多轮对话的技术实现容易但流程设计难——不同业务场景需要的对话流程结构完全不同。用一套状态机硬套所有场景结果是简单场景被过度设计、复杂场景又表达不了。按四种流程模式分类设计每种用最合适的结构。一、模式一线性问答——FAQ式多轮最简单的模式用户每轮独立提问机器人独立回答轮次之间没有强依赖。退货政策是什么那保修多久——后一个问题虽然带那但两个问题答案独立。这种模式不需要复杂状态机只需要保留最近N轮消息作为上下文让模型理解那它这类指代每轮独立检索知识库作答。关键工程点是上下文窗口管理保留轮数太少模型读不懂指代太多浪费token且引入噪声经验值3-5轮。二、模式二槽位填充——表单式收集改地址、创建工单这类场景本质是收集一张表单订单号、新地址、联系方式……机器人逐个询问直到字段填满。流程结构是固定的字段清单询问顺序。槽位填充的设计要点字段支持乱序填充用户一次性说了订单号和地址不要还去追问已经给过的字段每个字段带校验规则订单号格式校验、地址长度校验校验不过当场追问不带着错误往下走。三、模式三分支决策——按回答走不同路径售后流程是典型的分支结构用户说退货→问是否已签收→已签收走退货分支未签收走拒签分支每个分支又有自己的子问题。流程像一棵决策树用户的每个回答决定走哪个分支。分支流程要可视化维护——业务规则经常调整如退货条件变化流程树做成配置而非硬编码运营改配置就能调整分支。四、模式四开放式探索——导购式对话导购对话没有固定流程用户可能先问产品、再问价格、又绕回产品对比、最后问售后。机器人不能预设问题顺序要跟着用户的思路走同时暗中推进购买链路。开放式模式的实现不是状态机是目标追踪机器人始终知道当前处于导购链路的哪个环节需求挖掘/匹配/异议/成交但不强制用户按顺序走用户自由跳转机器人在每个节点判断该推进还是响应。四种模式对照模式结构典型场景核心机制线性问答无固定流程FAQ咨询上下文窗口槽位填充固定字段清单改地址/建工单字段校验乱序填充分支决策决策树售后处理条件路由配置化开放式探索目标追踪智能导购链路节点自由跳转四种模式的统一调度class ConversationFlow: def __init__(self, wxid): self.wxid wxid self.mode None self.context ContextWindow(max_turns5) self.slots SlotForm() self.tree DecisionTree() self.goal GoalTracker() def handle(self, text): # 首轮或模式未定时识别该走哪种模式 if not self.mode: self.mode self.detect_mode(text) if self.mode qa: self.context.add(user, text) reply knowledge_answer(text, self.context.recent()) self.context.add(assistant, reply) elif self.mode slot: self.slots.fill(text) # 支持乱序填充 if self.slots.invalid(): reply self.slots.ask_invalid() # 校验不过当场追问 elif self.slots.missing(): reply self.slots.ask_next() # 问下一个缺失字段 else: reply self.slots.submit() # 填满执行 self.mode None # 流程结束 elif self.mode branch: reply self.tree.walk(text) # 按回答走分支 if self.tree.finished: self.mode None elif self.mode open: self.goal.update(text) # 更新当前环节 reply self.goal.respond(text) # 跟随用户思路 # 暗中推进时机合适时引导下一环节 if self.goal.can_advance(): reply \n\n self.goal.next_hint() return reply class ContextWindow: 线性问答的上下文窗口管理 def __init__(self, max_turns5): self.turns [] self.max_turns max_turns def add(self, role, content): self.turns.append({role: role, content: content}) if len(self.turns) self.max_turns * 2: self.turns self.turns[-self.max_turns * 2:] def recent(self): return self.turns落地建议四种模式不要混用一个引擎——问答用上下文窗口、表单用槽位管理、决策用树配置、导购用目标追踪各自实现独立维护。模式识别在会话开始时自动判断消息含明确操作动词→槽位模式含售后关键词→分支模式产品相关→开放模式其他→问答模式用户中途切换模式时允许重新判定。会话状态和消息结构参考 Eyun 开发文档平台开通见 Eyun 官网。