引言: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 会这样做:

  1. 🧠 理解任务 - 解析你的意图:订机票
  2. 📋 规划步骤 - 分解为:查航班 → 比价 → 选择 → 下单
  3. 🔍 执行行动 - 调用航司 API 或搜索工具查询航班
  4. 📝 记忆结果 - 保存查询结果以便后续比较
  5. 🔄 迭代执行 - 根据你的反馈调整选择,直到完成订单

这就是 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)
关键点解析
  1. 工具定义:使用 @tool 装饰器定义工具,函数的 docstring 会自动成为工具描述
  2. Agent 创建:create_agent 是新版主要 API,基于 LangGraph 构建,内置 ReAct 循环逻辑
  3. 消息格式:新版 Agent 使用 messages 格式输入和输出
  4. 模型选择:示例中的模型名称需根据实际可用模型调整

ReAct 的优势与局限

✅ 优势
  • 可解释性强 - 每一步都清晰可见,方便调试
  • 可靠性高 - 通过 Observation 验证推理结果
  • 灵活性好 - 可接入任意工具,适应多种场景
  • 错误恢复 - 可以在循环中修正错误
⚠️ 局限
  • 循环开销 - 多次 LLM 调用增加延迟和成本
  • 推理长度限制 - 复杂任务可能超出模型上下文窗口
  • 工具依赖 - 效果很大程度上取决于工具的质量

小结

ReAct 框架通过 Thought → Action → Observation 的循环,让 Agent 能够在推理中行动,在行动中推理。

📌 重点回顾: - Thought:分析现状,决定下一步 - Action:执行工具调用 - Observation:获取结果,用于下一轮推理 - 循环直到任务完成


第三部分:Tool Use(工具使用)

🔧 工具是 Agent 的「手」和「脚」,让它能够真正行动于现实世界,完成从「思考」到「执行」的跨越。

为什么 Agent 需要工具?

LLM 虽然强大,但它有两个根本性局限:

  1. 知识截止 - 训练数据有时间限制,无法获取最新信息
  2. 无法行动 - 只能生成文本,无法真正操作外部系统

工具(Tools) 正是为了解决这些问题:

┌─────────────────────────────────────────────────────────────┐
│              🛠️ 工具如何扩展 Agent 能力                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐              ┌─────────────┐             │
│   │   LLM 本身   │     +        │    工具     │             │
│   │             │              │             │             │
│   │ • 推理      │              │ • 搜索     │             │
│   │ • 规划      │              │ • 计算     │             │
│   │ • 生成文本  │              │ • 调用API  │             │
│   │             │              │ • 执行代码 │             │
│   └─────────────┘              └─────────────┘             │
│          │                            │                     │
│          └──────────┬─────────────────┘                     │
│                     ▼                                       │
│            ┌─────────────────┐                              │
│            │    🤖 Agent     │                              │
│            │  能够感知、推理  │                              │
│            │  行动、记忆    │                              │
│            └─────────────────┘                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘
工具的核心作用
能力 无工具时 有工具后
获取实时信息 ❌ 受限于训练数据 ✅ 搜索、API 调用
执行计算 ❌ 只能估算 ✅ 代码执行
操作外部系统 ❌ 无法实际执行 ✅ API 调用
访问私有数据 ❌ 无法访问 ✅ 数据库查询

工具描述与注册

要让 Agent 正确使用工具,我们需要提供清晰的工具描述。这是因为 Agent 是通过理解工具描述来决定调用哪个工具的。

工具描述的关键要素

每个工具都应该包含:

  1. 工具名称(name) - 简洁、描述性
  2. 功能描述(description) - 工具作用的详细说明
  3. 参数模式(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 获取
  1. 访问 OpenAI Platform
  2. 登录账号并进入 API Keys 页面
  3. 创建新的 API Key
  4. 配置环境变量:
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 Key
  • ChatOpenAI: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()


总结

本章我们完成了:

  1. 环境搭建:Python 3.10+、虚拟环境、依赖安装
  2. API 配置:OpenAI API Key 获取与安全配置
  3. Agent 构建:使用 create_agent 创建搜索问答智能体
  4. 代码解析:理解每个部分的作用和原理
  5. 运行测试:实际运行并观察 Agent 行为
  6. 扩展方向:多工具、自定义工具、记忆、流式输出

LangChain 的核心价值在于: - 标准化接口:不同 LLM 和工具使用统一 API - 模块化设计:按需组合,灵活扩展 - 生产级架构:基于 LangGraph,支持复杂编排

推荐学习路径: 1. 深入理解 LangGraph 的状态图编排 2. 学习 Agent 评测方法(LangSmith) 3. 探索多 Agent 协作架构 4. 实践 RAG(检索增强生成)与 Agent 结合


Logo

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

更多推荐