收到一条类似这样的输入:“【哥谭/含谜鹅】狂犬疫苗你们能打吗。”单看文字,它有一个动作“打”,有一个对象“狂犬疫苗”,还有一个范围“你们”。可如果你让系统直接回答“能”或“不能”,多半会翻车。因为这句话里真正的问题,根本不是“有没有疫苗”,而是“到底是谁在问,问的是虚构剧情还是现实医疗,问的是身份资格还是操作权限”。
把这句话丢给一个自动问答系统,其实是一次很典型的“语义混乱压力测试”。它混合了三类信息:一个“哥谭”世界观标签,一个“含谜鹅”内容兴趣标签,一个很容易被识别成真实医疗查询的“狂犬疫苗”短语。如果系统没有做过意图分类、实体消歧和场景路由,它大概率会错误地进入疫苗知识库,返回一堆关于接种禁忌、接种流程的内容。用户看到的结果可能很完整,但并不是他想问的东西。
这种问题,在真实项目里比想象中更常见。很多团队做智能客服、知识库问答、搜索召回时,习惯性地先做“关键词命中”,再用排序模型“给一个自信的回答”。看起来很快,但实际并没有解决用户问题。一个真正靠谱的系统,不应该急着回答“能不能打”,而应该先判断这句话属于哪个场景、问的是谁、需要走哪条知识通道。换到工程视角看,这就是一个从“字面响应”走向“意图决策”的过程。
1. 先别急着回答“能不能打”,先拆清这句话在问什么
1.1 “打疫苗”在语言层面是一个多义触发点
中文里的“打”是一个典型的多义词。它可以表示“接种”,可以表示“执行一个操作”,也可以表示“询问某个请求是否被允许”。当用户输入里出现“狂犬疫苗”和“能不能打”时,分词和实体抽取会优先命中“医疗”和“动作”,因此很容易被判断成“接种资格咨询”。
但如果把整个输入放回上下文里看,情况就复杂了。前面的“哥谭”是一个虚构城市设定,“含谜鹅”更像是一个作品或内容话题标签。用户很可能是在一个兴趣社区里问一个带有玩笑性质的“能不能打”,而不是真的想知道自己该不该去打狂犬疫苗。如果系统完全不看上下文,只是把“狂犬疫苗”映射到医学知识库,它就会把对话语境彻底带偏。
这里可以引出一个关键判断:不要把一个词的标准含义,当成整句话的意图。在对话系统里,词是线索,句子才是一个完整请求;而请求真正要落到的场景,往往藏在标点、标签、代词和句法关系里。
1.2 方括号和斜杠不是普通符号,而是可解析的结构化信号
很多人处理文本时,会直接把“【”和“】”当作噪声清洗掉,把“/”当作无意义分隔符。但在真实数据里,这类符号往往携带很强的先验信息。
这条输入里的“哥谭”和“含谜鹅”用“/”隔开,外部又有方括号,看起来非常接近用户生成内容里的标签系统。方括号通常表示“这是一个话题单元”,“/”表示同一话题单元下的组合或分类。也就是说,文本本身已经透露了一部分上下文:用户在聊一个虚构世界观里的角色组合,而不是在挂号问诊。
处理这类输入时,规则可以先于模型介入。常见做法是:
- 用正则或自定义解析器提取“【】”中的内容;
- 把括号内的“/”作为标签切分边界;
- 将“哥谭”归类为内容世界观标签;
- 将“含谜鹅”归类为内容兴趣/角色组合标签;
- 然后对剩余部分“狂犬疫苗你们能打吗”单独做意图识别。
这样做不是为了把问题变简单,而是为了让后续模型少做一些无意义的“猜测”。如果一开始就把结构化信号清理掉,再让模型从一堆无差别字符里学上下文,等于主动丢掉高价值特征。
2. 为什么“单看懂关键词”还不够:实体识别、意图分类和场景路由要配合使用
2.1 关键词匹配会掉进最常见的“语义陷阱”
只做关键词匹配的系统,遇到“狂犬疫苗”这个词,会直接返回一个答案,可能是“以下人群可以接种”,也可能是“最新接种建议”,甚至可能是某个医院的预约入口。但这些答案对一条带虚构标签的 query 来说,几乎是无效的。
为什么?因为关键词只解决了“提到了什么”,没有解决“想问什么”。同一个词“狂犬疫苗”,出现在医学咨询里、出现在比价搜索里、出现在同人话题里,答案完全不一样。如果意图层不分场景,后面做得越精细,偏差反而越大。
这里真正需要的是“领域识别”和“槽位校验”。只靠一个“疫苗”实体,不足以支撑回答。还需要知道提问对象“你们”指的是普通民众、内容角色,还是某个提供接种服务的团队;问的是资格、流程,还是某种比喻意义上的“可行”。
2.2 实体、意图、场景三层拆解比“端到端生成”更可控
现在很多团队会直接上一个预训练模型,希望模型能根据整句话输出一个标准答案。端到端方案在部分成熟领域确实有效,但在信息比较杂、格式比较自由、合规要求高的场景里,并不是首选。
可落地的方式,是把任务拆成三层:
| 层级 | 核心任务 | 输入示例 | 输出示例 |
|---|---|---|---|
| 实体层 | 识别词和短语 | “哥谭”“含谜鹅”“狂犬疫苗”“你们” | 世界观标签、兴趣标签、医疗实体、对象指代 |
| 意图层 | 判断用户真实目的 | 整句输入 | 虚构话题咨询/真实医疗咨询/提问资格与权限 |
| 场景层 | 决定由哪个知识库或流程回答 | 实体+意图结果 | 同人内容区、医学知识库、转人工、需澄清 |
实体层解决“有哪些词可被索引”,意图层解决“用户到底要干什么”,场景层解决“哪个下游环节来承接”。三层各司其职,出错时也更容易定位。
回到这条输入。实体层抽出来的是一个医疗词“狂犬疫苗”,和两个内容标签。意图层不能直接判定为“医疗咨询”,因为“哥谭”和“含谜鹅”构成了强上下文,说明用户大概率不是来找医院接种点。于是场景层应该优先进入“内容话题问答”或“澄清询问”,而不是直接调用医疗回答模板。
这层设计背后有一个工程原则:不要把“可能性最高的词义”和“用户需要的答案”混为一谈。系统要保留多种解释路径,并通过路由逻辑选出最合适的一条。
2.3 路由层要加安全闸门,尤其是医疗、法律、金融类信息
“狂犬疫苗”天然带医疗属性。即便用户在问的是虚构设定,系统也不能贸然给出看似权威的医学结论。因为同一个回复可能被另一个真实用户搜到,从而被误当成正规医疗建议。
所以在路由层,至少要设置四类结果:
- 可回答:命中了可信知识库,且用户意图与答案场景一致;
- 需澄清:意图存在多种可能性,或上下文不足;
- 拒答:涉及真实医疗诊断、法律判断等高风险场景,应引导至专业人士;
- 转人工:用户表达出明确的强需求,需要人介入处理。
对于这条里面包含“狂犬疫苗”的输入,最稳妥的做法不是拒绝,也不是硬答,而是先澄清。系统可以回复“你是想问在虚构作品设定里能不能打,还是想问真实情况下人能不能接种狂犬疫苗?”这样既没有丢失用户,也没有越界给出专业建议。
3. 从一条模糊 query 到可落地系统的落地流程
3.1 先做规则基线,而不是一上来就训练模型
很多技术团队拿到业务需求后,第一反应是收集数据、训练模型。但实际项目里,数据量通常不够,标注标准也还没建立。与其盲目训练一个不可解释的黑盒,不如先搭一套可运行的规则基线,把业务流程跑通。
规则基线可以这样做:
- 建立“标签/括号提取规则”,把“【】”里的内容切出来;
- 建立“领域实体词典”,把“狂犬疫苗”“接种”“打针”等词映射到医疗领域;
- 建立“意图启发式规则”,例如出现世界观标签、作品标签,同时出现医疗词,不能直接判定为真实医疗咨询;
- 为“无法判定”的输出一个澄清模板;
- 为“高风险领域查询”设置默认兜底话术。
这套规则不用写得多复杂,只需要稳定可解释。它的价值不是达到最高准确率,而是确定整个流程的骨架:输入进来,经过拆解,进入路由,最终返回一个符合边界的输出。
3.2 数据标注要定义清楚“边界样本”,不能只标“标准答案”
规则基线跑起来之后,团队才应该开始准备训练数据。为这类模糊 query 做标注,真正的难点不在“正常样本”,而在“边界样本”。
比如这条输入,不同标注者会给出不同结果:
- 标注者 A 觉得“含谜鹅”只是内容标签,核心还是要问疫苗能不能打,所以标成“医疗咨询”;
- 标注者 B 认为前面标签权重很高,应该标成“虚构话题咨询”;
- 标注者 C 认为信息不足,应该标成“需澄清”。
这三种判断没有绝对的对错,关键是团队要提前定好标注规范。我通常会建议把标签定义为“可执行动作”,而不是“语义类别”。比如不要纠结于“这句话是不是医疗”,而要问“用户发出这句话后,系统应该执行什么动作”:回答他、拒绝他、问他、还是转人工。
这样标注时更直观,模型训练出来也更容易和下游系统对接。
3.3 最后再接答案生成、反馈采集和日志审计
当意图分类和路由逻辑稳定后,再考虑答案生成。这里建议:
- 先做检索式回答:从FAQ、知识库或内容库里匹配固定回答,可解释性更强;
- 再做生成式回答:只有当检索结果不足时,才使用生成模型;
- 所有高风险领域的回答都要记录日志,保存用户原始输入、系统判定结果、路由目标和最终回复。
日志非常关键。特别是医疗类 query,后期做合规审计和模型迭代时,如果没有完整的链路日志,几乎无法解释系统为什么给出一条回答。每次上线优化,都需要从日志中还原真实用户请求和系统决策过程。
4. 最容易让系统失灵的不是模型,而是边界和上下文漂移
4.1 排查链路:先看输入,再看解析,接着看路由和日志
当一个系统开始出现“答非所问”或“错误拒答”时,不要急着调整模型参数。最有效的排查链路通常是这样:
- 先看原始输入:用户发来的文字有没有被清洗、截断、编码转换?方括号和斜杠是否完整保留?
- 再看解析结果:实体识别是否正确抽出了“狂犬疫苗”和内容标签?标签切分有没有把“含谜鹅”拆错?
- 再看意图判断:分类器输出的概率是多少?是不是因为阈值设置太激进,导致歧义样本被强行归到“医疗咨询”?
- 再看场景路由:系统进了哪个知识库?触发了哪条流程?返回的是默认模板、拒绝话术,还是检索结果?
- 最后看日志:用户是否多次追问?用户在回复后有没有“这不是我想要的”等负面反馈?
大多数问题都出在第二步和第三步。要么是结构化信号被提前清洗,导致标签信息丢失;要么是规则把“医疗词”的权重设置过高,压过了上下文标签。
4.2 系统要学会“不自信”,并且把不确定性显性化
很多问答系统给用户的感觉是“什么都能答”,但它在不该回答的时候非常自信。真正合适的做法,是在边界不清晰时承认不知道,并给用户选择权。
对“【哥谭/含谜鹅】狂犬疫苗你们能打吗”这句输入,系统可以这样拆:
- 如果判断用户是在讨论虚构设定,回答“这个设定在不同创作里可以自己解释,没有统一结论”;
- 如果判断用户是在咨询真实接种,回答“狂犬疫苗的接种条件和禁忌需要由医疗机构判断,建议直接咨询当地疾控或医院”;
- 如果系统无法判断用户在问真实还是虚构,就不该强行区分,而是主动问一句。
这种显性化的不确定处理,虽然会损失一点“秒回”的流畅感,但能大幅降低错误信息和合规风险。对真实生产系统来说,稳定性比“显得聪明”重要得多。
4.3 词表会更新,话题标签会过时,边界判断必须持续维护
不要以为规则和模型训练完就一劳永逸。像“哥谭”“含谜鹅”这类内容标签,在不同时期可能指代不同内容。新的作品、新的角色组合、新的网络热词会不断出现,旧词也可能被赋予全新含义。
维护工作一般包括三块:
- 词表更新:定期补充新出现的世界观标签、内容标签和常见缩写;
- 标签规则回归:每次新增规则后,用一批历史样本做回归测试,确认旧样本没有被新规则误伤;
- 边界反馈闭环:把用户“问错了却被强答”的case汇总,反哺到标注集和路由规则中。
如果你准备长期投入这类系统,至少要留下一名成员负责人话术和边界的持续维护。模型不是维护难点,词表、规则和下游结构才是。
5. 把复杂问题拆成可重复决策,才是这类系统真正该有的能力
5.1 从一条具体 query 到一个通用决策框架
“哥谭/含谜鹅/狂犬疫苗能不能打”只是一个例子。同样的结构还有:
- “【某个游戏角色】他能吃这个药吗”
- “如果我是某个虚构职业,交社保需要什么材料”
- “AI 生成的合同在法律上有效吗”
这些问题的共同点是:它们看起来很像某个专业领域的问题,但前置文本里又包含明显的限定条件或假设语境。如果系统把所有包含“药”“法律”“疫苗”字眼的输入都当作严肃咨询,就会同时犯两类错误:在错误场景里给了确定性答复,在真实风险场景里又漏掉了风险控制。
一个更通用的决策框架,可以抽象为三步:
- 判断请求类型:这是一个虚构话题、真实咨询、还是两者混合?
- 确认回答来源:应该由内容库、专业知识库、还是人工客服来承接?
- 判定可执行程度:系统能不能直接给答案?如果不能,是要澄清、拒答,还是转人工?
这个框架的价值在于,它把“能不能打”这种开放性主观问题,转化成一个人可执行、系统也可实现的判断流程。每一次判断都不再依赖“某个模型碰运气”,而是有明确路径、有日志记录、有改进口子。
5.2 不是所有场景都适合完全自动化
如果这条 query 是企业内部知识库的真实请求,而且用户只是随便问一句,自动回复加一个“去问专业人士”的提示就够了。如果它是一个在线医疗平台的用户问题,系统就必须更谨慎,必须把转人工和官方咨询入口放在显著位置。此时,除技术之外,还要有业务方、法务方和客服团队共同参与边界定义。
这也是一开始就应该写清楚的一句话:这类系统的目标不是替人做医疗或法律判断,而是帮助用户准确找到信息来源。打疫苗能不能打,最终要听专业医务人员的;系统能做到的,是高效理解用户意图,并把问题送到合适的人或知识库面前。
5.3 先做最小闭环,再扩展复杂场景
如果你正在做一个问答、搜索或客服类系统,遇到这样模糊的输入,我建议不要一开始就追求“测得很准”,而是先做一个小闭环:
- 输入一条 query;
- 解析出标签和词法特征;
- 输出“用户可能想问A或B”;
- 让用户自己确认;
- 记录用户选择,形成评估数据。
这个流程看起来简单,却能快速帮你发现三类问题:文本解析是否稳定、意图判断是否可靠、安全兜底是否到位。跑通之后再逐步增加多轮对话、知识库检索、生成式回答、批量评测,压力会小很多。
真正高级的问答系统,不是背了更多知识和参数,而是在面对模糊、歧义和未知时,仍能稳定地做出可解释的选择。它的价值,也不是代替人类判断,而是把复杂问题拆成一个又一个清晰的小决策,然后一步步逼近用户真正需要的答案。