第 1.7.3 节:用状态字段和迁移表描述多轮任务进度
状态字段与迁移表不能只停留在口头约定,还需要落实为字段、校验和失败处理。完成本节后,你应该能够把状态字段与迁移表落成字段表、校验规则、错误处理和验收样例。
实现步骤或决策流程
推荐技术流
| 步骤 | 做什么 | 为什么 |
|---|---|---|
| 1 | 先定义任务生命周期 | 明确任务从创建、等待信息、调用工具、等待审批到完成的阶段。 |
| 2 | 设计状态字段 | 让系统知道当前步骤、缺失信息、工具结果和停止原因。 |
| 3 | 区分会话状态和长期记忆 | 防止把临时信息错误保存成长期记忆。 |
| 4 | 设计上下文构造规则 | 控制进入模型的历史、状态摘要和工具结果。 |
| 5 | 设计状态迁移表 | 明确什么事件会让状态从一步进入下一步。 |
| 6 | 设计恢复策略 | 工具失败、用户中断、输出无效后能继续处理。 |
| 7 | 设计停止条件 | 防止循环、重复追问和重复调用工具。 |
| 8 | 设计记忆写入策略 | 只保存有价值、被允许、可删除的信息。 |
| 9 | 记录状态变更日志 | 让问题能被追踪、复盘和审计。 |
| 10 | 用多轮验收样例测试 | 证明系统不是只会单轮回答。 |
这条技术流的核心理由是:状态管理要先于复杂编排。没有稳定状态,LangGraph(智能体状态图框架)和多智能体都会变成混乱流程。
字段契约
会话字段
| 字段 | 含义 | 示例 | 验收要求 |
|---|---|---|---|
| session_id(会话编号) | 一段多轮交互的编号 | 用户一次售后咨询窗口 | 同一会话内补充信息能接上前文。 |
| user_id(用户编号) | 当前用户身份 | 登录用户编号或访客编号 | 不让用户口头输入冒充身份。 |
| channel(渠道) | 用户来自哪里 | 网站、App(应用程序)、企业微信 | 影响转人工和通知方式。 |
| session_status(会话状态) | 会话是否活跃 | active、waiting_user、closed | 关闭后不能继续误用旧上下文。 |
| started_at(开始时间) | 会话开始时间 | 本次咨询创建时间 | 用于过期和统计。 |
| last_active_at(最后活跃时间) | 最后一次交互时间 | 用户补充订单号的时间 | 用于会话恢复和超时。 |
| session_summary(会话摘要) | 会话关键事实摘要 | 用户投诉售后,缺订单号 | 用摘要替代全部历史。 |
任务状态字段
| 字段 | 含义 | 客服项目示例 | 风险控制 |
|---|---|---|---|
| task_id(任务编号) | 当前处理任务编号 | 一次退款咨询任务 | 一个会话可以有多个任务时避免混乱。 |
| intent(意图) | 当前任务类型 | refund_request、order_status、complaint | 来自第 1.5 章分流结果。 |
| risk_level(风险等级) | 当前风险 | low、medium、high | 高风险默认保守处理。 |
| current_step(当前步骤) | 任务进行到哪里 | waiting_for_order_id、checking_order、preparing_ticket | 决定下一步动作。 |
| missing_fields(缺失字段) | 还缺哪些信息 | order_id、contact_info | 防止信息不足时调用工具。 |
| used_tools(已用工具) | 已调用工具列表 | get_order_status、search_policy | 防止重复调用和便于复盘。 |
| tool_results(工具结果) | 工具结果摘要 | 订单已发货,政策需人工审核 | 不保存不必要敏感字段。 |
| approval_required(需要审批) | 是否需要人工确认 | true 或 false | 控制高风险动作。 |
| retry_count(重试次数) | 当前任务失败或重试次数 | 1、2、3 | 达到上限后转人工。 |
| stop_reason(停止原因) | 本轮为什么停止 | completed、need_info、handoff、failed | 用于日志和面试说明。 |
记忆字段
| 字段 | 含义 | 可保存示例 | 不应保存示例 |
|---|---|---|---|
| memory_id(记忆编号) | 一条长期记忆的编号 | 用户偏好短信通知 | 真实 API Key(接口密钥)。 |
| memory_type(记忆类型) | 偏好、摘要、经验、规则 | communication_preference(沟通偏好) | 未核实的订单状态。 |
| owner_scope(归属范围) | 属于个人、团队还是系统 | 用户个人偏好、客服团队经验 | 无归属的敏感数据。 |
| source_trace_id(来源追踪编号) | 这条记忆来自哪次交互 | 某次用户明确确认的偏好 | 无来源的模型猜测。 |
| expires_at(过期时间) | 何时失效 | 30 天后重新确认 | 永久保存敏感内容。 |
| access_policy(访问策略) | 谁能读取 | 当前用户、客服主管、管理员 | 所有人都能读。 |
| delete_policy(删除策略) | 如何删除或撤回 | 用户请求删除时移除 | 无法删除。 |
记忆字段的核心原则是:能不记就不记,必须记就说明原因、权限和期限。
状态迁移表
状态迁移表说明“什么事件发生后,任务状态如何变化”。它比自然语言说明更容易验收。
读图重点:状态机把禁止跳步写清:没有订单号不查订单,没有审批不建高风险工单,失败超限必须转人工。
| 当前状态 | 触发事件 | 下一个状态 | 系统动作 |
|---|---|---|---|
| new_task(新任务) | 用户提交退款投诉 | waiting_for_order_id(等待订单号) | 追问订单号,记录高风险。 |
| waiting_for_order_id(等待订单号) | 用户补充订单号 | ready_to_check_order(可查订单) | 校验订单号格式,准备工具调用。 |
| ready_to_check_order(可查订单) | 工具权限通过 | checking_order(正在查订单) | 调用查订单工具。 |
| checking_order(正在查订单) | 工具成功 | ready_to_search_policy(可查政策) | 保存订单结果摘要。 |
| checking_order(正在查订单) | 工具失败 | recoverable_error(可恢复错误) | 记录失败次数,判断是否重试。 |
| ready_to_search_policy(可查政策) | 政策要求人工 | waiting_approval(等待审批) | 创建工单草稿或转人工。 |
| waiting_approval(等待审批) | 用户确认 | creating_ticket(创建工单中) | 进入创建工单工具。 |
| creating_ticket(创建工单中) | 工单创建成功 | completed(完成) | 返回工单编号和处理摘要。 |
| recoverable_error(可恢复错误) | 重试次数未超限 | previous_step(回到上一步) | 重试或要求用户补充信息。 |
| recoverable_error(可恢复错误) | 重试次数超限 | handoff(转人工) | 停止自动处理,转人工。 |
真实项目里,状态迁移表可以直接变成产品验收材料。客户和面试官都能看懂系统如何推进任务。
制作步骤
第 1 步:定义任务生命周期
先写清楚一个客服任务有哪些阶段。不要只写“用户提问,Agent(智能体)回答”。以退款投诉为例,阶段至少包括:
- 新任务。
- 等待用户补充订单号。
- 可查订单。
- 正在查订单。
- 可查政策。
- 准备工单。
- 等待人工确认。
- 创建工单。
- 完成。
- 转人工或失败。
第 2 步:列出状态字段
每个阶段都要问:
- 这个阶段需要哪些输入?
- 已经知道哪些事实?
- 还缺哪些字段?
- 是否调用过工具?
- 是否需要人工确认?
- 失败后能否恢复?
- 什么情况下停止?
这些问题会反推出本章的任务状态字段。
第 3 步:设计上下文构造规则
不要把全部历史都给模型。建议只放:
- 当前用户输入。
- 当前任务状态摘要。
- 必要的最近一两轮对话。
- 关键工具结果摘要。
- 本轮可选动作。
- 安全边界。
这样既能保持连续性,又能控制 Token(文本计量单位)、成本和错误。
第 4 步:设计状态迁移
用表格写清楚“当前状态、触发事件、下一个状态、系统动作”。状态迁移表是从普通聊天系统进入 Agent 工程系统的关键。
第 5 步:设计恢复策略
恢复策略要覆盖:
- 用户补充缺失信息后继续。
- 工具失败后重试或转人工。
- 模型输出无效后重试或降级。
- 会话超时后询问是否继续旧任务。
- 高风险任务等待人工确认。
第 6 步:设计记忆策略
记忆策略至少回答:
- 什么信息可以保存?
- 为什么保存?
- 保存多久?
- 谁能读取?
- 用户能否删除?
- 信息过期后如何处理?
如果回答不上来,就不要写入长期记忆。
第 7 步:设计验收样例
状态管理必须用多轮样例验收。至少准备:
- 用户缺订单号后补充订单号。
- 查订单工具失败后重试。
- 用户中断后回来继续。
- 高风险退款请求进入人工确认。
- 输出校验失败后降级。
- 长期记忆不保存敏感信息。
什么时候不该使用长期记忆
长期记忆不是越多越好。下面这些场景不适合直接记:
| 场景 | 原因 | 推荐做法 |
|---|---|---|
| 订单状态 | 会变化,且属于业务系统事实 | 每次从订单系统查询。 |
| 退款结果 | 涉及资金和审批 | 以售后系统为准。 |
| API Key(接口密钥)或凭据 | 高敏感信息 | 永远不进入记忆。 |
| 用户身份证、银行卡等敏感信息 | 隐私和合规风险高 | 避免保存,必要时用合规系统处理。 |
| 模型猜测的用户偏好 | 可能不准确 | 只有用户明确确认后才能保存。 |
| 临时投诉情绪 | 可能只和当前事件有关 | 放入会话状态,不写长期记忆。 |
状态管理追求的是可控,不是无限记忆。
和后续章节的关系
| 后续主题 | 本章如何铺垫 |
|---|---|
| RAG(检索增强生成) | 状态决定什么时候需要查知识库,工具结果和检索片段如何进入上下文。 |
| MCP(模型上下文协议) | MCP 提供外部工具生态,但工具结果仍要写入状态和日志。 |
| LangGraph(智能体状态图框架) | LangGraph(智能体状态图框架)可以把本章状态迁移表实现成状态图。 |
| 多智能体 | 多个 Agent 之间交接任务时,必须交接状态摘要和权限边界。 |
| 部署和监控 | 状态日志是监控失败率、转人工率和工具成功率的基础。 |
第 1.7 章的状态设计,是后面复杂编排的地基。
版本与资料来源
本节聚焦状态、会话、记忆、恢复、停止条件和面试表达。
主要资料入口:
- OpenAI(模型服务商) Agents SDK(智能体软件开发工具包)文档:https://openai.github.io/openai-agents-python/
- LangGraph(智能体状态图框架)文档:https://langchain-ai.github.io/langgraph/
- OpenAI(模型服务商) Function Calling(函数调用)指南:https://developers.openai.com/api/docs/guides/function-calling
过时风险:Agent 框架、状态图框架和记忆模块会持续变化。涉及具体实现前,必须重新核对官方文档和版本说明。