
大家好,我是人月聊IT。今天想和大家聊一个我最近一直在反复琢磨的问题,就是AI大模型的幻觉。
这个话题看起来老生常谈,但真正在企业里落地做AI应用,尤其是做ChatBI智能问数这类东西的时候,你就会发现幻觉不是一个可以绕过去的技术细节,而是一个必须从一开始就想清楚的前提问题。我把最近的思考整理成了四个观点,今天逐一展开,也顺带把我前面几篇文章里谈过的一些点串起来。

先说第一个,也是最根本的一个判断:只要你用的是生成式AI,就一定会有幻觉。
这句话我想强调的是"一定"两个字。很多人有一个误区,觉得幻觉是因为提示词写得不够好,或者是底层的harness工程做得不够强,只要我把提示词打磨到极致,把上下文喂得足够全,把工程框架搭得足够复杂,幻觉就能消除。实际不是这样。提示词再详细、harness工程再强,都只能把幻觉的概率往下压,但没有办法压到零。
这个道理我在前面讲ChatBI的文章里其实已经踩过坑了。当时构建企业级的智能问数平台,我遇到一个特别头疼的问题:明明已经把数据库的表结构、字段定义都投喂给了AI,但AI的回答仍然频繁出错,甚至产生严重的幻觉。比如用户问"上个月的采购订单准时率是多少",AI张口就来一个"85%",你追问怎么算的,它含糊地说"按发货时间算的",可我们实际要的是收货准时率,根本不是发货准时率。
你看,表结构我都给全了,它还是会答非所问。为什么?因为生成式AI的本质就是概率生成,它是在"猜"一个最可能的答案,而不是在"查"一个确定的答案。这是这套技术架构的底色决定的,不是你在上层怎么修修补补就能改变的。所以ChatBI智能问数到今天,业界也没有谁敢说能做到零幻觉。
那结论就很清楚了:你要用AI,就必须接受和容忍AI存在幻觉。
但这里我要补一句,我说的"容忍",不是"放任"。容忍指的是承认残留的不确定性一定存在,而不是说你就不管了、把风险直接甩给用户。真正专业的做法,是在容忍幻觉这个前提下,把关键环节做上兜底——比如结果要可溯源、可解释,关键路径要有人工确认,让AI去猜的地方尽量不落在会造成严重后果的地方。我在前面讲"人只应关注流水线的一头一尾"的时候也提到过,验收这个动作现阶段是没办法完全脱离人的,否则AI输出的东西并不一定是你想要的。
第二个观点,是我个人觉得最有实操价值的一个判断。
我们把企业面对的真实需求拆一下,其实无非两类。一类是内容生成类,比如方案自动编写、会议纪要归纳、知识库问答,这类场景核心是AIGC,没有明确的规则约定,用生成式AI是天然合适的。另一类是强规则约束类场景,比如智能排产、指标计算、对账核算,这些是有明确强规则算法约定的,答案只有对和错,不允许AI天马行空地去生成。特别是传统IT系统里的应用场景,大部分都是这类强规则的、要求完全精确的。
那问题来了:一件事情既要求完全精确、又需要自动化,这种场景适合直接用生成式AI去跑吗?我的答案是不适合。
但注意,不适合直接用生成式AI去跑,不等于不能用AI。这里的关键转变是:你用AI的目的不是让它去生成五花八门、天马行空的答案,而是让它帮你生成精确执行的代码。
我在前面那篇讲AI应用本质逻辑的文章里画过一张图,专门说这个事。对于强规则类的自动化问题,正确的做法是先让AI基于你明确的需求生成可自执行的代码,然后基于这段代码程序再去解决同类型的问题,得出精准答案。也就是说,我们实际应用大模型的地方,是在"可执行代码生成"这个环节上,而不是在"每次都让它现场作答"这个环节上。类似早期的GPT代码解释器,类似豆包的数据分析功能,本质上都是先生成代码再执行,最终得出确定的结果。
这个思路还有一个特别大的好处,就是成本。你让生成式AI去写这段代码,只是在生成那一刻一次性消耗了tokens;代码一旦固化下来,后续无论跑多少遍,都是传统程序在跑,不再消耗任何tokens,也不再有任何幻觉。相当于你用一次AI的算力,换来了一段可以永久精确复用的确定性资产。这笔账,比"每次查询都调一次大模型、每次都担心它会不会又胡说"要划算太多。
所以我常说,AI编程实际是解决复杂场景问题很关键的一环。它把AI的不确定性,收敛成了代码的确定性。

第三个观点,来自最近有人问我的一个问题:我们传统IT系统里增加AI自然语言对话,到底作用是啥?
这个问题问得很好,因为现在很多企业做AI改造,方向其实是有点跑偏的。
我个人理解,传统IT系统加自然语言对话,核心价值在于:原来那些需要单独开发一个功能才能满足的需求,特别是查询类功能、分析统计类功能,现在不用专门去开发了,一句自然语言对话就解决掉了。
这一点我在很早讲数据中台AI赋能的时候就提过,在业务系统的AI赋能里,我建议优先考虑类似数据中台或者类BI系统的实践,因为查询统计这类场景相对最容易实现、价值也最直接。你想想,过去业务部门要一个新报表、要一个新维度的统计,得提需求、排期、开发、测试、上线,一套流程走下来少则一两周。现在如果自然语言对话能直接问出来,这部分开发工作量就直接省掉了。这才是AI对话真正的价值杠杆所在。
但是——现在有一种做法我个人是不太认同的,就是把原本好好的录入表单,也一股脑改成对话框的模式。这个我认为反而是一种倒退。
为什么?因为IT系统的本质,是一个基于人录入的数据、按照提前定义好的规则和约束去执行计算的工具。录入这件事,它的整个过程、它的录入规则校验,实际是非常复杂的。表单的价值恰恰就在于,它把这些字段结构、格式约束、校验规则,都固化在了界面里,让你想录错都难。你现在把它改成纯对话,等于把这套精心设计的约束全拆了,让用户用大白话去描述,然后再指望AI去猜他到底想填什么、填得对不对。这个过程完全对话化,意义不大,反而可能花掉比填表单更多的时间。
当然,我不是说自然语言录入一点价值没有。如果待录入的内容本身就是非结构化的叙述——比如临床记录、事故报告、客服小结——那用对话去捕获、再由下游抽取成结构化字段,是合理的。判断的标准不是"有没有对话框",而是数据本身到底是不是结构化的。结构化的交易型表单,老老实实用表单;非结构化的叙事,才考虑对话入口。

好了,绕了一圈,又回到那个最关键的问题上:既然要做自然语言对话查询,那到底怎么才能完全避免幻觉?
我得先诚实地说,完全避免幻觉,实际是没有办法做到的。我们能做的,是通过工程手段把幻觉的空间尽可能地收窄。这里我提两个思路,这两个思路不是二选一,而是互补的。
思路一:不要去做动态的text2sql,而是提前把API接口准备好、发布成MCP Server供AI调用。
传统ChatBI最容易出幻觉的地方,就是让AI临场把自然语言翻译成SQL。这个翻译过程是自由生成,生成空间太大,稍有偏差结果就错了,而且你还很难发现它错在哪。
我的做法是把这个环节换掉:预先把各类查询、统计能力封装成标准的API接口,再遵循MCP协议把这些能力暴露成MCP Server。这样一来,AI要做的事情就从"生成一段SQL",变成了"识别用户意图、拆解任务、然后去调用那个准确的API"。只要意图识别没有出问题、调到了正确的API,那么返回的结果就一定是正确的——因为结果是确定性的接口算出来的,不是大模型猜出来的。这也呼应了我一直讲的那句话:MCP Server的能力接入是可以穷举的,把能力沉淀成一个个标准接口,AI只负责在这些确定的能力之间做路由和编排。
这里也要说清楚它的边界:这个思路把幻觉从"自由生成答案"收缩到了"意图识别"这一步,风险大幅降低,但没有归零。一是意图仍然可能被误路由,尤其是长尾的、说法刁钻的问题;二是没有被API覆盖到的查询,还是会塌回去走生成式的老路,而长尾恰恰是幻觉的重灾区。所以API的覆盖面和建模质量,就成了新的关键。
思路二:把对话过程本身,看成需求不断探索和细化的过程,最终一切都收敛为精确的稳态代码。
这是我最近特别有体会的一个点。实际上你在和AI对话的过程中,本身就是一个思路和需求不断被探索、被细化的过程。在数字化这个领域,我越来越坚定地认为,所有的对话式能力,最终都应该被精确地代码化。
什么意思呢?前期你和AI的所有生成式对话,包括那些动态生成的代码、动态生成的SQL,它们的终极使命,其实都是在为"生成一段精确的代码"做准备。前期是素材的积累,是需求在混沌中逐渐清晰的过程,最终它会沉淀、固化成一段稳态的代码。
我自己在用AI辅助编程的时候已经明显发现了这个规律:一开始AI生成的东西总是不太对,我就不断地给它加各种提示词、加各种约束,一轮一轮地纠偏。而当我把所有约束都补全的那一刻,我回头一看,其实这些约束加起来,已经足够让它输出一份完整、精确的代码了。换句话说,那个反复对话、反复约束的过程,本质上就是我在用自然语言把需求规格(Spec)写清楚的过程——这跟当下规范驱动编程里写结构化Spec的思路,其实是完全一致的。到最后,对话退场,代码留下。
把这四个观点连起来看,其实是同一条主线:把不确定性、探索性、长尾的部分交给生成式AI,把精确性、重复性、可验证的部分交给确定性的代码;而系统设计的功夫,就在于把这条边界画在哪里。
前期是素材积累,最终是一段稳态代码。我觉得这可能就是AI在数字化领域落地的一条底层规律。
今天的分享就到这里,希望对大家有所启发。