Agent (代理)
Agents 将语言模型(Model)与工具(Tools)结合,能够推理任务、决定使用哪些工具,并循环执行直到达成目标。
基础 Agent
1. 静态模型与工具
create_agent 是最基础的用法,模型和工具在创建时固定。
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool
# 1. 定义工具
@tool
def get_weather(city: str) -> str:
"""获取城市天气"""
return f"{city} 的天气是晴天,25度"
tools = [get_weather]
# 2. 定义模型
model = ChatOpenAI(model="gpt-4o")
# 3. 创建 Agent
# create_agent 构建一个基于 LangGraph 的运行时
agent = create_agent(model, tools=tools)
# 4. 调用
# 必须包含 "messages" 列表
response = agent.invoke({
"messages": [{"role": "user", "content": "北京天气怎么样?"}]
})
print(response["messages"][-1].content)
进阶配置
1. 系统提示词 (System Prompt)
可以直接通过参数设置 Agent 的角色设定。
from langchain.agents import create_agent
agent = create_agent(
model,
tools,
system_prompt="你是一个乐于助人的天气助手。请用幽默的语气回答。"
)
2. 动态模型 (Dynamic Models)
使用中间件 (middleware) 在运行时根据状态选择模型(例如:简单问题用小模型,复杂问题用大模型)。
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse
basic_model = ChatOpenAI(model="gpt-4o-mini")
advanced_model = ChatOpenAI(model="gpt-4o")
@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
# 简单的逻辑:如果对话轮数超过10轮,切换到高级模型
message_count = len(request.state["messages"])
if message_count > 10:
model = advanced_model
else:
model = basic_model
# 覆盖本次请求的模型
return handler(request.override(model=model))
agent = create_agent(
model=basic_model,
tools=tools,
middleware=[dynamic_model_selection]
)
3. 动态工具 (Dynamic Tools)
根据用户权限或状态过滤可用工具。
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call
@wrap_model_call
def auth_based_tools(request, handler):
# 假设 state 中包含用户认证信息
is_admin = request.state.get("is_admin", False)
# 过滤工具列表
available_tools = [
t for t in request.tools
if not t.name.startswith("admin_") or is_admin
]
return handler(request.override(tools=available_tools))
agent = create_agent(
model,
tools=[user_tool, admin_tool],
middleware=[auth_based_tools]
)
记忆与状态 (Memory)
Agent 会自动在状态中维护 messages 列表。如果需要存储额外信息(如用户偏好),可以自定义状态 Schema。
from langchain.agents import create_agent, AgentState
from typing import TypedDict
# 1. 定义自定义状态
class CustomState(AgentState):
user_name: str
# 2. 创建带状态 Schema 的 Agent
agent = create_agent(
model,
tools=tools,
state_schema=CustomState
)
# 3. 调用时传入初始状态
response = agent.invoke({
"messages": [{"role": "user", "content": "你好"}],
"user_name": "Kingmusi"
})