En este tutorial, utilizaremos herramientas LangChain prediseñadas para un agente ReAct agéntico con el fin de mostrar su capacidad para diferenciar los casos de uso adecuados para cada herramienta. Principalmente utilizaremos el paquete LangChain Python de código abierto.
La llamada a herramientas, también conocida como llamada a funciones, es la interfaz que permite a los agentes de inteligencia artificial (IA) trabajar en tareas específicas que requieren información actualizada, que de otro modo no estaría disponible para los modelos de lenguaje de gran tamaño (LLM) entrenados. Los LLM, como los modelos IBM Granite o los modelos GPT (transformador generativo preentrenado) de OpenAI, solo tienen acceso a la información utilizada en el entrenamiento. Hay muchas herramientas predeterminadas accesibles a través de LangChain, incluida una herramienta para trabajar con consultas de bases de datos SQL database, acceder a información en Wikipedia y mucho más. Le recomendamos que lea la documentación de LangChain para obtener una lista completa de herramientas prediseñadas.
Las herramientas personalizadas se pueden definir utilizando varios métodos, incluido el decorador @tool o LangChain Runnables, que trataremos en este tutorial. Las herramientas asíncronas se pueden crear utilizando las clases StructuredTool o BaseTool. Para distinguir entre cada enfoque, le recomendamos que consulte la documentación oficial de LangChain. Consulte el tutorial de llamadas a funciones de IBM para ver ejemplos de herramientas personalizadas.
Le recomendamos que consulte nuestro explicador de agentes de IA para obtener una descripción detallada de los distintos tipos de agentes de IA y en qué se diferencian de los chatbots LLM tradicionales.
Necesita una cuenta de IBM Cloud.
Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.
Inicie sesión en watsonx.ai utilizando su cuenta de IBM Cloud.
Cree un proyecto watsonx.ai.
Puede obtener el ID de su proyecto desde su proyecto. Haga clic en la pestaña Administrar. A continuación, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.
Cree un Jupyter Notebook.
Este paso abrirá un entorno de Jupyter Notebook donde podrá copiar el código de este tutorial. También puede descargar este cuaderno en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Para ver más tutoriales de Granite, consulte la comunidad de IBM Granite. Este tutorial también está disponible en Github.
Cree una instancia de servicio de watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia gratuita).
Genere una clave de API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.
Necesitamos unas pocas bibliotecas y módulos para este tutorial. Asegúrese de importar los siguientes y, si no están instalados, puede resolverlo con una instalación rápida de pip. LangChain y LangGraph serán los marcos y kits de herramientas para desarrolladores utilizados.
Nota: este tutorial se creó con Python 3.11.9 y también es compatible con Google Colab, que utiliza Python 3.10.12. Para comprobar su versión de Python, puede ejecutar el comando !python --version en una celda de código.
Para establecer nuestras credenciales, necesitamos el WATSONX_APIKEY y el WATSONX_PROJECT_ID que generó en el paso 1. Puede almacenarlos en un archivo .env en su directorio o reemplazar el texto del marcador de posición. También estableceremos la URL que sirve como endpoint de la API.
La herramienta meteorológica utilizada en este tutorial requiere una clave API de OpenWeather. Para generar una, cree una cuenta de OpenWeather. Al crear una cuenta, seleccione la pestaña "Claves de API" para mostrar su clave gratuita.
Para este tutorial, utilizaremos el contenedor ChatWatsonx para configurar nuestro modelo de chat. Este contenedor simplifica la integración de la llamada y el encadenamiento de herramientas. Utilizaremos el modelo granite-3-8b-instruct. Le recomendamos que utilice las referencias de la API en la documentación de ChatWatsonx para obtener más información.
Para inicializar el LLM, necesitamos establecer los parámetros del modelo. Es importante configurar aquí la temperatura del modelo para limitar las alucinaciones del agente.
Podemos usar la clase Tool para hacer que nuestras herramientas sean invocables. También es importante una descripción clara y sencilla de la herramienta. Además, el atributo booleano return_direct determina si la respuesta de la herramienta debe devolverse directamente al usuario. Por último, el atributo opcional args_schema del tipo pydantic.BaseModel se utiliza para proporcionar información adicional o validación al modelo.
Imaginemos que está planeando sus próximas vacaciones en Grecia y desea obtener más información sobre ellas y prepararse para el viaje. Primero, configuremos la herramienta meteorológica incorporada de LangChain. La herramienta utiliza el OpenWeatherMapAPIWrapper que utiliza la OPENWEATHERMAP_API_KEY que generamos anteriormente.
A continuación, configuremos la herramienta prediseñada de YouTube utilizando el paquete de búsqueda de YouTube disponible a través de LangChain. Este paso le resultará útil para encontrar vídeos sobre el destino de su viaje.
Por último, configuremos una herramienta de compras en línea usando Ionic. Esta herramienta devuelve artículos relevantes para la consulta del usuario que están a la venta a través del mercado de comercio electrónico.
Establezcamos nuestra lista de las múltiples herramientas que proporcionamos al LLM. También podemos imprimir la lista para ver cómo se cargó. Para obtener una lista ampliada de las herramientas LangChain disponibles, consulte la documentación de LangChain.
Output:
[Tool(name='weather_search', description='Get weather for a city and country code, e.g. Athens, GR', func=<bound method OpenWeatherMapAPIWrapper.run of OpenWeatherMapAPIWrapper(owm=<pyowm.owm.OWM - API key=************************611450cc, subscription type=free, PyOWM version=(3, 3, 0)>, openweathermap_api_key='******************')>),
Tool(name='youtube_search', description='Search YouTube for video links.', func=<bound method BaseTool.run of YouTubeSearchTool()>),
Tool(name='ionic_commerce_shopping_tool', description='\nIonic is an e-commerce shopping tool...[abbreviated]', verbose=True, func=<bound method Ionic.query of <ionic_langchain.tool.Ionic object at 0x17f6e5510>>)]
La llamada a herramientas suele hacer referencia a un LLM que devuelve el nombre de la herramienta a llamar y sus argumentos. Podemos utilizar la información extraída para otros fines o podemos llamar a la herramienta con estos argumentos. Para obtener más ejemplos de esto, consulte nuestro tutorial de llamada a funciones.
En realidad, ejecutar la herramienta y recuperar su resultado no siempre está implícito. En este tutorial, exploraremos ambos enfoques.
Para realizar las llamadas a herramientas tradicionales, simplemente podemos proporcionar una consulta de usuario y utilizar el método bind_tools precompilado para pasar la lista de herramientas al LLM en cada iteración.
Output:
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353', 'type': 'function', 'function': {'name': 'youtube_search', 'arguments': '{"query": "greece"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 578, 'total_tokens': 599}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-5fe7a26b8f954c179c4995e873bff91e', tool_calls=[{'name': 'youtube_search', 'args': {'query': 'greece'}, 'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353', 'type': 'tool_call'}], usage_metadata={'input_tokens': 578, 'output_tokens': 21, 'total_tokens': 599})
Output:
{'tool_calls': [{'id': 'chatcmpl-tool-7a15abba7d3c4419970d807ac0c8d353',
'type': 'function',
'function': {'name': 'youtube_search',
'arguments': '{"query": "greece"}'}}]}
Como se ve en el resultado de tool_calls, el LLM identifica correctamente la llamada a la herramienta y los argumentos adecuados. El LLM no ejecuta la herramienta en sí. Lo haremos en el siguiente paso.
Para ejecutar las llamadas a la herramienta, primero debemos crear un agente ReAct utilizando el método auxiliar LangGraph create_react_agent precompilado. Esta función crea un gráfico que sirve de puente entre el modelo de chat y las herramientas disponibles, lo que permite la llamada a herramientas agénticas. Este gráfico se representa en el siguiente diagrama.
Ahora podemos hacer preguntas al agente que requieren llamadas de herramientas. En primer lugar, podemos pedir al modelo que devuelva las URL de los vídeos de YouTube sobre Grecia. Podemos usar la clase HumanMessage para pasar la consulta del usuario al LLM.
Output:
[HumanMessage(content='What are some YouTube videos about Greece', additional_kwargs={}, response_metadata={}, id='1adba6c0-32e6-4bbd-92a6-7d21b0177439'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce', 'type': 'function', 'function': {'name': 'youtube_search', 'arguments': '{"query": "Greece"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 578, 'total_tokens': 600}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-5f41aee6736842749285aa7fbff50f65', tool_calls=[{'name': 'youtube_search', 'args': {'query': 'Greece'}, 'id': 'chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce', 'type': 'tool_call'}], usage_metadata={'input_tokens': 578, 'output_tokens': 22, 'total_tokens': 600}),
ToolMessage(content="['https://www.youtube.com/watch?v=waQY2Ucpbd0&pp=ygUGR3JlZWNl', 'https://www.youtube.com/watch?v=NMlBB2pK5qo&pp=ygUGR3JlZWNl']", name='youtube_search', id='1ccf3137-2c10-495e-86ad-a548a3434243', tool_call_id='chatcmpl-tool-b4b5bf452404424ba4d6d9c26e53c6ce'),
AIMessage(content='Here are some YouTube videos about Greece:\n\n1. [Greece Travel Guide | Top 10 Tourist Attractions](https://www.youtube.com/watch?v=waQY2Ucpbd0&pp=ygUGR3JlZWNl)\n2. [Greece Travel Guide | Top 10 Tourist Attractions](https://www.youtube.com/watch?v=NMlBB2pK5qo&pp=ygUGR3JlZWNl)', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 117, 'prompt_tokens': 677, 'total_tokens': 794}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-801e3b596a174ac88246b507c93e5869', usage_metadata={'input_tokens': 677, 'output_tokens': 117, 'total_tokens': 794})]
¡Genial! Como se ve en el AIMessage, el modelo identificó correctamente la llamada a la herramienta adecuada. En ToolMessage, vemos que el modelo devolvió con éxito el resultado esperado utilizando la herramienta LangChain YouTube incorporada. Por último, el AIMessage muestra que el LLM sintetizó la respuesta de la herramienta.
A continuación, preguntemos al modelo sobre el tiempo en Grecia para determinar si llama a la herramienta weather_search como se esperaba.
Output:
[HumanMessage(content='What is the weather in Athens, GR', additional_kwargs={}, response_metadata={}, id='a0c4b69c-988a-4f7d-9b8a-4780305f8e2a'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8', 'type': 'function', 'function': {'name': 'weather_search', 'arguments': '{"__arg1": "Athens, GR"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 26, 'prompt_tokens': 579, 'total_tokens': 605}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-eeed087050e049f0ad715f3615c7fdda', tool_calls=[{'name': 'weather_search', 'args': {'__arg1': 'Athens, GR'}, 'id': 'chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8', 'type': 'tool_call'}], usage_metadata={'input_tokens': 579, 'output_tokens': 26, 'total_tokens': 605}),
ToolMessage(content='In Athens, GR, the current weather is as follows:\nDetailed status: few clouds\nWind speed: 4.47 m/s, direction: 23°\nHumidity: 58%\nTemperature: \n - Current: 15.15°C\n - High: 15.74°C\n - Low: 14.1°C\n - Feels like: 14.24°C\nRain: {}\nHeat index: None\nCloud cover: 20%', name='weather_search', id='587b0230-b667-41de-97b9-3779554d2559', tool_call_id='chatcmpl-tool-9a0c07a3b35f4c69a351c5540ab663f8'),
AIMessage(content='The current weather in Athens, GR is:\n- Detailed status: few clouds\n- Wind speed: 4.47 m/s, direction: 23°\n- Humidity: 58%\n- Temperature:\n - Current: 15.15°C\n - High: 15.74°C\n - Low: 14.1°C\n - Feels like: 14.24°C\n- Rain: None\n- Heat index: None\n- Cloud cover: 20%', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 125, 'prompt_tokens': 733, 'total_tokens': 858}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-6719a5ca266a439bb10ed410db25c5ef', usage_metadata={'input_tokens': 733, 'output_tokens': 125, 'total_tokens': 858})]
El modelo pudo discernir la herramienta adecuada para llamar, ejecutar la herramienta con los argumentos extraídos y sintetizar el resultado. Ahora, pidamos al LLM algunas maletas de menos de 100 USD para su próximo viaje. Tenga en cuenta que la herramienta está diseñada para buscar precios en centavos. Por lo tanto, pedimos maletas por menos de 10 000 céntimos en este escenario, lo que equivale a 100 USD.
Output:
[HumanMessage(content='Find some suitcases for less than 10000', additional_kwargs={}, response_metadata={}, id='8b207035-150a-4390-aff3-8b09ef85a592'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'chatcmpl-tool-b011e718b18e41dcbcae2f7786af263d', 'type': 'function', 'function': {'name': 'ionic_commerce_shopping_tool', 'arguments': '{"__arg1": "suitcases, 10, 0, 10000"}'}}]}, response_metadata={'token_usage': {'completion_tokens': 41, 'prompt_tokens': 582, 'total_tokens': 623}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'tool_calls'}, id='chat-e38c8568d1754636a6a92082561180bd', tool_calls=[{'name': 'ionic_commerce_shopping_tool', 'args': {'__arg1': 'suitcases, 10, 0, 10000'}, 'id': 'chatcmpl-tool-b011e718b18e41dcbcae2f7786af263d', 'type': 'tool_call'}], usage_metadata={'input_tokens': 582, 'output_tokens': 41, 'total_tokens': 623}),
ToolMessage(content='[{"products": [{"links": [{"text": "Details", "type": "pdp", "url": "https://go.ionic.click/Ch4CKd"}], "merchant_name": "Walmart", "merchant_product_id": "811277349", "name": "Zimtown Hardside Lightweight Spinner Orange 3 Piece Luggage Set with TSA Lock", "price": "$69.99", "status": "available", "thumbnail": "https://i5.walmartimages.com/asr/b809a274-ccc7-4ca4-b4f1-e848b4412fe6.314144bcd13e5467a33cb99e8dd5237c.jpeg?odnHeight=100&odnWidth=100&odnBg=ffffff", "brand_name": "Zimtown", "upc": "273109526768"}, {"links": [{"text": "Details", "type": "pdp", "url": "https://www.amazon.com/dp/B071HHX6VF?tag=ioniccommer00-20&linkCode=osi&th=1&psc=1"}], "merchant_name": "Amazon", "merchant_product_id": "B071HHX6VF", "name": "Amazon Basics Expandable Hardside Luggage, Suitcase with Wheels, 30-Inch Spinner with Four Spinner Wheels and Scratch-Resistant Surface, Black", "price": "$74.49", "status": "available", "thumbnail": "https://m.media-amazon.com/images/I/41jJcuMYSdL._SL160_.jpg", "brand_name": "Amazon Basics", "upc": "841710177190"}, .....[abbreviated],
AIMessage(content='Here are some suitcases that are less than 10000:\n\n1. [Zimtown Hardside Lightweight Spinner Orange 3 Piece Luggage Set with TSA Lock](https://go.ionic.click/Ch4CKd) - $69.99\n2. [Amazon Basics Expandable Hardside Luggage, Suitcase with Wheels, 30-Inch Spinner](https://www.amazon.com/dp/B071HHX6VF) - $74.49\n3. [SwissGear Sion Softside Expandable Luggage, Blue, Carry-On 21-Inch](https://www.amazon.com/dp/B01MFBVKDF) - $80.73\n4. [Travelers Club Midtown Hardside Luggage Travel, Rose Gold, 4-Piece Set](https://www.amazon.com/dp/B07RS4PK3J) - $95.19\n5. [American Tourister Stratum 2.0 Expandable Hardside Luggage with Spinner Wheels, 28" SPINNER, Slate Blue](https://www.amazon.com/dp/B0B2X1BDFH) - $89.97\n6. [Wrangler Smart Luggage Set with Cup Holder and USB Port, Navy Blue, 20-Inch Carry-On](https://www.amazon.com/dp/B07SLG6WZ2) - $39.99\n7. [Wrangler Hardside Carry-On Spinner Luggage, Lilac, 20-Inch](https://www.amazon.com/dp/B0C7YWMBGP) - $40.00\n8. [Protege 20 inch Hard Side Carry-On Spinner Luggage, Black Matte Finish (Walmart.com Exclusive)](https://go.ionic.click/qJqBRA) - $29.87\n9. [Wrangler Wesley Rolling Duffel Bag, Tannin, Large 30-Inch](https://www.amazon.com/dp/B07XKWMLJ5) - $44.00\n10. [U.S. Traveler Boren Polycarbonate Hardside Rugged Travel Suitcase Luggage with 8 Spinner Wheels, Aluminum Handle, Lavender, Checked-Large 30-Inch](https://www.amazon.com/dp/B085B4D852) - $79.99', additional_kwargs={}, response_metadata={'token_usage': {'completion_tokens': 612, 'prompt_tokens': 2794, 'total_tokens': 3406}, 'model_name': 'ibm/granite-3-8b-instruct', 'system_fingerprint': '', 'finish_reason': 'stop'}, id='chat-d08201ff6ef84c428e7ae44372396926', usage_metadata={'input_tokens': 2794, 'output_tokens': 612, 'total_tokens': 3406})]
Como se ve en la respuesta de LLM, el modelo utilizó correctamente la herramienta de compra para devolver varias maletas para su compra en línea por menos de 100 USD.
En este tutorial, utilizó herramientas LangChain prediseñadas para crear un agente ReAct en Python con watsonx utilizando el modelo granite-3-8b-instruct . Ha utilizado las herramientas youtube_search , weather_search e ionic_search . El tutorial mostró cómo implementar la llamada tradicional a herramientas, así como un enfoque agéntico que ejecuta las herramientas. El resultado de muestra es importante, ya que muestra los pasos que siguió el agente para crear su propio flujo de trabajo utilizando las funciones disponibles. Las herramientas otorgadas al agente fueron vitales para responder a las consultas de los usuarios.
Cree, implemente y gestione potentes asistentes y agentes de IA que automaticen flujos de trabajo y procesos con IA generativa.
Construya el futuro de su empresa con soluciones de IA en las que puede confiar.
Los servicios de IA de IBM Consulting ayudan a reinventar la forma de trabajar de las empresas usando IA para la transformación.