Agent
将所有工具封装成json信息,在调用大模型时候传入所有JSON Schema
补充整理:下面是课后补充的原理说明与可运行示例,用于复习时对照。
Agent 和普通对话的区别
普通调用:问题进 → 答案出,模型只能「说」。
Agent:模型 + 工具 + 循环,模型可以「做」。
text
用户提问
↓
LLM 思考:要不要用工具?用哪个?参数是什么?
↓ ↓
直接回答 执行工具 → 拿到结果 → 塞回上下文 → 再思考
↓
直到能给出最终答案所以 Agent 的核心不是「模型更聪明」,而是给模型配了手和脚,并让它自己决定什么时候用。
工具是怎么告诉模型的
模型不认识 Python 函数,它只认识文本。所以要把工具翻译成结构化的 JSON Schema 一起传进去:
json
{
"name": "get_weather",
"description": "查询指定城市当前的天气情况",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名称,如 北京" }
},
"required": ["city"]
}
}三个字段都很关键:
name:模型后续回传时用来指定调用哪个工具。description:最重要。模型靠这段自然语言判断该不该用这个工具,写得含糊就会乱调或不用。parameters:约束入参,模型会照着 schema 拼 JSON。
在 Python 里定义工具
用 @tool 装饰器,文档字符串会自动变成 description,类型注解会变成 parameters:
python
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str:
"""查询指定城市当前的天气情况。用户问天气时调用它。"""
# 真实场景这里调天气 API
return f"{city}:晴,26℃"
@tool
def calculate(expr: str) -> str:
"""计算数学表达式,例如 12 * (3 + 4)。"""
return str(eval(expr))
tools = [get_weather, calculate]
print(get_weather.args_schema.model_json_schema()) # 看看生成的 JSON Schema经验:docstring 第一句写「做什么」,第二句写「什么时候用」,召回准确率会明显提升。
一个完整的 Agent
python
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_react_agent(llm, tools)
for step in agent.stream(
{"messages": [{"role": "user", "content": "北京今天天气怎么样?顺便算下 128 * 15"}]},
stream_mode="values"
):
step["messages"][-1].pretty_print()执行过程肉眼可见:
- 模型输出一个「工具调用请求」(不是最终答案)。
- 框架执行
get_weather("北京"),把结果作为tool消息追加。 - 模型看完结果继续思考,再调
calculate。 - 信息够了,输出最终回答。
这个「思考 → 调用 → 观察 → 再思考」的循环就是 ReAct 模式。
生产上要注意的事
- 限制轮数:不设上限,模型可能陷入死循环把 token 烧光。设
recursion_limit。 - 超时与兜底:外部工具会挂,必须有超时和失败话术。
- 工具别给太多:一次塞 20 个工具,模型选择质量会断崖下降。按场景动态裁剪到 5 个以内。
- 危险操作要human-in-the-loop:删数据、发消息、付款这类工具,加人工确认再执行。
