系统提示词是根牵引绳,不是脑叶切除手术。它可以被忽略、被误读,也会在压力下漂移。确定性代码不会。
作者构建了一个本地AI代理Ahmad-AI,用LangGraph、Python和Ollama,接入实时SQL数据库和伊斯兰知识库。设计规则只有一条,不可谈判:除非某条引用或数据声明被独立验证过,否则不许说出口。验证过,或者闭嘴。
因为通用大模型编造引用时既自信又频繁,"自信地错"比"诚实地不确定"更糟。作者花了几周时间,试图证明这套系统会自己破规矩。它确实破了,而且不止一次。以下是六轮对抗测试后的记录。
第一轮:幽灵行与失配的正则
第一轮跑了一组测试问题:空数据库查询、古兰经与圣训引用请求、含义模糊的排序查询。两个关键bug立刻浮出水面。
幽灵行bug:查询一张没有匹配行的表时,代理正确输出了"该查询未返回任何结果"。就在同一句话里,它编造了两个不存在的商品ID和对应的库存数量。
正则失配:被问到高利贷(riba)时,代理引用了5:51节——一节真实存在的古兰经经文,但内容完全关于跨信仰联盟。引用守卫没有触发,因为它的正则期待"Surah [名称] X:Y"的格式,而模型写的是"(Quran X:Y)"。一个匹配不上输出形状的安全机制,等于不存在。
修法:写代码,不是写更多指令
第一反应是加固系统提示词。作者压住了这个冲动。与其给大模型写更严的规则,不如在Python里建一道确定性兜底,当已知的失败模式出现在状态里时,直接覆盖模型的措辞。
兜底逻辑很直白:如果最后一次数据库查询返回空或硬报错,无论模型写了什么,整体替换为一句固定的诚实提示——"该查询未找到匹配数据,数据可能尚不存在。"
引用守卫则改用白名单:只放行预先验证过的引用(示例中为20:114)。扫描文本中的引用模式,只要有一条不在白名单内,就返回安全兜底话术。哪怕那条引用是真的,也照样拦截。
不撒谎的评测框架
在终端里手动重敲测试提示词,规模上不去。为了让代理保持诚实,自动化测试被拆成两层。
- 单元测试22个:直接对Python守卫函数跑合成输入,速度快,不需要调用实时大模型。
- 端到端评测框架:驱动真实的LangGraph执行链路,对接Ollama和Postgres。
把模糊的模型输出当成二值通过/失败,要么让真实回归被噪声般的假失败掩盖,要么把硬性安全检查降级成"差不多就行"。
给AI工程师的几条结论
白名单胜过正确性检查器。验证"这条引用准不准"很难,检查"这条引用在不在预批准白名单里"简单且可靠。
启动时打印构建戳。代理启动时输出一个版本标记,成本为零,能防止对着过期代码做测试。
区分瞬时错误与永久错误。连接掉线重试有意义,SQL列名写错还重试,只是失败得慢一点。
别让大模型做算术或行匹配。在工具输出里把查询答案明确写出来,能防止模型误读JSON行。
这套架构已上线,跑过22个单元测试和5/5端到端硬检查。作者Muhammad Ahmad是AI代理工程师、数字供应链架构师,持PMP与RMP认证,有超过15年运营领导经验。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.