模型分类,代码保证:一个AI Agent实战踩坑总结
很多搞AI Agent的人习惯把所有逻辑都塞进Prompt,试图通过优化提示词来解决所有问题。但我通过给本田经销商做SMS自动化助手(处理预约、查手册、核对保修)才发现,一个极其残酷的真相:LLM在处理逻辑判断和数值计算时,即便你把指令写得再详细,它依然会随机掉链子。
我曾遇到一个Bug:客户的保修期已过,但Agent读取了上下文中的过期日期后,居然告诉客户“在保修范围内”。我尝试在System Prompt里强调今天的日期,要求它仔细对比,结果依然失败。
如果让模型计算税费或零件总价,它可能会在四舍五入或百分比计算上出错。我把所有费用公式直接硬编码在函数里,模型只负责识别用户在问总价,然后把计算结果像人一样说出来。
我使用了 Pydantic 来强制执行结构化输出,模型返回一个
下一篇
UE5开发模型对比 →
最核心的实战经验就是:让模型负责分类和自然语言交互,而把确定性的逻辑交给代码。
分享三个我掉坑后的解决方案,希望能给正在做大模型实战的朋友避坑:
一、 别让模型做日期比对
我曾遇到一个Bug:客户的保修期已过,但Agent读取了上下文中的过期日期后,居然告诉客户“在保修范围内”。我尝试在System Prompt里强调今天的日期,要求它仔细对比,结果依然失败。
结论: LLM不擅长日期比对。现在的方案是在Python端预先处理好,直接给模型传“已过期”或“有效”的结论。
def _annotate_expirations(in_md: str) -> str:
"""
在门户数据的所有过期日期旁标注计算后的‘已过期/有效’结论。
因为LLM在日期比对上不可靠,所以由代码完成比对,模型仅负责传达结果。
"""
# 具体的比对逻辑在 Python 中实现,而非 Prompt 中
...二、 算钱的事,绝不能交给模型
如果让模型计算税费或零件总价,它可能会在四舍五入或百分比计算上出错。我把所有费用公式直接硬编码在函数里,模型只负责识别用户在问总价,然后把计算结果像人一样说出来。
def calculate_total(subtotal):
"""
费用计算的唯一事实来源,确保Prompt和代码之间不会出现偏差:
杂费 = min(小计 × 10%, $59.50)
税费 = (小计 + 杂费) × 7%
"""
shop_supplies = min(subtotal * 0.1, 59.50)
tax = (subtotal + shop_supplies) * 0.07
return subtotal + shop_supplies + tax三、 别相信模型的“自我检查”
我使用了 Pydantic 来强制执行结构化输出,模型返回一个
complete 标志位来告知预约是否完成。但早期出现过一个诡异问题:模型标记了 complete: True,但实际提交的数据里缺失了服务类型。现在的逻辑是:模型说“完成了”只是一个建议,服务器在写入数据库前必须独立运行一次字段校验。
总结下来,一个鲁棒的AI Agent工作流应该是:LLM → 结构化输出 → 代码校验 → 确定性执行 → LLM反馈。