一、引言

随着大语言模型技术快速落地,传统对话机器人的短板逐渐暴露:单纯依靠模型自身知识库极易产生事实幻觉,无法对接业务系统完成订单查询、库存核验、工单下发等真实业务操作;而只执行指令的自动化脚本又缺少自主规划能力,只能执行固定脚本,无法应对用户多变的自然语言请求。

在 LLM 智能体(Agent)技术体系中,ReAct(Reason + Act)范式成为解决这一矛盾的经典方案。该范式由 Shunyu Yao 于 2022 年正式提出,核心创新是将大模型的逻辑推理(Reasoning)与外部工具调用(Acting)进行显式绑定,构造出 “Thought 思考 → Action 行动 → Observation 观察” 的迭代循环。智能体先通过思考拆解任务、制定执行计划,再调用外部工具执行动作,最后把工具返回的真实观测结果补充进上下文,用来修正下一轮推理,实现思考与行动双向协同。

本文以电商智能客服为业务场景,从零搭建一套遵循 ReAct 循环的智能客服 Agent,支持查询订单、核验商品库存、发送业务邮件三项工具能力,完整记录每一轮推理轨迹并可视化输出决策链路。项目全程使用 Python 原生代码实现,无需调用大模型 API,既可以作为 ReAct 理论的工程落地案例,也可以直接扩展接入 LLM 完成自主推理,非常适合 Agent 初学者入门实践。

二、ReAct 范式核心原理

2.1 传统方案的局限性

在 ReAct 范式诞生之前,LLM 智能体主要分为两条技术路线,二者都存在明显短板:

  1. 纯思考型(思维链 CoT) 思维链技术可以引导大模型完成多步骤逻辑推导,擅长处理复杂数学推理、文本逻辑分析。但这类模型只能依赖自身训练数据,无法访问外部数据库、业务接口,面对时效性强的业务数据时,很容易编造虚假信息,也就是行业内常说的 “模型幻觉”。放到客服场景中,模型无法获取实时订单、库存数据,只能凭空捏造信息,完全无法投入正式业务。

  2. 纯行动型工具调用程序 另一类程序可以直接调用 API、数据库等外部工具,完成真实业务操作。但程序缺少自主思考能力,只能匹配固定关键词执行固定动作,一旦用户改变提问句式、增加附加需求,程序就会识别失败,缺少灵活的任务规划与纠错能力。

2.2 ReAct 循环的核心逻辑

ReAct 范式把思考和行动深度耦合,形成闭环迭代机制:思考用来指导行动,行动返回的观测结果反过来约束思考,让每一步推理都建立在真实事实之上。一轮完整的循环包含三个核心环节:

  1. Thought(思考):智能体的内部推理过程,分析用户当前需求,拆解任务步骤,决定下一步要执行什么动作。对应本项目中的think()函数。
  2. Action(行动):根据思考结论调用外部工具,发起数据库查询、接口请求等操作,对应本项目中的订单查询、库存查询、发送邮件动作。
  3. Observation(观察):接收工具执行后返回的真实结果,把这条观测记录追加到对话历史,作为下一轮思考的事实依据。

智能体会不断重复这一循环,持续迭代任务进度,直到在思考环节判断任务已经完成,才终止循环并输出最终答案。整个流程形成强大协同效应:推理让工具调用更有目的性,避免盲目执行;外部观测为推理提供事实依据,从根源上抑制模型幻觉。

2.3 形式化表达

从数学层面,智能体基于历史行动与观测轨迹(a1​,o1​),(a2​,o2​)...(at−1​,ot−1​),生成当前轮次的思考内容与执行动作: (tht​,at​)=π(qt​,(a1​,o1​),…,(at−1​,ot−1​)) 随后环境执行动作at​,返回新的观测值ot​,将新记录存入历史上下文,开启新一轮循环。

三、整体项目架构设计

3.1 整体模块划分

整个智能客服 Agent 项目一共拆分为三大核心模块,严格对应 ReAct 运行流程:

  1. 决策日志模块:专门记录每一轮循环的轮次、思考内容、执行动作、入参、观测结果,并且提供格式化可视化方法,直观打印完整决策链路。
  2. 工具封装模块:封装订单查询、库存查询、邮件发送三类业务工具,内置模拟数据库,统一对外提供工具调用入口,后续可以无缝替换成真实业务接口。
  3. Agent 智能主体模块:实现 ReAct 循环引擎,包含思考决策、闭环执行、多轮对话交互三大功能,持续驱动 “思考 - 行动 - 观察” 迭代。

3.2 业务功能说明

本次搭建的电商智能客服一共开放三项业务能力:

  • 工具 1:订单查询,根据用户提供的订单号,从模拟数据库读取订单商品、数量、物流状态;
  • 工具 2:库存查询,输入商品名称,返回当前实时库存数量;
  • 工具 3:业务邮件推送,自动把用户的咨询内容整理为邮件,发送至指定邮箱。

3.3 技术环境

本项目全程使用 Python 内置库开发,不需要额外安装第三方依赖,Python3.7 及以上版本即可直接运行:

  • dataclasses:构造结构化日志实体,保存每一轮决策记录;
  • typing:完善类型注解,提升代码可读性与规范性;
  • time:模拟接口请求延迟,还原真实业务调用场景。

四、核心代码实现与解析

4.1 决策日志模块(轨迹记录与可视化)

为了完整留存 ReAct 每一轮循环的全过程,我们先定义数据实体DecisionRecord,把轮次、思考、动作、参数、观测五项信息结构化存储。同时配套日志管理类DecisionLogger,提供新增记录与格式化打印功能,最终输出格式和实验结果截图保持完全一致。

python
火狐中的kaggle官网链接直达然后利用邮箱来登录,记得要进行人机验证,也就是手机号码验证,再开启网络

运行

import time
from dataclasses import dataclass
from typing import Dict, List

@dataclass
class DecisionRecord:
    round_id: int          # 对话轮次
    thought: str           # Agent思考内容
    action: str            # 执行动作(工具名)
    action_params: Dict    # 工具入参
    observation: str       # 工具返回结果

class DecisionLogger:
    def __init__(self):
        self.records: List[DecisionRecord] = []

    def add_record(self, round_id: int, thought: str, action: str, params: Dict, observation: str):
        rec = DecisionRecord(round_id, thought, action, params, observation)
        self.records.append(rec)

    def visualize(self):
        # 严格匹配输出截图格式
        print("\n==== Agent 完整思考-行动决策链路 ====")
        for item in self.records:
            print(f"\n【第{item.round_id}轮】")
            print(f"💡思考(Thought): {item.thought}")
            print(f"⚙行动(Action): {item.action}")
            print(f"📎参数(Params): {item.action_params}")
            print(f"📄观察(Observation): {item.observation}")
        print("====================================")

该模块是整个项目的溯源核心,每一次工具调用的来龙去脉都会被永久保存,既可以用于调试 Agent 决策逻辑,也可以导出日志用于后续模型微调。

4.2 业务工具封装模块

我们把三项业务能力封装到同一个工具类中,内置订单数据库与库存数据库,同时统一工具分发入口,便于后续新增更多业务工具。

python

运行

import time
from typing import Any, Dict

class CustomerServiceTools:
    def __init__(self):
        # 模拟电商业务数据库
        self.order_db = {
            "01001": {"status": "已发货", "goods": "无线鼠标", "num": 2},
            "O1002": {"status": "待发货", "goods": "机械键盘", "num": 1}
        }
        self.stock_db = {
            "无线鼠标": 156,
            "机械键盘": 23
        }

    def query_order(self, order_no: str) -> str:
        time.sleep(0.2)
        if order_no in self.order_db:
            info = self.order_db[order_no]
            return f"订单{order_no}:商品{info['goods']},数量{info['num']},状态{info['status']}"
        else:
            return f"未查询到订单号 {order_no}"

    def query_stock(self, product_name: str) -> str:
        time.sleep(0.2)
        stock = self.stock_db.get(product_name, 0)
        return f"商品【{product_name}】当前库存:{stock}件"

    def send_email(self, receiver: str, content: str) -> str:
        time.sleep(0.3)
        return f"邮件已发送至 {receiver},内容摘要:{content[:20]}..."

    def run_tool(self, tool_name: str, params: Dict[str, Any]) -> str:
        if tool_name == "query_order":
            return self.query_order(params["order_no"])
        elif tool_name == "query_stock":
            return self.query_stock(params["product_name"])
        elif tool_name == "send_email":
            return self.send_email(params["receiver"], params["content"])
        else:
            return f"不存在工具:{tool_name}"

工具层和 Agent 推理层完全解耦,后续如果对接 MySQL 数据库、企业邮件接口,只需要修改这一部分代码,上层 ReAct 循环逻辑不需要改动,代码扩展性极强。

4.3 ReAct 智能 Agent 主体(循环核心)

这是整个项目的引擎,分为三大核心函数:

  1. think():对应 ReAct 中的 Thought 环节,解析用户自然语言,输出下一步动作与入参;
  2. run_agent():完成一轮完整闭环:思考→执行工具→获取观测→写入日志;
  3. chat_loop():搭建多轮对话交互窗口,支持持续对话,输入 quit 终止程序并打印全部决策链路。

python

运行

class ServiceAgent:
    def __init__(self):
        self.tools = CustomerServiceTools()
        self.logger = DecisionLogger()
        self.round = 0

    def think(self, user_input: str):
        self.round += 1
        user_text = user_input.strip()
        # 规则化推理逻辑,可直接替换为LLM输出解析
        if "订单" in user_text and "01001" in user_text:
            thought = "用户想要查询01001订单,我需要调用query_order工具,传入订单号01001"
            action = "query_order"
            params = {"order_no": "01001"}
        elif "库存" in user_text and "机械键盘" in user_text:
            thought = "用户询问机械键盘库存,调用query_stock工具"
            action = "query_stock"
            params = {"product_name": "机械键盘"}
        elif "发邮件" in user_text:
            thought = "用户要求发送邮件,调用send_email工具"
            action = "send_email"
            params = {
                "receiver": "3105469252@qq.com",
                "content": user_text
            }
        else:
            thought = "无需调用工具,直接文字回复用户"
            action = "reply_direct"
            params = {}
        return thought, action, params

    def run_agent(self, user_message: str) -> str:
        # 一轮完整的ReAct闭环
        thought, action, params = self.think(user_message)
        if action == "reply_direct":
            obs = "暂时无法识别您的请求,请提供订单号或商品名称"
        else:
            obs = self.tools.run_tool(action, params)
        # 保存本轮决策轨迹
        self.logger.add_record(
            round_id=self.round,
            thought=thought,
            action=action,
            params=params,
            observation=obs
        )
        return obs

    def chat_loop(self):
        print("智能客服Agent已启动,输入quit结束对话")
        while True:
            user_msg = input("\n用户:")
            if user_msg.lower() == "quit":
                break
            result = self.run_agent(user_msg)
            print(f"客服回复:{result}")
        # 退出对话后可视化全部决策链路
        self.logger.visualize()

if __name__ == "__main__":
    agent = ServiceAgent()
    agent.chat_loop()

当前think()函数采用规则匹配做推理,非常适合初学者理解流程。后续只需要把这一段替换为大模型调用 + 结果解析,就可以升级为具备自主推理能力的 LLM 智能体,完美适配 ReAct 原生设计。

五、运行效果与结果分析

5.1 交互对话流程

启动程序后,控制台开启多轮对话窗口,我们依次输入三条业务指令,最后输入 quit 退出程序:

plaintext

智能客服Agent已启动,输入quit结束对话

用户:帮我查一下订单01001
客服回复:订单01001:商品无线鼠标,数量2,状态已发货

用户:查一下机械键盘库存
客服回复:商品【机械键盘】当前库存:23件

用户:发邮件把订单信息发给3105469252@qq.com
客服回复:邮件已发送至 3105469252@qq.com,内容摘要:发邮件把订单信息发给3105469252...

用户:quit

三轮对话分别对应三次独立的 ReAct 循环,每一次都完成 “思考 - 行动 - 观测” 完整链路。

5.2 决策链路可视化输出

程序终止后,自动打印全部三轮的思考行动轨迹,和实验截图保持完全一致:

plaintext

==== Agent 完整思考-行动决策链路 ====

【第1轮】
💡思考(Thought): 用户想要查询01001订单,我需要调用query_order工具,传入订单号01001
⚙行动(Action): query_order
📎参数(Params): {'order_no': '01001'}
📄观察(Observation): 订单01001:商品无线鼠标,数量2,状态已发货

【第2轮】
💡思考(Thought): 用户询问机械键盘库存,调用query_stock工具
⚙行动(Action): query_stock
📎参数(Params): {'product_name': '机械键盘'}
📄观察(Observation): 商品【机械键盘】当前库存:23件

【第3轮】
💡思考(Thought): 用户要求发送邮件,调用send_email工具
⚙行动(Action): send_email
📎参数(Params): {'receiver': '3105469252@qq.com', 'content': '发邮件把订单信息发给3105469252@qq.com'}
📄观察(Observation): 邮件已发送至 3105469252@qq.com,内容摘要:发邮件把订单信息发给3105469252...
====================================

从日志可以清晰看到每一轮循环的因果关系:思考内容决定了工具调用动作,工具返回的观测结果作为本轮闭环的终点,同时存入历史上下文,为下一轮推理提供事实依据。整个执行流程完全贴合 ReAct 范式的理论模型,做到了推理与行动双向联动。

5.3 项目价值总结

  1. 理论落地价值:把抽象的 ReAct 循环转化为可运行的代码,把 Thought、Action、Observation 三个抽象概念拆解为独立函数,直观展现智能体迭代运行机制,完美打通理论与工程实践。
  2. 业务落地价值:搭建了轻量化客服 Agent 框架,解耦推理层与工具层,既能作为实验 Demo,也可以快速改造对接企业真实业务接口,落地电商售前咨询、工单自动处理等场景。
  3. 可扩展性极强:规则推理模块可以无缝替换为 OpenAI、通义千问、本地开源大模型,升级为具备自主规划、多轮纠错能力的 LLM 智能体,后续还可以新增退款审核、物流查询等更多工具,不断丰富 Agent 能力边界。

六、后续优化与扩展方向

6.1 接入大模型实现原生 ReAct 推理

当前项目使用关键词匹配完成思考决策,属于简化版本。下一步可以接入大语言模型,编写 ReAct 专属提示词,让模型自主输出 Thought 与 Action 内容,再用正则表达式解析出工具名称和入参,实现真正意义上自主思考、自主调用工具的智能体,彻底摆脱固定关键词限制。

6.2 接入真实业务数据源

把内存中的模拟字典替换为 MySQL 数据库,订单、库存数据从业务库实时读取;邮件工具对接 SMTP 协议,实现真实邮件推送,让 Agent 具备线上业务交付能力。

6.3 增加记忆与多轮上下文

把每一轮的思考、行动、观测全部存入对话上下文,支持跨轮次任务协同。例如用户第一轮查订单,第二轮直接要求把刚刚查到的订单信息打包发邮件,Agent 可以自动读取上一轮观测结果,无需用户重复输入订单号。

6.4 可视化 Web 前端

基于 Flask 搭建简易网页,把决策链路渲染成时序流程图,在线实时展示 Agent 每一步思考与工具调用过程,把控制台日志升级为可视化页面,更适合课程演示与项目答辩。

七、结语

ReAct 范式是 LLM 智能体开发的基石,它解决了大模型 “只会空想,无法落地” 的痛点,把推理能力和外部工具牢牢绑定。本文以电商客服为场景,完整实现了一版轻量化 ReAct 智能 Agent,从日志记录、工具封装到循环引擎层层拆解,每一行代码都对应范式中的理论环节。

对于 Agent 初学者来说,先完成这套无大模型的规则版 ReAct 循环,能清晰看懂思考、行动、观察三者的循环逻辑,再去对接大模型做自主推理,学习曲线会平缓很多。在企业级开发中,这套分层解耦的架构同样具备很高的复用性,可以快速迁移到运维机器人、办公助手、自动数据查询等各类 Agent 项目中。


类同,可先参考以下内容 

一、ReAct 核心概述

ReAct(Reason + Act)由 Shunyu Yao 在 2022 年提出,核心思想是把 ** 推理(Reasoning)行动(Acting)** 结合,形成 Thought → Action → Observation 闭环,解决大模型幻觉、无法调用外部工具的问题。


二、传统方案的短板

  1. 纯思考型(思维链 CoT) 优点:可以完成复杂逻辑推理; 缺点:不能和外部工具交互,容易产生事实幻觉。
  2. 纯行动型 优点:可以直接执行外部动作; 缺点:缺少规划与反思,行为盲目。

ReAct 取长补短:思考指导行动,行动返回的观察结果反过来修正下一轮思考。


三、三步循环流程

  1. Thought(思考) 智能体内部推理:分析当前任务、拆解步骤、反思上一轮结果,属于内心独白。
  2. Action(行动) 执行具体操作,一般是调用外部工具(搜索、查数据库、查订单、发邮件等)。
  3. Observation(观察) 拿到工具执行后返回的真实结果,作为下一轮思考的事实依据。

循环逻辑: 不断重复 Thought → Action → Observation,把每一轮的观察追加到上下文历史,直到模型在 Thought 里判断已经得到最终答案,停止循环并输出结果。

协同效果:推理让行动更有目的性,行动为推理提供真实事实,大幅减少模型凭空编造内容。


四、数学形式表达

模型基于历史轨迹: (a1​,o1​),…,(at−1​,ot−1​) 生成当前轮次的思考与行动: (tht​,at​)=π(qt​,(a1​,o1​),…,(at−1​,ot−1​)) 随后环境工具执行动作 at​,返回新观测 ot​,进入下一轮循环。


五、和你之前代码的对应关系

你写的智能客服 Agent,完全就是 ReAct 范式的落地实现:

  • think() 函数 = Thought 思考环节
  • 调用查订单 / 查库存 / 发邮件工具 = Action 行动环节
  • 工具返回内容 = Observation 观察结果
  • 多轮对话循环 = ReAct 迭代闭环
  • 决策日志 = 完整记录每一轮 Thought-Action-Observation 轨迹

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐