基于 ReAct 范式搭建思考 - 行动闭环智能客服 Agent(自主学习客服)
一、引言
随着大语言模型技术快速落地,传统对话机器人的短板逐渐暴露:单纯依靠模型自身知识库极易产生事实幻觉,无法对接业务系统完成订单查询、库存核验、工单下发等真实业务操作;而只执行指令的自动化脚本又缺少自主规划能力,只能执行固定脚本,无法应对用户多变的自然语言请求。
在 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 智能体主要分为两条技术路线,二者都存在明显短板:
-
纯思考型(思维链 CoT) 思维链技术可以引导大模型完成多步骤逻辑推导,擅长处理复杂数学推理、文本逻辑分析。但这类模型只能依赖自身训练数据,无法访问外部数据库、业务接口,面对时效性强的业务数据时,很容易编造虚假信息,也就是行业内常说的 “模型幻觉”。放到客服场景中,模型无法获取实时订单、库存数据,只能凭空捏造信息,完全无法投入正式业务。
-
纯行动型工具调用程序 另一类程序可以直接调用 API、数据库等外部工具,完成真实业务操作。但程序缺少自主思考能力,只能匹配固定关键词执行固定动作,一旦用户改变提问句式、增加附加需求,程序就会识别失败,缺少灵活的任务规划与纠错能力。
2.2 ReAct 循环的核心逻辑
ReAct 范式把思考和行动深度耦合,形成闭环迭代机制:思考用来指导行动,行动返回的观测结果反过来约束思考,让每一步推理都建立在真实事实之上。一轮完整的循环包含三个核心环节:
- Thought(思考):智能体的内部推理过程,分析用户当前需求,拆解任务步骤,决定下一步要执行什么动作。对应本项目中的
think()函数。 - Action(行动):根据思考结论调用外部工具,发起数据库查询、接口请求等操作,对应本项目中的订单查询、库存查询、发送邮件动作。
- 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 运行流程:
- 决策日志模块:专门记录每一轮循环的轮次、思考内容、执行动作、入参、观测结果,并且提供格式化可视化方法,直观打印完整决策链路。
- 工具封装模块:封装订单查询、库存查询、邮件发送三类业务工具,内置模拟数据库,统一对外提供工具调用入口,后续可以无缝替换成真实业务接口。
- 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 主体(循环核心)
这是整个项目的引擎,分为三大核心函数:
think():对应 ReAct 中的 Thought 环节,解析用户自然语言,输出下一步动作与入参;run_agent():完成一轮完整闭环:思考→执行工具→获取观测→写入日志;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 项目价值总结
- 理论落地价值:把抽象的 ReAct 循环转化为可运行的代码,把 Thought、Action、Observation 三个抽象概念拆解为独立函数,直观展现智能体迭代运行机制,完美打通理论与工程实践。
- 业务落地价值:搭建了轻量化客服 Agent 框架,解耦推理层与工具层,既能作为实验 Demo,也可以快速改造对接企业真实业务接口,落地电商售前咨询、工单自动处理等场景。
- 可扩展性极强:规则推理模块可以无缝替换为 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 闭环,解决大模型幻觉、无法调用外部工具的问题。
二、传统方案的短板
- 纯思考型(思维链 CoT) 优点:可以完成复杂逻辑推理; 缺点:不能和外部工具交互,容易产生事实幻觉。
- 纯行动型 优点:可以直接执行外部动作; 缺点:缺少规划与反思,行为盲目。
ReAct 取长补短:思考指导行动,行动返回的观察结果反过来修正下一轮思考。
三、三步循环流程
- Thought(思考) 智能体内部推理:分析当前任务、拆解步骤、反思上一轮结果,属于内心独白。
- Action(行动) 执行具体操作,一般是调用外部工具(搜索、查数据库、查订单、发邮件等)。
- 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 轨迹

更多推荐



所有评论(0)