实战详解:从零构建 LangChain 智能 Agent,让大模型真正“动起来”!
文章目录

导读:还在让大模型只会“陪聊”?out了!真正的 AI 应用核心在于 Agent(智能体)。本文将带你深入 LangChain Agent 的核心机制,通过流程图解析、完整代码实战和避坑指南,手把手教你构建一个能联网搜索、能执行代码、能自主规划任务的超级助手。文末附带完整项目源码结构,建议收藏!
📖 一、为什么我们需要 Agent?
在传统的 LLM 应用中,模型通常是被动的:你问它答,它无法主动获取最新信息,也无法操作外部工具。
Agent 的本质 = 大模型 (大脑) + 规划能力 (思考) + 工具集 (手脚)
当用户提出一个复杂问题(例如:“帮我查一下特斯拉昨天的股价,并画一张走势图”)时:
- 感知:Agent 理解用户意图。
- 规划:大模型决定需要先调用“搜索工具”查股价,再调用“绘图工具”画图。
- 行动:Agent 执行工具调用。
- 观察:获取工具返回的结果。
- 反思:如果结果不够,继续规划;如果够了,生成最终回答。
🔄 Agent 核心工作流图解
🛠️ 二、环境准备与核心组件
在开始之前,确保你安装了必要的库。我们将使用 langchain 生态中最稳定的组件。
pip install langchain langchain-openai langchain-community tavily-python matplotlib pandas
核心组件介绍
- LLM (大脑):推荐使用支持 Function Calling 的模型(如 GPT-4, DeepSeek-V2, Claude 3)。
- Tools (手脚):预定义或自定义的 Python 函数。
- Prompt (指令):告诉 Agent 如何思考、如何使用工具的 System Prompt。
- Executor (执行器):负责循环执行“思考 - 行动 - 观察”的引擎。
💻 三、实战代码:构建“全能数据分析师”Agent
本案例将构建一个 Agent,它具备以下能力:
- 🔍 联网搜索:获取实时新闻或数据。
- 🐍 Python 代码解释器:进行复杂数学计算或数据绘图。
1. 定义工具 (Tools)
首先,我们需要给 Agent 配备“武器”。LangChain 提供了丰富的内置工具,也支持自定义。
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_experimental.tools import PythonREPLTool
from langchain_core.tools import tool
# 初始化搜索工具 (需设置 TAVILY_API_KEY)
search_tool = TavilySearchResults(max_results=3)
# 初始化 Python 代码执行工具 (慎用,生产环境需沙箱隔离)
python_tool = PythonREPLTool()
# 自定义工具示例:获取当前时间
@tool
def get_current_time(*args, **kwargs) -> str:
"""获取当前的日期和时间,格式为 YYYY-MM-DD HH:MM:SS"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 组装工具列表
tools = [search_tool, python_tool, get_current_time]
2. 构建 Agent 逻辑 (ReAct 模式)
我们将使用经典的 ReAct (Reasoning + Acting) 范式。LangChain 提供了 create_react_agent 快速构建。
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
# 1. 初始化大模型
llm = ChatOpenAI(
model="gpt-4-turbo", # 或者 deepseek-chat 等支持 function calling 的模型
temperature=0,
api_key="YOUR_API_KEY"
)
# 2. 定义提示词模板 (这是 Agent 的灵魂)
# LangChain 内置了 ReAct 的 prompt,也可以自定义
base_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个强大的 AI 助手。
你可以使用以下工具来帮助用户解决问题:
{tools}
请严格按照以下步骤思考:
1. Thought: 分析用户问题,思考是否需要使用工具。
2. Action: 如果需要,选择正确的工具名称。
3. Action Input: 构造工具的输入参数。
4. Observation: 等待工具返回结果。
5. 重复上述步骤直到获得足够信息。
6. Final Answer: 给出最终回答。
注意:如果不需要工具,直接给出 Final Answer。
"""),
("human", "{input}"),
("placeholder", "{agent_scratchpad}") # 用于存储历史对话和思维链
])
# 3. 创建 Agent
agent = create_react_agent(llm, tools, base_prompt)
# 4. 创建执行器 (AgentExecutor)
# handle_parsing_errors=True 可以让 Agent 在格式错误时自动重试
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 开启详细日志,方便调试
handle_parsing_errors=True,
max_iterations=5 # 防止死循环
)
3. 运行测试
让我们看看 Agent 如何处理一个需要多步推理和工具调用的复杂任务。
任务:“查询今天比特币的价格,并计算如果我在昨天买入 1000 美元,今天卖出能赚多少(假设昨天价格是今天的 95%),最后画出收益示意图。”
query = "查询今天比特币的价格,并计算如果我在昨天买入 1000 美元,今天卖出能赚多少(假设昨天价格是今天的 95%),最后用 python 画出收益示意图。"
print(f"🚀 开始处理任务: {query}\n")
response = agent_executor.invoke({"input": query})
print(f"\n✅ 最终回答:\n{response['output']}")
🖥️ 预期控制台输出日志 (Verbose Mode)
> Entering new AgentExecutor chain...
Thought: 我需要先查询今天比特币的价格。
Action: tavily_search_results_json
Action Input: {"query": "Bitcoin price today USD"}
Observation: [{"content": "Bitcoin is currently trading at $65,000...", ...}]
Thought: 我得到了今天的价格 ($65,000)。根据题目,昨天价格是今天的 95%。我需要计算收益并画图。
Action: python_repl_ast
Action Input:
price_today = 65000
price_yesterday = price_today * 0.95
investment = 1000
btc_bought = investment / price_yesterday
value_today = btc_bought * price_today
profit = value_today - investment
print(f"Profit: {profit}")
import matplotlib.pyplot as plt
plt.bar(['Yesterday', 'Today'], [investment, value_today])
plt.title('Investment Growth')
plt.savefig('result.png')
"Done"
Observation: Profit: 52.63... (Image saved)
Thought: 我已经完成了计算和绘图,现在可以回答用户了。
Final Answer: 今天比特币价格约为 $65,000。如果你昨天投入 1000 美元,今天卖出可获利约 52.63 美元。收益图已生成如下...
> Finished chain.
🧠 四、深度解析:Agent 是如何“思考”的?
很多初学者困惑:为什么模型知道什么时候该停?什么时候该调用工具?
这归功于 Prompt Engineering 中的 agent_scratchpad 机制。
- 上下文注入:每次循环,Agent 会将之前的
Thought,Action,Observation全部追加到 Prompt 的末尾。 - 少样本学习 (Few-Shot):虽然我们在代码中没写,但 LangChain 的默认 Prompt 里其实隐含了 ReAct 的格式示例。
- 停止符 (Stop Tokens):执行器会监控模型的输出,一旦检测到 “Final Answer” 关键词,就停止生成,认为任务完成。
⚠️ 常见坑点与优化策略
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| 死循环 | 模型一直找不到正确工具,或工具报错导致无限重试。 | 1. 设置 max_iterations。2. 优化 Tool 的 Description,让模型更懂何时调用。3. 增加 handle_parsing_errors 容错。 |
| 工具调用失败 | 模型生成的 JSON 参数格式错误。 | 使用支持 Function Calling 原生能力的模型(如 GPT-4, DeepSeek),而非纯文本补全模型。 |
| 幻觉严重 | 模型编造工具返回结果。 | 在 Prompt 中强调:“必须严格依据 Observation 内容回答,严禁编造数据”。 |
| 响应慢 | 多轮工具调用耗时久。 | 1. 并行化工具调用 (Plan-and-Solve 模式)。2. 缓存常用搜索结果。 |
🚀 五、进阶:从 ReAct 到 Plan-and-Solve
上面的 ReAct 模式是“走一步看一步”。对于超复杂任务(如“分析过去 5 年特斯拉财报并预测明年趋势”),我们需要更高级的 Plan-and-Solve 架构。
流程差异:
- ReAct: 思考 -> 行动 -> 观察 -> (循环)
- Plan-and-Solve:
- Planner: 先将大任务拆解为子任务列表
[Task A, Task B, Task C]。 - Executor: 依次或并行执行子任务。
- Synthesizer: 汇总所有结果,生成最终报告。
- Planner: 先将大任务拆解为子任务列表
在 LangChain 中,可以通过 create_plan_and_execute_agent 实现,或者基于 LangGraph 构建自定义状态机(State Graph),这是目前业界最主流的生产级方案。
📝 六、总结与展望
通过本文,我们完成了:
- ✅ 理解了 Agent 的 ReAct 核心原理。
- ✅ 掌握了 Tools 定义 与 Prompt 设计 的关键技巧。
- ✅ 实战了一个能 搜索 + 计算 + 绘图 的多模态 Agent。
未来的方向:
- 多 Agent 协作:让“研究员 Agent”、“程序员 Agent”、“审核员 Agent”互相开会解决问题。
- 长期记忆:结合 Vector Database,让 Agent 记住用户的偏好和历史交互。
- 自主性:从“问答”走向“自主执行”,例如自动订机票、自动部署代码。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)