RCT构词法
提示词工程是一门专注于 LLM 输入的学科,主要目的是以尽可能程序化的方式生成理想的输出。
- 角色(Role)
- 上下文(Context)
- 任务(Task)
上下文
在为 LLM 编写输入文本的时候,需要尽可能详细的描述上下文。
常见上下文形式:
- 提供数据、范例、定义、规则、语境
- 指明受众(如“这段话要写给小学生听”)
- 加入限制条件(如“不能超过100字”)
使用示例
使用简短的提示词:给我一个午餐建议
使用上下文更丰富的提示词:我现在正在健身,坚持16+8的健身计划,请你给我一个午餐的建议
任务
任务定义了你使用模型的目的,应该明确且具体。你应该为任务提供足够的信息,并且在提示词中使用恰当的语句来引导模型达到预期。
常见任务形式:
- 生成类:帮我写一段话、帮我生成一个标题、续写一段话
- 分析类:总结这段话的要点,比较两段话的异同,找错误
- 转换类:给它一段话,切换风格、翻译
- 多轮任务:先分析要点、在总结成一个报告
示例:
我现在正在健身,坚持16+8的健身计划,请你给我一个午餐的建议,我需要你以表格的形式罗列出每一样食材的量、卡路里等信息,还包括健身时关心的食材的其他信息。
在 OpenAI API 示例页面 上有一个列表,包含 GPT 模型可以执行的多个任务示例,均附有相关的提示词和演示。
角色
影响模型输出的最后一个方式是在编写提示词的时候赋予它一个角色。
角色和上下文可以独立使用,但同时使用两者可以增强你对模型输出的控制。
角色的设定会影响大模型输出结果的语气、表达方式以及知识深度。
常见角色示例:
- 你是一位严谨的大学教授 - 回答的时候会更加学术化
- 你是一名耐心的初中数学老师 - 回答的时候会更加通俗
- 你是产品经理,正在写 PRD 文档 - 回答的时候会更加结构化
示例:
你是一个资深营养学家,我现在正在健身,坚持16+8的健身计划,请你给我一个午餐的建议,我需要你以表格的形式罗列出每一样食材的量、卡路里等信息,还包括健身时关心的食材的其他信息。
最佳实践
一个标准的,符合 RCT 结构的提示词模板如下:
你是一个 [角色],
现在的背景是 [上下文],
请你完成如下任务:[任务描述]。
或者
假设你是 [角色]。
请基于以下上下文:[上下文内容]。
你的任务是:[任务目标 + 要求]。
提示词常见技巧
- 少样本学习
- 逐步思考
少样本学习
少样本学习(few-shot learning),也称之为少样本提示,这是一种范式,在这种范式中,模型通过提示词获得你希望模型执行的任务示例。
给大模型提供2~5条 任务 - 结果对(上下文)
接着给大模型一个新的任务,让大模型模仿前面的例子给出答案。
少样本学习的优势:
- 快速适应新任务
- 灵活应对多种格式
- 提高准确性/稳定性
- 更可控的输出结构
示例:
例子:
评论:这个产品真不错,用得很顺手! → 情感:正面
评论:完全失望,质量太差了。 → 情感:负面
评论:快递到了。 → 情感:中性评论:外观还行,性能一般般。 → 情感:
例子:
句子:马云是阿里巴巴的创始人。
实体:[马云: 人名], [阿里巴巴: 组织]句子:乔布斯出生在旧金山。
实体:[乔布斯: 人名], [旧金山: 地点]句子:李雷明天去北京出差。
实体:
例子:
姓名:张三,年龄:28,职业:工程师
→ {"name": "张三", "age": 28, "job": "工程师"}姓名:李四,年龄:35,职业:设计师
→ {"name": "李四", "age": 35, "job": "设计师"}姓名:王五,年龄:40,职业:产品经理
→
逐步思考
369 * 1235 是多少?
早期的大模型是无法回答这个问题的,给出的答案千奇百怪。
🤔为什么大模型不能解决这个问题?
因为大模型是从左到右,一个词元一个词元的去预测,每一个数字都是预测出来的,而非计算出来的。
逐步思考:不是让大模型直接给出答案,而是通过提示词让大模型进行中间推理。
如何做:在提示词之后添加“Let's think step by step(让我们一步一步思考)”
这种策略被称之为 零样本思维链策略(zero-shot-CoT strategy),最早由 Kojima 等人于 2022 年发表在一篇名为“Large Language Models Are Zero-Shot Reasoners”的科学论文中。
- 零样本:不提供任何的样本
- 思维链:让大模型一步一步进行推理,然后得到答案
示例:
Q: 小明有 3 个苹果,小红给了他 2 个苹果,然后他吃掉了 1 个。问他现在有几个苹果?
请一步步思考。
Q: 如果所有猫都会爬树,汤姆是猫,那么汤姆会爬树吗?
请一步步思考。
Q: 今天是星期三,那么 10 天后是星期几?
请一步步思考。
Q: 小王有 4 支红笔和 5 支蓝笔,他给了朋友 2 支蓝笔和 1 支红笔。现在他还有几支笔?
请一步步思考。
Q: 如果下雨了,地会湿;如果地湿了,孩子们就不能出去玩。现在下雨了。那么孩子们能出去玩吗?
请一步步思考。
总结一下:所谓逐步思考,就是指在零样本的情况下,让大模型一步一步思考,最终得到答案。
常见的提示词:
- 请一步一步思考
- 请解释你的推理过程
- 请详细说明你是如何得到这个答案的
N-shot Learning
少样本学习:few-shot learning 给一些少量的样本,大模型会基于你所给的样本,给出问题的答案
零样本学习:zero-shot Learning 完全不给样本,让大模型自己一步一步思考,得出答案
One-shot Learning:给一个样本,然后询问大模型问题
Prompt:
例子:
Input: "Good morning" → Output: "早上好"请翻译:
Input: "Thank you" → Output:
基于反馈迭代优化
在复杂任务中,单次提示往往难以得到理想结果。这时就需要用到“迭代优化技术”,即通过多轮修改和反馈,不断改进最初的提示词。
迭代优化主要分为两类:
- 人工迭代:由人类观察输出并调整提示词。
- 智能迭代:让模型自动提出改进建议。
人工迭代
人工迭代的核心思路是:人类观察模型的输出 → 找出不足之处 → 修改提示词 → 再次生成 → 循环优化。
这种方式适合在风格、重点、结构等方面有明确要求的任务。
下面通过两个例子说明:
示例一
初始提示词(V1)
“请写一段学习机产品介绍。”
模型输出
这是一款革命性的多功能学习设备,融合了AI技术与语音交互系统,能够有效提升学习效率......
问题:输出太长、太正式,不符合“轻松有趣”的目标。
优化后的提示词(V2)
“用轻松有趣的语气,给大学生写一段产品介绍,不超过100字。”
模型输出
考试周的救星来了!这款AI学习助手能语音陪聊、秒查资料,效率拉满,不卷白不卷!
示例二
初始提示词(V1)
“请分析以下财报数据。”
模型输出
一大段模糊分析,遗漏关键财务指标。
问题:内容笼统,没有条理,缺少重点。
优化后的提示词(V2)
“你是财务分析师,请从以下内容中提取:
1)营收增减
2)利润变化
3)核心业务亮点
用条列式输出。”
模型输出
- 营收同比增长12%
- 净利润下降5%,主要因研发投入增加
- 云服务业务增长显著,占总营收28%
在设计提示时,可以遵循下面这个“反馈优化流程”:
可以用一个 checklist,去以下几个点去核对提示词:
智能迭代
与人工迭代依赖人类反馈不同,智能迭代的核心思路是:让模型本身(或多个模型协作)自动提出提示词的改进方案。
一种常见做法是角色分工,让不同的角色分别承担不同任务:
- 审查者(Reviewer):对原始提示词进行打分与评价,指出不足之处
- 提问者(Asker):基于审查者的反馈,向用户提出澄清性问题,收集更多上下文
- 提示词生成者(Prompt Generator):结合原始提示词、审查意见和用户反馈,生成优化后的提示词
具体示例。首先,由用户输入最初的提示词:
请阅读以下技术文章,并总结其中的关键点。
文章内容:【XXXX】
角色 1:审查者(Reviewer)
任务:对当前提示词进行评价并打分。
例如:
评分:2/5
评价:提示词过于宽泛,没有定义“关键点”的标准,输出结果可能冗长或不聚焦;也未指定输出格式,可能导致难以阅读;没有指出受众是谁,无法判断输出该有多专业。
针对初始提示词的评分、评价就会传递给第二个智能体。
角色 2:提问者(Asker)
任务:根据审查者反馈,提问者会询问用户更具体的一些信息。
例如:
什么样的信息应该被视为“关键点”?是技术原理、流程步骤,还是创新亮点?
我们是希望输出一个清单、摘要段落还是表格?
这个总结是写给谁的?是程序员、产品经理,还是普通用户?
这些问题是针对用户进行提问的。
用户就需要回答这些问题。
角色 3:提示词生成者(Prompt Generator)
任务:该角色会基于上面两位角色的反馈,以及原始的提示词,生成最终的提示词。
例如:
你是一名资深技术内容编辑,请阅读以下技术文章,并用条列方式总结关键内容,重点包括:
1)主要技术原理;
2)解决了什么问题;
3)文章中的创新亮点。
请将输出控制在200字以内,适合产品经理快速阅读。
文章内容【XXXX】
最终,这个优化后的提示词才会被发送给 LLM 执行,从而得到更契合需求的结果。
总体流程
- 初始提示词 → 审查者:对提示词进行评分与评价
- 审查结果 → 提问者:基于不足提出澄清性问题,收集用户反馈
- 提问者+用户反馈 → 提示词生成者:生成新的优化提示词
- 终端用户确认:如果满意则交给模型执行;若不满意,则重复迭代
这种“多角色协作”的智能迭代方式,本质上是把人类反馈机制嵌入到模型对话中,让模型自己学会发现问题、提出问题、再改进提示词,从而在无需大量人工干预的情况下,实现 自动化 的提示词优化循环。
import OpenAI from "openai";
import readlineSync from "readline-sync";
import dotenv from "dotenv";
dotenv.config();// 实例化模型
const client = new OpenAI({apiKey: process.env.OPENAI_API_KEY,
});// 和模型进行交互
async function askLLM(messages) {const res = await client.chat.completions.create({model: "gpt-4o",messages, // 聊天记录});// 向外部返回模型的输出结果return res.choices[0].message.content.trim();
}// 入口函数
async function main() {console.log("=== 智能迭代示例开始 ===");// 1. 用户输入初始的提示词const userPrompt = readlineSync.question("请输入您的初始提示词:\n>");// 2. 审查者就需要对初始的提示词进行审查const reviewerMsg = [{role: "system",content:"你是一个提示词审查者。请对用户的提示词进行 1~5 分打分,并写出改进意见。",},{role: "user",content: `当前的提示词为:${userPrompt}`,},];// 得到审查结果const review = await askLLM(reviewerMsg);console.log("\n[审查者反馈]");console.log(review);// 3. 提问者根据审查者的意见向用户提问const askerMsg = [{role: "system",content:"你是一个提示词提问者。请根据以下审查意见,向用户提出 2~3 个澄清问题,以帮助改进提示词。",},{role: "user",content: review,},];// 得到向用户提问的问题const askQuestions = await askLLM(askerMsg);console.log("\n[提问者的问题]");console.log(askQuestions);// 4. 用户需要回答这些问题const userAnswers = readlineSync.question("\n请回答以上问题:\n> ");// 5. 进行一个信息汇总,将汇总后的信息交给提示词生成者const generatorMsg = [{role: "system",content:"你是提示词生成者。请基于原始提示词、审查意见和用户的补充回答,生成一个改进后的提示词。",},{ role: "user", content: `原始提示词:${userPrompt}` },{ role: "user", content: `审查意见:${review}` },{ role: "user", content: `用户回答:${userAnswers}` },];const newPrompt = await askLLM(generatorMsg);console.log("\n[新生成的提示词]");console.log(newPrompt);console.log("\n=== 智能迭代示例结束 ===");
}main().catch((err) => console.error(err));
改善提示效果
- 指导模型提出更多问题
- 格式化输出
- 重复指令
- 使用负面提示
- 添加长度限制
- 链式提示
- 影子提示
1. 指导模型提出更多问题
Ask-for-questions prompting
核心思路:提示词末尾询问模型是否理解问题,并指导它主动提出更多问题,是一种非常有效的提示词设计技巧。
你向大模型提问,问大模型是否理解了你的问题,是否了解你的需求
一些示例:
xxxxxxxxx
在开始执行任务前,请先确认你是否理解我的意图。如果你认为还有不清楚的地方,请先向我提出你需要进一步了解的3个问题,以便你更准确地完成任务。
xxxxxxxxx
如果你对任务理解有疑问,请不要直接回答,而是先向我提出具体的问题。我会根据你的提问补充信息,然后你再继续任务。
xxxxxxxxx
作为一名智能助手,在开始执行任务前,请先判断自己是否具备足够的信息。如有不明确的地方,请提出最多三个问题澄清任务目标。
这样做的好处:
-
增强模型的“任务理解意识”
-
降低幻觉和误解
-
模拟“先问再做”的专家行为,特别适合多轮对话系统或具备角色设定的 LLM agent
2. 格式化输出
Format-Constrained Prompting
核心思路:明确要求模型以某种格式输出内容,比如表格、列表、JSON、Markdown、代码块等
常见的格式化输出类型:
格式类型 | 示例用途 |
---|---|
有序/无序列表 | 总结要点、罗列建议、步骤说明 |
Markdown 表格 | 对比分析、报告生成 |
JSON 格式 | 给前端/后端传数据、调用接口 |
特定模版格式 | 面试对话、文书、邮件、合同等 |
代码块格式 | 插入 HTML、JS、Python 等 |
举几个例子:
请将输出内容以有序列表的形式呈现,每一条都简洁明了。
请将分析结果以 Markdown 表格输出,包含“名称”、“优点”、“缺点”三列。
请用严格的 JSON 格式输出如下信息:
{"标题": "","摘要": "","关键词": []
}
注意:不要添加自然语言解释,只输出 JSON。
请根据以下信息,按如下格式输出简历段落:
【职位名称】
【公司名称】
【时间段】
【核心职责(3条以内)】
格式化提示可以极大提升输出可控性。
3. 重复指令
Repetition Reinforcement Prompting
核心思路:在提示词中重复强调核心目标或关键限制条件。一些关键点,反复强调,提升关键点的权重
一些示例:
请将内容控制在100字以内。再次提醒:不要超过100字。
请使用 Markdown 表格格式输出,记住,一定要使用 Markdown 表格格式。
请用幽默轻松的语气撰写,并确保全文保持这种语气。请务必避免严肃或学术风格。
请按以下结构输出:标题、关键词、摘要、行动建议。再次强调,输出必须包含这四部分,按顺序排列。
重复指令能够带来如下的收益:
- 提示词中重复强调可让模型强制遵守
- 重复格式要求可提升模型输出稳定性
- 可在多轮对话中“重复指令”,从而保持目标的一致性
4. 使用负面提示
Negative Prompting
核心思路:明确告诉模型“不要做什么”或“避免某种行为”,以此引导模型的输出更符合预期。
模型默认是“尽力补全”的,它并不能知道哪些内容是你不想要的。如果你不加限制,它可能会:
-
多余解释
请判断这个句子是正面还是负面
大模型输出:“这个句子是正面的,因为xxxxx”
使用负面提示:请判断这个句子是正面还是负面,不要做任何的解释
大模型输出:“正面”
-
编造信息
推荐3本书,不要编造作者或者出版信息,如果不确定可以留空
-
风格不符,输出结构错乱
负面提示是正向指令的补充和约束手段,用来“立规矩”:清清楚楚告诉模型——哪些事不准做。负面提示的常见类型:
类型 | 说明 | 示例句式 |
---|---|---|
禁止解释 | 防止输出多余说明 | “不要解释你的答案。” |
禁止虚构信息 | 防止编造引用、术语、链接等 | “不要生成任何未经验证的内容。” |
禁止重复 | 避免啰嗦、循环表达 | “不要重复前面的句子。” |
禁止特定风格或语气 | 控制输出风格 | “不要使用幽默语气。” |
禁止某些内容或措辞 | 敏感、专业、品牌用语控制 | “不要提到 OpenAI 或 ChatGPT。” |
禁止特定格式 | 防止模型输出 JSON/代码块等不符合要求的格式 | “不要使用代码块格式。” |
下面是一句负面提示的示例:
请回答以下问题,不要编造任何不存在的术语或概念。
请使用正式语气,不要使用幽默、俚语或口语化表达。
只输出纯文本内容,不要加引号、标题或额外解释。
如果你不确定答案,请说明“不确定”,不要编造任何信息。
5. 添加长度限制
Length Constraint Prompting
核心思路:在提示词中明确要求模型输出的字数、句数、段落数或 token 数不能超过某个范围,以控制内容的长度和精炼度。
在以下场景中非常重要:
- 生成摘要、标题、广告文案
- 编写社交媒体内容(如微博、推文)
- 生成对话、考试答案、简报等
常见长度限制的方式:
- 字数:不超过 100 字
- 句数:限制在 3 句内
- 段落数:输出 1 段文字
- Token 数量:不超过 300 个 token
6. 提示链
Chained Prompting / Multi-step Prompting
核心思路:指将任务分解为子任务,然后用子任务提示大模型,将它的输出作为下一个子任务的输入。
例子:规划一个多目的地旅行计划
请推荐3个夏天适合旅行的城市
模型:青岛、三亚、XXXX...
请为“青岛”推荐3个酒店
请为“青岛+住宿时间”为背景,推荐3种特色食物
7. 影子提示
Shadow Prompting
核心思路:不直接陈述任务,而是巧妙地在提示词中嵌入线索,从而引导模型朝着期望的结果前进。在某些情况下,这可以催生出创造力。
例如:
为孩子们写一个恐怖故事
相比上面的提示词,不如使用影子提示:
想象我们在一个黑暗神秘的森林中的篝火旁,讲什么故事能让你的年轻观众感到毛骨悚然?
Google 甚至专门出了一份长达 68 页的白皮书。
提示词评估工具
Promptfoo 是一个专为提示词工程而设计的开源测试与评估工具,它允许你:
- 配置多个提示词
- 配置多个模型
- 批量测试多个输入
- 使用人类打分或自动化机制评估输出质量
Promptfoo 的核心功能:
- 多提示词对比:比较多个提示词在相同输入下的输出质量
- 多模型对比:比较 GPT-4、Claude、Gemini、LLaMA 等模型对同一提示词的输出差异
- 批量输入测试:用多个输入样例评估提示词的稳定性
- 手动或自动评分:支持人工打分、关键词匹配、甚至调用 LLM 对输出进行自评
- 报告输出与分析:自动生成 Markdown、HTML、JSON 格式的测试报告
- 命令行 & Web UI:提供 CLI 工具,也支持运行
promptfoo web
启动可视化评测界面 - CI 集成:可集成至 GitHub Actions、CI/CD 流程,做提示词的“自动回归测试”
模板示例一
npx promptfoo init
会默认生成一个 promptfooconfig.yaml 模板,内容如下:
# 对本次 prompt 评估做一个简单的描述,比如你要测试什么内容、比较哪些提示词或模型。
description: "My eval" # 定义两个提示词模板,它们都包含变量 {{topic}}
# promptfoo 会自动将每个变量替换为 tests 中定义的具体值
prompts:- "Write a tweet about {{topic}}"- "Write a concise, funny tweet about {{topic}}"# 指定调用的模型提供者,支持多个。
providers:- "openai:gpt-4o-mini"- "openai:gpt-4o"# 定义每一组测试输入(变量)
tests:- vars:topic: bananas- vars:topic: avocado toastassert:- type: icontainsvalue: avocado- type: javascriptvalue: 1 / (output.length + 1)- vars:topic: new york cityassert:- type: llm-rubricvalue: ensure that the output is funny
assertions 类型速览
类型 | 描述 |
---|---|
equals |
严格等于某个期望值 |
icontains |
忽略大小写包含 |
regex |
匹配正则表达式 |
javascript |
使用 JS 表达式动态打分 |
llm-rubric |
通过 LLM 自动判分(更智能) |
1 / (output.length + 1)
output.length
表示模型输出内容的字符数。加 1 是为了避免除以 0。整个式子是:输出越长,分数越低;输出越短,分数越高。
输出内容 | output.length | 分数 (1 / (len + 1)) |
---|---|---|
"Hello" | 5 | 1 / 6 ≈ 0.166 |
"Hello, how are you today?" | 24 | 1 / 25 ≈ 0.04 |
这个规则鼓励模型输出简洁的结果。
进行评分
promptfoo eval
在线模型配置Key
- OpenAI(GPT-3.5 / GPT-4 / GPT-4o)
providers:- id: openai:gpt-4oconfig:apiKey: $OPENAI_API_KEY
- Anthropic(Claude 系列)
providers:- id: anthropic:claude-3-opusconfig:apiKey: $ANTHROPIC_API_KEY
- Cohere
providers:- id: cohere:command-rconfig:apiKey: $COHERE_API_KEY
promptfoo 会自动从 .env
文件中读取变量,例如:
OPENAI_API_KEY=sk-xxx...
ANTHROPIC_API_KEY=sk-ant-xxx...
确保你运行 promptfoo
命令时,处于 .env
文件所在目录下(或将它放在项目根目录)。
模板示例二
下面是另外一份提示词模板示例:
prompts:- id: basic-summarylabel: "基础总结"raw: "请用一句话总结下面这段话:{{input}}"- id: formal-summarylabel: "正式语气总结"raw: "请用正式、简洁的语气总结以下内容:{{input}}"providers:- id: ollama:llama3- id: ollama:gemma3tests:- vars:input: "小明今天早上迟到了,因为他错过了地铁。"- vars:input: "天气预报说今天有雨,所以我们取消了郊游计划。"- vars:input: "这家咖啡馆的氛围很好,适合工作和学习。"eval:automatic:- type: keyword-matchcriteria:- "总结"- "简洁"
这份配置文件大致分为四大部分:
prompts: # 提示词设计
providers: # 模型提供方设置
tests: # 输入样本
eval: # 自动评分方式
提示词设计
prompts:- id: basic-summarylabel: "基础总结"raw: "请用一句话总结下面这段话:{{input}}"- id: formal-summarylabel: "正式语气总结"raw: "请用正式、简洁的语气总结以下内容:{{input}}"
说明如下:
字段 | 说明 |
---|---|
id |
每个提示词的唯一标识符(用于结果记录/引用) |
label |
提示词在结果中显示的中文/人类可读名 |
raw |
实际传递给模型的提示词模板,支持变量(如 {{input}} ) |
在上面的提示词中,我们设置了两个不同风格的提示词(一个通用、一个正式),Promptfoo 会分别用这两个提示词+输入变量进行测试,形成组合。{{input}}
是变量占位符,会从 tests
中填入。
模型提供方设置
providers:- id: ollama:llama3- id: ollama:gemma3
说明如下:
字段 | 说明 |
---|---|
id |
指定要调用的模型(格式为 平台:模型名 ) |
我们测试的本地模型有 llama3 和 gemma3,通过 Ollama 调用。Promptfoo 会用所有的 prompt × 所有的 model 做笛卡尔积组合进行测试。
输入样本
tests:- vars:input: "小明今天早上迟到了,因为他错过了地铁。"- vars:input: "天气预报说今天有雨,所以我们取消了郊游计划。"- vars:input: "这家咖啡馆的氛围很好,适合工作和学习。"
说明如下:
字段 | 说明 |
---|---|
vars |
输入变量定义(对应 prompt 中的 {{input}} ) |
input |
实际输入内容,会被插入到 prompt 中的位置 |
每条样本会作为一次完整测试输入,和每一个 prompt 和模型组合配对,例如有 3 个 input × 2 个 prompt × 2 个模型 = 12 次测试运行。
自动评分方式
eval:automatic:- type: keyword-matchcriteria:- "总结"- "简洁"
说明如下:
字段 | 说明 |
---|---|
type |
自动评分的方式,这里使用的是 keyword-match |
criteria |
模型输出中必须包含的关键词,如果包含则判定“命中” |
Promptfoo 会在每一组结果中查找是否出现了这些关键词。若命中多项,得分越高,可用于粗略判断“是否按照我们要求的格式说话”。也可以使用:
regex-match
:用正则表达式匹配输出结构llm-rubric
:用 LLM 来评价另一个 LLM 输出质量。
这里说一下 llm-rubric,你可以把它理解为模型自己给自己打分(就像一个助教评分学生作业)。提前设计一个评分规则,然后让 GPT 或 Claude 这样的模型代替人类来打分。Rubric 原意就是“评分标准”,在 Promptfoo 中,它就是你写的一段评分说明或标准句子,告诉评分模型:
- 你想根据什么标准打分?
- 满分是多少?
- 评分输出格式是什么?
例如:
eval:automatic:- type: llm-rubricrubric: |评分标准:如果输出内容准确、表达清晰且逻辑合理,得5分;如果有小问题但大体合理,得3分;如果严重偏题或错误,得1分;请只输出一个整数分数,不加解释。
Promptfoo 会把你的提示输出 + 输入内容 + rubric 一起打包发给 GPT 模型,然后它会输出类似:
4
你可以指定评分的模型使用哪一个:
eval:automatic:- type: llm-rubricrubric: "..."provider: openai:gpt-4
如果你没指定,Promptfoo 默认使用你在 providers 中定义的第一个模型。
总结:llm-rubric 是用一个 LLM 来给另一个 LLM 的输出打分的机制。你只需要写一段评分标准,它就能自动判分,不需要你一个一个手动看结果。
模板示例三
prompts:- id: good-job-titlelabel: "好提示词:具体要求 + 输出格式"raw: |请根据以下岗位信息,撰写一句吸引人的招聘广告标题:- 以年轻人喜欢的口吻- 控制在15个字以内- 用一句话概括岗位亮点岗位信息:{{input}}- id: bad-job-titlelabel: "坏提示词:无要求,模糊指令"raw: |写一句话。providers:- id: ollama:llama3tests:- vars:input: "我们是一家AI初创公司,正在招聘前端开发,技术栈为Vue和TypeScript,提供远程办公和股票期权。"- vars:input: "本公司招聘客服专员,工作环境轻松,带薪培训,有下午茶。"- vars:input: "招聘Python数据工程师,参与大模型推理平台建设,年薪40万起。"eval:automatic:- type: llm-rubricrubric: |请从以下维度为这个输出打分(1~5分):- 是否突出岗位亮点(2分)- 是否语言吸引人(2分)- 是否符合短标题要求(1分)请仅返回一个整数分数(1~5分)。
可视化输出:
promptfoo view