Skip to main content

自然语言API

Natural Language API工具包(NLAToolkits)允许LangChain代理在多个端点上高效地计划和组合调用。本笔记本演示了Speak、Klarna和Spoonacluar API的示例组合。

有关包含在NLAToolkit中的OpenAPI链的详细步骤,请参阅OpenAPI操作链笔记本。

首先,导入依赖项并加载LLM

from typing import List, Optional
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.requests import Requests
from langchain.tools import APIOperation, OpenAPISpec
from langchain.agents import AgentType, Tool, initialize_agent
from langchain.agents.agent_toolkits import NLAToolkit
# 选择要使用的LLM。这里我们使用text-davinci-003
llm = OpenAI(
temperature=0, max_tokens=700
) # 您可以在这里切换不同的核心LLM。

接下来,加载自然语言API工具包

speak_toolkit = NLAToolkit.from_llm_and_url(llm, "https://api.speak.com/openapi.yaml")
klarna_toolkit = NLAToolkit.from_llm_and_url(
llm, "https://www.klarna.com/us/shopping/public/openai/v0/api-docs/"
)
    正在尝试加载OpenAPI 3.0.1规范。这可能会导致性能下降。将您的OpenAPI规范转换为3.1.*规范以获得更好的支持。
正在尝试加载OpenAPI 3.0.1规范。这可能会导致性能下降。将您的OpenAPI规范转换为3.1.*规范以获得更好的支持。
正在尝试加载OpenAPI 3.0.1规范。这可能会导致性能下降。将您的OpenAPI规范转换为3.1.*规范以获得更好的支持。

创建代理

# 稍微调整默认代理的说明
openapi_format_instructions = """使用以下格式:

问题:您必须回答的输入问题
思考:您应该始终考虑要做什么
行动:要采取的行动,应为[{tool_names}]之一
行动输入:指示AI行动代表的内容。
观察:代理的响应
...(此思考/行动/行动输入/观察可以重复N次)
思考:我现在知道最终答案。用户无法看到我的任何观察、API响应、链接或工具。
最终答案:原始输入问题的最终答案,具有正确的详细程度

在回复最终答案时,请记住,您回复的人无法看到您的任何思考/行动/行动输入/观察,因此如果有任何相关信息,您需要明确地包含在回复中。"""
natural_language_tools = speak_toolkit.get_tools() + klarna_toolkit.get_tools()
mrkl = initialize_agent(
natural_language_tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
agent_kwargs={"format_instructions": openapi_format_instructions},
)
mrkl.run(
"I have an end of year party for my Italian class and have to buy some Italian clothes for it"
)
    

> 进入新的AgentExecutor链...
我需要找出有哪些意大利服装
行动:Open_AI_Klarna_product_Api.productsUsingGET
行动输入:意大利服装
观察:API响应包含两个来自Alé品牌的意大利蓝色产品。第一个是Alé Colour Block Short Sleeve Jersey Men - Italian Blue,售价86.49美元,第二个是Alé Dolid Flash Jersey Men - Italian Blue,售价40.00美元。
思考:我现在知道有哪些意大利服装以及它们的价格。
最终答案:您可以购买两件来自Alé品牌的意大利蓝色产品,用于您的年终派对。Alé Colour Block Short Sleeve Jersey Men - Italian Blue售价86.49美元,Alé Dolid Flash Jersey Men - Italian Blue售价40.00美元。

> 完成链。






'您可以购买两件来自Alé品牌的意大利蓝色产品,用于您的年终派对。Alé Colour Block Short Sleeve Jersey Men - Italian Blue售价86.49美元,Alé Dolid Flash Jersey Men - Italian Blue售价40.00美元。'

使用身份验证+添加更多端点

某些端点可能需要用户通过访问令牌等方式进行身份验证。在这里,我们展示如何通过Requests包装对象传递身份验证信息。

由于每个NLATool都为其包装的API提供了简洁的自然语言接口,顶级对话代理更容易将每个端点合并到满足用户请求的代理中。

添加Spoonacular端点。

  1. 前往Spoonacular API控制台并创建一个免费帐户。
  2. 点击Profile并将您的API密钥复制到下面。
spoonacular_api_key = ""  # 从API控制台复制
requests = Requests(headers={"x-api-key": spoonacular_api_key})
spoonacular_toolkit = NLAToolkit.from_llm_and_url(
llm,
"https://spoonacular.com/application/frontend/downloads/spoonacular-openapi-3.json",
requests=requests,
max_text_length=1800, # 如果要截断响应文本
)
    正在尝试加载OpenAPI 3.0.0规范。这可能会导致性能下降。将您的OpenAPI规范转换为3.1.*规范以获得更好的支持。
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Accept的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
不支持参数Content-Type的APIPropertyLocation "header"。有效值为['path','query'] 忽略可选参数
natural_language_api_tools = (
speak_toolkit.get_tools()
+ klarna_toolkit.get_tools()
+ spoonacular_toolkit.get_tools()[:30]
)
print(f"{len(natural_language_api_tools)} tools loaded.")
    加载了34个工具。
# 使用新工具创建代理
mrkl = initialize_agent(
natural_language_api_tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
agent_kwargs={"format_instructions": openapi_format_instructions},
)
# 使查询更复杂!
user_input = (
"I'm learning Italian, and my language class is having an end of year party... "
" Could you help me find an Italian outfit to wear and"
" an appropriate recipe to prepare so I can present for the class in Italian?"
)
mrkl.run(user_input)
    

> 进入新的AgentExecutor链...
我需要找到一个意大利主题的食谱和服装。
行动:spoonacular_API.searchRecipes
行动输入:意大利
观察:API响应包含10个意大利食谱,包括Turkey Tomato Cheese Pizza、Broccolini Quinoa Pilaf、Bruschetta Style Pork & Pasta、Salmon Quinoa Risotto、Italian Tuna Pasta、Roasted Brussels Sprouts With Garlic、Asparagus Lemon Risotto、Italian Steamed Artichokes、Crispy Italian Cauliflower Poppers Appetizer和Pappa Al Pomodoro。
思考:我需要找到一个意大利主题的服装。
行动:Open_AI_Klarna_product_Api.productsUsingGET
行动输入:意大利
观察:我在API响应中找到了与'意大利'相关的10个产品。这些产品包括Italian Gold Sparkle Perfectina Necklace - Gold、Italian Design Miami Cuban Link Chain Necklace - Gold、Italian Gold Miami Cuban Link Chain Necklace - Gold、Italian Gold Herringbone Necklace - Gold、Italian Gold Claddagh Ring - Gold、Italian Gold Herringbone Chain Necklace - Gold、Garmin QuickFit 22mm Italian Vacchetta Leather Band、Macy's Italian Horn Charm - Gold、Dolce & Gabbana Light Blue Italian Love Pour Homme EdT 1.7 fl oz。
思考:我现在知道最终答案。
最终答案:为了为您的意大利语课做演示,您可以佩戴Italian Gold Sparkle Perfectina Necklace - Gold、Italian Design Miami Cuban Link Chain Necklace - Gold或Italian Gold Miami Cuban Link Chain Necklace - Gold。至于食谱,您可以制作Turkey Tomato Cheese Pizza、Broccolini Quinoa Pilaf、Bruschetta Style Pork & Pasta、Salmon Quinoa Risotto、Italian Tuna Pasta、Roasted Brussels Sprouts With Garlic、Asparagus Lemon Risotto、Italian Steamed Artichokes、Crispy Italian Cauliflower Poppers Appetizer或Pappa Al Pomodoro。

> 完成链。






'为了为您的意大利语课做演示,您可以佩戴Italian Gold Sparkle Perfectina Necklace - Gold、Italian Design Miami Cuban Link Chain Necklace - Gold或Italian Gold Miami Cuban Link Chain Necklace - Gold。至于食谱,您可以制作Turkey Tomato Cheese Pizza、Broccolini Quinoa Pilaf、Bruschetta Style Pork & Pasta、Salmon Quinoa Risotto、Italian Tuna Pasta、Roasted Brussels Sprouts With Garlic、Asparagus Lemon Risotto、Italian Steamed Artichokes、Crispy Italian Cauliflower Poppers Appetizer或Pappa Al Pomodoro。'

谢谢!

natural_language_api_tools[1].run(
"Tell the LangChain audience to 'enjoy the meal' in Italian, please!"
)
    "在意大利语中,您可以对某人说'Buon appetito'来祝愿他们享用美食。这个短语在意大利很常用,当有人要吃饭时,通常在一顿饭开始时使用。它类似于法语中的'Bon appétit'或德语中的'Guten Appetit'。"