使用promptfoo时传入prompt_generator.py的JSON格式错误问题求助
解决promptfoo传入Python脚本的非标准JSON格式问题
问题核心
使用promptfoo调用自定义prompt_generator.py脚本时,传入的数据是类似'{vars:{question:question1,document:document1}}'的Python字面量格式,而非标准JSON,导致json.loads()解析时触发"Expecting property name enclosed in double quotes"错误。
原因
promptfoo默认以Python字面量格式向外部脚本传递上下文数据,不是标准JSON结构,因此无法直接用JSON解析器处理。
解决方案
方案1:修改Python脚本解析逻辑
用ast.literal_eval()替代json.loads(),该方法可以安全解析Python字面量格式的数据,同时去除外层包裹的单引号:
修改后的prompt_generator.py代码:
import sys import ast def generate_prompt(context): document = context["vars"]["document"] question = context["vars"]["question"] return f"""Document. {document} Question: {question} "RELEVANT" or "NOT_RELEVANT":""" if __name__ == '__main__': data = sys.argv[1] if len(sys.argv) > 1 else None with open("log_data.txt", "a") as f: f.write(f"Log data: {data}\n") # 去除外层单引号并解析Python字面量 context_data = ast.literal_eval(data.strip("'")) print(generate_prompt(context_data))
方案2:配置promptfoo传递标准JSON
在prompfooconfig.yaml的prompt引用后添加format=json参数,强制promptfoo以标准JSON格式传递数据:
修改后的prompfooconfig.yaml代码:
prompts: - 'prompt_generator.py:generate_prompt?format=json' providers: - openai:gpt-3.5-turbo tests: - vars: question: "question1" document: "document1" assert: - type: equals value: 'NOT_RELEVANT' - vars: question: "question2" document: "document2" assert: - type: equals value: 'RELEVANT'
此方案无需修改Python脚本,原有的json.loads(data)即可正常解析数据。
验证
运行promptfoo测试命令后,检查log_data.txt中的日志,数据应变为标准JSON格式(如{"vars": {"question": "question1", "document": "document1"}}),脚本可正常生成prompt并完成测试。
内容的提问来源于stack exchange,提问作者tbo812
相关产品推荐
相关产品推荐

