1. 图灵测试到底在测什么:一场关于“装得像人”的模仿游戏
1.1 从“机器能思考吗”到“机器能装得像人吗”
聊到AI能不能思考,几乎所有讨论都绕不开图灵测试。1950年,图灵发表了那篇著名的论文《计算机与智能》,开篇就问了一个问题:“机器能思考吗?”但他很快意识到,这个问法本身是含糊的,什么叫思考,什么叫机器,每个人都有自己的答案,争论三天三夜也没有结果。所以图灵做了一个非常聪明的操作,他把这个问题换成了一个可操作的游戏:如果一台机器能在对话中成功伪装成人类,让审讯者无法分辨它是机器还是人,那就说明它已经具备了人类水平的智能行为。
这套设定就是“模仿游戏”。具体来说,审讯者隔着墙与另一端的“人”对话,对方实际上可能是真人也可能是机器,审讯者只能通过打字提问来判断对方是不是人。如果机器能够让超过一定比例的审讯者误判,它就通过了图灵测试。
这个设计的精妙之处在于,它把“思考”这个不可观测的形而上问题,转换成了“行为”这个可观测的工程问题。图灵根本没有尝试证明机器会思考,他说得很清楚:与其争论上帝能否让机器有灵魂,不如找一个大家都认可的操作性判定标准。这种思路对后来的AI研究影响极其深远,因为你只有先把“智能”变成可量化的指标,才能去优化它。ChatGPT这类大模型在对话中越来越像人,本质上就是在“模仿游戏”这条路上走了很远。
但是要注意,图灵测试从来不是一场“聊天比赛”。很多人以为让AI讲段子、谈人生、装成某个名人,骗过几个评委就算通过测试,这是对图灵测试最大的误读。图灵原版测试的标准化做法是设置一个真实的中位人类作为参照,审讯者问的问题覆盖常识、推理、情绪、反讽等各个方面,而且审讯者知道对方可能是机器,会故意设计陷阱问题。它的目标不是“显得聪明”,而是“显得像人”。一个AI如果每一题都给出完美答案、知识渊博得不像是普通人,反而更容易被识破——你看,连“表现得太优秀”都成了破绽,真实的人类哪有那么精确呢。
1.2 为什么“骗过评委”不等于“真的会思考”
即使一台机器完美通过了图灵测试,它就是在思考吗?这就要提到哲学史上最著名的思想实验之一:中文房间论证。1980年,哲学家塞尔设计了这个场景:一个完全不懂中文的人被关在房间里,房间里有一本厚厚的规则手册,外面的人递进来一张写着中文问题的纸条,房间里的人按照规则手册查找对应的中文符号,然后把答案符号递出去。从外面的视角看,这个房间能回答任何中文问题,表现得像“理解中文”;但房间里的人并不理解任何一个字,他只是机械地查表。
塞尔的结论是:程序可以产生“看起来智能的行为”,但程序本身永远不可能产生“理解”。英文原话是“syntax is not semantics”,语法不是语义,操作符号不等于理解意义。这个论证针对的正是图灵测试的漏洞:如果我们只看行为,那么中文房间就是一个通过测试却不理解的系统,行为主义判定会给出错误的“有智能”结论。
有意思的是,中文房间这个思想实验在大模型时代反而变得更有挑战性了。你仔细想一下,一个训练好的大模型,输入一句“我睡不着怎么办”,它输出一段共情的话,你很难说它“真正理解”了你的失眠;但它确实在语料中学到了大量人类关于失眠的表达模式,知道什么情景下该说什么话。它到底是在“理解”还是在一本巨大无比、精巧到极致的规则手册里查表?这个问题到今天也没有一个能让所有人都信服的答案。
我个人有一个比较务实的看法:对于产品和技术来说,我们不需要纠结它有没有主观体验,重要的是它的行为能不能稳定地满足需求。但是如果你要讨论“机器能否真正思考”,那么中文房间这个坑是绕不过去的,它提醒我们,行为的相似性不必然推导出内在状态的相似性。一个模糊的例子是闹钟:闹钟在早上7点准时响铃,你说它是“知道”该起床了吗?没有人会这么认为。我们之所以对语言模型产生“它在思考”的错觉,只是因为它输出的符号和我们人类思考时输出的符号属于同一种模态,这种表面同构很容易让人做出投射。
2. 大模型时代:从“背答案”到“会推理”,我们走了多远
2.1 统计鹦鹉与智力涌现的拉扯
现在的AI早就不是“查表”这么简单了。以ChatGPT为代表的大语言模型,核心训练目标只有一个:预测下一个词元。给定前面的所有文本,模型计算下一个词的概率分布,然后从中采样或取最高概率词,把这个动作重复几千次,就生成了一篇文章。听起来简单得令人发指,对吧?但就是这种“多读书,背概率”的做法,在参数规模达到百亿、千亿级别之后,产生了一系列小模型完全不具备的能力,比如少样本学习、思维链推理、指令遵循等。这就是圈内说的“能力涌现”。
2021年,有一篇著名的论文把语言模型称为“随机鹦鹉”,作者认为大模型只是学会了语料中的统计关联,本质上是在复述训练数据里的模式,根本谈不上理解。这篇论文在当时引发了巨大争论,而现在的技术进展让这顶帽子和现实之间的关系变得更微妙了。例如,你问GPT-4“如果小明有3个苹果,给了小红1个,又从树上摘下2个,他现在有几个”,它不仅能给出正确答案,还能列出推理步骤。你要说它只是背答案,那它背的题集得涵盖多少种说法才够用?实际上,模型已经学会了“数量的增减关系”这类抽象规律,只是这种规律不是以符号规则的形式存在,而是以分布式参数的形式弥散在网络里。
我理解的涌现是这样的:模型的每一层网络都在做特征变换,浅层学习词法和句法,中层学习语义和常识,深层学习跨领域的抽象模式。当层数和参数量足够多,信息经过足够多次非线性变换后,某些复杂模式就被编码成了“内部表示”,模型可以在新语境下泛化运用。这个过程非常像人脑里神经元之间的突触连接,但我们不知道具体是哪几个参数“负责”了什么规律,这也是后面要说的可解释性难题的根源。
当然,用“涌现”这个词描述能力是有点省力的。批评者会指出,所谓涌现可能只是评测指标的非线性放大,不是模型突然学会了什么新东西——模型一直在按同样的训练目标更新,只是在你评测的那些问题上,参数规模过了一个临界点,表现从“不及格”跳到“优秀”。这就像站在远处看雪山,不是雪瞬间出现了,而是你的分辨率够了。但不管怎样,工程事实是明确的:更大的模型、更多的数据、更好的训练方式,确实在让AI的行为越来越复杂,复杂到我们不得不用“推理”这类词来形容它。
2.2 语言模型眼中的“理解”和人类不一样
大模型每天都在生成“人类看得懂的话”,这让我们很容易产生一个联想:它是不是在像人类一样理解?这里有三个关键的差异需要说清楚。
第一个差异是载体问题。人类的理解依赖身感经验,我们说“热”,是因为皮肤被烫过;说“悲伤”,是因为经历过失去。这些词对我们来说是带着身体感受的实体概念。但语言模型从出生到训练结束,唯一接触的信息就是海量文本和图片描述,它从来没有摸过火。它知道“热”常在什么语境下出现,知道“热”和“烫”“出汗”“夏天”这些词频繁共现,知道“热”在中文里可以组成“热门”“热处理”“热恋”。它构建的是一个语义网络,而不是体验网络。理解这个词在哲学上至少包含两层:语义关联和主观体验。模型有前者,没有后者。
第二个差异是事实锚定问题。人类对“巴黎是法国首都”的理解,背后有地理经验或至少有过一次查阅确认。模型的“理解”是统计上的高概率关联路径,所以它能流利地说出这句话,但你没发现它也会很流利地说出“法国是巴黎首都”的等价推论吗?不一定。更严重的是,模型经常输出完全错误但听起来很流畅的内容,这就是“AI幻觉”。幻觉的本质不是模型存心撒谎,而是它的生成目标压根就不是“符合事实”,而是“符合概率分布”。在没有事实校验机制的情况下,错误说法和正确说法对模型来说没有区别,都只是概率高低的路径选择。
第三个差异是情境一致性。人类理解一个句子,会结合说话场景、历史对话、意图和常识背景,甚至能读懂“不说话就是默认同意”这样的弦外之音。大模型的做法是,把整个对话历史打包进上下文窗口,像一个超大型短期记忆体,然后基于这些token做下一步预测。窗口内是几千个token,模型能处理的任务复杂度就有限;一旦超出窗口,它就把前面的“理解”丢掉了。这和人脑的长期记忆机制差别巨大,人的理解是持续累积的,而模型的理解是每次请求都从零开始重建一遍(多轮对话中缓存的上下文是机械地堆叠,不是“记住”)。
因此,当我说“模型能理解”,我其实是在一个非常弱的定义下使用这个词:它能够从输入文本中提取与当前输出任务有关的语义模式,并按合理顺序产出响应。这是一种路径模拟,不是内涵把握。可以在工程上假装它理解了,但不要在理论上宣称它显然理解了。
2.3 推理增强:从“快思考”到“慢思考”的工程尝试
如果大语言模型只是一台高级概率机,它为什么能解数学题、写代码、做逻辑推理?一个重要的原因是工程上引入了“思维链”(Chain of Thought,简称CoT)机制。简单来说,思维链就是让模型在给出最终答案之前,先生成中间推理步骤。这不是什么玄学,原理很直白:语言模型的每一步生成都是基于前面的token,如果你让模型先写“设x为苹果数量,那么小红得到1个,小明的苹果数量为3减1加2……”,它的后续生成就有了一个可依赖的子结论链条,比直接跳到最后答案的错误率低很多。
你可以把模型想象成一个心算不太好的人:直接问他137乘59等于多少,他可能脱口而出一个离谱数字;但如果给他一张草稿纸,逼他一步一步列竖式,虽然他笨一点,但每步的错误率都会因为“计算范围缩小”而降低。思维链就是那张草稿纸。更进一步,o1这类新模型的思路是不仅给草稿纸,还给它时间:在推理时多次生成候选步骤、自我评估哪个路径更合理、发现错了就回退重试。这就是所谓的“推理时计算”(test-time compute),把算力从训练阶段部分转移到推理阶段。
我实际测试过用CoT提示词让普通模型尝试解“鸡兔同笼”问题,结果显示没有提示词的模型答对率大约只有三成,而提示“请一步一步思考并输出中间过程”之后,答对率能升到七成以上。说明当前模型的“推理能力”很大程度上是被提示方式激活的,不是内建的全能逻辑引擎。这就是为什么提示词工程仍然重要:你不是在给AI施魔法,而是在帮它对齐“调用推理路径”的行为模式。
但也要泼一盆冷水:思维链不是万能的。它解决的是“多步算术”“逻辑推断”这类有明确中间状态的任务,对于需要真实世界知识、反事实推理、需要外部验证的问题,光靠把思考过程写出来没有用。模型可以一本正经地写出一串推理步骤,然后从一个错误前提推出一个自信的错误结论,每一步都是流畅的,合起来是荒谬的。推理过程本身不能纠错,只有外部验证才能纠错,这就导向了下一章工具调用和智能体的讨论。
3. 机器“思考”的工程化路径:Agent、推理增强与外部工具
3.1 从单次问答到多步行动:为什么Agent是必然方向
如果你只用大模型做聊天,你会发现很多问题它单靠文本回答不了:它不知道今天的天气,算不了实时汇率,查不了你服务器的日志。原因很简单,它的知识图谱冻结在训练完成的那一刻,后续无法自动更新,也无法访问私有数据。所以把大模型嵌入到真实业务中,必须给它装上手和眼。这个“手和眼”就是工具调用机制,而把模型、工具、记忆、规划串起来协同执行任务的系统,就是当下最热的AI Agent(智能体)。
Agent的核心理念可以这样类比:过去的对话AI是一个“话务员”,你问什么它答什么,它不负责解决后续问题;现在的智能体更像一个“项目经理”,它拿到一个目标后,会自己拆解任务清单,决定先查什么资料,再调什么接口,最后汇总结果,甚至会发现自己做错了然后换一条路径重来。拆解、决策、执行、验证,这四个环节循环往复,就是Agent的基本工作回路。
在实际落地时,Agent最常用的架构可以分四层看:第一层是主控模型,负责理解目标和调度;第二层是工具层,通过API方式暴露给模型,比如搜索、计算器、数据库查询、代码执行器;第三层是记忆层,保存短期任务状态和长期用户偏好;第四层是验证层,对模型输出的结果做检查,比如用代码运行结果判断数学题对不对。这四层不一定要齐全,但缺少验证层的Agent通常会陷入幻觉而不自知,这是我做AI应用开发时最大的一个坑:模型自信地告诉你“我已经完成转账了”,实际上它只是调用了一个不存在的接口。
3.2 函数调用与参数配置:给模型配一套可用的“工具箱”
要让Agent真正干活,第一步是把工具设计好并让模型学会调用。在API方式下,这件事做得比较成熟,OpenAI、Anthropic、通义千问等模型都支持函数调用。流程是这样的:开发者先在请求中声明工具列表,每个工具包含名称、描述、入参的JSON Schema;模型在推理时根据用户问题的需要,输出一个结构化的函数调用意图;程序捕获这个意图,在外部执行真实函数,把结果以“工具消息”的形式回传给模型;模型再基于结果生成最终回答。
关键要点是,工具描述必须写得极其清楚,因为大模型没有“常识”来脑补你的函数是干嘛的。比如你写一个get_weather函数,参数里注明latitude是维度,longitude是经度还是分别填吗?。含糊的案会直接影响模型选择的准确率。我在项目里反复调整工具描述,发现一个明确的描述能让模型的调用准确率从七成提到九成以上,就这么离谱。
参数配置上,做Agent和做聊天机器人很不一样。聊天任务中常把temperature调到0.7到1.2,让回答有创造性;但Agent的每一步工具调用都要求稳定,temperature最好调到0或0.1附近,减少随机性。另外,max_tokens不要设得太小,不然模型生成一半的工具调用参数被截断,整个环节都会失败。还有top_p,通常保持默认即可,不必与temperature同时调。做多轮工具调用时,要把每一轮工具的返回结果都保留在上下文里,并且定期压缩旧消息,避免超出上下文窗口。很多人跑Agent出现“越跑越慢”“中途丢失状态”,多半是上下文管理没做好。
3.3 本地部署大模型:参数配置、硬件门槛和做事逻辑
除了调用云端API,本地部署大模型也是一个热门方向。为什么要本地部署?三个核心动机:数据隐私(对话内容不出内网)、成本控制(长期调用量很大时云端API费用高)、离线可用(没有网络也能跑)。但它不意味着你得到一个“更强的模型”,通常本地跑的是开源模型(如Qwen、Llama系列),能力可能弱于顶尖云端闭源模型,所以选不选本地部署不是“谁聪明”的问题,而是“能不能用、敢不敢用”的问题。
本地部署最容易卡住新手的点是硬件。以7B参数的模型为例,如果全精度FP16部署,模型本身大约是14GB显存,加上KV Cache和计算开销,一张24GB的RTX 3090/4090比较宽裕;如果是70B模型,没有两张80GB的A100/H100就不要想了。但很多人用的是消费卡,这时候就得上量化,把模型权重从FP16压成INT8或INT4,显存占用大概能降到原来的四分之一到一半。参数配置上,量化字段主要看bits、group_size、zero_point这些,推理框架常见的有llama.cpp、vLLM、Ollama。我的建议是:先上Ollama把玩一下,它支持一键拉模型、自动量化参数、CPU/GPU混合跑,门槛低到几乎不用写代码。
本地部署还有一个容易忽略的问题:并发与速度。单卡跑一个小模型,单请求可能很快,但并发一高,显存带宽会成为瓶颈,推理速度指数级下降。如果要做成多人可用的服务,建议上vLLM这类支持continuous batching的推理引擎,通过PagedAttention优化显存管理,能显著提升吞吐。还有长上下文场景,KV Cache会吃掉大量显存,所以配置context length参数时要量力而行,不是越长越好,而是够用就好。我见过太多人部署时把上下文设成128K,结果启动后显存直接爆掉,模型一步都跑不动。
4. “思考”的判定边界:行为主义与可解释性之间的拉锯
4.1 行为主义困境:你永远无法直接看到机器的“理解”
现在回到文章标题那个最根本的问题:机器能否真正思考?图灵测试给出的回应是行为主义式的——只要行为上无法区分,就等于过关。这个立场在工程上很有用,但哲学上很脆弱。因为“思考”涉及内在体验,而任何外在行为都与内在状态不是一一对应的。一个人可以装病,机器可以装作理解。从外部观察者的角度看,你永远无法确定,对面那个输出“我懂了”的实体,是真的懂了,还是只是在输出符合语境的符号序列。
这个困境在大模型时代被放大了。模型会主动说“我知道了,这个问题的关键在于……”,甚至会说“你说得对,我之前的回答有误”。但它的“自我纠错”大概率不是基于对错误的觉知,而是因为训练数据里包含了“对话中承认错误是合理的回复模式”。它学到了模式的分布,没有学到“错误”本身。这就是行为主义的根本局限:我们可以用行为来推定智能,但无法用行为来证明体验。
对我们这些做技术的人来说,这个问题不妨转换一下:你不需要证明模型有没有意识,你只需要验证它能不能稳定可靠地完成你需要的认知任务。你评估一台洗碗机洗得干不干净,不会纠结“它是不是真心想洗碗”。同样,评估一个AI系统时,用评测集、准确率、任务完成度说话,比纠缠“它有没有真正理解”要务实得多。这种态度的底气在于,即使我们不知道模型内部有没有思想,系统行为已经可以提供可测试、可复现、可度量的结果,这已经够工程用了。
4.2 可解释性:绕不开的黑盒问题与有限的突破口
如果要进一步逼近“机器是否思考”,就躲不开一个问题:能不能从模型内部找到思考的证据?这正是可解释性研究在做的事。但目前的技术手段都很初级,远没有到“读心”的程度。大概有三类工作:第一类是注意力可视化,看模型生成每个词时在关注哪些前面的词,这能提供一定线索,但注意力权重和因果影响并不等价;第二类是探针法,训练一个小的分类器去“解读”模型内部向量里编码的信息,比如判断某个隐藏层的向量是否包含“性别”“时态”“情感”等信息,这类研究证明模型内部确实存在语义表征,但仍是间接推断;第三类是表征工程,找到某些语义方向(比如“幸福”方向、“诚实”方向),通过向量加减来干预生成内容,这个方法已经开始被用来控制模型行为。
这些工作让我想起一个场景:你在看一个巨大的数据库,里面没有表格、没有字段名,只有几十亿条互相缠绕的记录,所有知识都以分布式权重的方式混在一起。想找到“模型在哪一部分‘理解’了巴黎是首都”,就像在一锅汤里找哪一粒盐贡献了咸味。符号化的规则、树状的推理图,这些在传统AI里清晰可见的东西,在神经网络里全被打碎了。所以,大模型的可解释性本质上是一个“逆工程难题”,目前连门都还没完全找到,更谈不上通过内部证据来证明“思考”。
就算有了一些方向,也要小心一种“验证偏差”:当你用某个探针发现模型内部有一个“情感方向”时,这只能说明模型表征里用得到这个特征,不代表它体验到了情感。就像一部小说里的角色可以从语言上分析出性格,但角色本身没有血肉。可解释性和行为主义是两种互相补充的视角,一个从内部猜,一个从外部测,目前谁也无法独自回答“思考”问题。
4.3 幻觉、上下文与“伪思考”的边界
聊“机器能否思考”,有一个绕不开的反面案例:AI幻觉。幻觉指的是模型生成一段文本,语法通顺、逻辑自洽、语气笃定,但内容完全是错的。我让AI写一份关于某本冷门技术书的内容概括,它非常流畅地编造了一个不存在的章节标题和作者的引言,要不是我自己读过原文,几乎被骗过去。这个现象很好地说明了“语言流利”和“真实思考”之间的巨大鸿沟。人类思考通常绑定事实校验,我们说出一个具体结论前,大脑里会有一个“这个我怎么知道”的来源核查环节(虽然也会犯错),而大模型的生成过程根本没有这个环节,它的每一个token都只是“根据上文,哪个词最合理”。
更麻烦的是,当上下文窗口里塞入大量虚构或错误信息时,模型倾向于顺着这些信息继续编造,而不是指出“你的前提有误”。这不是它笨,而是它的目标函数里没有“真理”一项。模型优化的是语言概率,语言概率高不代表世界模型正确。所以在使用AI做事实型任务时,我的习惯永远是把“核验”放在生成环节之后:要么用程序校验(比如代码运行结果),要么用外挂RAG检索真实文档,要么至少人工抽查。不要因为“它说得像真的”就放松警惕,这句话是每一个AI重度用户都应该刻在办公桌上的。
这个事实也顺便回应了标题中“深度探讨”应有的姿态:对机器是否思考的最好观察,不是看它流畅时什么样子,而是看它犯错时暴露了什么。幻觉暴露了它没有外部锚点;翻来覆去说车轱辘话暴露了它没有全局规划;忘记了对话开头的内容暴露了它没有长期记忆。这些缺口说明,即使未来某天我们承认“这种AI在思考”,它思考的方式也肯定和人类不同,是一种内嵌于概率空间的、局部的、无体验的“类思维过程”。
5. 实操视角:如何和“疑似会思考”的AI协作
5.1 提示词工程:与其念咒语,不如写清楚任务的上下文
很多新手把提示词当成“咒语”,到处找所谓的神级提示词模板,一粘就期待奇迹。实际上,大模型不是靠咒语驱动的,它靠的是“上下文中给出的信息约束”。提示词工程的本质,是把你的任务意图和约束条件在上下文窗口里说清楚,让模型沿着约束给出的路径去生成。一个高质量的提示词至少要包含四个要素:背景说明(你是谁、任务发生在什么场景)、目标描述(你希望得到什么输出)、约束条件(不能做什么、必须做什么)、输出格式(需要结构化结果的话给示例或模板)。
举个例子,你要让AI帮你写Python脚本,差的提示词是:“帮我写个爬虫。”这个提示词过于开放,模型可能给你一个用requests抓取静态HTML却忽略动态渲染、没有异常处理、也没有节流的脚本。好的提示词是:“我的需求是抓取某电商网站的商品列表页,页面内容是JavaScript动态渲染的,请使用selenium或requests+接口直连的方式实现;要求包含重试机制、超时设置、UA伪装,并控制每秒最多请求2次;最后输出完整的Python代码,包括必要的import和运行示例。”这时候模型给你的代码质量会完全不一样,因为你在上下文中提供了足够多的技术约束。
另外,我发现一个很实用的技巧:让模型在回答前“复述任务”。比如你给出一个复杂的多步骤需求后,加一句“请先用自己的话复述一遍你的理解,确认无误后再开始”,这能极大减少模型跑偏的概率。原理很简单——模型是逐token生成的,先复述任务相当于先创建一个“任务理解锚点”,后续生成的内容会与这个锚点保持语义一致。这比在提示词里反复强调“你要记住……”管用得多。
5.2 AI编程与IDE插件:代码场景下的实践与防翻车办法
AI编程是目前落地最成熟的场景之一。我日常主要依赖两类工具:一是GitHub Copilot这类AI编程助手(或者PyCharm里的AI插件),二是直接在大模型对话框里进行代码生成和调试。这两类的用法不同:IDE插件的优势是代码上下文感知,它能看到你当前文件、当前函数甚至项目结构,适合做补全、生成小函数、写测试用例;大模型对话框的优势是能容纳大段代码和分析报错信息,适合做架构设计、重构方案、跨文件改动。
在PyCharm中使用AI插件时,我最常用的三个功能是:自动补全(写完函数签名后让AI补全函数体)、生成测试(选中函数后右键让AI生成pytest单测)、解释代码(阅读别人遗留的一段糊代码时让AI一句一句解释)。但有个忠告:补全的代码一定要自己编译运行一遍,AI生成代码最常见的错误包括变量名前后不一致、调用了不存在的库方法、忽略了必要的import。让我用一句话总结这段经验:AI写代码的效率高,但你的身份从“写代码的人”变成了“代码审查的人”,审查责任绝对不能丢。
另外一个容易被忽略的点是:AI编程提示词不要只给“输出代码”,要给“输出代码+测试用例+预期行为”。当我要求AI先写出三个测试用例再实现函数时,它生成的代码质量明显更高,因为测试用例本身构成了对实现的约束。具体操作可以这样写:“请先列出核心边界条件,再基于这些边界条件写出测试代码,最后实现功能代码。”这相当于用测试逼着模型把需求定义清楚,很大程度上避免了“代码跑通了但逻辑和需求不符”的尴尬。
5.3 做AI应用开发和测试:评估集才是你最该花时间的资产
我见过太多团队做AI应用,Demo阶段惊艳全场,一上线就崩,原因不是AI不够聪明,而是没有建立评估体系。AI应用和传统软件最大的区别是:传统应用输入相同就输出相同,AI应用输入相同也可能输出不同。这种不确定性让你没法用传统“断言”来测它。所以做AI应用开发时,第一优先级不是调模型,而是先建一个评估集:收集一百个真实用户问题,标注好期望答案或关键考核点,每次改完prompt或换模型,都用这批问题跑一遍,对比输出质量。
这个“回归测试”看起来土,但极其有效。你可以人工对比打分,也可以用大模型做“裁判”(让GPT-4给两个回答质量打分),后者的成本低、速度快,但要注意裁判模型自身有偏好,最好定期人工抽验。我做一个客服问答机器人时,初期只有三十个左右评估问题,每次调整提示词都拿它跑一遍,很快就发现模型在“退款政策”上总是答错,后来定位到是知识库检索排序出了问题。如果没有评估集,这种问题可能到上线后才会被用户发现。
测试AI应用还要特别注意上下文污染问题。多轮对话场景里,模型会把前面几轮的输出当作输入继续生成,一旦某轮出现幻觉或偏离,后面就会越偏越远。我建议在系统设计上增加“状态校验节点”:用户完成关键操作(比如下单、查询、申请)后,系统要从工具返回结果中抽取出确定性字段,由程序校验成功后再继续下一轮;不要完全依赖模型的自然语言来判断“这步有没有做成功”。简单说,AI可以负责“理解意图”和“生成表达”,但涉及关键状态的判定,还是要交给确定性代码。
最后再分享一个我在实际项目里的体会:每次当我试图给AI的“思考能力”下结论时,我都会强迫自己回去看一遍那批失败案例——看它编造过的引用、算错的数学题、忽略掉的用户指令。正是这些失败提醒我,它并没有我有时感受到的那样“懂我”,它的强大,恰恰在于把语言规律的掌握做到了极致,从而让所有观感上的“思考”变得像真的一样。而作为使用者和开发者,我们真正应该做的,不是帮它争取“会思考”的头衔,而是把它这份基于模式的强大用在对的流程里,用外部验证兜住它不靠谱的那一面。这才是这个时代里,最值得你投入时间修炼的技能。