一、LangChain Agent 核心概念详解

Agent 是 LangChain 的最高级形态,它把 LLM、Tools、Memory、Planning 全部整合起来,能自主规划、自主选择工具、自主完成复杂任务,是从「工具调用机器人」到「智能助手」的跨越。

今天重点讲两个核心:AgentExecutor(执行器)ReAct Agent(推理行动智能体)

1. AgentExecutor:Agent 的「执行引擎」

核心定义

AgentExecutor 是 LangChain 中负责运行 Agent、处理工具调用、管理执行循环、处理错误的核心类,它是 Agent 的「执行引擎」,没有它,Agent 只是一个静态的 Prompt + LLM 组合,无法真正运行。

核心作用

  1. 循环执行:自动运行「LLM 推理 → 调用工具 → 获取结果 → 注入上下文 → 继续推理」的循环
  2. 工具调用处理:自动解析 LLM 的工具调用请求,调用对应的工具,获取返回结果
  3. 错误处理:自动处理工具调用失败、LLM 输出格式错误等异常,避免程序崩溃
  4. 终止判断:自动判断任务是否完成,完成就停止循环,输出最终答案

2. ReAct Agent:推理 + 行动的智能体

核心定义

ReAct Agent 是基于 ReAct 框架(Reasoning + Acting) 的 Agent,它的核心思想是 **「先思考,再行动,根据结果再思考,再行动」**,交替生成「思考轨迹(Thought)」和「具体行动(Action)」,直到完成任务。

ReAct 的完整工作流程

这是你之前学过的 ReAct 论文的核心逻辑,LangChain 把它完全工程化了:

  1. Thought(思考):LLM 分析当前状态,规划下一步要做什么,为什么要做
  2. Action(行动):LLM 根据思考,生成具体的工具调用请求
  3. Observation(观察):执行工具调用,获取返回结果
  4. 循环:把「Thought → Action → Observation」的完整轨迹注入上下文,继续思考下一步
  5. Final Answer(最终答案):LLM 判断任务完成,输出最终答案

二、实战:用 LangChain 实现 ReAct Agent(计算器 + 搜索引擎)

下面是一份完全兼容 LangChain 1.0+ 最新版本的代码,实现了一个能同时调用计算器Serper 搜索引擎的 ReAct Agent,能解决需要「搜索 + 计算」的复杂问题。

1. 准备工作

(1)安装依赖

pip install -U langchain langchain-openai langchain-community python-dotenv numexpr

(2)配置 .env 文件

DOUBAO_API_KEY=你的豆包APIKey
SERPER_API_KEY=你的SerperAPIKey

2. 完整可运行代码

import os
from dotenv import load_dotenv

import numexpr
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import AgentExecutor, create_react_agent

from 学习langchain架构.serper工具调用成功 import agent_with_history

# ================== 1. 加载环境变量 ======================
load_dotenv()
os.environ["SERPER_API_KEY"] = "api_key"


# =================== 2. 初始化 LLM (必须使用支持调用工具的模型)======================
llm = ChatOpenAI(
    api_key=os.getenv("QWEN_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model='qwen3-max', # 必须用 pro模型,支持工具调用
    temperature=0.01
)


# ===================== 3. 定义工具 (计算器 + 搜索引擎)==================
# ✅️ 工具1: 安全计算器(用numexpr 保证安全)
@tool
def calculator(expression: str) -> str:
    """
    【数学计算专用】 安全计算器,用户解决数学计算问题
    支持: 加 减 乘 除 括号 小数 指数运算
    输入格式:纯数学表达式,不要有中文,比如 “35*23+18”、“100/(2+3)”
    """
    # 用 numexpr 安全计算,防止代码注入
    try:
        result = numexpr.evaluate(expression).item()
        return f'计算结果: {result}'
    except Exception as e:
        return f'计算错误:{str(e)}'

# ✅️工具2:Serper搜索引擎
@tool
def web_search(query: str) -> str:
    """
    【实时信息/知识查询专用】联网搜索引擎
    只要满足以下任意一个条件,必须调用此工具
    1. 用户查询的实时信息(如:今天天气,最新新闻,体育比赛结果,实时价格)
    2. 用户询问的内容有时间限制(如:2025年后的事件、最新政策)
    3. 你不确定的答案,或者你的知识已经过时
    4. 用户明确你要【上网查一下】 【搜索一下】
    """
    serper = GoogleSerperAPIWrapper(k=5)
    return serper.run(query)

# 工具列表:把所有工具放在这里
tools = [calculator, web_search]

# ============================== 4. 提示词模版(Langchain 官方推荐格式)==============================
prompt = ChatPromptTemplate.from_messages([
    ("system","""你是一个强大的 ReAct 智能助手,能通过调用工具解决复杂问题。
    
    【核心规则 - 必须100%严格遵守】
    1.  你必须严格按照「Thought → Action → Action Input → Observation」的格式循环执行,直到完成任务
    2.  Thought:分析当前问题,说明你下一步要做什么、为什么要做
    3.  Action:只能输出你可用的工具名称,必须是 [{tool_names}] 中的一个,不能有其他内容
    4.  Action Input:工具需要的输入参数,必须是纯字符串,不能有括号、引号包裹
    5.  Observation:工具返回的结果,你不需要生成,系统会自动补充
    6.  当你获取了足够的信息,能完整回答用户的问题时,直接输出:Final Answer: 你的最终答案
    7.  禁止编造信息、禁止不调用工具就编造 Observation、禁止输出格式外的多余内容
    
    【格式示例 - 必须严格按照这个格式输出】
    Question: 用户的问题
    Thought: 我需要先查询2026年世界杯的举办国,才能获取对应的人口数据,因此调用web_search工具
    Action: web_search
    Action Input: 2026年世界杯举办国
    Observation: 工具返回的搜索结果
    Thought: 我已经获取了举办国信息,接下来需要查询这些国家的人口数据
    Action: web_search
    Action Input: 美国 加拿大 墨西哥 2026年最新人口
    Observation: 工具返回的人口数据
    Thought: 我已经获取了所有需要的信息,可以给出最终答案了
    Final Answer: 2026年世界杯由美国、加拿大、墨西哥联合举办,三国人口分别是xxx、xxx、xxx
    
    【可用工具详情】
    {tools}
    
    【工具名称列表】
    {tool_names}"""),
    # 对话历史占位符(记忆功能)
    MessagesPlaceholder(variable_name="chat_history"),
    ("user","{input}"),
    # ✅️ReAct 强制要求:agent_scratchpad 占位符,用来存储中间过程
    ("ai", "{agent_scratchpad}")
])


# ============================ 5. 记忆管理(短期记忆) ==================
store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]


# =========================6. 构建 ReAct Agent (LangChain 1.0+ 标准写法) ===================
# 第一步:构建ReAct Agent
agent = create_react_agent(llm, tools, prompt)

# 第二步:创建:AgentExecutor
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True, # 开启详细日记,能看到完整的ReAct执行过程
    handle_parsing_errors=True, # 自动处理解析错误
    max_iterations=10, # 最大迭代次数 10次
    early_stopping_method="generate"  # 迭代到上限时,用已有信息生成答案,而不是直接停止
)

# 第三步:给agent 加上记忆功能
agent_with_memory = RunnableWithMessageHistory(
    agent_executor,
    get_session_history,
    input_messages_key = "input",
    history_messages_key="chat_history"
)

# =====================7, 主程序 ==================================
def main():
    print("===== 🚀 LangChain 1.0+ ReAct Agent(计算器 + 搜索引擎)=====")
    print("输入 q 退出,输入 clear 清空记忆\n")
    print("💡 测试问题:2026年世界杯举办地的人口是多少?乘以3.14是多少?\n")
    session_id = "user_001"

    while True:
        user_input = input("你:").strip()

        if user_input.lower() == "q":
            print("🤖 再见!")
            break
        if user_input.lower() == "clear":
            if session_id in store:
                store[session_id].clear()
            print("🤖 记忆已清空!")
            continue
        if not user_input:
            continue

        # 调用 ReAct Agent
        result = agent_with_memory.invoke(
            {"input": user_input},
            config={"configurable": {"session_id": session_id}}
        )
        print(f"\n🤖:{result['output']}\n")

if __name__ == "__main__":
    main()

三、代码核心部分详解

1. 工具定义(两个核心工具)

(1)安全计算器

numexpr 库代替 eval,保证安全,防止代码注入,同时支持复杂的数学运算。

@tool
def calculator(expression: str) -> str:
    """..."""
    result = numexpr.evaluate(expression).item()
    return f"计算结果:{result}"

(2)Serper 搜索引擎

用官方标准的 GoogleSerperAPIWrapper,稳定、兼容所有版本。

@tool
def web_search(query: str) -> str:
    """..."""
    serper = GoogleSerperAPIWrapper()
    return serper.run(query)

2. ReAct 提示词模板(关键)

提示词里必须包含:

  • {tools}:工具的详细描述
  • {tool_names}:工具的名称列表
  • agent_scratchpad:占位符,用来存储 ReAct 的中间过程(Thought → Action → Observation)

3. 创建 ReAct Agent

create_react_agent 函数,传入 LLM、工具列表、提示词模板,就能创建一个标准的 ReAct Agent。

4. AgentExecutor(执行引擎)

AgentExecutor 包装 Agent,负责循环执行、工具调用、错误处理。

agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # 看详细日志
    handle_parsing_errors=True,
    max_iterations=10,
)
agent = create_react_agent(llm, tools, prompt)

四、运行效果演示

测试问题:2026 年世界杯举办地的人口是多少?乘以 3.14 是多少?

控制台日志(完整 ReAct 过程):

===== 🚀 LangChain 1.0+ ReAct Agent(计算器 + 搜索引擎)=====
输入 q 退出,输入 clear 清空记忆

💡 测试问题:2026年世界杯举办地的人口是多少?乘以3.14是多少?

你:2026年世界杯举办地的人口是多少?乘以3.14是多少?


> Entering new AgentExecutor chain...
Thought: 我需要先查询2026年世界杯的举办国,才能获取对应的人口数据,因此调用web_search工具
Action: web_search
Action Input: 2026年世界杯举办国... 年6月11日至7月19日举行,由美国、墨西哥和加拿大三国联合举办。赛事将在三个国家的16座城市间展开,是世界杯历史上首次由三个国家联合举办。 2026年国际足联世界杯 ... 2026世界杯16个主办城市出炉,美国11城、加拿大2城、墨西哥3城 ; 美国 · 达拉斯 · AT&T体育场 ; 美国 · 堪萨斯城 · 箭头体育场 ; 美国 · 休斯敦 · NRG体育场 ; 美国 · 迈阿密 · 硬石 ... 2026年国际足联世界杯(The 23rd FIFA World Cup),简称“2026年美加墨世界杯”,该届赛事于2026年6月11日至7月19日在美国、加拿大与墨西哥三国联合举办,是历史上首次由三个国家 ... 据报道,2026年世界杯将由美国、墨西哥和加拿大联合举办,其中美国有11个举办城市,墨西哥3个,加拿大2个,这将是历史上首次由三个东道主联合举办的世界杯。 目前,2022年卡塔尔将举办世界杯,2026年在美国加拿大墨西哥三国举行世界杯;2019 ... 国际足联室内五人足球世界杯主办国家. 编辑. 主办国, 所属洲, 主办的届数, 年份 ...2026年世界杯由美国、加拿大和墨西哥联合举办,我需要查询这三个国家的最新人口数据,因此调用web_search工具  
Action: web_search  
Action Input: 美国 加拿大 墨西哥 2026年最新人口世界各国人口排名(2026). 此列表包括国家和附属领土。数据基于最新的联合国人口司估算。 点击国家或附属领土的名称可查看当前估算(实时人口时钟)、历史数据和预测数据。 常住人口, 面积. 1. 美国. 33100.26万人. 937万km². 2. 墨西哥. 12893.28万人. 1964375km². 3. 加拿大. 3774.22万人. 998万km². 4. 危地马拉. 1791.56万人. 10.89万km². 5 ... 世界各国搭地区人口列表按照各国人口从多到少排列,数据主要来自人口时钟(population clock)预测搭各国官方人口普查。列出了主权国家搭自治领地,后者斜体表示。 北美洲国家人口排名(2026) ; 1, 美国, 349,035,494 ; 2, 加拿大, 40,467,728 ; 3, 百慕大, 64,459 ; 4, 格陵兰, 55,629 ... Missing: 墨西哥 | Show results with:墨西哥. 墨西哥全国统计和地理局宣布,根据墨西哥全国居民委员会的最新估算,墨西哥共有1亿1840万人口,居全球第十一位。 全球人口最多的国家分别为中国、印度、美国、印度尼西亚、 ...根据搜索结果,2026年世界杯举办国为美国、加拿大和墨西哥。我需要将三国人口相加,再乘以3.14。从数据中提取最新人口估算:

- 美国:约349,035,494人  
- 加拿大:约40,467,728人  
- 墨西哥:约118,400,000人  

现在计算总和并乘以3.14。

Action: calculator  
Action Input: (349035494 + 40467728 + 118400000) * 3.14计算结果: 1594816117.0800002我已经获取了2026年世界杯举办国(美国、加拿大、墨西哥)的人口数据,并计算出三国总人口乘以3.14的结果为约1,594,816,117.08。现在可以给出最终答案。

Final Answer: 2026年世界杯举办国(美国、加拿大、墨西哥)的总人口约为507,903,222人,乘以3.14的结果约为1,594,816,117.08。

> Finished chain.

🤖:2026年世界杯举办国(美国、加拿大、墨西哥)的总人口约为507,903,222人,乘以3.14的结果约为1,594,816,117.08。

你:北京今天天气


> Entering new AgentExecutor chain...
Question: 北京今天天气  
Thought: 我需要查询北京今天的实时天气情况,因此调用web_search工具  
Action: web_search  
Action Input: 北京今天天气  气温, 20.3℃, 25.2℃ ; 降水, 无降水, 无降水 ; 风速, 3.3m/s, 1.9m/s ; 风向, 西北风, 东北风 ; 气压, 1008.7hPa, 1010hPa ... 今天白天,华南部分地区雨势仍然较强,夜间起降雨逐渐停歇;明天,南方将迎来近期降水最少的一天。同时,南方大部将迎来升温。 4月23日 ... 舒适度:凉爽,较舒适. 雷达图. 24小时预报7天预报10天预报11-30天预报. 发布时间:04-28 12:00. 04/28 周二. 多云. 北风. 微风. 21℃. 9℃. 晴. 北风. 微风. 04/29 周三. 生活气象指数 下午好,今日天气晴好,心情也要保持晴朗哦. 出游: 适宜. 晴, 空气优. 穿衣: 大衣类. 9℃~21℃. 感冒: 极易发. 风力较大. 洗车: 不适宜. 近期有大风. 未来40天 ... 下午6时. 68°. RealFeel® 67°. 天氣宜人 · 大致晴朗 ; 下午7时. 65°. RealFeel® 64°. 天氣宜人 · 晴 ; 下午8时. 62°. RealFeel® 62°. 涼爽 · 晴朗.我已经获取了北京今天的天气信息,可以给出最终答案了  
Final Answer: 北京今天天气晴到多云,气温在9℃~21℃之间,北风微风,空气质量优,整体舒适度凉爽、较舒适。

> Finished chain.

🤖:北京今天天气晴到多云,气温在9℃~21℃之间,北风微风,空气质量优,整体舒适度凉爽、较舒适。

你:q
🤖 再见!

五、总结

  1. AgentExecutor:Agent 的执行引擎,负责循环执行、工具调用、错误处理
  2. ReAct Agent:基于「推理 + 行动」框架的 Agent,交替生成 Thought、Action、Observation
  3. 核心要点
    • 提示词里必须加 agent_scratchpad 占位符
    • 必须用支持工具调用的模型(doubao-pro)
    • 工具的 docstring 必须写得极其清楚
    • AgentExecutor 包装 Agent,处理执行循环
Logo

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

更多推荐