引言:AI 行业的范式转变
🚀 AI 正在从「回答问题」走向「解决问题」
过去的几年里,我们见证了 大语言模型(LLM) 的崛起。从 GPT-3 到 GPT-4,从 Claude 到 Gemini,这些模型展现出了惊人的语言理解和生成能力。它们能够写代码、创作文章、翻译语言,甚至能够通过各种考试。
然而,有一个根本性的限制:传统 LLM 只能被动地响应输入,你问一句,它答一句。它们不具备主动规划、执行多步骤任务的能力,也无法真正「行动」于现实世界。
为什么 Agent 是下一个热点?
Agent(智能体) 正是为了解决这些问题而诞生的概念。与传统 LLM 不同,Agent 能够:
- 🔄 自主规划 - 将复杂任务分解为步骤
- 🛠️ 使用工具 - 调用搜索引擎、代码解释器、API 等
- 📝 记忆上下文 - 记住之前的交互和结果
- 🔁 迭代执行 - 根据反馈调整行动,直到完成任务
这就是 AI 行业正在发生的范式转变:从**「你说我答」** 的被动模式 ,走向**「你说我做」** 的主动模式。
📖 写在前面 :本文将带你从概念到实战,全面理解 Agent 的核心原理。我们会深入探讨 ReAct 框架 和 Tool Use(工具使用) 这两大关键技术,最后你会看到一个完整的 Agent 示例,学会如何构建自己的第一个智能体。
准备好了吗?让我们开始吧!🚀
第一部分:Agent 是什么?
🤖 Agent 是能够自主决策并执行行动的 AI 系统,它超越了传统 LLM 的「被动回答」模式。
传统 AI vs Agent:核心区别
在深入 Agent 之前,我们需要先理解传统 LLM 和 Agent 之间的本质差异。
| 特性 | 传统 LLM | Agent |
|---|---|---|
| 交互模式 | 被动响应,一次性回答 | 主动规划,持续交互 |
| 执行能力 | 仅生成文本 | 可执行代码、调用工具 |
| 状态管理 | 无状态(每轮独立) | 有记忆,可记住上下文 |
| 任务处理 | 单轮问答 | 多步骤任务分解与执行 |
| 反馈利用 | 不利用输出反馈 | 基于观察结果迭代优化 |
传统 LLM 的局限性
想象一下这个场景:你对 ChatGPT 说「帮我订一张下周去上海的机票」。
传统 LLM 的回答可能是:
「好的,我可以帮你订机票。你需要提供以下信息:出发城市、出发日期、预算、航空公司偏好...」
它只能生成建议 ,无法真正帮你完成订票这个行动。
Agent 的处理方式
同样的任务,Agent 会这样做:
- 🧠 理解任务 - 解析你的意图:订机票
- 📋 规划步骤 - 分解为:查航班 → 比价 → 选择 → 下单
- 🔍 执行行动 - 调用航司 API 或搜索工具查询航班
- 📝 记忆结果 - 保存查询结果以便后续比较
- 🔄 迭代执行 - 根据你的反馈调整选择,直到完成订单
这就是 Agent 的魅力:它不仅能回答问题,还能解决问题。
Agent 的核心特征:感知 → 推理 → 行动 → 记忆
根据 AI 领域的共识,一个完整的 Agent 系统包含四个核心能力。正如经典教材《Artificial Intelligence: A Modern Approach》(Stuart Russell & Peter Norvig)所定义:
"An agent is anything that can be viewed as perceiving its environment through sensors and acting upon that environment through actuators."
┌─────────────────────────────────────────────────────────────┐
│ 🤖 Agent 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 感知 │ -> │ 推理 │ -> │ 行动 │ -> │ 记忆 │ │
│ │(Perceive)│ │(Reason) │ │(Act) │ │(Memory) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ v v v v │
│ • 读取输入 • 理解意图 • 调用工具 • 存储上下文 │
│ • 环境信息 • 规划步骤 • 执行操作 • 检索历史 │
│ • 工具返回 • 逻辑推理 • 生成响应 • 持续学习 │
│ │
└─────────────────────────────────────────────────────────────┘
1. 感知(Perception)
Agent 通过感知模块获取信息和环境状态,包括:
- 用户输入(自然语言指令)
- 工具返回的结果(搜索结果、API 响应等)
- 外部环境数据(时间、位置、系统状态等)
2. 推理(Reasoning)
Agent 的大脑负责理解和决策:
- 意图理解 - 理解用户真正想要什么
- 任务分解 - 将复杂任务拆解为可执行的子任务
- 逻辑推理 - 基于已知信息推导出下一步行动
- 策略选择 - 决定使用哪个工具、哪种方法
💡 提示 :在 LangChain 中,这部分通常由 LLM 本身完成,通过**提示词(Prompt)**来指导模型进行推理。
3. 行动(Action)
Agent 通过行动模块与外部世界交互:
- 调用搜索引擎获取信息
- 执行 Python 代码进行计算
- 调用外部 API 完成实际操作
- 生成自然语言响应给用户
4. 记忆(Memory)
Agent 的记忆系统使其能够:
- 短期记忆 - 记住当前对话的上下文
- 长期记忆 - 存储历史经验供后续参考
- 上下文管理 - 在多轮交互中保持连贯性
Agent 的能力边界
理解 Agent 的能力边界很重要:
✅ Agent 擅长
- 📝 文本处理 - 理解、生成、翻译、摘要
- 🔍 信息检索 - 搜索、过滤、整合信息
- 💻 代码执行 - 编写、运行、分析代码
- 🔄 任务自动化 - 流程编排、多步骤执行
- 📊 数据分析 - 处理结构化/非结构化数据
⚠️ Agent 的局限
- 🚫 无法真正「理解」物理世界 - 它通过文字和数据理解世界
- 🚫 依赖工具质量 - 工具的准确性决定了 Agent 的输出质量
- 🚫 可能产生幻觉 - 在推理过程中可能得出错误结论
- 🚫 安全风险 - 错误使用可能导致数据泄露或恶意操作
小结
Agent 是 AI 从「回答」走向「行动」 的关键一步。它通过感知、推理、行动、记忆四个核心能力,实现了从被动响应到主动执行的转变。
📌 重点回顾 : - Agent ≠ LLM,Agent 是建立在 LLM 之上的系统 - 四大核心能力:感知 → 推理 → 行动 → 记忆 - Agent 的价值在于解决问题,而不仅仅是回答问题
第二部分:ReAct 框架
🧠 ReAct 让 AI 学会「边想边做」,通过推理指导行动,通过行动验证推理,形成闭环。
什么是 ReAct?
ReAct(Reasoning + Acting) 是由 Google Research 在 2022 年提出的框架(论文:Synergizing Reasoning and Acting in Language Models,Yao et al.),旨在解决 LLM 在复杂任务中推理链断裂的问题。
核心思想很简单:
在执行行动之前进行推理,用推理指导行动,用行动结果验证推理。
这模仿了人类解决问题的过程:遇到问题时,我们会先思考(Reasoning),然后尝试(Acting),根据结果调整思考,再继续尝试,直到问题解决。
ReAct vs 传统方法
| 方法 | 特点 | 适用场景 |
|---|---|---|
| Chain-of-Thought (CoT) | 只推理,不行动 | 数学推理、逻辑分析 |
| Action-only | 只行动,不推理 | 简单指令执行 |
| ReAct | 推理 + 行动 + 观察 | 复杂多步骤任务 |
Thought → Action → Observation 循环
ReAct 的核心是Thought-Action-Observation(T-A-O)循环:
┌─────────────────────────────────────────────────────────────┐
│ 🔄 ReAct 循环流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ 用户 │ │
│ │ 输入 │ │
│ └────┬────┘ │
│ │ │
│ v │
│ ┌─────────┐ │
│ │ Thought │ 🤔 思考:分析任务,决定下一步行动 │
│ └────┬────┘ │
│ │ │
│ v │
│ ┌─────────┐ │
│ │ Action │ 🔧 行动:执行工具调用 │
│ └────┬────┘ │
│ │ │
│ v │
│ ┌─────────┐ │
│ │ Obs │ 👁️ 观察:获取行动结果,用于下一步推理 │
│ └────┬────┘ │
│ │ │
│ └─────返回「Thought」继续循环,直到任务完成─────> │
│ │
└─────────────────────────────────────────────────────────────┘
各阶段详解
1. Thought(思考)
Agent 分析当前状态,考虑: - 用户想要什么? - 我现在知道什么? - 下一步应该做什么? - 使用哪个工具?
2. Action(行动)
Agent 执行具体的操作: - 调用搜索引擎 - 执行代码 - 调用 API - 或者直接生成回答
3. Observation(观察)
Agent 获取行动的结果,并将其作为下一轮推理的输入: - 搜索返回的结果 - 代码执行的输出 - API 响应的数据
经典案例分析
让我们通过一个具体例子来理解 ReAct:
任务:「查一下 Python 3.12 的新特性,然后总结成 3 点」
第一次循环
Thought:用户想要了解 Python 3.12 的新特性,我需要先搜索相关信息。
Action :search[Python 3.12 new features]
Observation:搜索返回了 Python 3.12 的官方发布说明和新特性列表...
第二次循环
Thought:我已经获取了 Python 3.12 的新特性信息,现在需要阅读详细内容并提取关键点。
Action :visit[Python 3.12 release notes]
Observation:获取到以下关键特性: 1. 错误消息改进 2. PEP 695 类型参数语法 3. F-string 增强 ...
第三次循环
Thought:我已经收集到足够的信息,现在可以总结成 3 点并回复用户。
Action :finish[总结 Python 3.12 的 3 个新特性...]
ReAct 在 LangChain 中的实现
LangChain 提供了对 ReAct 框架的原生支持。以下是基于最新版 LangChain(使用 LangGraph 构建)的 ReAct Agent 示例:
版本说明 :以下代码基于 LangChain 最新版(2026)。LangChain 的 Agent 系统现已基于 LangGraph 构建,使用
create_agent作为主要 API。
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool
# 1. 定义工具(使用 @tool 装饰器)
@tool
def search(query: str) -> str:
"""搜索互联网获取实时信息。
Args:
query: 搜索关键词
Returns:
搜索结果摘要
"""
return f"搜索结果:{query}的相关信息..."
@tool
def visit_page(url: str) -> str:
"""访问指定 URL 获取页面内容。
Args:
url: 要访问的网页地址
Returns:
页面内容摘要
"""
return "页面内容..."
tools = [search, visit_page]
# 2. 创建 Agent
# 注意:模型名称需根据实际可用的 OpenAI 模型调整
# 可选:gpt-4o-mini, gpt-4o, gpt-3.5-turbo 等
# 请确保你的 OpenAI API Key 有权限访问所选模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_agent(
model=llm,
tools=tools,
system_prompt="你是一个助手,可以使用搜索和访问网页的工具获取信息。请根据用户需求选择合适的工具。"
)
# 3. 执行 Agent
result = agent.invoke({
"messages": [{"role": "user", "content": "查一下 Python 3.12 的新特性,然后总结成 3 点"}]
})
print(result["messages"][-1].content)
关键点解析
- 工具定义 :使用
@tool装饰器定义工具,函数的 docstring 会自动成为工具描述 - Agent 创建 :
create_agent是新版主要 API,基于 LangGraph 构建,内置 ReAct 循环逻辑 - 消息格式 :新版 Agent 使用
messages格式输入和输出 - 模型选择:示例中的模型名称需根据实际可用模型调整
ReAct 的优势与局限
✅ 优势
- 可解释性强 - 每一步都清晰可见,方便调试
- 可靠性高 - 通过 Observation 验证推理结果
- 灵活性好 - 可接入任意工具,适应多种场景
- 错误恢复 - 可以在循环中修正错误
⚠️ 局限
- 循环开销 - 多次 LLM 调用增加延迟和成本
- 推理长度限制 - 复杂任务可能超出模型上下文窗口
- 工具依赖 - 效果很大程度上取决于工具的质量
小结
ReAct 框架通过 Thought → Action → Observation 的循环,让 Agent 能够在推理中行动,在行动中推理。
📌 重点回顾 : - Thought :分析现状,决定下一步 - Action :执行工具调用 - Observation:获取结果,用于下一轮推理 - 循环直到任务完成
第三部分:Tool Use(工具使用)
🔧 工具是 Agent 的「手」和「脚」,让它能够真正行动于现实世界,完成从「思考」到「执行」的跨越。
为什么 Agent 需要工具?
LLM 虽然强大,但它有两个根本性局限:
- 知识截止 - 训练数据有时间限制,无法获取最新信息
- 无法行动 - 只能生成文本,无法真正操作外部系统
工具(Tools) 正是为了解决这些问题:
┌─────────────────────────────────────────────────────────────┐
│ 🛠️ 工具如何扩展 Agent 能力 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ LLM 本身 │ + │ 工具 │ │
│ │ │ │ │ │
│ │ • 推理 │ │ • 搜索 │ │
│ │ • 规划 │ │ • 计算 │ │
│ │ • 生成文本 │ │ • 调用API │ │
│ │ │ │ • 执行代码 │ │
│ └─────────────┘ └─────────────┘ │
│ │ │ │
│ └──────────┬─────────────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 🤖 Agent │ │
│ │ 能够感知、推理 │ │
│ │ 行动、记忆 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
工具的核心作用
| 能力 | 无工具时 | 有工具后 |
|---|---|---|
| 获取实时信息 | ❌ 受限于训练数据 | ✅ 搜索、API 调用 |
| 执行计算 | ❌ 只能估算 | ✅ 代码执行 |
| 操作外部系统 | ❌ 无法实际执行 | ✅ API 调用 |
| 访问私有数据 | ❌ 无法访问 | ✅ 数据库查询 |
工具描述与注册
要让 Agent 正确使用工具,我们需要提供清晰的工具描述 。这是因为 Agent 是通过理解工具描述来决定调用哪个工具的。
工具描述的关键要素
每个工具都应该包含:
- 工具名称(name) - 简洁、描述性
- 功能描述(description) - 工具作用的详细说明
- 参数模式(parameters) - 输入参数的 schema
LangChain 工具定义示例
from langchain.tools import tool
from pydantic import BaseModel, Field
# 方式 1:使用 @tool 装饰器(简化方式)
@tool
def search_news(query: str) -> str:
"""搜索最新的新闻资讯。
Args:
query: 搜索关键词,如"AI"、"科技"等
Returns:
搜索结果列表,包含标题、来源、摘要
"""
return f"关于 {query} 的最新新闻..."
# 方式 2:使用 Pydantic 模型(推荐方式)
class SearchInput(BaseModel):
query: str = Field(description="搜索关键词")
limit: int = Field(default=10, description="返回结果数量")
@tool(args_schema=SearchInput)
def search_wiki(query: str, limit: int = 10) -> str:
"""搜索维基百科条目。
适用于查询人物、地点、历史事件等百科知识。
"""
return f"找到 {limit} 条关于 {query} 的结果"
工具注册
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
tools = [search_news, search_wiki]
# 注意:模型名称需根据实际可用的 OpenAI 模型调整
# 可选:gpt-4o-mini, gpt-4o, gpt-3.5-turbo 等
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_agent(model=llm, tools=tools, system_prompt="你是一个助手")
工具选择策略
Agent 如何决定使用哪个工具?这涉及到**工具选择(Tool Selection)**的策略。
1. 基于描述的匹配
最常见的方式是让 LLM 根据工具描述进行匹配:
用户问题:「Python 3.12 有什么新特性?」
Agent 分析:
- 问题关于 Python 版本新特性
- 需要获取最新信息
- 搜索工具 description: "搜索最新的新闻资讯" ✓ 匹配
- 计算工具 description: "执行数学计算" ✗ 不匹配
决策:调用 search_news 工具
2. 强制工具调用
可以通过提示词强制 Agent 使用特定工具:
prompt = """你是一个研究助手。
用户问题:{input}
你必须按照以下步骤回答:
1. 首先使用 search 工具搜索相关信息
2. 然后使用 visit 工具获取详细内容
3. 最后总结答案
禁止直接生成答案,必须先搜索!"""
常见工具类型
1. 🔍 搜索工具
@tool
def web_search(query: str) -> str:
"""使用搜索引擎查找最新信息。"""
pass
@tool
def wiki_search(query: str) -> str:
"""搜索维基百科获取百科知识。"""
pass
2. 💻 代码执行工具
@tool
def python_executor(code: str) -> str:
"""执行 Python 代码并返回结果。
适用于:数学计算、数据分析、文本处理等。
"""
pass
3. 🌐 API 调用工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的实时天气信息。"""
pass
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""发送电子邮件。"""
pass
4. 📊 数据处理工具
@tool
def query_database(sql: str) -> str:
"""执行 SQL 查询从数据库获取数据。"""
pass
@tool
def read_file(path: str) -> str:
"""读取指定路径的文件内容。"""
pass
5. 🔄 自定义工具
@tool
def order_product(product_id: str, quantity: int) -> str:
"""创建订单,购买指定商品。
Args:
product_id: 商品 ID
quantity: 购买数量
"""
pass
图解 Tool Use 架构
┌─────────────────────────────────────────────────────────────┐
│ 🔧 Tool Use 完整架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 👤 用户 │ │
│ │ 「帮我查下北京天气」 │ │
│ └─────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🧠 LLM │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 理解意图:用户想查询北京天气 │ │ │
│ │ │ 选择工具:get_weather │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ Tool Call │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🔧 工具注册表 │ │
│ │ │ │
│ │ • get_weather(city: str) -> str │ │
│ │ • search_news(query: str) -> str │ │
│ │ • python_executor(code: str) -> str │ │
│ │ • send_email(to, subject, body) -> str │ │
│ │ │ │
│ └─────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ Execution │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 🌐 外部世界 │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 天气 API │ │ 搜索引擎 │ │ 代码执行 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │
│ └─────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ Result │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 📝 生成回复 │ │
│ │ 「北京今天天气:晴,23°C,东南风2级」 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
小结
Tool Use(工具使用) 是 Agent 区别于传统 LLM 的关键能力。
📌 重点回顾 : - 工具让 Agent 能够获取实时信息 、执行操作 - 工具描述 是 Agent 选择工具的依据 - 常见工具类型:搜索、代码执行、API 调用、数据处理 - 工具选择策略:基于描述匹配 、强制调用
第四部分:LangChain Agent 实战--从零构建你的第一个智能体
在了解了 AI Agent 的核心概念后,让我们用 LangChain 框架亲手构建一个真正可运行的智能体。本节将带你完成环境搭建、依赖安装、代码编写、运行测试的全流程。
版本说明:本节代码基于 LangChain 最新版(2026)编写。LangChain 更新较快,API 可能有所变化。如遇 API 变化,请查阅官方文档:https://docs.langchain.com
环境准备
Python 版本要求
LangChain 需要 Python 3.10 或更高版本。建议使用 Python 3.11 或 3.12 以获得最佳性能和兼容性。
# 检查 Python 版本
python --version
# 推荐输出: Python 3.11.x 或更高
创建虚拟环境
# 创建项目目录
mkdir langchain-agent-demo
cd langchain-agent-demo
# 创建虚拟环境
python -m venv .venv
# 激活虚拟环境
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows
安装依赖
LangChain 采用模块化架构,按需安装:
# 完整安装命令
pip install langchain langchain-community langchain-openai duckduckgo-search
包说明 : -
langchain:核心框架 -langchain-community:社区集成包(包含 DuckDuckGo 搜索等工具) -langchain-openai:OpenAI 模型集成 -duckduckgo-search:DuckDuckGo 搜索库
OpenAI API Key 获取
-
登录账号并进入 API Keys 页面
-
创建新的 API Key
-
配置环境变量:
export OPENAI_API_KEY="your-api-key-here"
安全提示:永远不要将 API Key 硬编码在代码中或上传到公开仓库。
模型选择说明 : - 示例代码使用gpt-4o-mini作为默认模型,这是 OpenAI 提供的性价比优秀的模型 - 你可用的模型取决于你的 OpenAI API Key 权限和账户类型 - 常见可选模型:gpt-4o-mini(推荐,性价比高)、gpt-4o(能力强)、gpt-3.5-turbo(经济型) - 如遇模型不可用错误,请登录 OpenAI Platform 查看你的账户支持哪些模型
完整代码
将以下代码保存为 agent_demo.py:
# -*- coding: utf-8 -*-
"""
LangChain Agent 示例:搜索增强问答智能体
使用 OpenAI GPT 模型作为 LLM 后端
使用 DuckDuckGo 搜索作为外部工具
"""
import os
from langchain.agents import create_agent
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_openai import ChatOpenAI
# ============================================
# 1. 配置 API Key
# ============================================
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
raise ValueError(
"请设置 OPENAI_API_KEY 环境变量\n"
"示例: export OPENAI_API_KEY='your-api-key'"
)
# ============================================
# 2. 初始化 LLM
# ============================================
# 注意:模型名称需根据实际可用的 OpenAI 模型调整
# 可选:gpt-4o-mini, gpt-4o, gpt-3.5-turbo 等
# 请确保你的 OpenAI API Key 有权限访问所选模型
llm = ChatOpenAI(
model="gpt-4o-mini", # 或 gpt-4o、gpt-3.5-turbo 等
temperature=0.7,
)
# ============================================
# 3. 定义工具
# ============================================
# 使用 langchain-community 的 DuckDuckGo 搜索工具
# 需要安装:pip install langchain-community duckduckgo-search
# 注意:如果 DuckDuckGoSearchRun 导入失败,可以使用 @tool 装饰器自定义搜索工具
search_tool = DuckDuckGoSearchRun()
tools = [search_tool]
# ============================================
# 4. 创建 Agent
# ============================================
agent = create_agent(
model=llm,
tools=tools,
system_prompt="""你是一个乐于助人的 AI 助手。
你可以使用搜索工具来获取最新信息。当用户的问题需要实时数据、新闻或你不确定的事实时,请使用搜索工具。
请始终保持友好和专业的态度,给出准确、有帮助的回答。""",
)
# ============================================
# 5. 运行 Agent
# ============================================
def run_agent(query: str):
"""运行 Agent 处理用户查询"""
result = agent.invoke(
{"messages": [{"role": "user", "content": query}]}
)
last_message = result["messages"][-1]
return last_message.content
# ============================================
# 6. 测试示例
# ============================================
if __name__ == "__main__":
print("=" * 50)
print("LangChain Agent 搜索问答演示")
print("=" * 50)
question = "2024年巴黎奥运会中国队获得了多少金牌?"
print(f"\n问题: {question}")
print("-" * 40)
answer = run_agent(question)
print(f"\n回答:\n{answer}")
代码逐行解析
第 1 部分:导入模块
import os
from langchain.agents import create_agent
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_openai import ChatOpenAI
os:标准库,用于读取环境变量create_agent:LangChain 新式 Agent 创建函数,基于 LangGraph 构建DuckDuckGoSearchRun:DuckDuckGo 搜索工具,免费无需 API KeyChatOpenAI:OpenAI GPT 模型的 LangChain 集成类
第 2 部分:API Key 配置
从环境变量安全获取 API Key,避免硬编码。
第 3 部分:LLM 初始化
llm = ChatOpenAI(
model="gpt-4o-mini", # 或 gpt-4o、gpt-3.5-turbo 等
temperature=0.7,
)
model:gpt-4o-mini是性能与成本的平衡选择(也可使用gpt-4o)temperature:控制输出随机性(0-1),0.7 较为平衡
第 4 部分:工具定义
使用 langchain-community 的 DuckDuckGo 搜索工具,免费无需额外 API Key。
第 5 部分:Agent 创建
create_agent 内部使用 LangGraph 构建 ReAct 循环: 1. Agent 分析用户输入 2. 决定是否使用工具 3. 调用工具获取信息 4. 根据工具返回结果生成最终回答
第 6 部分:运行 Agent
Agent 使用 messages 格式输入,返回完整的对话链。
运行测试
export OPENAI_API_KEY="your-api-key"
python agent_demo.py
预期输出
==================================================
LangChain Agent 搜索问答演示
==================================================
问题: 2024年巴黎奥运会中国队获得了多少金牌?
----------------------------------------
回答:
根据搜索结果,2024年巴黎奥运会上,中国代表团共获得了40枚金牌、27枚银牌和24枚铜牌,总计91枚奖牌。
常见问题排查
| 问题 | 原因 | 解决方法 |
|---|---|---|
OPENAI_API_KEY 错误 |
API Key 未设置 | 设置环境变量 |
| 模型返回空结果 | API Key 无效 | 重新生成 Key |
| 工具未被调用 | 工具未正确注册 | 检查工具列表 |
| 回答不准确 | 模型能力限制 | 升级到 gpt-4o |
扩展思路
1. 添加更多工具
from langchain_community.tools import DuckDuckGoSearchRun, WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
search_tool = DuckDuckGoSearchRun()
wiki_tool = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
tools = [search_tool, wiki_tool]
2. 自定义工具
from langchain_core.tools import tool
@tool
def get_current_time(location: str) -> str:
"""获取指定位置的当前时间。"""
from datetime import datetime
import pytz
timezone_map = {"北京": "Asia/Shanghai", "纽约": "America/New_York"}
tz = pytz.timezone(timezone_map.get(location, "Asia/Shanghai"))
return datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
3. 使用 Tavily 搜索
pip install tavily-python
from langchain_community.tools.tavily_search import TavilySearchResults
tavily_tool = TavilySearchResults(tavily_api_key=os.environ.get("TAVILY_API_KEY"))
4. 添加记忆功能
# 添加记忆功能需要安装 langgraph
# pip install langgraph
from langgraph.checkpoint.memory import MemorySaver
agent = create_agent(
model=llm,
tools=tools,
system_prompt="...",
checkpointer=MemorySaver(), # 启用记忆功能
)
config = {"configurable": {"thread_id": "user-123"}}
result = agent.invoke({"messages": [{"role": "user", "content": "我叫张三"}]}, config=config)
注意 :记忆功能需要安装
langgraph包,并确保版本兼容。MemorySaver使用内存存储对话历史,适合开发和测试环境;生产环境建议使用持久化存储方案。
5. 流式输出
# 流式输出可以实时查看 Agent 的思考过程和结果
# 注意:返回的 chunk 结构可能因版本而异,请根据实际输出结构调整
for chunk in agent.stream({"messages": [{"role": "user", "content": query}]}):
if "agent" in chunk:
print(chunk["agent"]["messages"][0].content, end="", flush=True)
提示 :流式输出的具体结构取决于 LangChain/LangGraph 的版本。如果上述代码不工作,建议打印
chunk的内容查看实际结构,或使用非流式方式agent.invoke()。
总结
本章我们完成了:
- 环境搭建:Python 3.10+、虚拟环境、依赖安装
- API 配置:OpenAI API Key 获取与安全配置
- Agent 构建 :使用
create_agent创建搜索问答智能体 - 代码解析:理解每个部分的作用和原理
- 运行测试:实际运行并观察 Agent 行为
- 扩展方向:多工具、自定义工具、记忆、流式输出
LangChain 的核心价值在于: - 标准化接口 :不同 LLM 和工具使用统一 API - 模块化设计 :按需组合,灵活扩展 - 生产级架构:基于 LangGraph,支持复杂编排
推荐学习路径: 1. 深入理解 LangGraph 的状态图编排 2. 学习 Agent 评测方法(LangSmith) 3. 探索多 Agent 协作架构 4. 实践 RAG(检索增强生成)与 Agent 结合