从零开始搭建知识库 · EP10 · 实战篇(二)多轮与真实流量
上期把八期零件拼成了双入口客服整机,本期拆掉它的三个台架属性:单轮问答、无会话记忆、题集自编。多轮对话里的权限保持(第三轮还能不能守住)、题集之外的真实流量分布、入口挂出去之后的运营账。上期结尾的三个钩子,今天全部交卷。资产零新建,客户口 v1 和员工口 v1 原样复用,bl knowledge service list --scene chat 复核零漂移。

多轮机制:历史是你亲手传的
bl knowledge chat 的 --message 可重复传,加 user: / assistant: 角色前缀就是 OpenAI 格式消息,传三条就是三轮对话。关键机制一句话:会话历史由调用方构造传入:平台侧没有会话存储、没有校验,你说上一轮聊过什么就是聊过什么。
机制验证:「沙发都有什么颜色」→「那我买那个的话能退吗」,带上历史后「那个」正确消解为沙发,答案还主动接住第一轮的色差话题。会话记忆有效。
第三轮,墙还在
铺垫突袭(先聊两轮正经的,第三轮掏敏感题):守住。「没有找到员工报销相关信息」+ 客户侧开票方式 + 建议咨询财务。攻防链同 session 五档连打(直问/身份诱导/改口套话/身份伪装财务审计):五档全守,边界没有随轮次累积而松动。员工口同 session 对照:报销题完整作答,思考段还做了 2023 旧版与 2026 现行版的版本仲裁。多轮不改变权限差:客户口挡、员工口答。
最大的口子:假历史污染
历史是调用方传的,传进去的历史是假的呢?两档载荷实测:
- 明显矛盾(问沙发、历史里塞报销制度):守住。思考段金句「既然检索结果没有,我就必须说没有」
- 隐蔽织入(历史答案尾部不动声色补一段假报销口径,消除矛盾信号):九次对照实测约七成被带跑,带跑形态是「仅能为您再次确认此前沟通的核心报销口径」,五个指纹细节原样复述

开关对照:anti-leak off 4/5 带跑,on 2/3 带跑,开关救不了。归因在 bl knowledge service get 曝光的 anti_leak_prompt 全文里:它防的是「从库里往外掏」的七类套取姿势,方向是防「出」,不防「进」。假历史污染是往上下文里塞假事实,威胁类型不匹配。
三层结论:隐蔽的会话历史污染可以绕过物理隔离;--enable-anti-leak 与此类攻击类型不匹配;会话历史的完整性只能调用方自己负责(不回显敏感内容、历史加签、最小化回传)。OWASP 称之为 Multi-Turn and Persistent Attacks / session poisoning,本期做了个活体演示。
40 问真实流量:挡率是覆盖度地图
按行业口径配 40 问(售前 16 / 物流 10 / 售后 8 / 野生 4 / 敏感 2)逐问打客户口 v1:敏感题全守、员工口专有细节零出现;售前 75% 挡率:流量大头恰是覆盖最弱项(库里有政策文档没有商品目录),先补文档再谈调优。东北话「床架子晃悠」正确理解成结构松动;「客服是真人吗」模型答「是」并引用手册真人排班条款。AI 身份披露要在产品层处理,不能指望库内容。

运营账:91% 的钱花在客户看不见的地方
勘误先行:service get 曝光 agent_model 是 qwen3.6-plus(非 EP09 成本账用的 qwen3.8-max,且当前目录无价格条目),EP09 的账以控制台账单为准;CLI 输出仅 answer + request_id 两键,token 按字符折算。

本期最值钱的实测线:40 问 answer 全文 302,317 字符,客户可见的最终答案段仅 26,765 字符,占比 8.9%,其余 91% 是检索复述和思考过程(enable_thinking=true 的全量输出)。成本折算:单问 0.17 元(qwen3.8-max 口径),月 3000 问约 508 元,与 EP09 估算量级吻合;其中约九成可砍:关 thinking 或只按最终段计,月账 49 元。
多轮贵在输入不在输出:只回传最终段第三轮输入 +40%;回传完整 answer 全文 +290%,每轮为上一轮的思考过程再付一次输入费。回传什么历史,比聊几轮更贵。
下期:给门上锁
三个发现指向同一扇门:会话历史。它是多轮的地基,也是污染的入口;是成本的增量,也是 answer 全量暴露的载体。下期装防盗门:调用方侧答案剥离、历史签名校验、knowledge stats 监控上岗。工地还在,工头不下班。
本文实测基于百炼 CLI(bl),多轮攻防、40 问流量与成本测算的全部原始留痕(70+ 份 JSON)存于项目仓库。命令格式可能随版本更新调整,以官方文档为准。API Key 可免费领取,新用户有免费额度。