从零搭建可可视化思考链路的智能客服 Agent:拆解工具调用、决策日志与邮件归档完整实现
从零搭建可可视化思考链路的智能客服 Agent:拆解工具调用、决策日志与邮件归档完整实现
一、前言:从传统客服到 Agent 智能体的技术跃迁
在大模型普及之前,传统在线客服系统大多基于关键词匹配、固定问答库搭建,只能应对标准化、单一化咨询。一旦用户提出跨场景复合需求 —— 比如先查订单、再问库存、最后要求导出全部对话记录发送邮件,传统客服代码就会陷入逻辑臃肿、分支爆炸的困境。
随着 Agent 智能体技术落地,“思考 (Thought)- 行动 (Action)- 观察 (Observation)” 的闭环范式,成为解决复杂任务调度的标准方案。不同于简单的 if-else 判断,Agent 拥有独立的意图思考模块、可扩展工具集、完整决策记录链路三大核心能力:它能自主判断用户需求、选择对应工具执行、保存每一轮推理过程,甚至支持对话数据自动归档推送。
本文将基于一份完整可运行的 Python 工程,带大家从零拆解一款轻量化工业级智能客服 Agent。项目实现三大核心工具:订单查询、商品库存查询、对话记录邮件自动推送,同时内置可视化决策日志模块,每一轮用户交互都会完整打印 Agent 的内心思考、调用工具、入参、返回结果,完美复现大模型 Agent 的推理过程,无需依赖任何第三方大模型 API,纯规则即可落地,新手也能看懂、运行、二次改造。
完整工程包含四大分层模块:决策日志实体层、工具集封装层、Agent 核心推理层、交互式对话入口。全文将逐模块解析代码设计思想、业务落地场景、可扩展优化方案,同时结合运行演示截图展示实际交互效果,适合想入门 Agent 开发、搭建私有客服机器人、学习工具调用逻辑的开发者阅读。
二、项目整体架构设计:分层解耦,易于扩展
整个智能客服 Agent 采用分层模块化设计,四层结构职责完全隔离,符合高内聚低耦合编程思想,后续新增业务工具、替换 LLM 推理、扩展日志存储都无需改动核心逻辑:
- 决策日志层(DecisionLogger):负责存储每一轮对话 Agent 的完整推理链路,封装实体类记录轮次、思考内容、调用工具、参数、返回结果,提供可视化打印方法,直观展示 Agent “大脑” 的思考过程,对应截图中完整的【Agent 完整思考 - 行动决策链路】输出。
- 工具集层(CustomerServiceTools):统一封装所有业务能力工具,当前内置订单查询、库存查询、QQ 邮件发送三大工具,提供统一
run_tool分发路由,新增业务仅需新增工具函数 + 路由判断,不用改动 Agent 推理逻辑。内置模拟订单、库存数据库,同时集成 yagmail 实现真实 SMTP 邮件发送,支持对话记录一键归档。 - Agent 核心推理层(ServiceAgent):整个项目的调度中枢,实现经典 T-A-O(思考 - 行动 - 观察)闭环。
think()方法完成用户意图识别(规则匹配,可无缝替换为 GPT / 文心一言等大模型);run_agent()串联思考、工具执行、日志存储、对话历史保存全流程;chat_loop()提供交互式命令行多轮对话。 - 程序入口层:极简启动入口,实例化 Agent 并启动对话循环,输入
quit即可退出程序,退出后自动打印全部轮次的决策日志。
运行流程总览:用户输入对话 → Agent 思考模块识别需求 → 匹配对应业务工具 → 工具执行返回结果 → 保存本轮对话历史与推理日志 → 输出客服回复 → 用户持续交互直至输入 quit 退出 → 批量可视化所有轮次完整思考链路。
三、核心模块深度源码解析
3.1 决策日志实体层:实现 Agent 思考过程可追溯、可视化
很多新手开发 Agent 时会忽略推理过程记录,只关注最终返回给用户的结果,但在生产环境中,可追溯的决策日志是排查问题、优化意图识别的核心依据。例如用户输入指令没有触发预期工具、工具参数传递错误,通过日志就能直接定位 Agent 哪一轮思考出现偏差。
项目使用dataclass定义DecisionRecord数据实体,标准化每一轮推理的存储字段:对话轮次、思考文本、调用工具名、工具入参字典、工具返回观察结果。配套DecisionLogger日志管理器,提供新增记录、批量可视化打印两个核心方法。
环境部署与前置配置
3.1 第三方库安装
项目仅依赖yagmail邮件库,打开终端 / Notebook 单元格执行安装命令:
python
# 适配云Notebook精准安装,避免环境错位
import sys
!{sys.executable} -m pip install yagmail --user -i https://pypi.tuna.tsinghua.edu.cn/simple
Kaggle 环境注意:带--user参数安装的库存储在临时用户目录,重启内核会丢失,每次启动会话需重新执行安装代码;全局安装可移除--user参数。
3.2 QQ 邮箱授权码获取(邮件发送必备)
代码无法直接使用 QQ 登录密码登录 SMTP 服务器,必须开启 POP3/IMAP 服务并生成 16 位授权码,操作步骤:
浏览器打开mail.qq.com,登录发件 QQ 账号;
页面右上角「设置」→ 顶部切换「账户」标签;
下滑找到POP3/IMAP/SMTP服务,点击开启,完成短信 / 扫码安全验证;
验证通过后点击「生成授权码」,复制页面展示的 16 位字母 + 数字组合,妥善保存(仅显示一次,丢失需重新生成)。
3.3 邮箱配置参数替换
在CustomerServiceTools类初始化方法中修改三处邮箱配置:
python
self.sender_mail = "你的QQ账号@qq.com" # 发件QQ邮箱
self.auth_code = "你的QQ邮箱授权码" # 16位授权码
self.receiver_mail = "你的QQ账号@qq.com" # 接收对话记录的目标邮箱
python
@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("========================================")
结合运行截图可以看到,每一轮交互都会按固定格式输出结构化日志:第 1 轮用户查询 O1001 订单,Agent 思考内容、调用query_order工具、传入订单号参数、工具返回订单详情全部完整展示;第 4 轮执行邮件发送时,日志清晰记录邮件收件人、拼接完整对话记录作为邮件正文,全程透明可追溯。
日志模块的业务价值:
- 开发调试:快速定位意图识别逻辑 bug,比如用户输入模糊指令时 Agent 错误匹配工具;
- 业务复盘:运营可导出完整推理链路,分析用户高频咨询需求,优化客服话术;
- LLM 迁移兼容:如果后续将规则匹配替换为大模型,日志格式完全对齐主流 LLM Agent 框架(LangChain、LlamaIndex),无需重构日志存储逻辑。
3.2 工具集封装层:统一管理业务能力,低门槛扩展
工具是 Agent 和真实业务系统交互的桥梁,本项目将所有工具收敛在CustomerServiceTools类中,内置模拟数据库、邮箱配置、工具分发路由,三大工具各司其职,相互解耦。
3.2.1 模拟业务数据库
内置订单库order_db、库存库stock_db模拟后端业务服务,生产环境可直接替换为 MySQL、Redis 接口调用,无需改动上层 Agent 逻辑:
python
运行
self.order_db = {
"O1001": {"status": "已发货", "goods": "无线鼠标", "num": 2},
"O1002": {"status": "待发货", "goods": "机械键盘", "num": 1}
}
self.stock_db = {
"无线鼠标": 156,
"机械键盘": 23
}
观测层:DecisionLogger 可观测决策日志模块
4.1.1 DecisionRecord 日志实体
使用@dataclass定义标准化日志存储结构,固定 5 类核心字段,统一存储每一轮 Agent 完整决策信息,解决日志格式混乱、字段缺失问题:
python
运行
@dataclass
class DecisionRecord:
round_id: int # 对话轮次,区分多轮会话
thought: str # AI完整思考推理文本,解决黑盒问题
action: str # 执行动作标识(工具名/reply_direct)
action_params: Dict # 工具调用入参字典,用于调试参数错误
observation: str # 工具执行返回结果(客服回复文本)
每一次用户交互都会生成一条DecisionRecord对象,存入日志列表永久缓存至会话结束。
4.1.2 DecisionLogger 日志管理类
提供两大核心方法:
add_record():接收本轮全部决策数据,实例化日志实体并存入列表;
visualize():格式化遍历全部日志,分层打印轮次、思考、动作、参数、返回结果,清晰展示 AI 完整推理链路,便于开发调试与业务复盘。
python
运行
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("========================================")
4.2 能力层:CustomerServiceTools 业务工具集
————————————————
版权声明:本文为CSDN博主「Q19175349932」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Q19175349932/article/details/162513072
3.2.2 订单 & 库存查询工具
query_order、query_stock为基础查询工具,加入time.sleep(0.2)模拟真实接口网络延迟,返回标准化可读文本,直接对外输出给用户,容错处理覆盖订单号 / 商品不存在场景。
3.2.3 真实 QQ 邮箱发送工具(核心特色功能)
区别于仅模拟邮件输出的 Demo,本项目基于yagmail封装真实 SMTP 邮件发送能力,支持将全部多轮对话历史拼接为邮件正文,一键归档对话记录,适配企业客服会话留存需求。
python
运行
def send_email(self, receiver: str, content: str) -> str:
try:
mail_client = yagmail.SMTP(
user=self.sender_mail,
password=self.auth_code,
host="smtp.qq.com"
)
mail_client.send(
to=receiver,
subject="【智能客服Agent完整对话记录】",
contents=content
)
return f"✅ 对话记录邮件发送成功!收件人:{receiver}"
except Exception as err:
return f"❌ 邮件发送失败,错误详情:{str(err)}"
代码增加全局异常捕获,避免邮箱配置错误、网络波动导致整个客服程序崩溃;QQ 邮箱配置区单独抽离注释标注,使用者仅需替换发件邮箱、授权码、收件邮箱即可使用。
3.2.4 统一工具分发器run_tool
通过工具名字符串路由分发,Agent 仅需传递工具名和参数字典,不用感知每个工具的入参细节。后续新增物流查询、退款申请等工具,只需要新增函数 + 增加一行elif判断,完美满足业务迭代需求,符合开闭设计原则。
3.3 Agent 核心层:T-A-O 闭环,智能体调度中枢
ServiceAgent是整个项目的核心,串联思考、工具执行、日志存储、对话记录四大能力,实现标准 Agent 闭环流程。
3.3.1 意图思考模块think()
当前采用轻量化关键词规则匹配实现意图识别,零成本即可运行,同时预留完美的大模型替换接口。方法返回三元组:思考文本、工具名称、工具参数字典。
python
运行
def think(self, user_input: str) -> tuple[str, str, Dict]:
self.round += 1
user_text = user_input.strip()
if "订单" in user_text and "O1001" in user_text:
thought = "用户想要查询O1001订单,调用query_order工具,传入订单号O1001"
action = "query_order"
params = {"order_no": "O1001"}
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"
mail_content = "===== 本次智能客服完整对话记录 =====\n"
for idx, item in enumerate(self.dialog_history, 1):
mail_content += f"\n【第{idx}轮】\n用户:{item['user']}\n客服:{item['reply']}\n"
params = {
"receiver": self.tools.receiver_mail,
"content": mail_content
}
else:
thought = "无法识别用户需求,无需调用工具,返回兜底提示"
action = "reply_direct"
params = {}
return thought, action, params
逻辑覆盖三类核心用户需求:订单查询、库存查询、对话邮件归档;无法匹配时走兜底直接回复,引导用户输入规范指令。同时内置dialog_history列表,永久保存每一轮用户提问与客服回复,执行发邮件工具时自动遍历拼接完整对话文本。
3.3.2 单次闭环执行run_agent()
完成一轮完整交互全流程:调用 think 获取推理结果 → 判断是否需要调用工具 → 执行工具获取返回内容 → 写入决策日志 → 保存对话历史,最终返回客服回复文本给终端打印。
3.3.3 交互式对话循环chat_loop()
提供命令行交互式入口,打印使用指引,持续接收用户输入;输入quit终止循环,程序退出时自动调用日志可视化方法,批量输出所有轮次完整推理链路,和截图运行效果完全对应。
3.4 程序入口层
极简启动代码,隔离业务逻辑与启动代码,结构清晰:
python
运行
if __name__ == "__main__":
agent = ServiceAgent()
agent.chat_loop()
四、项目运行演示:还原多轮对话完整流程
结合两张运行截图,完整复现用户多轮交互场景,直观感受 Agent 完整工作链路:
4.1 对话交互流程
- 第一轮:用户输入「帮我查找一下订单 O1001」 Agent 思考识别用户查询订单,调用
query_order工具,传入订单号 O1001,工具返回订单详情,客服输出订单信息,保存本轮对话与推理日志。 - 第二轮:用户输入「帮我查看机械键盘的库存还有多少」 关键词匹配触发库存查询工具,返回机械键盘库存 23 件,完成第二轮记录。
- 第三轮:用户输入「帮我发送邮件到邮箱」 关键词仅包含 “邮件”,无 “发邮件” 完整关键词,匹配兜底分支,返回引导提示文本,日志标记
reply_direct无工具调用。 - 第四轮:用户输入「发邮件」 精准匹配邮件发送意图,自动读取前 3 轮全部对话历史拼接为邮件正文,调用
send_email工具发送至配置 QQ 邮箱,返回发送成功提示。 - 终止交互:用户输入
quit退出对话循环,程序批量打印 4 轮完整思考 - 行动决策链路,每一轮 Agent 的内心推理、工具参数、返回结果全部结构化输出。
4.2 运行效果核心亮点
- 推理全透明:普通客服程序只会输出回复文本,本项目完整还原 Agent “思考过程”,复现大模型 Agent 的思维链(CoT)效果,是学习思维链技术绝佳入门案例;
- 真实业务落地能力:不只是模拟 Demo,邮件模块可真实收发对话记录,订单、库存模块可无缝对接企业后端接口;
- 高容错鲁棒性:工具调用异常捕获、未知指令兜底回复、邮箱发送失败捕获,不会出现程序崩溃;
- 轻量化无依赖:仅依赖 yagmail 第三方库,其余均为 Python 标准库,安装一行
pip install yagmail即可运行,无需 GPU、大模型 API 密钥。
五、工程扩展与生产级优化方案
本项目是轻量化 Agent Demo,在此基础上可从四大维度升级为企业级智能客服系统,下面给出可落地优化思路:
5.1 意图识别升级:规则匹配替换为大模型 LLM
当前think()方法基于关键词规则,适合标准化指令;面对模糊、口语化用户提问(如 “我之前买的鼠标订单查一下”“键盘还有货吗,把聊天记录发我邮箱”)识别能力不足。可将think()重构为调用大模型 API(OpenAI、通义千问、本地 Llama3),通过 Prompt 约束大模型输出固定 JSON 格式的思考、动作、参数,日志、工具层完全不用改动,兼容现有架构。
5.2 持久化存储优化
当前决策日志、对话历史仅保存在内存,程序退出即销毁,生产环境需要持久化:
- 对话记录、决策日志写入 SQLite/MySQL,增加对话 ID、用户 ID、时间戳字段;
- 日志支持导出 Excel、PDF 文件,搭配邮件工具实现自动日报推送;
- 接入 Elasticsearch,支持对话内容全文检索,方便运营复盘。
5.3 工具集能力拓展
基于统一run_tool路由,快速新增企业客服高频工具:
- 物流查询工具:对接快递 100 开放 API,输入订单号获取物流轨迹;
- 售后退款工具:调用售后系统接口,提交退款申请、查询退款进度;
- 商品推荐工具:根据用户查询的商品,返回关联配件库存与活动优惠;
- 知识库检索工具:接入向量数据库,实现产品 FAQ 智能问答。
5.4 交互界面升级
当前仅支持命令行交互,可快速封装上层交互界面:
- Web 端:基于 Gradio/Streamlit 搭建可视化网页客服界面,实时展示 Agent 思考日志;
- 对接企业渠道:封装 API 接口,对接小程序、企业微信、抖音小店客服窗口;
- 可视化面板:实时展示每一轮 T-A-O 推理链路,用于产品演示、教学培训。
5.5 安全与风控优化
- 参数校验:对订单号、邮箱、商品名校验输入格式,防止注入攻击;
- 邮件权限管控:限制仅管理员邮箱接收对话记录,避免会话数据泄露;
- 访问限流:单用户每分钟工具调用次数限制,防止恶意高频查询压垮业务数据库;
- 敏感词过滤:对话内容过滤手机号、身份证等隐私信息,邮件发送前脱敏处理。
六、总结:Agent 开发入门核心收获
本文完整实现了一套分层架构、可追溯推理、具备真实业务能力的轻量化智能客服 Agent,从代码分层设计、T-A-O 智能体闭环、工具调用路由、决策日志可视化、多轮对话邮件归档多个维度完成拆解。对于 Agent 技术入门学习者,通过本项目可以掌握三大核心知识点:
- Agent 标准 T-A-O 闭环范式:理解智能体 “思考判断 - 工具执行 - 结果观察” 的基础运行逻辑,这是所有大模型 Agent(AutoGPT、LangChain Agent)的底层核心原理;
- 模块化工程设计思想:业务工具、推理逻辑、日志存储分层解耦,掌握可扩展、易维护的 Python 工程开发规范;
- 业务落地 Demo 改造能力:基于现有代码快速拓展客服场景功能,无缝对接后端数据库、邮件、第三方 API,低成本搭建私有智能客服机器人。
不同于网上大量仅做模拟输出、无真实业务能力的玩具 Demo,本项目的邮件归档、可视化推理日志两大特色功能可直接用于课程作业、技术演示、小型企业内部客服工具。读者运行代码后,可基于文中给出的扩展方案,尝试接入大模型、Web 界面、数据库持久化,一步步从 Demo 升级为完整可用的生产级智能客服系统。
可完整运行代码
import time
import yagmail
from typing import Dict, List, Any
from dataclasses import dataclass
# ---------------------- 1. 决策日志实体 ----------------------
@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("========================================")
# ---------------------- 2. 工具集:订单、库存、真实邮件发送 ----------------------
class CustomerServiceTools:
"""客服可用工具库"""
def __init__(self):
# ========== 【核心配置区,必须修改为你自己的信息】 ==========
self.sender_mail = "你的QQ账号@qq.com" # 发件人QQ邮箱
self.auth_code = "你的QQ邮箱授权码" # 网页mail.qq.com生成的授权码
self.receiver_mail = "你的QQ账号@qq.com" # 接收对话记录的邮箱
# ==========================================================
# 模拟业务数据库
self.order_db = {
"O1001": {"status": "已发货", "goods": "无线鼠标", "num": 2},
"O1002": {"status": "待发货", "goods": "机械键盘", "num": 1}
}
self.stock_db = {
"无线鼠标": 156,
"机械键盘": 23
}
def query_order(self, order_no: str) -> str:
"""工具1:查询订单"""
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:
"""工具2:查询库存"""
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:
"""工具3:真实QQ邮箱发送,捕获异常防崩溃"""
try:
# 连接QQ邮箱SMTP服务器
mail_client = yagmail.SMTP(
user=self.sender_mail,
password=self.auth_code,
host="smtp.qq.com"
)
# 发送邮件
mail_client.send(
to=receiver,
subject="【智能客服Agent完整对话记录】",
contents=content
)
return f"✅ 对话记录邮件发送成功!收件人:{receiver}"
except Exception as err:
return f"❌ 邮件发送失败,错误详情:{str(err)}"
# 工具路由分发器
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}"
# ---------------------- 3. Agent核心:思考-行动-观察闭环 ----------------------
class ServiceAgent:
def __init__(self):
self.tools = CustomerServiceTools()
self.logger = DecisionLogger()
self.round = 0
# 新增:存储全部对话历史
self.dialog_history = []
def think(self, user_input: str) -> tuple[str, str, Dict]:
"""意图识别模块,规则匹配,可替换大模型LLM"""
self.round += 1
user_text = user_input.strip()
if "订单" in user_text and "O1001" in user_text:
thought = "用户想要查询O1001订单,调用query_order工具,传入订单号O1001"
action = "query_order"
params = {"order_no": "O1001"}
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"
# 拼接完整对话记录作为邮件内容
mail_content = "===== 本次智能客服完整对话记录 =====\n"
for idx, item in enumerate(self.dialog_history, 1):
mail_content += f"\n【第{idx}轮】\n用户:{item['user']}\n客服:{item['reply']}\n"
params = {
"receiver": self.tools.receiver_mail,
"content": mail_content
}
else:
thought = "无法识别用户需求,无需调用工具,返回兜底提示"
action = "reply_direct"
params = {}
return thought, action, params
def run_agent(self, user_message: str) -> str:
"""单次完整思考-执行-记录闭环"""
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
)
# 保存本轮用户提问+客服回复到对话历史
self.dialog_history.append({
"user": user_message,
"reply": obs
})
return obs
def chat_loop(self):
"""交互式多轮对话入口"""
print("🤖 智能客服Agent已启动")
print("使用指令示例:")
print("1. 查询O1001订单")
print("2. 机械键盘库存还有多少")
print("3. 发邮件(自动把所有对话记录发送到邮箱)")
print("输入 quit 退出对话\n")
while True:
user_msg = input("用户:")
if user_msg.lower() == "quit":
break
reply = self.run_agent(user_msg)
print(f"客服回复:{reply}\n")
# 退出后打印完整决策链路
self.logger.visualize()
# ---------------------- 4. 程序入口 ----------------------
if __name__ == "__main__":
agent = ServiceAgent()
agent.chat_loop()


DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)