Skip to main content
Open In ColabOpen on GitHub

Passio NutritionAI

为了最好地理解 NutritionAI 如何赋予您的智能体超级食物营养能力,让我们构建一个能够通过 Passio NutritionAI 查找该信息的智能体。

定义工具

我们首先需要创建 Passio NutritionAI 工具

Passio NutritionAI

LangChain 内置了一个工具,可轻松使用 Passio NutritionAI 查询食物营养成分。 请注意,此功能需要 API 密钥——他们提供免费层级。

创建API密钥后,您需要将其导出为:

export NUTRITIONAI_SUBSCRIPTION_KEY="..."

... 或通过其他方式(例如 dotenv 包)将其提供给您的 Python 环境。您也可以通过构造函数调用显式控制密钥。

from dotenv import load_dotenv
from langchain_core.utils import get_from_env

load_dotenv()

nutritionai_subscription_key = get_from_env(
"nutritionai_subscription_key", "NUTRITIONAI_SUBSCRIPTION_KEY"
)
API 参考:get_from_env
from langchain_community.tools.passio_nutrition_ai import NutritionAI
from langchain_community.utilities.passio_nutrition_ai import NutritionAIAPI
nutritionai_search = NutritionAI(api_wrapper=NutritionAIAPI())
nutritionai_search.invoke("chicken tikka masala")
nutritionai_search.invoke("Schnuck Markets sliced pepper jack cheese")

工具

现在我们已经有了这个工具,可以创建一个将在下游使用的工具列表。

tools = [nutritionai_search]

创建代理

现在我们已经定义了工具,接下来可以创建代理。我们将使用 OpenAI Functions 代理——有关此类代理以及其他选项的更多信息,请参阅本指南

首先,我们选择想要用来指导代理的大型语言模型。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
API 参考:ChatOpenAI

接下来,我们选择用于指导代理的提示。

from langchain import hub

# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-functions-agent")
prompt.messages
API 参考:Hub
[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], template='You are a helpful assistant')),
MessagesPlaceholder(variable_name='chat_history', optional=True),
HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], template='{input}')),
MessagesPlaceholder(variable_name='agent_scratchpad')]

现在,我们可以使用 LLM、提示词和工具来初始化代理。代理负责接收输入并决定采取哪些操作。关键在于,代理本身并不执行这些操作——这一步由 AgentExecutor(下一步)完成。有关如何理解这些组件的更多信息,请参阅我们的概念指南

from langchain.agents import create_openai_functions_agent

agent = create_openai_functions_agent(llm, tools, prompt)

最后,我们将代理(大脑)与工具结合到 AgentExecutor 中(它将反复调用代理并执行工具)。有关如何理解这些组件的更多信息,请参阅我们的概念指南

from langchain.agents import AgentExecutor

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
API 参考:AgentExecutor

运行代理

现在我们可以对几个查询运行代理了!请注意,目前这些查询都是无状态的(不会记住之前的交互)。

agent_executor.invoke({"input": "hi!"})


> Entering new AgentExecutor chain...
Hello! How can I assist you today?

> Finished chain.
{'input': 'hi!', 'output': 'Hello! How can I assist you today?'}
agent_executor.invoke({"input": "how many calories are in a slice pepperoni pizza?"})

如果我们想自动跟踪这些消息,可以将其包装在 RunnableWithMessageHistory 中。有关如何使用它的更多信息,请参阅本指南

agent_executor.invoke(
{"input": "I had bacon and eggs for breakfast. How many calories is that?"}
)
agent_executor.invoke(
{
"input": "I had sliced pepper jack cheese for a snack. How much protein did I have?"
}
)
agent_executor.invoke(
{
"input": "I had sliced colby cheese for a snack. Give me calories for this Schnuck Markets product."
}
)
agent_executor.invoke(
{
"input": "I had chicken tikka masala for dinner. how much calories, protein, and fat did I have with default quantity?"
}
)

结论

到此结束!在本快速入门中,我们介绍了如何创建一个简单的智能体,使其能够将食物营养信息融入回答中。智能体是一个复杂的主题,还有很多内容值得学习!