Day 5: 当 LLM 开始胡说八道:如何设计 Clawdbot 的防御层
标题备选
- 当 LLM 开始胡说八道:如何设计 Clawdbot 的防御层
- 给你的 AI 装上"熔断器":容错机制的实战指南
- 不要盲信 AI 的 JSON:构建基于校验器的鲁棒工作流
正文内容
我们在前几天建立了模块化架构,也加上了日志追踪。现在,我们要面对 AI Agent 最大的不可控因素:幻觉 (Hallucination) 和不确定性。
即使是 Claude 3.5 这样强大的模型,偶尔也会"抽风"。 比如,你让它抓取股价,它没找到,为了完成任务,它可能编一个数字给你。 或者你让它返回 JSON,它却返回了一段 Python 代码。
如果你直接把 AI 的输出写进生产数据库,那就是在埋雷。
容错不是可选项,是必选项。 我们需要构建三层防御体系。
第一层防御:结构化验证 (Validator)
原则:永远不要信任 LLM 的输出。
不管你在 Prompt 里强调了多少遍"只返回 JSON",你都必须在代码层做校验。不要只用 try-catch JSON.parse(),那太弱了。你需要 Schema 校验。
在 Python 里,Pydantic 是神器。
from pydantic import BaseModel, Field, ValidationError
class ProductItem(BaseModel):
name: str = Field(description="商品名称")
price: float = Field(description="价格,必须是数字")
in_stock: bool = Field(description="是否有货")
# 模拟 LLM 的输出(这次它犯蠢了,价格给成了中文)
llm_output = {"name": "Switch", "price": "三百块", "in_stock": "Yes"}
try:
# 这步会直接抛出详细错误,而不是把垃圾数据写进库里
product = ProductItem(**llm_output)
except ValidationError as e:
print("AI 输出格式错误,启动修复流程...")
这层防御能挡住 90% 的格式错误。
第二层防御:自我修正循环 (Self-Correction Loop)
当第一层校验失败时,不要直接报错退出。把错误信息扔回给 AI,让它自己改。
这是一种非常有效的 Pattern:
- AI 生成结果 A。
- 代码校验 A,发现错误:
price should be float。 - 将错误信息 + 原始 Prompt 再次发给 AI:"你上次生成的结果有误,报错是...,请修正。"
- AI 生成结果 B。
通常一次修正就能解决问题。这让你的工作流具有了"自愈"能力。
第三层防御:任务熔断 (Circuit Breaker)
如果 AI 连续修正了 3 次还是错怎么办? 或者 API 连续超时 5 次怎么办? 或者今天的 Token 消耗突然达到了平常的 10 倍怎么办?
这时候,必须熔断。停下来,发报警,转人工。
不要让错误的循环无休止地运行下去,这不仅烧钱,还可能污染大量数据。
熔断策略示例:
- 重试上限: 每个步骤最多重试 3 次。
- 成本熔断: 单次任务 Token 消耗超过 $2 强制停止。
- 错误率熔断: 如果过去 1 小时失败率超过 50%,暂停整个 Cron Job。
总结:防御性编程
在传统编程中,输入通常是可控的。 在 AI 编程中,输入(环境)和处理逻辑(模型)都是概率性的。
所以,Clawdbot 的稳定性不来自于模型本身有多强,而来自于你的**外围包裹代码(Wrapper Code)**有多厚实。
- 用 Validator 确保数据类型正确。
- 用 Retry Loop 解决偶发性抽风。
- 用 Circuit Breaker 防止灾难性损耗。
只有做好了这三层防御,你才敢在周末放心地去睡觉,而不是担心周一早上被老板叫去修数据。
明天,我们聊聊如何管理这些复杂的配置——把 Prompt 当代码管。
标签:#AI安全 #容错设计 #Pydantic #Clawdbot #鲁棒性