先看现象。promptfoo 0.95 的配置里写了 assert: [{type: javascript, value: "output.includes('退款')"}],跑一百条用例全部报 javascript assertion failed: eval is not allowed,改成函数写法也一样。
真正麻烦的地方在于,几个原因的现象几乎一样。运行环境启用了沙箱,禁止动态执行字符串。另一种情况是断言返回的不是布尔值,框架按失败处理。
还有一种情况,变量名写成了 response,实际注入的是 output。
另外,Node 版本过低,可选链在断言里直接语法错误。
先换成内置断言确认链路是否正常
npx promptfoo eval -c promptfooconfig.yaml --filter-failing
再往下把断言写成外部文件再引用
npx promptfoo eval -c config.yaml --max-concurrency 1
随后在断言里只返回布尔并打印中间值
python -c "print({'assert':'output.includes(\"退款\")'})"
降级到 contains 断言,避免执行任意脚本
python -c "print({'type':'contains','value':'退款'})"
怎么算真的好了,看的是同一批现象。同一批用例跑通,失败项能正确标红,输出里能看到断言的期望值与实际值。
补一句。能用内置断言表达的就别写脚本,沙箱限制是安全设计不是 bug,绕过去的代价通常比换一种断言方式高。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
