对话流和工作流最要紧的差别只有一条:对话流有记忆。 用户上一句说保温杯, 下一句只说「能退吗」,它知道「它」指什么。 跨轮靠会话变量。这一轮说的话、判出的类型、提到的产品名,都存进去,下一轮还能读。 测对话流一定要测省略句。三轮都拿完整问题去测,测出来的是工作流的能力。
这一节对应书上「创建对话流」和「问题意图识别配置」两个小节。 创建对话流的按钮位置和建工作流一样,这一步没什么可讲的,本课不占篇幅。 真正要讲的是:为什么客服非用对话流不可,用工作流会缺什么。
一、五个差别,一条最要紧
| 项 | 工作流 | 对话流 |
|---|---|---|
| 多轮 | 一次输入一次输出 | 能记住上一轮说了什么 |
| 会话变量 | 全局变量只在本轮有效 | 跨轮保留 |
| 节点里能读历史 | 不能 | 能,能拿最近几轮 |
| 挂载方式 | 被智能体当工具调 | 被智能体当对话入口 |
| 测试方式 | 填参数跑一次 | 像聊天一样一问一答 |
五条里第一条是根,后四条都是它的结果:有记忆才需要会话变量,有记忆才谈得上「读历史」。 工作流也能做客服,但每一轮都要用户把话说全——「请问您要咨询哪款产品的哪个问题」。 这种问法一问就掉用户。 多轮是对话流的本分,不是加分项。
二、会话变量到底存了什么
第一轮用户说「你们那个保温杯能保温多久」,变量里就有了三条:last 是空的、text 是这句话、 product 是「保温杯」。 第二轮用户只说「能退吗」。 这一轮的 text 换成了「能退吗」,last 存着上一轮的原话,而 product 还留着「保温杯」。 就靠 product 这一条,「它」才不会是空的。 没有它,第二轮得让模型猜「它」指什么。
猜也未必猜错,但猜错了用户不会告诉你他问的是别的产品——他只会觉得这机器人不懂人话。
三、意图识别放哪
| 放哪 | 效果 | 代价 |
|---|---|---|
| 放在对话流开头 | 每轮都判一次 | 多花一次调用 |
| 放在产品问题分支里 | 只判「产品 / 非产品」 | 判断题变简单 |
| 不单独放,靠大模型自己判 | 省一个节点 | 判错了不知道 |
书上用第二种:一个意图识别节点只判「产品 / 非产品」,判完分两条路。 判得越少越准。 判三类容易错,判两类不容易错。 第 13.9 节的测试集里,答错的那三句全是「一句话里有两个话题」,正因为只判两类,这种错才压得住。 第三种看着省事,其实最贵:判错的时候没有任何地方能看到它判错了,只能从用户的抱怨里倒推。
四、测试要测省略句
| 轮次 | 用户说 | 期望 |
|---|---|---|
| 第一轮 | 你们那个保温杯能保温多久 | 12 小时,316 内胆 |
| 第二轮 | 能退吗 | 七天无理由,十五天换新 |
| 第三轮 | 那盖子呢 | 杯盖可拆洗,别放洗碗机 |
三轮里第二、三轮都是省略句。省略句才是真实用户的样子。 如果三轮都拿完整问题测,测出来的是工作流的能力——它当然全对,因为每句都自带主语。 补一句:第三轮的「那盖子呢」最难。它连「退」这个动词都没有,全靠会话里的 product 撑住。 这一句过了,多轮才算真的通了。
五、平台上怎么建
顺序是:资源库 → 创建对话流 → 开始节点加一个「用户输入」变量 → 意图识别节点, 最后两条出边各接一条支路。 建完点右上角的试运行,用聊天窗口一问一答。 按钮位置随版本会动,能保证的只有顺序:先变量、再判断、再分支。
开始节点那个变量最容易漏。没有它,后面的节点就没东西可接,点连线时会发现「没有可选的输入」。 试运行那一步是本节的验收标准: 在聊天窗口里能连着问三句省略句,都答对,才算建完。填参数跑一次那种测法,在对话流里不算数。 以上都是平台上的点击操作,本沙箱没有扣子账号,这一段不执行。 能执行的部分在下面:会话变量和多轮记忆的机制。
六、动手 Demo:对话流不是工作流
先列五个差别,再用一个三轮对话的模拟,看会话变量是怎么跨轮活下来的。 最后看意图识别该放在哪一层:判两类比判三类稳。
SESSION = {}
def turn(text):
SESSION[u'last'] = SESSION.get(u'text', u'')
SESSION[u'text'] = text
if u'保温杯' in text:
SESSION[u'product'] = u'保温杯'
return dict(SESSION)
实跑输出:
--------------------------------------------------------------------
对话流不是工作流
--------------------------------------------------------------------
① 五个差别
--------------------------------------------------------------------
| 项 | 工作流 | 对话流 |
|---|---|---|
| 多轮 | 一次输入一次输出 | 能记住上一轮说了什么 |
| 会话变量 | 全局变量只在本轮有效 | 跨轮保留 |
| 节点里能读历史 | 不能 | 能,能拿最近几轮 |
| 挂载方式 | 被智能体当工具调 | 被智能体当对话入口 |
| 测试方式 | 填参数跑一次 | 像聊天一样一问一答 |
最要紧的是第一行:对话流有记忆。
用户上一句说「保温杯」,下一句说「能退吗」,它知道「它」指什么。
工作流也能做客服,但每一轮都要用户把话说全。多轮是对话流的本分。
② 会话变量怎么用
--------------------------------------------------------------------
第一轮说了什么:last=、text=你们那个保温杯能保温多久、product=保温杯
第二轮说了什么:last=你们那个保温杯能保温多久、text=能退吗、product=保温杯
第二轮只有两个字,可 product 还留着「保温杯」——这就是跨轮保留。
没有这个变量,第二轮就得靠模型猜「它」是什么。 猜错了答非所问。
③ 意图识别放在哪
--------------------------------------------------------------------
| 放哪 | 效果 | 代价 |
|---|---|---|
| 放在对话流开头 | 每轮都判一次 | 多花一次调用 |
| 放在产品问题分支里 | 只判「产品 / 非产品」 | 判断题变简单 |
| 不单独放,靠大模型自己判 | 省一个节点 | 判错了不知道 |
书上用第二种:一个意图识别节点判「产品 / 非产品」,后面分两条路。
判得越少越准。 判三类容易错,判两类不容易错。
④ 对话流的测试方式
--------------------------------------------------------------------
| 轮次 | 用户说 | 期望 |
|---|---|---|
| 第一轮 | 你们那个保温杯能保温多久 | 答:12 小时,316 内胆 |
| 第二轮 | 能退吗 | 答:七天无理由,十五天换新 |
| 第三轮 | 那盖子呢 | 答:杯盖可拆洗,别放洗碗机 |
三轮里第二、三轮都是省略句。测对话流一定要测省略句——这是它和工作流最大的区别。
! 如果三轮都拿完整问题去测,测出来的是工作流的能力,不是对话流的能力。
①第一张表五个差别:多轮是根,后四条都是它的结果。 ②会话变量模拟:第二轮只说两个字,product 还留着「保温杯」。 ③第三张表意图识别放哪:判两类比判三类稳,代价是多一个节点。 ④第四张表三轮测试:后两轮都是省略句,这才是真实用户的样子。 ⑤第四节的提示很硬:拿完整问题测,测出来的是工作流的能力。
30 秒实验
- 拿你自己的产品,写三句省略句(第二句只有两个字)。写不出来,说明你还不了解用户怎么说话。
- 把会话变量列一遍:哪些跨轮要留、哪些本轮用完就扔。留多了下一轮会被旧值带偏。
- 在聊天窗口里连着问五句,中间故意换一次产品名,看它会不会串。
常见误区
- 「对话流就是工作流加个聊天框。」差别在记忆。没有会话变量,多轮就是假的。
- 「意图识别越细越好。」判三类容易错,判两类不容易错。细的那层放到分支里。
- 「拿完整问题测过了就行。」那测的是工作流的能力。省略句才是真实输入。
自测三问(点开对答案)
1. 对话流和工作流最要紧的差别是什么? —— 记忆。对话流能跨轮保留会话变量,工作流每轮重新开始。 2. 意图识别为什么只判两类? —— 判得越少越准。细分类放到后面的分支里,主线只判「产品 / 非产品」。 3. 为什么测试一定要用省略句? —— 省略句是真实用户的输入形态。完整问题自带主语,测不出多轮记忆有没有生效。骨架搭好了,下一节把产品问题那条支路填满:改写、检索、生成。
- ☐ (本篇完,下一篇 13.3 产品相关问题处理模块)
相关笔记
- 项目背景与整体思路:上一节的需求拆解
- 工作流及其分类:工作流的基本形状
- 产品相关问题处理模块:下一节填产品问题支路
- 🐦 扣子开发 AI Agent · 索引