Skip to main content
Open In Colab在 GitHub 上打开

帕西奥营养AI

为了最好地了解 NutritionAI 如何为您的代理提供超级食品营养能力,让我们构建一个可以通过 Passio NutritionAI 找到该信息的代理。

定义工具

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

Passio Nutrition 人工智能

我们在 LangChain 中有一个内置工具,可以轻松使用 Passio NutritionAI 来查找食品营养事实。 请注意,这需要 API 密钥 - 他们有免费套餐。

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

export NUTRITIONAI_SUBSCRIPTION_KEY="..."

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

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
API 参考:NutritionAI | 营养AIAPI
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 代理 - 有关此类代理以及其他选项的更多信息,请参阅本指南

首先,我们选择我们想要指导代理的 LLM。

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、提示符和工具初始化代理。代理负责听取输入并决定要采取的作。至关重要的是,Agent 不会执行这些作 - 这是由 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?"
}
)

结论

到此结束!在这个快速入门中,我们介绍了如何创建一个简单的代理,该代理能够将食物营养信息合并到其答案中。代理是一个复杂的话题,有很多东西要学!