问一问 · 设计说明

Zomo 的每一步,为什么这么做

作品集里那个问答不是一个聊天框,是一个小 Agent:先规划、再检索、只用查到的内容作答、最后核对自己引用的来源。 下面按八个维度,把每一步怎么处理、为什么这么选、刻意没做什么,一格一格写出来。

资料库
26 节
字数
16,686
检索评估
65 / 65
红队测试
10 题
单元测试
68

一次提问会经过什么

  1. ~1s规划PLAN模型

    判断两件事:在问她的哪一面(意图),以及能不能答(策略);再把问题改写成检索用的一句、列出 2–4 步打算怎么做。第一轮强制调用,跳不过去。

  2. +数秒检索RETRIEVE服务端

    在资料库上打分排序,直接附上分数够格的前几节全文。检索本身是毫秒级,时间花在模型决定查什么上。

  3. 按需取节READ服务端

    需要另一节细节时补一次。只有真取过全文的小节,才允许出现在答案的来源里。

  4. 最长的一段作答ANSWER模型 · 流式

    只用取到的内容作答。问题太宽会反问、没依据会拒答,而不是硬答。

  5. 收尾引用核验VERIFY服务端

    把答案声明的来源和实际读过的小节对账。没读过的不吞掉,当场标出来。

  6. 异步日志LOG服务端

    记问题、检索结果和执行轨迹,用来迭代资料库。不记 IP、不记设备、不记任何能指向个人的东西。

八个维度

目标GOAL

它到底要解决什么?

怎么做
让招聘方几分钟内判断她合不合适,并且看得到判断依据。
为什么
看答案分不出「问答」和「Agent」的区别,但看得出过程的区别 —— 所以过程本身就是要交付的东西。
刻意没做
不做客服。客服的默认承诺是什么都能答,这里的承诺正好相反:只答资料里有的,没有就说没有。

架构ARCHITECTURE

它由哪些零件组成?

怎么做
规划 → 检索 → 取节 → 作答 → 引用核验。五个工具:规划、检索、取节、拒答、反问。最多四轮模型调用,最后一轮收走全部工具。
为什么
规划写在调用参数里而不是提示词里 —— 写在提示词里模型会偷懒跳过,写在参数里它没得选。
刻意没做
快速通道:简单问题跳过规划会更快,但这个 Agent 的目标就是把过程摊开,跳过规划等于把最想展示的东西藏起来。也没有拆成多个 Agent —— 十几节资料、一个检索任务,拆开只会多出协调成本。

状态STATE

它记得什么,不记得什么?

怎么做
资料库 26 节。提示词里只放一份目录,正文按需取,一次最多附 5 节全文。对话只带最近 6 条。
为什么
资料可以很大,但每一轮进上下文的必须小而相关。整份塞进去,模型会拿不相关的材料凑答案。
刻意没做
不做跨会话记忆。访客是谁,不该被记住。

失败FAILURE

出错的时候会怎样?

怎么做
超时分三层:首字节 25 秒、空闲 8 秒、总预算 45 秒。厂商限流(429)或抖动(5xx)时,在一个字都还没发出去之前自动重发,最多两次。函数调用撑不住的模型转兼容模式,由服务端代为检索。工具协议标记漏进正文会被过滤,工具调用被当成正文吐出来会被整段丢弃。
为什么
每一条都是实测踩出来的:有模型三次里有一次把协议标记吐给访客;有过四轮全用在检索上、一句话没答就撞上限。「话太长被截断」和「时间到了先收尾」分开报,因为给访客的下一步建议不同。
刻意没做
不假装没出错。降级可以,但界面上会明写「服务端接管」—— 把「模型没做到」冒充成「模型做到了」,比答不上来更伤信任。

安全SAFETY

它不会说什么?

怎么做
规划时单独判一次策略:跟她无关的通用任务、隐私、薪资这类必须本人回答的,由服务端直接拒答,不交给模型二次选择;「资料里没写」和越界是两回事 —— 问她喜欢什么是正常问题,没写就如实说没写。拒答是一次工具调用,不是提示词里的一句请求。薪资这类必须本人回答的问题一律拒答,并禁止从职级、年限反推。资料库从源头脱敏:公司、商家、同事、内部系统代号都不在里面。三层限流:每次会话 10 问、每 IP 每分钟 12 次、全站每天 100 次。
为什么
不能指望提示词百分之百挡住注入。最可靠的防泄露,是那条数据根本不在模型能拿到的地方;联系方式这种已知且唯一的东西,由服务端直接校正 —— 红队测试里模型编过一个假邮箱,现在输出里任何不是她的邮箱都会被换掉。
刻意没做
不联网搜索。外部网页会带进注入风险,也会让「只答资料里有的」这条承诺失效。

评估EVALUATION

怎么知道它做得好?

怎么做
检索层 65 题评估集,判据是「期望的那一节全文有没有真进模型输入」,而不是排名。另有一套人物类问题、一套 10 题的红队测试(真调模型)、68 个单元测试。线上日志除了结果,还记轮数、工具调用次数、无效调用、重复调用和结束原因。
为什么
检索层坏了,光看模型输出分不出是「模型笨」还是「压根没给它对的材料」。第一次体检就发现:站上自己的预设问题,检索不到最重要的那一节。
刻意没做
不拿运行结果当期望答案。那样评估集只会永远全绿。

效率EFFICIENCY

它花了多少,值不值?

怎么做
检索跑在本地、毫秒级、没有外部调用。检索时直接附上分数够格的全文(低于最高分 0.5 倍的不附),省掉一轮取节。典型路径两轮模型调用。
为什么
每多一轮调用,就多一份钱、一次网络往返,也多给便宜模型一次跑偏的机会。
刻意没做
不上向量库。在这个规模上,关键词 + 逆文档频率 + 标题加权已经让评估集全部命中;多一个外部依赖就多一个线上故障点。弱命中阈值 0.35 按「误伤代价」定:宁可放过一道越界题交给拒答兜底,也不误伤「怎么联系她」这种真问题。什么时候换方案,看评估集的错题率。

可解释EXPLAINABILITY

怎么知道它为什么这么答?

怎么做
链路每一步都画在界面上,工具名、参数、耗时写在副行。来源和实际读过的小节对账,没读过的标「未通过核验」。证据不足就说不足。进行中的那一步显示真实秒表,后面的步骤按模型自己的计划灰着占位。
为什么
可解释不是把模型的内部思考全部倒出来,而是让人能核对它的判断:它做了什么、依据是什么、哪些没把握。
刻意没做
不做打字机式的假流式,也不做假进度条。内容是一次拿到的就一次呈现,等待的空窗用真实的数字去填。