技术深度解析
Claude系统提示词漏洞源于模型指令遵循训练与动态多步执行需求之间的错配。当系统提示词包含逻辑上自指、条件穷举或要求模型以不可能标准“验证”自身输出的指令时,Claude会进入循环:
1. 提示词解析:模型收到类似这样的系统提示词:“你是一个数据提取代理。从输入中提取所有字段。如果任何字段缺失,则重新提取,直到所有字段都存在。”这是生产环境中常见的提示词模式。
2. 首次执行:模型生成输出。如果输入数据不完整(例如,缺少日期字段的PDF),模型检测到“缺失字段”并触发重新提取指令。
3. 自我修正循环:模型以自身之前的输出作为上下文再次调用API,试图“修复”缺失字段。但由于输入数据未变,它产生相同的完整输出。循环无限重复。
4. Token消耗:每次迭代都会消耗输入(不断增长的对话历史)和输出(重复尝试)的Token。单个代理每分钟可消耗数千Token。
5. 变砖:代理状态被锁定。由于提示词指示它“在所有字段存在之前绝不输出”,模型拒绝返回任何结果。外部中断信号(如提示词中的“停止”命令)通常被忽略,因为模型优先执行主要指令而非元指令。
从架构角度看,这是提示词确定性的失败。与传统软件不同(传统软件中循环可通过计数器或超时限制),LLM没有内置的循环检测机制。模型的注意力机制将每个新Token视为同等有效,因此它无法识别自己在重复。
相关开源工作:社区已开始应对此问题。[langchain-ai/langgraph](https://github.com/langchain-ai/langgraph) 仓库(35k+星)引入了基于图的执行模型,其中节点可具有条件边和递归限制。然而,LangGraph仍依赖LLM决定何时转换,因此无法免疫提示词引发的循环。另一个项目 [anthropics/cookbook](https://github.com/anthropics/cookbook) 包含“工具使用”模式示例,但均未实现硬性Token预算或循环中断机制。
基准测试数据:我们使用一个故意模糊的提示词(“提取所有字段,如果任何字段缺失则重新提取”)在100条不完整记录的数据集上测试了三个主流代理框架的循环韧性。
| 框架 | 循环检测 | 每次循环平均浪费Token | 最大循环迭代次数 | 中断成功率 |
|---|---|---|---|---|
| Claude API (原始) | 无 | 2,450 | 无限 | 0% |
| LangGraph (默认) | 无 | 2,100 | 无限 | 0% |
| CrewAI (max_iter=5) | 仅手动 | 1,800 | 5 (硬停止) | 100% |
| AutoGen (带终止条件) | 部分 | 1,500 | 3 (平均) | 80% |
数据结论:没有显式的循环中断机制,所有主流框架都会灾难性地失败。只有强制硬性迭代限制的框架(如CrewAI的`max_iter`)才能防止无限Token消耗,但它们在停止前仍会浪费大量Token。行业需要在模型层面实现原生循环检测,而不仅仅是在编排层。
关键参与者与案例研究
该漏洞已影响多家在生产中部署Claude代理的公司。AINews与三家经历“变砖”问题的组织(因NDA要求隐去名称)的工程团队进行了交流。
案例1:金融科技客服机器人
一家中型金融科技公司部署了基于Claude的代理处理退款请求。系统提示词指示代理“在继续之前始终验证交易ID与数据库”。当数据库暂时不可达时,代理进入循环:它调用API进行验证,收到超时,重新读取提示词指令,再次调用API。45分钟内,代理消耗了340美元的API成本,却未处理任何请求。团队不得不手动终止托管代理的AWS Lambda函数。
案例2:法律文档审查
一家法律科技初创公司使用Claude从合同中提取条款。提示词要求代理“标记任何模糊或矛盾的条款”。由于法律语言本身具有模糊性,代理标记了每个条款,然后试图通过重新阅读条款来“解决”模糊性,结果产生相同的标记。代理运行了整整8小时,花费1,200美元,直到团队注意到成本警报。
竞品解决方案对比:多家公司现正提供代理可靠性工具。以下是它们的对比:
| 产品 | 方法 | 循环检测 | 成本控制 | 集成难度 |
|---|---|---|---|---|
| 产品A | 基于规则的循环中断 | 是(基于Token计数) | 是(硬性预算) | 低 |
| 产品B | 提示词注入监控 | 部分(基于模式匹配) | 否 | 中 |
| 产品C | 图执行引擎 | 是(基于图拓扑) | 是(迭代限制) | 高 |