完整项目:手把手做「旅行助手」
多工具、多步的典型形态——让 LangGraph 自动编排查天气、查票价、算预算
资料管家偏"问答"。这个项目换个味道:多工具、多步骤——做一个「旅行助手」。
你说一句:"我俩下周末从上海去杭州玩两天,看看天气、估下往返高铁总价、给点建议",它就自己:查天气 → 查票价 → 算总价 → 综合成建议。这次我们用 LangGraph(b1.2)把多个工具自动编排起来——这是真实世界 agent 最常见的形态之一。
设计:一个大脑,三只手
🔧 手把手:完整可运行的「旅行助手」
下面整段 复制即可运行。给它三个工具,LangGraph 让它自动编排:
# pip install "langgraph>=0.2" "langchain-openai>=0.2" # 钉版本,LangGraph 演进快
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="deepseek-chat",
base_url="https://api.deepseek.com", api_key="你的KEY")
def get_weather(city: str) -> str:
"""查询某城市未来几天的天气。""" # 演示用假数据,真实项目换天气 API
return f"{city}:周末晴转多云,18–26℃,适合出行。"
def train_price(route: str) -> str:
"""查询某条高铁线路的单程二等座票价。"""
return "上海→杭州 高铁二等座约 73 元/人(单程)。"
def calculator(expression: str) -> str:
"""做精确数学计算,输入算式字符串。"""
try:
return str(eval(expression)) # 教学演示,生产别用 eval
except Exception:
return "算式无效"
agent = create_react_agent(llm, tools=[get_weather, train_price, calculator])
out = agent.invoke({"messages": [("user",
"我和朋友 2 人下周末从上海去杭州玩两天,帮我看看天气、估算往返高铁总价、给点建议。")]})
print(out["messages"][-1].content)
运行后,它会自己排出顺序:查杭州天气 → 查上海到杭州单程票价(73) → 算往返两人的总价(单程 73 → 往返 ×2 → 两人 ×2,即 73*2*2 ≈ 292)→ 综合成一段建议(天气不错、往返高铁约 292 元、记得带件外套)。
📌 具体数字由模型当次计算得出,可能略有出入;重点看它会自己一步步规划、调用、综合,而不是这个确定的 292。
你只写了三个工具函数,"先查哪个、要不要算、怎么综合"全是它自己决定的——这就是多工具 agent 的威力,也是 LangGraph 替你省下的编排。
对比两个项目,你就懂了 agent 的两种典型形态
| 资料管家(b4.1) | 旅行助手(b4.2) | |
|---|---|---|
| 形态 | 问答型:RAG + 记忆 | 任务型:多工具 + 多步 |
| 核心 | 检索你的资料、有据回答 | 规划 + 调用多个工具 |
| 适合 | 知识库、客服、私人助理 | 行程、调研、自动化任务 |
掌握这两种,你就能套出绝大多数实用智能体了。
多工具 agent 最常见的毛病是选错工具或该用不用。两个关键:
- 每个工具的 docstring/描述写清楚"什么时候用我"——模型靠它选工具(呼应 a1.3)。
- 别一股脑塞十几个工具——只装这个任务真用得到的,多了它会挑花眼。
另外:示例里是假数据,真实项目把工具换成真 API(真天气、真票价),逻辑不变。
我想做一个多工具的任务型 agent:『___』(我来描述,如:帮我做菜谱+算食材采购清单)。请帮我:① 列出它需要哪 3-4 个工具(名字+docstring) ② 给出用 LangGraph create_react_agent 组装的完整代码 ③ 一个能体现多步编排的测试问题。
🏆 两个完整项目到手:资料管家(问答型)+ 旅行助手(任务型)——你已经能独立套出绝大多数实用智能体了。进阶篇(框架/评估/协议/自进化/训练/项目)到这就通关了!
接下来是选修扩展篇——像一篇篇小科普,按兴趣取用:智能体简史、求职面试题、GUI/Web Agent、怎么写好 Skill、开发踩坑经验。第一篇,我们轻松一下,聊聊智能体是怎么一步步走到今天的。
