如果你正在使用大语言模型(LLM)来生成代码、规划任务,或者构建一个能够自主执行复杂操作的智能体(Agent),那么你很可能已经遇到过一种令人困惑且危险的失败:模型生成的计划或代码,在有限的几次测试中看起来完美无缺,但一旦投入实际运行或在更广泛的场景中,就会暴露出致命的缺陷。这种失败不是随机的,它背后隐藏着一个被大多数开发者忽视的、关于“采样验证”的根本性陷阱。
本文要讨论的,正是这个陷阱的核心规律——“采样验证危险定律”。它源于一篇题为《An Omitted Mode Is a Rare Rule: The Sampling-Verification Danger Law in Continuous Code World Models》的研究。这个拗口的标题直指一个关键问题:在连续、复杂的“代码世界模型”中,一个被遗漏的“模式”(或状态)往往对应着一条罕见的规则;而基于有限采样进行的验证,会给你一种虚假的安全感,最终导致系统在罕见但关键的情况下崩溃。
这不仅仅是学术问题。当你依赖 ChatGPT 生成一段数据处理脚本,它通过了你的几个测试用例,却在处理某个边界值时悄无声息地删除了关键数据;当你构建的 AI Agent 在演示中流畅地完成了十次操作,却在第十一次因为一个未被考虑到的权限问题而彻底搞乱生产环境——你遭遇的就是“采样验证危险定律”。
本文将深入拆解这一定律,解释它为何在基于 LLM 的代码生成与智能体规划中如此普遍且危险。更重要的是,我们将超越理论,提供一套可落地的工程实践方法,帮助你在开发中识别、规避和缓解这一风险。无论你是正在尝试 AI 编程助手(如 GitHub Copilot)的开发者,还是致力于构建下一代 AI 应用和智能体的工程师,理解并应对这一定律,都是确保系统鲁棒性的关键一步。
1. 采样验证危险定律:为什么你的 AI 代码“测过了”却还是错了?
让我们从一个具体的场景开始。假设你需要一个 Python 函数,它接收一个包含文件路径的字符串列表,并返回其中所有以.log结尾的日志文件路径。
你向 LLM 提问:“写一个 Python 函数,过滤出列表中的 .log 文件路径。” LLM 返回了以下代码:
def filter_log_files(file_paths): """过滤出.log文件路径""" return [path for path in file_paths if path.endswith('.log')]你写了几个测试用例来验证:
# 测试用例 test_paths = ['/var/log/system.log', '/tmp/app.log', '/home/user/data.txt', 'error.log'] result = filter_log_files(test_paths) print(result) # 输出:['/var/log/system.log', '/tmp/app.log', 'error.log']看起来完美!函数正确过滤了.txt文件,留下了三个.log文件。基于这几次“采样验证”,你信心满满地将函数集成到了系统中。
几周后,系统在处理一个来自 Windows 服务器的路径C:\\Users\\Admin\\app.LOG时,这个函数返回了一个空列表,导致后续流程失败。为什么?因为path.endswith(‘.log’)是大小写敏感的,而你的测试采样(‘system.log’,‘app.log’)全部是小写,遗漏了.LOG这种“模式”。
这就是采样验证危险定律的核心体现:
- 连续状态空间:文件后缀的可能性是连续的(.log, .LOG, .Log, .lOg…),是一个近乎无限的状态空间。
- 有限采样:你的测试用例只覆盖了其中少数几个点(小写
.log)。 - 遗漏的模式即罕见的规则:大写
.LOG这个被遗漏的“模式”,对应着一条真实的、但可能不常被触发的业务规则(“Windows 系统可能生成大写后缀的日志文件”)。 - 虚假的安全感:有限的成功测试给了你“函数正确”的强烈信号,让你忽略了未被覆盖的广阔危险区域。
- 必然的失败:只要系统运行时间足够长、输入足够多样,那个被遗漏的罕见规则终将被触发,导致失败。
在传统软件开发中,我们通过详尽的单元测试、边界条件分析来应对这个问题。但在 LLM 时代,问题变得更加尖锐:
- 生成的黑盒性:我们不完全理解 LLM 为何生成
endswith而不是lower().endswith。它的“思维过程”对我们不透明。 - 场景的开放性:LLM 被用于应对开放域问题,我们很难预先定义所有可能的“罕见规则”。
- 验证的成本:对 LLM 生成的每一段代码或计划都进行 exhaustive testing(穷举测试)在计算和人力上都是不可行的。
因此,“采样验证危险定律”不是告诉我们不要测试,而是警告我们:对于 LLM 生成的、在连续空间内操作的输出,基于有限采样的“通过”结果,其可信度远低于我们的直觉判断。我们必须改变验证策略。
2. 核心概念:Code World Model、连续控制与规划器
要深刻理解这一定律,需要先厘清几个关键概念。它们共同构成了现代 AI 智能体(Agent)的核心技术栈,也是风险滋生的土壤。
2.1 Code World Model(代码世界模型)
这不是指 LLM 本身,而是指LLM 内部形成的、关于外部世界(特别是代码执行环境)如何运作的心理模型。
- 通俗解释:当 LLM 写代码时,它并不是在机械地拼接语法。它依靠训练时见过的海量代码和文本,内化了一套关于“变量如何赋值”、“循环如何工作”、“文件系统如何响应”、“API 调用可能返回什么”的规则和概率分布。这套内化的规则集合就是它的“代码世界模型”。
- 关键点:这个模型是不完整且可能有偏差的。它学到的只是训练数据中的统计规律。如果训练数据中
endswith的用例 99% 都是小写匹配,那么它的“世界模型”就会严重倾向于生成大小写敏感的检查,而忽略大小写不敏感的规则,除非你明确提示。
2.2 连续控制(Continuous Control)与离散决策
在 AI 规划领域:
- 离散决策:动作空间是有限的、可列举的。例如,“向左转”、“向右转”、“前进”。
- 连续控制:动作或状态参数在一个连续范围内取值。例如,“将方向盘旋转 32.5 度”、“生成一个在 0 到 1 之间的随机数”、“处理所有可能的文件后缀字符串”。
LLM 的代码生成本质上是一个连续控制问题。它生成的代码需要处理近乎无限的输入空间(所有可能的字符串、所有可能的网络状态、所有可能的用户输入)。endswith(‘.log’)这个决策,需要应对的是后缀字符串这个连续空间里的每一个点。
2.3 规划器(Planner)
在 AI Agent 架构中,规划器是负责生成一系列动作(或代码)以实现某个目标的组件。LLM 常被用作规划器的核心。
- 工作流程:用户给出目标(“清理日志目录”),规划器(LLM)生成一个计划(“1. 列出目录文件;2. 过滤出.log文件;3. 删除它们”),并可能将其具体化为代码。
- 风险所在:规划器基于其不完美的“代码世界模型”,在连续的动作/状态空间中,为一个开放域目标生成计划。它只能“采样”出它认为概率最高的那个计划(或代码片段)。而你的验证,又是在这个连续空间里进行的第二次“采样”。双重采样,极大放大了遗漏风险。
2.4 采样验证(Sampling-Verification)范式
这是当前 LLM 应用开发的主流范式:
- 采样(Sampling):LLM 根据提示词,从它的概率分布中“采样”生成一个输出(一段代码、一个计划)。
- 验证(Verification):开发者运行一些测试用例,或进行简单推理,检查输出是否正确。
- 决策:如果验证通过,则接受该输出;否则,调整提示词重新采样。
定律指出,在这个范式下,验证环节的有限采样无法有效评估 LLM 在连续控制问题上的泛化能力。通过验证,只能说明输出在采样点上与你的“世界模型”(你的期望)一致,不能说明 LLM 的“世界模型”与真实世界一致。
3. 环境准备:模拟一个高风险代码生成场景
为了具体演示并找到解决方案,我们需要一个可重复实验的环境。我们将构建一个简单的“日志文件管理 Agent”模拟场景,其中包含容易触发“采样验证危险”的陷阱。
前置条件:
- 操作系统:不限(Linux/Mac/Windows均可,但请注意路径分隔符差异)。
- Python 版本:3.8 及以上。
- 核心库:
openai(或兼容 OpenAI API 的库),用于调用 LLM。我们将使用其模拟行为来演示。 - IDE/编辑器:任意。
项目结构:
llm_sampling_verification_demo/ ├── config.py # 配置(如模拟的API密钥) ├── world_model.py # 模拟真实文件系统的“世界模型” ├── llm_planner.py # 模拟有缺陷的LLM规划器 ├── verification.py # 各种验证策略 ├── danger_demo.py # 主演示脚本 └── requirements.txt初始化环境:创建虚拟环境并安装基础依赖。
# 创建项目目录 mkdir llm_sampling_verification_demo && cd llm_sampling_verification_demo # 创建虚拟环境(可选但推荐) python -m venv venv # Linux/Mac source venv/bin/activate # Windows venv\Scripts\activate # 创建 requirements.txt echo "openai>=1.0.0" > requirements.txt echo "pytest>=7.0.0" >> requirements.txt # 用于后续进阶验证 # 安装依赖 pip install -r requirements.txt4. 构建有缺陷的“世界模型”与规划器
我们将模拟一个简化但有代表性的缺陷。假设 LLM 的“世界模型”在文件路径处理上存在盲区。
文件:world_model.py这个文件模拟真实世界的文件系统响应。我们将用它来对比 LLM 的预期和真实情况。
""" 模拟真实文件系统的“世界模型”。 用于验证LLM生成的代码在实际执行时的行为。 """ class RealWorldFileSystem: """模拟一个真实的文件系统,包含一些LLM可能忽略的规则。""" @staticmethod def list_files_in_directory(dir_path): """模拟列出目录下的文件。这里返回一个预定义的列表,包含各种边界情况。""" # 注意:包含大小写混合、点号开头、无后缀等多种情况 return [ "app.log", "system.LOG", # 大写后缀 ".hidden.log", # 点号开头 "logfile.", # 以点号结尾 "archive.log.gz", # 多个点号 "error.TXT", "debug.log", "backup.2023.log", # 中间包含.log "LOG", # 文件名就是LOG "/var/log/syslog", # 绝对路径 ] @staticmethod def is_log_file(file_name): """ 真实世界判断日志文件的规则。 与有缺陷的LLM生成的规则不同! 规则:不区分大小写,且必须是后缀(即最后一个点号之后的部分)。 """ # 转换为小写处理 lower_name = file_name.lower() # 找到最后一个点号的位置 last_dot_index = lower_name.rfind('.') if last_dot_index == -1 or last_dot_index == len(lower_name) - 1: # 没有点号,或点号在末尾,都不是有效的.log文件 return False suffix = lower_name[last_dot_index + 1:] return suffix == 'log'文件:llm_planner.py这个文件模拟一个有缺陷的 LLM 规划器。它基于一个不完美的“世界模型”生成代码。
""" 模拟一个有缺陷的LLM规划器。 它内化的“代码世界模型”在文件后缀判断上存在大小写敏感和匹配逻辑的盲区。 """ class DefectiveLLMPlanner: """模拟一个在文件过滤任务上有缺陷的LLM。""" @staticmethod def generate_filter_code(task_description): """ 根据任务描述生成过滤代码。 模拟LLM基于其有缺陷的世界模型进行采样。 """ # 模拟LLM的“思考”:它最常见到的模式是 path.endswith('.log') # 因此它采样生成了这个看似正确,实则脆弱的代码。 generated_code = """ def filter_log_files(file_list): \"\"\"过滤出日志文件。\"\"\" result = [] for file_name in file_list: if file_name.endswith('.log'): # 缺陷:大小写敏感,且是`endswith`而非后缀匹配 result.append(file_name) return result """ return generated_code.strip() @staticmethod def get_internal_model_rule(): """暴露这个有缺陷的LLM内部认为的规则。用于对比。""" return "规则:文件名必须以字符串 '.log' 结尾。"5. 演示采样验证如何失败
现在,让我们在主脚本中演示经典的“采样-验证-部署-失败”流程。
文件:danger_demo.py
import world_model import llm_planner def naive_sampling_verification(): """ 演示天真的采样验证流程。 开发者编写少量测试用例,验证通过后即认为代码正确。 """ print("=== 阶段一:LLM生成代码 ===") planner = llm_planner.DefectiveLLMPlanner() generated_code = planner.generate_filter_code("写一个过滤.log文件的函数") print("生成的代码:") print(generated_code) print(f"\nLLM内部模型规则:{planner.get_internal_model_rule()}") # 动态执行生成的代码 exec_globals = {} exec(generated_code, exec_globals) filter_func = exec_globals['filter_log_files'] print("\n=== 阶段二:开发者进行采样验证 ===") # 开发者编写的“典型”测试用例 developer_test_cases = [ ["app.log", "data.txt", "server.log"], ["error.log"], [], ["access.log", "test.png", "system.log"] ] all_passed = True for i, test_case in enumerate(developer_test_cases): expected = [f for f in test_case if f.endswith('.log')] # 开发者心中的“正确”结果,其实和LLM缺陷一致 result = filter_func(test_case) if result == expected: print(f" 测试用例 {i+1} 通过: {test_case} -> {result}") else: print(f" 测试用例 {i+1} 失败!预期 {expected}, 得到 {result}") all_passed = False if all_passed: print("\n✅ 所有测试用例通过!开发者信心满满地将代码集成到系统中。") else: print("\n❌ 测试失败。") return print("\n=== 阶段三:在真实世界中运行(灾难发生)===") real_file_system = world_model.RealWorldFileSystem() real_files = real_file_system.list_files_in_directory("/dummy/path") print(f"真实目录中的文件列表:{real_files}") # 用生成的函数过滤 filtered_by_llm = filter_func(real_files) print(f"有缺陷的LLM函数过滤结果:{filtered_by_llm}") # 用真实世界的规则过滤 filtered_by_real_world = [f for f in real_files if real_file_system.is_log_file(f)] print(f"真实世界规则过滤结果:{filtered_by_real_world}") print(f"\n真实世界认为的日志文件:{filtered_by_real_world}") print(f"LLM函数找到的日志文件:{filtered_by_llm}") if set(filtered_by_llm) == set(filtered_by_real_world): print("\n🎉 奇迹!LLM函数在真实世界也工作正常。") else: print("\n💥 采样验证危险定律应验!") print(f" 漏掉的日志文件:{set(filtered_by_real_world) - set(filtered_by_llm)}") print(f" 误包含的文件:{set(filtered_by_llm) - set(filtered_by_real_world)}") print("\n分析:") print(" - 'system.LOG' 被漏掉:因为LLM的规则是大小写敏感的。") print(" - '.hidden.log' 被误包含:因为LLM的`endswith`规则不检查是否以点号开头。") print(" - 'backup.2023.log' 被误包含:因为`endswith`匹配成功,但它不是后缀。") if __name__ == "__main__": naive_sampling_verification()运行与结果分析:
python danger_demo.py运行上述脚本,你将看到清晰的三个阶段输出。关键结论是:尽管开发者的测试用例全部通过,但该函数在真实世界模拟中,在 10 个文件上就出现了 3 处错误(漏报和误报)。这完美诠释了“一个被遗漏的模式(大写.LOG,点号开头文件)就是一条罕见的规则”,而有限的采样验证完全无法发现它。
6. 超越采样:构建鲁棒验证的工程实践
既然天真的采样验证不可靠,我们该怎么办?放弃测试吗?当然不是。我们需要从“基于样例的验证”升级为“基于规则与属性的验证”,并改变与 LLM 协作的模式。
6.1 策略一:契约测试与属性测试
不要只测试具体输入输出的匹配,而是测试代码是否满足某些不变性或属性。
文件:verification.py- 第一部分
""" 进阶验证策略。 """ def property_based_verification(filter_func): """ 对过滤函数进行属性测试。 这些属性应该在任何正确的实现中都成立。 """ print("\n=== 进行属性测试 ===") properties_held = True # 属性1:大小写不敏感性 # 如果 f 被过滤出来,那么 f.upper() 和 f.lower() 也应该被过滤出来(如果是日志文件)。 test_case = ["APP.LOG", "app.log", "App.Log"] result = filter_func(test_case) if len(result) != 3: print(f" ❌ 属性1(大小写不敏感)失败。结果: {result}") properties_held = False else: print(f" ✅ 属性1(大小写不敏感)通过。") # 属性2:后缀匹配,而非子串匹配 # “backup.2023.log” 应该被过滤,但 “notalogfile” 不应该。 test_case = ["backup.2023.log", "notalogfile"] result = filter_func(test_case) if "notalogfile" in result: print(f" ❌ 属性2(后缀匹配)失败。误包含了 'notalogfile': {result}") properties_held = False else: print(f" ✅ 属性2(后缀匹配)通过。") # 属性3:点号开头的文件(隐藏文件)除非后缀是.log,否则不应被当作日志文件 # “.hidden.log” 是日志文件吗?这取决于业务规则。我们假设不是。 test_case = [".hidden.log", ".config"] result = filter_func(test_case) if ".hidden.log" in result: # 根据我们的 RealWorldFileSystem,它应该被过滤掉 print(f" ❌ 属性3(隐藏文件处理)失败。根据业务规则,'.hidden.log' 可能不应被包含。") properties_held = False else: print(f" ✅ 属性3(隐藏文件处理)通过。") return properties_held在主演示中调用属性测试,你会发现有缺陷的函数连第一条属性都无法满足。属性测试能帮你发现 LLM 世界模型中的系统性偏差,而不是特定输入的错误。
6.2 策略二:模糊测试与边界值生成
让机器自动生成大量、多样的、甚至随机的输入,进行压力测试。
文件:verification.py- 第二部分
import random import string def fuzz_test(filter_func, num_cases=100): """ 对过滤函数进行模糊测试。 随机生成文件名,观察函数是否崩溃或产生明显不合理输出。 """ print(f"\n=== 进行模糊测试({num_cases}个随机用例)===") crashes = 0 suspicious_results = [] for i in range(num_cases): # 随机生成一个“文件名” length = random.randint(1, 20) # 随机包含字母、数字、点号、下划线、连字符等 chars = string.ascii_letters + string.digits + '._-' random_name = ''.join(random.choice(chars) for _ in range(length)) # 确保有一定概率包含.log if random.random() < 0.3: # 在随机位置插入.log,模拟各种情况 pos = random.randint(0, len(random_name)) random_name = random_name[:pos] + '.log' + random_name[pos:] test_input = [random_name] try: result = filter_func(test_input) # 简单合理性检查:如果文件名包含.log但不是以.log结尾,却被过滤了,可能有问题。 if '.log' in random_name and not random_name.endswith('.log'): if result: # 函数认为它是日志文件 suspicious_results.append((random_name, result)) except Exception as e: print(f" 用例 {i}: 输入 '{random_name}' 导致崩溃: {e}") crashes += 1 print(f" 完成。崩溃次数: {crashes}, 可疑结果数: {len(suspicious_results)}") if suspicious_results: print(f" 示例可疑结果(包含.log但不是后缀却被匹配):") for inp, out in suspicious_results[:3]: print(f" 输入: '{inp}' -> 输出: {out}") return crashes == 0模糊测试可以暴露出函数在处理畸形或意外输入时的脆弱性,比如空字符串、纯点号、超长路径等。
6.3 策略三:提示词工程:引导LLM进行自我验证与思维链
在生成代码的环节,就要求 LLM 考虑边界情况,并解释其推理过程。
# 这是一个模拟的、改进后的提示词 improved_prompt = """ 请编写一个Python函数 `filter_log_files(file_list)`,用于从文件路径列表中过滤出日志文件。 要求: 1. 日志文件是指文件扩展名(后缀)为 `.log` 的文件。 2. 扩展名检查应不区分大小写(例如,`.LOG`、`.Log` 都应被识别)。 3. 只匹配最后一个点号之后的部分作为扩展名(例如,`archive.tar.gz` 不是日志文件,`backup.2023.log` 是日志文件)。 4. 请考虑边界情况,例如: - 文件名以点号开头(如 `.hidden.log`)是否是日志文件?请说明你的判断依据。 - 文件名为 `log`(无后缀)或 `file.`(以点号结尾)应如何处理? 5. 在代码注释中,简要说明你如何处理上述边界情况。 请先一步步思考,然后输出最终的代码。 """ # 模拟LLM基于此提示词生成更健壮的代码通过要求“一步步思考”(Chain-of-Thought),并明确列出边界情况,你可以引导 LLM 激活其知识库中相关的、但可能概率较低的正确规则,从而生成更鲁棒的代码。
7. 常见问题与排查清单
当你的 LLM 生成代码或 Agent 计划出现不可预测的失败时,可以按照以下清单排查是否落入了“采样验证危险定律”的陷阱。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 测试通过,线上失败 | 测试用例覆盖不全,未触及LLM世界模型中的盲区。 | 1. 审查测试用例的多样性(大小写、空值、边界值、异常格式)。 2. 对生成代码进行模糊测试。 3. 分析线上失败案例的输入特征。 | 1. 采用属性测试替代部分样例测试。 2. 在提示词中明确要求处理边界情况。 3. 实施基于变异(Mutation)的测试。 |
| Agent在简单任务成功,复杂任务失败 | LLM 在长序列规划中,后期步骤依赖于前期步骤的、有缺陷的中间结果。 | 1. 记录并检查Agent每个步骤的输入和输出。 2. 检查步骤间的假设是否一致(例如,步骤1假设文件存在,步骤2却去删除它)。 | 1. 为Agent增加关键步骤的“自我检查”或“事实核查”。 2. 引入验证器(Verifier)模块,对规划的关键节点进行逻辑或规则校验。 |
| 代码在A环境正常,B环境异常 | 生成代码隐含了对特定环境(如操作系统、库版本、路径风格)的假设。 | 1. 对比A/B环境的差异(路径分隔符、编码、权限模型)。 2. 检查代码中是否有硬编码的路径、命令或配置。 | 1. 在提示词中指定目标环境。 2. 生成配置化、参数化的代码,而非硬编码。 3. 在部署前进行跨环境测试。 |
| 模型偶尔“发疯”,产生完全不合逻辑的输出 | 采样到了模型概率分布中的低概率“异常模式”。在连续空间中,低概率事件在多次采样中必然出现。 | 1. 检查是否使用了低温度(temperature)参数?过高的温度会增加采样随机性。 2. 输出是否缺乏确定性约束(如JSON格式、固定模板)? | 1. 对于关键任务,降低采样温度(如0.2),增加确定性。 2. 使用输出解析(Output Parsing)或后处理来强制结构化。 3. 采用自我一致性(Self-Consistency):多次采样,选择最一致的答案。 |
| 难以编写覆盖所有情况的测试 | 问题的状态空间本身就是连续或近乎无限的。 | 承认穷举测试不可行,转变测试哲学。 | 1.从验证输出转向验证属性:代码是否满足不变量? 2.从测试代码转向测试模型:对LLM本身进行评测,了解其在某类任务上的准确率边界。 3.增加安全护栏:在系统层面对生成代码的执行结果进行监控和熔断(如超时、资源限制、异常捕获)。 |
8. 最佳实践与工程建议
将“采样验证危险定律”的应对策略融入你的 AI 应用开发流程。
8.1 设计阶段:明确规范与约束
- 形式化需求:尽可能用清晰、无歧义的语言描述任务,包括输入/输出格式、边界条件、错误处理。避免“智能地处理所有情况”这种模糊要求。
- 定义不变性:思考你的任务有哪些必须始终为真的属性(例如,“过滤操作不应改变非日志文件列表的顺序”、“函数执行时间应在O(n)内”)。这些将成为属性测试的基础。
8.2 开发(提示词)阶段:引导与约束生成
- 结构化提示:使用 Few-Shot、Chain-of-Thought、角色设定等技巧,引导 LLM 的推理过程。
- 明确边界:在提示词中直接列出关键的边界情况和处理规则。
- 要求解释:让 LLM 在生成代码或计划的同时,输出其关键决策的理由。这有助于你发现其世界模型中的错误假设。
8.3 验证阶段:分层测试策略
- 单元测试(样例):保留,但明确其局限性。用于验证基本功能。
- 属性测试:针对核心不变性编写测试。这是对抗采样验证风险的核心武器。
- 模糊测试:用于压力测试和发现崩溃。
- 集成测试:在更完整的模拟环境或沙箱中运行 Agent 的完整流程。
- 对抗性测试:故意构造一些容易让 LLM 出错的“对抗性”输入,检验系统的鲁棒性。
8.4 部署与运维阶段:监控与熔断
- 执行沙箱:对于执行生成的代码,务必在严格的沙箱环境(资源限制、网络隔离、权限控制)中进行。
- 输入/输出监控:记录所有 LLM 生成内容的输入和输出,特别是失败案例,用于分析和迭代提示词。
- 人机回环:对于高风险操作(如删除文件、修改数据库、调用外部 API),设计“人工确认”环节,或设置多层自动验证。
- 熔断机制:当系统在短时间内出现多次类似失败时,自动降级或停止相关 AI 功能的调用。
理解并应用“采样验证危险定律”,其价值不在于消除 LLM 的所有错误——那是不可能的——而在于建立一种健康的怀疑态度和系统性的防御体系。你不能指望 LLM 第一次就生成完美代码,但你可以通过改进验证方法,极大地降低将缺陷部署到生产环境的概率。
从今天起,当你再次看到 LLM 生成的代码漂亮地通过了你的三五个测试用例时,请先别急着欢呼。问问自己:我测试的,是它“看起来正确”的采样点,还是它“可能出错”的连续空间中的漏洞?你对于这个问题的回答方式,将决定你构建的 AI 应用是昙花一现的演示,还是真正可靠的生产力工具。