代理¶
什么是代理?¶
一个代理由三个组件构成:一个大型语言模型 (LLM)、一套它能使用的工具,以及一个提供指令的提示。
LLM 在一个循环中运行。在每次迭代中,它选择一个工具来调用,提供输入,接收结果(观察),并使用该观察来指导下一步行动。循环持续进行,直到满足停止条件——通常是当代理收集了足够的信息来响应用户时。
基本配置¶
使用 create_react_agent
实例化一个代理
API 参考:create_react_agent
from langgraph.prebuilt import create_react_agent
def get_weather(city: str) -> str: # (1)!
"""Get weather for a given city."""
return f"It's always sunny in {city}!"
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest", # (2)!
tools=[get_weather], # (3)!
prompt="You are a helpful assistant" # (4)!
)
# Run the agent
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)
- 定义代理使用的工具。工具可以定义为普通的 Python 函数。有关更高级的工具用法和自定义,请查看工具页面。
- 为代理提供一个语言模型。要了解有关代理语言模型的更多配置信息,请查看模型页面。
- 为模型提供一个工具列表。
- 为代理使用的语言模型提供一个系统提示(指令)。
LLM 配置¶
使用 init_chat_model 配置具有特定参数(如温度)的 LLM
API 参考:init_chat_model | create_react_agent
from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent
model = init_chat_model(
"anthropic:claude-3-7-sonnet-latest",
temperature=0
)
agent = create_react_agent(
model=model,
tools=[get_weather],
)
有关如何配置 LLM 的更多信息,请参阅模型页面。
自定义提示¶
提示指导 LLM 如何行为。它们可以是
- 静态:一个字符串被解释为系统消息
- 动态:根据输入或配置在运行时生成的消息列表
静态提示¶
定义固定的提示字符串或消息列表。
API 参考:create_react_agent
from langgraph.prebuilt import create_react_agent
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[get_weather],
# A static prompt that never changes
prompt="Never answer questions about the weather."
)
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)
动态提示¶
定义一个函数,该函数根据代理的状态和配置返回消息列表
API 参考:AnyMessage | RunnableConfig | AgentState | create_react_agent
from langchain_core.messages import AnyMessage
from langchain_core.runnables import RunnableConfig
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.prebuilt import create_react_agent
def prompt(state: AgentState, config: RunnableConfig) -> list[AnyMessage]: # (1)!
user_name = config["configurable"].get("user_name")
system_msg = f"You are a helpful assistant. Address the user as {user_name}."
return [{"role": "system", "content": system_msg}] + state["messages"]
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[get_weather],
prompt=prompt
)
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]},
config={"configurable": {"user_name": "John Smith"}}
)
-
动态提示允许在构建 LLM 输入时包含非消息上下文,例如
- 运行时传递的信息,如
user_id
或 API 凭据(使用config
)。 - 多步推理过程中更新的内部代理状态(使用
state
)。
动态提示可以定义为接受
state
和config
并返回要发送给 LLM 的消息列表的函数。 - 运行时传递的信息,如
有关更多信息,请参阅上下文页面。
内存¶
要与代理进行多轮对话,您需要在创建代理时通过提供 checkpointer
来启用持久化。在运行时,您需要提供一个包含 thread_id
的配置——它是对话(会话)的唯一标识符
API 参考:create_react_agent | InMemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver()
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[get_weather],
checkpointer=checkpointer # (1)!
)
# Run the agent
config = {"configurable": {"thread_id": "1"}}
sf_response = agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]},
config # (2)!
)
ny_response = agent.invoke(
{"messages": [{"role": "user", "content": "what about new york?"}]},
config
)
checkpointer
允许代理在工具调用循环的每一步存储其状态。这使能了短期内存和人工干预(human-in-the-loop)功能。- 传递包含
thread_id
的配置,以便能够在未来的代理调用中恢复相同的对话。
启用 checkpointer 后,它会在提供的 checkpointer 数据库(如果使用 InMemorySaver
,则在内存中)的每一步存储代理状态。
请注意,在上面的示例中,当代理第二次使用相同的 thread_id
被调用时,来自第一次对话的原始消息历史记录会自动包含进来,以及新的用户输入。
请参阅内存指南以了解有关如何使用内存的更多详细信息。
结构化输出¶
要生成符合模式的结构化响应,请使用 response_format
参数。模式可以使用 Pydantic
模型或 TypedDict
定义。结果将通过 structured_response
字段访问。
API 参考:create_react_agent
from pydantic import BaseModel
from langgraph.prebuilt import create_react_agent
class WeatherResponse(BaseModel):
conditions: str
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[get_weather],
response_format=WeatherResponse # (1)!
)
response = agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)
response["structured_response"]
-
提供
response_format
后,代理循环末尾会添加一个单独的步骤:将代理消息历史记录传递给具有结构化输出的 LLM,以生成结构化响应。要为该 LLM 提供系统提示,请使用元组
(prompt, schema)
,例如response_format=(prompt, WeatherResponse)
。
LLM 后处理
结构化输出需要额外调用 LLM 以根据模式格式化响应。