在这里插入图片描述

导读:还在让大模型只会“陪聊”?out了!真正的 AI 应用核心在于 Agent(智能体)。本文将带你深入 LangChain Agent 的核心机制,通过流程图解析完整代码实战避坑指南,手把手教你构建一个能联网搜索、能执行代码、能自主规划任务的超级助手。文末附带完整项目源码结构,建议收藏!


📖 一、为什么我们需要 Agent?

在传统的 LLM 应用中,模型通常是被动的:你问它答,它无法主动获取最新信息,也无法操作外部工具。

Agent 的本质 = 大模型 (大脑) + 规划能力 (思考) + 工具集 (手脚)

当用户提出一个复杂问题(例如:“帮我查一下特斯拉昨天的股价,并画一张走势图”)时:

  1. 感知:Agent 理解用户意图。
  2. 规划:大模型决定需要先调用“搜索工具”查股价,再调用“绘图工具”画图。
  3. 行动:Agent 执行工具调用。
  4. 观察:获取工具返回的结果。
  5. 反思:如果结果不够,继续规划;如果够了,生成最终回答。

🔄 Agent 核心工作流图解

工具集

需要工具?

可以直接回答

用户输入

Agent 核心控制器

大模型思考

生成行动计划: Action & Input

工具执行器

🔍 搜索工具

🧮 计算器/代码解释器

💾 数据库查询

观察结果

生成最终回复


🛠️ 二、环境准备与核心组件

在开始之前,确保你安装了必要的库。我们将使用 langchain 生态中最稳定的组件。

pip install langchain langchain-openai langchain-community tavily-python matplotlib pandas

核心组件介绍

  1. LLM (大脑):推荐使用支持 Function Calling 的模型(如 GPT-4, DeepSeek-V2, Claude 3)。
  2. Tools (手脚):预定义或自定义的 Python 函数。
  3. Prompt (指令):告诉 Agent 如何思考、如何使用工具的 System Prompt。
  4. 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 机制。

  1. 上下文注入:每次循环,Agent 会将之前的 Thought, Action, Observation 全部追加到 Prompt 的末尾。
  2. 少样本学习 (Few-Shot):虽然我们在代码中没写,但 LangChain 的默认 Prompt 里其实隐含了 ReAct 的格式示例。
  3. 停止符 (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:
    1. Planner: 先将大任务拆解为子任务列表 [Task A, Task B, Task C]
    2. Executor: 依次或并行执行子任务。
    3. Synthesizer: 汇总所有结果,生成最终报告。

在 LangChain 中,可以通过 create_plan_and_execute_agent 实现,或者基于 LangGraph 构建自定义状态机(State Graph),这是目前业界最主流的生产级方案。


📝 六、总结与展望

通过本文,我们完成了:

  1. ✅ 理解了 Agent 的 ReAct 核心原理
  2. ✅ 掌握了 Tools 定义Prompt 设计 的关键技巧。
  3. ✅ 实战了一个能 搜索 + 计算 + 绘图 的多模态 Agent。

未来的方向:

  • 多 Agent 协作:让“研究员 Agent”、“程序员 Agent”、“审核员 Agent”互相开会解决问题。
  • 长期记忆:结合 Vector Database,让 Agent 记住用户的偏好和历史交互。
  • 自主性:从“问答”走向“自主执行”,例如自动订机票、自动部署代码。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐