
本文分享基于 LangChain 框架开发的智能旅游助手 Agent,核心功能是「查询城市天气 + 根据天气推荐景点」,并对比 ReAct 与 FunctionCall 两种 Agent 实现模式的差异,同时总结 LangChain 框架的使用优势。
ReAct 模式的核心是「思考-行动-观察」循环,通过提示词约束 LLM 输出固定格式的文本(Thought/Action/Action Input),再解析文本执行工具。
关键函数:
_json_objects_in_text:从 LLM 输出的杂乱文本中提取 JSON 对象(解决 LLM 易拼接无关文本的问题);
_weather_params_from_input/_attraction_params_from_input:解析工具入参,分别适配天气/景点工具的参数结构;
工具装饰器 @tool:定义工具描述与入参格式,ReAct 模式下工具入参为 JSON 字符串,需手动解析;
Prompt 模板:严格定义 ReAct 格式(Thought/Action/Action Input/Final Answer),并加入「防重复调用」规则约束。
Agent 初始化:
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[get_weather, get_attraction],
)
agent_executor = AgentExecutor(
agent=agent,
memory=memory,
tools=[get_weather, get_attraction],
verbose=True,
handle_parsing_errors="返回到上一步并重新尝试,确保Action Input是有效的JSON格式",
max_iterations=8,
early_stopping_method="generate",
stream_runnable=False,
)FunctionCall 模式利用 LLM 的工具调用能力,让模型输出结构化的工具调用指令,无需手动解析文本。
WeatherInput/AttractionInput),替代 ReAct 模式的 JSON 字符串解析;city: str, weather: str),无需手动提取;MessagesPlaceholder 管理对话历史与 Agent 思考过程,无需手动定义 ReAct 格式。.env 中的 AGENT_MODE 加载 ReAct 或 FunctionCall 版本的 Agent;/api/chat:接收用户消息,调用 Agent 并返回结果;/api/chat/reset:清空对话记忆;fetch 调用后端接口,处理网络错误与服务端异常。LLM 输出的 Action Input 常拼接无关文本(如 Observation 内容),导致 JSON 解析失败,报错「无法解析 LLM 的输出」。
_json_objects_in_text 从杂乱文本中精准提取 JSON 对象,忽略无关拼接内容;_weather_params_from_input/_attraction_params_from_input 针对天气 / 景点工具的参数结构,分别处理 JSON 解析逻辑;LLM 可能因「确认天气」「翻译推荐结果」等原因重复调用同一城市的天气 / 景点工具。
get_weather/get_attraction 最多调用 1 次;维度 | ReAct 模式 | FunctionCall 模式 |
|---|---|---|
核心原理 | 基于「思考 - 行动 - 观察」文本循环,手动定义格式并解析 | 利用 LLM 原生工具调用能力,输出结构化指令 |
参数处理 | 需手动解析 JSON 字符串,易受格式污染 | 基于 Pydantic 自动校验入参,结构化参数直接使用 |
提示词复杂度 | 高:需严格定义 ReAct 格式(Thought/Action 等) | 低:仅需描述工具用途,格式由框架自动处理 |
灵活性 | 高:可自定义任意格式的思考过程 | 中:受 LLM 工具调用格式约束 |
稳定性 | 低:易因 LLM 输出格式偏差导致解析失败 | 高:结构化输出,解析成功率高 |
适用场景 | 复杂推理场景(需显式思考过程) | 简单工具调用场景(参数明确、逻辑固定) |
@tool 装饰器,可快速定义工具描述、入参 Schema,原生手写需手动设计工具注册 / 调用逻辑;ConversationBufferMemory 等记忆组件,一键集成对话上下文管理,原生手写需手动维护会话状态;AgentExecutor 封装了「思考 - 调用工具 - 处理结果」的循环逻辑,原生手写需手动实现循环控制、最大迭代次数、错误处理;handle_parsing_errors),可快速适配 LLM 输出异常场景。本次项目通过 LangChain 实现了两种模式的旅游助手 Agent,实践发现:
后续可优化方向:
Github连接:https://github.com/KevinJosephDavis/TravelAgent.git
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。