从零搭建可可视化思考链路的智能客服 Agent:拆解工具调用、决策日志与邮件归档完整实现

一、前言:从传统客服到 Agent 智能体的技术跃迁

在大模型普及之前,传统在线客服系统大多基于关键词匹配、固定问答库搭建,只能应对标准化、单一化咨询。一旦用户提出跨场景复合需求 —— 比如先查订单、再问库存、最后要求导出全部对话记录发送邮件,传统客服代码就会陷入逻辑臃肿、分支爆炸的困境。

随着 Agent 智能体技术落地,“思考 (Thought)- 行动 (Action)- 观察 (Observation)” 的闭环范式,成为解决复杂任务调度的标准方案。不同于简单的 if-else 判断,Agent 拥有独立的意图思考模块、可扩展工具集、完整决策记录链路三大核心能力:它能自主判断用户需求、选择对应工具执行、保存每一轮推理过程,甚至支持对话数据自动归档推送。

本文将基于一份完整可运行的 Python 工程,带大家从零拆解一款轻量化工业级智能客服 Agent。项目实现三大核心工具:订单查询、商品库存查询、对话记录邮件自动推送,同时内置可视化决策日志模块,每一轮用户交互都会完整打印 Agent 的内心思考、调用工具、入参、返回结果,完美复现大模型 Agent 的推理过程,无需依赖任何第三方大模型 API,纯规则即可落地,新手也能看懂、运行、二次改造。

完整工程包含四大分层模块:决策日志实体层、工具集封装层、Agent 核心推理层、交互式对话入口。全文将逐模块解析代码设计思想、业务落地场景、可扩展优化方案,同时结合运行演示截图展示实际交互效果,适合想入门 Agent 开发、搭建私有客服机器人、学习工具调用逻辑的开发者阅读。

二、项目整体架构设计:分层解耦,易于扩展

整个智能客服 Agent 采用分层模块化设计,四层结构职责完全隔离,符合高内聚低耦合编程思想,后续新增业务工具、替换 LLM 推理、扩展日志存储都无需改动核心逻辑:

  1. 决策日志层(DecisionLogger):负责存储每一轮对话 Agent 的完整推理链路,封装实体类记录轮次、思考内容、调用工具、参数、返回结果,提供可视化打印方法,直观展示 Agent “大脑” 的思考过程,对应截图中完整的【Agent 完整思考 - 行动决策链路】输出。
  2. 工具集层(CustomerServiceTools):统一封装所有业务能力工具,当前内置订单查询、库存查询、QQ 邮件发送三大工具,提供统一run_tool分发路由,新增业务仅需新增工具函数 + 路由判断,不用改动 Agent 推理逻辑。内置模拟订单、库存数据库,同时集成 yagmail 实现真实 SMTP 邮件发送,支持对话记录一键归档。
  3. Agent 核心推理层(ServiceAgent):整个项目的调度中枢,实现经典 T-A-O(思考 - 行动 - 观察)闭环。think()方法完成用户意图识别(规则匹配,可无缝替换为 GPT / 文心一言等大模型);run_agent()串联思考、工具执行、日志存储、对话历史保存全流程;chat_loop()提供交互式命令行多轮对话。
  4. 程序入口层:极简启动入口,实例化 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 轮执行邮件发送时,日志清晰记录邮件收件人、拼接完整对话记录作为邮件正文,全程透明可追溯。

日志模块的业务价值:

  1. 开发调试:快速定位意图识别逻辑 bug,比如用户输入模糊指令时 Agent 错误匹配工具;
  2. 业务复盘:运营可导出完整推理链路,分析用户高频咨询需求,优化客服话术;
  3. 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_orderquery_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 对话交互流程

  1. 第一轮:用户输入「帮我查找一下订单 O1001」 Agent 思考识别用户查询订单,调用query_order工具,传入订单号 O1001,工具返回订单详情,客服输出订单信息,保存本轮对话与推理日志。
  2. 第二轮:用户输入「帮我查看机械键盘的库存还有多少」 关键词匹配触发库存查询工具,返回机械键盘库存 23 件,完成第二轮记录。
  3. 第三轮:用户输入「帮我发送邮件到邮箱」 关键词仅包含 “邮件”,无 “发邮件” 完整关键词,匹配兜底分支,返回引导提示文本,日志标记reply_direct无工具调用。
  4. 第四轮:用户输入「发邮件」 精准匹配邮件发送意图,自动读取前 3 轮全部对话历史拼接为邮件正文,调用send_email工具发送至配置 QQ 邮箱,返回发送成功提示。
  5. 终止交互:用户输入quit退出对话循环,程序批量打印 4 轮完整思考 - 行动决策链路,每一轮 Agent 的内心推理、工具参数、返回结果全部结构化输出。

4.2 运行效果核心亮点

  1. 推理全透明:普通客服程序只会输出回复文本,本项目完整还原 Agent “思考过程”,复现大模型 Agent 的思维链(CoT)效果,是学习思维链技术绝佳入门案例;
  2. 真实业务落地能力:不只是模拟 Demo,邮件模块可真实收发对话记录,订单、库存模块可无缝对接企业后端接口;
  3. 高容错鲁棒性:工具调用异常捕获、未知指令兜底回复、邮箱发送失败捕获,不会出现程序崩溃;
  4. 轻量化无依赖:仅依赖 yagmail 第三方库,其余均为 Python 标准库,安装一行pip install yagmail即可运行,无需 GPU、大模型 API 密钥。

五、工程扩展与生产级优化方案

本项目是轻量化 Agent Demo,在此基础上可从四大维度升级为企业级智能客服系统,下面给出可落地优化思路:

5.1 意图识别升级:规则匹配替换为大模型 LLM

当前think()方法基于关键词规则,适合标准化指令;面对模糊、口语化用户提问(如 “我之前买的鼠标订单查一下”“键盘还有货吗,把聊天记录发我邮箱”)识别能力不足。可将think()重构为调用大模型 API(OpenAI、通义千问、本地 Llama3),通过 Prompt 约束大模型输出固定 JSON 格式的思考、动作、参数,日志、工具层完全不用改动,兼容现有架构。

5.2 持久化存储优化

当前决策日志、对话历史仅保存在内存,程序退出即销毁,生产环境需要持久化:

  1. 对话记录、决策日志写入 SQLite/MySQL,增加对话 ID、用户 ID、时间戳字段;
  2. 日志支持导出 Excel、PDF 文件,搭配邮件工具实现自动日报推送;
  3. 接入 Elasticsearch,支持对话内容全文检索,方便运营复盘。

5.3 工具集能力拓展

基于统一run_tool路由,快速新增企业客服高频工具:

  1. 物流查询工具:对接快递 100 开放 API,输入订单号获取物流轨迹;
  2. 售后退款工具:调用售后系统接口,提交退款申请、查询退款进度;
  3. 商品推荐工具:根据用户查询的商品,返回关联配件库存与活动优惠;
  4. 知识库检索工具:接入向量数据库,实现产品 FAQ 智能问答。

5.4 交互界面升级

当前仅支持命令行交互,可快速封装上层交互界面:

  1. Web 端:基于 Gradio/Streamlit 搭建可视化网页客服界面,实时展示 Agent 思考日志;
  2. 对接企业渠道:封装 API 接口,对接小程序、企业微信、抖音小店客服窗口;
  3. 可视化面板:实时展示每一轮 T-A-O 推理链路,用于产品演示、教学培训。

5.5 安全与风控优化

  1. 参数校验:对订单号、邮箱、商品名校验输入格式,防止注入攻击;
  2. 邮件权限管控:限制仅管理员邮箱接收对话记录,避免会话数据泄露;
  3. 访问限流:单用户每分钟工具调用次数限制,防止恶意高频查询压垮业务数据库;
  4. 敏感词过滤:对话内容过滤手机号、身份证等隐私信息,邮件发送前脱敏处理。

六、总结:Agent 开发入门核心收获

本文完整实现了一套分层架构、可追溯推理、具备真实业务能力的轻量化智能客服 Agent,从代码分层设计、T-A-O 智能体闭环、工具调用路由、决策日志可视化、多轮对话邮件归档多个维度完成拆解。对于 Agent 技术入门学习者,通过本项目可以掌握三大核心知识点:

  1. Agent 标准 T-A-O 闭环范式:理解智能体 “思考判断 - 工具执行 - 结果观察” 的基础运行逻辑,这是所有大模型 Agent(AutoGPT、LangChain Agent)的底层核心原理;
  2. 模块化工程设计思想:业务工具、推理逻辑、日志存储分层解耦,掌握可扩展、易维护的 Python 工程开发规范;
  3. 业务落地 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()

Logo

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

更多推荐