mirror of
https://github.com/hwchase17/langchain.git
synced 2025-05-20 06:21:57 +00:00
Add a notebook showing how to make a chain that composes multiple OpenAPI Endpoint operations to accomplish tasks.
293 lines
8.0 KiB
Plaintext
293 lines
8.0 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c7ad998d",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Multi-hop Task Execution with the NLAToolkit\n",
|
|
"\n",
|
|
"Natural Language API Toolkits (NLAToolkits) permit LangChain Agents to efficiently plan and combine calls across endpoints. This notebook demonstrates a sample composition of the Speak, Klarna, and Spoonacluar APIs.\n",
|
|
"\n",
|
|
"For a detailed walkthrough of the OpenAPI chains wrapped within the NLAToolkit, see the [OpenAPI Operation Chain](openapi.ipynb) notebook.\n",
|
|
"\n",
|
|
"### First, import dependencies and load the LLM"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6593f793",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"from typing import List, Optional\n",
|
|
"from langchain.chains import LLMChain\n",
|
|
"from langchain.llms import OpenAI\n",
|
|
"from langchain.prompts import PromptTemplate\n",
|
|
"from langchain.requests import Requests\n",
|
|
"from langchain.tools import APIOperation, OpenAPISpec\n",
|
|
"from langchain.agents import AgentType, Tool, initialize_agent\n",
|
|
"from langchain.agents.agent_toolkits import NLAToolkit"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "dd720860",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Select the LLM to use. Here, we use text-davinci-003\n",
|
|
"llm = OpenAI(temperature=0, max_tokens=700) # You can swap between different core LLM's here."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "4cadac9d",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"### Next, load the Natural Language API Toolkits"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6b208ab0",
|
|
"metadata": {
|
|
"scrolled": true,
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"speak_toolkit = NLAToolkit.from_llm_and_url(llm, \"https://api.speak.com/openapi.yaml\")\n",
|
|
"klarna_toolkit = NLAToolkit.from_llm_and_url(llm, \"https://www.klarna.com/us/shopping/public/openai/v0/api-docs/\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "16c7336f",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Create the Agent"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "730a0dc2-b4d0-46d5-a1e9-583803220973",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Slightly tweak the instructions from the default agent\n",
|
|
"openapi_format_instructions = \"\"\"Use the following format:\n",
|
|
"\n",
|
|
"Question: the input question you must answer\n",
|
|
"Thought: you should always think about what to do\n",
|
|
"Action: the action to take, should be one of [{tool_names}]\n",
|
|
"Action Input: what to instruct the AI Action representative.\n",
|
|
"Observation: The Agent's response\n",
|
|
"... (this Thought/Action/Action Input/Observation can repeat N times)\n",
|
|
"Thought: I now know the final answer. User can't see any of my observations, API responses, links, or tools.\n",
|
|
"Final Answer: the final answer to the original input question with the right amount of detail\"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "40a979c3",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"natural_language_tools = speak_toolkit.get_tools() + klarna_toolkit.get_tools()\n",
|
|
"mrkl = initialize_agent(natural_language_tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, \n",
|
|
" verbose=True, agent_kwargs={\"format_instructions\":openapi_format_instructions})"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "794380ba",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"mrkl.run(\"I have an end of year party for my Italian class and have to buy some Italian clothes for it\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c61d92a8",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Using Auth + Adding more Endpoints\n",
|
|
"\n",
|
|
"Some endpoints may require user authentication via things like access tokens. Here we show how to pass in the authentication information via the `Requests` wrapper object.\n",
|
|
"\n",
|
|
"Since each NLATool exposes a concisee natural language interface to its wrapped API, the top level conversational agent has an easier job incorporating each endpoint to satisfy a user's request."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f0d132cc",
|
|
"metadata": {},
|
|
"source": [
|
|
"**Adding the Spoonacular endpoints.**\n",
|
|
"\n",
|
|
"1. Go to the [Spoonacular API Console](https://spoonacular.com/food-api/console#Profile) and make a free account.\n",
|
|
"2. Click on `Profile` and copy your API key below."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "c2368b9c",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"spoonacular_api_key = \"\" # Copy from the API Console"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "fbd97c28-fef6-41b5-9600-a9611a32bfb3",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"requests = Requests(headers={\"x-api-key\": spoonacular_api_key})\n",
|
|
"spoonacular_toolkit = NLAToolkit.from_llm_and_url(\n",
|
|
" llm, \n",
|
|
" \"https://spoonacular.com/application/frontend/downloads/spoonacular-openapi-3.json\",\n",
|
|
" requests=requests,\n",
|
|
" max_text_length=1800, # If you want to truncate the response text\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "81a6edac",
|
|
"metadata": {
|
|
"scrolled": true,
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"natural_language_api_tools = (speak_toolkit.get_tools() \n",
|
|
" + klarna_toolkit.get_tools() \n",
|
|
" + spoonacular_toolkit.get_tools()[:30]\n",
|
|
" )\n",
|
|
"print(f\"{len(natural_language_api_tools)} tools loaded.\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "831f772d-5cd1-4467-b494-a3172af2ff48",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Create an agent with the new tools\n",
|
|
"mrkl = initialize_agent(natural_language_api_tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, \n",
|
|
" verbose=True, agent_kwargs={\"format_instructions\":openapi_format_instructions})"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "0385e04b",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Make the query more complex!\n",
|
|
"user_input = (\n",
|
|
" \"I'm learning Italian, and my language class is having an end of year party... \"\n",
|
|
" \" Could you help me find an Italian outfit to wear and\"\n",
|
|
" \" an appropriate recipe to prepare so I can present for the class in Italian?\"\n",
|
|
")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6ebd3f55",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"mrkl.run(user_input)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "a2959462",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Thank you!"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6fcda5f0",
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"natural_language_api_tools[1].run(\"Tell the LangChain audience to 'enjoy the meal' in Italian, please!\")['output']"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "ab366dc0",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|