Skip to content

企业 AI 问数的澄清与拒绝:比“回答一切”更重要

很多 AI 问数 demo 会强调一个目标:用户怎么问,系统都能回答。

这在演示阶段很有吸引力。用户输入一句自然语言,模型自动理解业务含义、选择数据表、生成查询、执行分析、返回结论。过程越顺滑,看起来越像一个真正的“数据分析助手”。

但在企业系统里,尤其是 ERP、CRM、财务、库存、人事这类业务数据场景里,“尽量回答一切”不是一个可靠目标。

更合理的目标是:

text
能回答的问题,给出可复核的答案;
语义不清的问题,先澄清;
权限不足或能力超界的问题,明确拒绝。

这听起来不如“什么都能问”有吸引力,但它更接近生产系统需要的边界。

AI 数据访问不是聊天续写。它连接的是真实业务数据、权限模型、指标口径和审计责任。一个看起来流畅但实际越权、误解口径或缺少证据的回答,比一个明确的拒绝更危险。

不确定时硬答,是企业问数里的高风险行为

大模型擅长生成连贯文本,也擅长在不完整信息下补全上下文。

这对写作、代码辅助、知识问答有帮助。但在企业数据查询里,这种能力会带来一个问题:模型可能把“不确定”包装成“看起来合理”。

例如用户问:

text
上个月销售怎么样?

这句话至少有几类不确定性:

  • “销售”指销售订单、已开票收入,还是已收款收入;
  • “上个月”按自然月、会计期间,还是当前用户所在时区;
  • 是否排除取消订单和草稿订单;
  • 是否按当前用户可见公司过滤;
  • 是否包含跨公司数据;
  • 返回总额、同比、环比,还是按产品 / 区域拆分;
  • 当前用户是否有权查看销售金额或毛利。

如果系统直接生成一个 SQL 并返回“上个月销售额为 X”,用户可能会相信这个结果。但这个答案可能只是模型在多个可能口径中选了一个,并没有说明选择依据。

生产系统不能把这种隐含选择藏起来。

对于关键业务问题,系统应该能判断:当前问题是否足够明确;需要哪些参数;当前用户是否有权限;所需指标是否存在;查询是否能在已定义模型边界内执行。

如果不能判断,就应该澄清或拒绝。

澄清不是体验倒退

很多产品会担心澄清问题影响体验。

确实,如果系统对每个问题都反复追问,用户会觉得低效。但这不意味着应该取消澄清,而是澄清应该有明确触发条件。

AI 问数里常见的澄清触发点包括:

  • 时间范围不明确:例如“最近”“这段时间”“上个月”在业务口径里有多种解释;
  • 指标口径不明确:例如“销售额”“利润”“库存”“客户价值”没有绑定明确指标;
  • 维度含义不明确:例如“华东区”“大客户”“重点产品”需要业务定义;
  • 查询粒度不明确:用户要汇总、明细、趋势、排名,还是异常列表;
  • 多个模型都可能匹配:例如“订单”可能是销售订单、采购订单或生产工单;
  • 当前模型缺少必要字段:系统不能确定是否应该换模型或拒绝;
  • 查询结果可能过宽:例如用户要求导出所有客户明细,但未说明范围。

澄清的目标不是让用户补完所有技术参数,而是把会影响结果含义或权限边界的关键选择暴露出来。

一个好的澄清问题应该具体、短、可选择。例如:

text
你说的“销售额”是指已确认销售订单金额,还是已开票收入?

或者:

text
当前可以按“自然月”或“会计期间”统计。你希望使用哪一种?

这比系统默默选择一个默认口径要好。默认值可以存在,但默认值应该来自查询模型或业务配置,而不是模型临场猜测。

拒绝不是失败,而是安全边界

除了澄清,企业 AI 问数还需要明确拒绝。

拒绝不是“系统能力差”的表现。相反,拒绝是生产级数据工具必须具备的安全状态。

典型的拒绝场景包括:

  • 当前用户无权访问目标模型;
  • 当前用户无权访问请求字段;
  • 查询需要跨公司或跨租户数据,但上下文不允许;
  • 查询试图访问敏感字段,例如成本、薪资、供应商价格或内部审批意见;
  • 请求要求导出过大范围的明细数据;
  • 请求要求写回、修改、审批或删除业务数据;
  • 请求超出当前工具支持的查询能力;
  • 请求需要的指标没有被定义;
  • 问题要求系统给出无法由数据支撑的判断或承诺。

拒绝应该清楚说明原因,但不泄露不该泄露的信息。

例如,系统可以说:

text
当前用户无权访问该查询模型。

或者:

text
当前查询需要字段“成本金额”,该字段不在你的可见字段范围内。

但系统不应该为了“解释清楚”而把完整敏感字段列表、隐藏模型名称或权限规则细节全部暴露给用户。

拒绝也不应该伪装成空结果。空结果表示查询合法但没有匹配数据;拒绝表示查询不允许执行。两者必须区分,否则用户和审计系统都无法判断发生了什么。

fail closed 比静默降级更可靠

企业数据工具常见的一个危险做法,是在无法满足请求时静默降级。

例如:

  • 用户请求毛利,系统无权访问成本,于是只返回销售额;
  • 用户请求全公司数据,系统只查了当前公司,但没有说明;
  • 用户请求按客户等级分组,模型没有客户等级字段,于是改用客户类型;
  • 用户请求明细导出,系统自动截断前 100 行,但回答里没有提示;
  • 用户请求“所有逾期应收”,系统没有应收模型,于是改查发票状态。

这些行为看似提升了回答率,实际上会降低可信度。

更好的策略是 fail closed:当查询意图无法在当前授权和模型能力内被准确执行时,系统应该停止执行,并返回结构化错误、澄清问题或明确拒绝。

fail closed 并不意味着系统不能提供帮助。它可以给出可行替代方案:

text
当前用户不能访问毛利字段。可以查询销售额、订单数量和已开票金额。是否改为查看销售额趋势?

或者:

text
当前模型没有“客户等级”字段。可以按客户类型或区域分组。你希望使用哪一个?

区别在于:替代方案必须显式呈现,由用户确认,而不是系统悄悄改变问题。

澄清与拒绝应该进入工具契约

如果 AI 问数是通过 MCP 或其他 tool calling 协议实现,澄清和拒绝不能只停留在最终回答文本里。

它们应该进入工具契约和返回结构。

一个面向生产的查询工具,不应该只有成功返回数据这一种状态。至少应该区分:

  • ok:查询成功执行;
  • clarify_required:需要用户补充业务参数或选择口径;
  • rejected:由于权限、能力或安全边界拒绝执行;
  • invalid_request:请求结构不合法或引用了不存在字段;
  • unsupported:当前模型或引擎不支持该能力;
  • error:系统错误,需要运维或开发排查。

这些状态的价值在于:LLM client、前端 UI、审计系统和运维系统可以基于结构化状态做不同处理,而不是从自然语言回答里猜。

例如,当工具返回 clarify_required 时,AI client 可以把候选选项展示给用户;当返回 rejected 时,client 应该停止继续尝试绕过边界;当返回 invalid_request 时,模型可以在同一查询模型内修正字段或操作符。

这比让模型在自由文本里自我解释稳定得多。

查询模型需要表达“不能做什么”

很多 schema 或 API 描述只告诉 AI 能做什么。

生产级查询模型还需要表达不能做什么。

例如:

  • 某个字段可用于筛选,但不可返回明细;
  • 某个指标只能聚合返回,不能按单据明细展开;
  • 某个模型最多允许查询 12 个月范围;
  • 某个维度只允许在当前公司内使用;
  • 某类查询需要用户确认后才能导出;
  • 某些字段只能用于内部计算,不能直接暴露给 AI;
  • 某些聚合粒度会产生小样本泄露风险,需要拒绝。

这些限制如果只写在文档里,模型未必稳定遵守。它们应该成为查询模型和执行引擎的约束。

当请求违反约束时,工具应该返回明确状态,而不是把约束交给提示词处理。

审计需要记录澄清和拒绝

审计不应该只记录成功查询。

澄清和拒绝同样重要。

一个完整的 AI 问数审计记录,至少应该能回答:

  • 用户原始问题是什么;
  • 系统选择了哪个查询模型;
  • 是否发生澄清;
  • 澄清问题是什么;
  • 用户选择了哪个口径;
  • 是否发生拒绝;
  • 拒绝原因是什么;
  • 请求引用了哪些字段或指标;
  • 权限上下文是什么;
  • 最终是否执行查询;
  • 如果执行,生成了什么查询证据。

这些记录可以帮助团队发现两类问题。

第一,模型或查询模型设计是否不足。如果大量问题都因为指标不明确而澄清,说明业务口径需要更好地建模。如果大量问题都因为缺字段被拒绝,说明模型边界可能需要评估。

第二,是否存在异常访问尝试。如果某些用户频繁请求敏感字段、跨公司数据或大范围导出,审计系统应该能看到这些被拒绝的请求。

只记录成功查询,会漏掉很多安全和产品改进信号。

对 Odoo / ERP 场景的具体含义

在 Odoo 或其他 ERP 系统里,澄清和拒绝尤其重要。

因为 ERP 问题经常带有隐含业务口径。

用户问“这个客户的应收情况”,系统需要知道:

  • 是看未结清发票、逾期应收,还是全部账龄;
  • 是否只看当前公司;
  • 是否包含草稿单据;
  • 当前用户是否有会计模块权限;
  • 是否允许看到发票明细;
  • 是否允许跨联系人合并客户主体。

用户问“本月库存够不够”,系统需要知道:

  • 是按现有库存、预测库存,还是可用库存;
  • 是看所有仓库还是指定仓库;
  • 是否扣除已预留数量;
  • 是否按产品变体维度统计;
  • 当前用户是否有库存数量权限;
  • 是否需要结合销售预测或采购在途。

这些问题如果都由模型临场猜,结果很容易看起来顺畅但实际不可复核。

更可靠的方式是让 Odoo 相关的查询模型显式表达可用指标、字段、公司上下文和权限规则。AI 只在这个边界内构造查询;遇到业务口径不明确就澄清;遇到权限或模型边界就拒绝。

结论

企业 AI 问数不应该把“回答率”作为唯一目标。

真正需要优化的是:在正确权限、正确语义和可复核证据下回答问题;在不确定时澄清;在越权或超界时拒绝。

这要求系统把 clarify、reject 和 fail closed 设计成一等能力,而不是失败后的补丁。

更具体地说:

  • 查询模型要定义可用字段、指标、限制和默认口径;
  • 工具返回要区分成功、澄清、拒绝、无效请求和系统错误;
  • 执行引擎要在查询前做字段校验、权限注入和能力检查;
  • UI 或 AI client 要把澄清问题明确展示给用户;
  • 审计系统要记录成功查询,也要记录澄清和拒绝;
  • 系统不能为了提高回答率而静默降级或绕过边界。

Foggy Data MCP / Foggy Odoo Bridge 的设计方向也是如此:AI 可以辅助用户查询企业数据,但不应该被赋予任意解释、任意 SQL、任意导出或绕过宿主权限的能力。生产级 AI 数据访问需要清楚知道什么时候回答,什么时候追问,以及什么时候停下来。