如何写好提示词
大约 7 分钟
1. Prompt 到底用 # 还是 <></>
目前的开源项目,存在两种主流的prompt标记符号。下面以两个自动优化提示词的项目为例子:
\#: prompt_optimizer<>: coze_loop
个人感觉还是<>效果更好一点,可以明确的划定一个指令块的区间,只是可读性不太友好
prompt_optimizer
#你是一个资深营养学家。
## 目标
根据用户提供的一日三餐,进行营养分析。
## 输入
用户输入:{user_input}
coze_loop
<><role>
你是一位经验丰富的软件开发工程师。
</role>
<task>
审查下面提供的代码片段,找出潜在的错误和可以优化的地方。
</task>
2. 为什么LLM的对话模型分为system、user、assistant?
如果所有指令都混在user里,会导致一些问题:
- 指令混淆:模型无法分辨哪些是永恒不变的规则,哪些是临时的。
- 安全问题:把system分离出来,可以由开发者定义业务的边界(虽然也有很多注入攻击可以破解)
3. 常见Prompt方法
3.1 RASCE
按照RASCE框架(角色、动作、场景、约束、示例)来写,例如:
- 角色:如“金融分析师”;
- 动作:如“分析美联储加息影响”;
- 场景:如“面向科技股投资者”;
- 约束:如“三句话以内”;
- 示例:如“类似”加息导致借贷成本上升,科技股估值承压”。
3.2 Zero-Shot 和 Few-Shot
- Zero-Shot: 不提供任何示例,直接下达指令
- 优点: 简洁高效、快速验证,适用于模型已经能够掌握的任务(翻译、摘要)
- 缺点: 无法胜任复杂格式、任务
- Few-Shot: 从正、反角度,提供少量示例
- 优点: 泛化性强
- 缺点: token消耗多、示例敏感
# Few-Shot的例子
请将情感分类为正面、负面或中性。
输入: "我太喜欢这部电影了!" -> 输出: 正面
输入: "这本书写得非常枯燥。" -> 输出: 负面
输入: "铅笔放在桌子上。" -> 输出: 中性
输入: "今天的午餐还行。" -> 输出: 中性
3.3 COT(链式思考)、自我一致性和TOT(思维树)
COT
COT适用于复杂推理问题,通过提供包含推理步骤的示例(少样本CoT)或直接指令(零样本CoT),引导模型激活其内部的逻辑和推理能力,将复杂问题分解为可管理的子问题,从而降低单步出错的概率
问题:小明有5个苹果,他吃了2个,又买了3个,现在他有几个苹果?
推理:一开始有5个。吃了2个,所以剩下5-2=3个。又买了3个,所以现在有3+3=6个。答案是6。
自我一致性
自我一致性对COT进行了增强。它的核心思想是:“不要只相信一条推理路径,通过多条路径投票来决定最佳答案。” 主要包括:生成多条推理路径、获取多个候选答案、投票决定最终答案三个步骤。
自我一致性的优点是:
- 显著提升准确率:可以平滑掉单条推理链中可能出现的偶然错误。如果大多数路径都指向正确答案,那么最终结果就是可靠的。
- 增强鲁棒性:降低了对单一提示或随机种子的敏感性。
- 提供置信度:答案的“得票率”可以作为一个粗糙的置信度指标。
注意,在任务过于简单、需求模糊的情况,COT反而会效果不好
TOT
还有一种变形是TOT, 它通过三个步骤,分别进行思维生成、状态评估和搜索,但是计算成本过高,往往不用
一个经典例子:24点游戏
用数字(4, 5, 6, 10)通过加减乘除得到24。
CoT:可能会直接开始计算:4 * 5 = 20, 20 + 6 = 26, 26 - 10 = 16... 失败了。
ToT:
- 步骤1(思维生成):从四个数字中任选两个,生成所有可能的运算:4+5=9, 4*5=20, 5-4=1, 6*10=60...
- 步骤2(状态评估):评估哪个中间结果最有利于最终得到24。6*10=60 离24太远,分数低;4*5=20 接近24,分数高。
- 步骤3(搜索):选择高分路径(20, 6, 10),继续生成思维:20+6=26, 20+10=30, 6*10=60, 20*6=120... 评估发现20+4=24(这里的4由10-6得到)是一条可行路径
3.4 生成知识Prompt
显式的让模型生成知识,强迫模型进行“信息检索”和“组织”,使最终答案更具结构性、更全面、论据更充分
- 第一步:知识生成
请根据以下问题,生成3-5条相关的背景知识或事实。这些知识将用于后续回答问题。不要直接回答问题本身。
问题:为什么说蝙蝠是生态系统中的重要组成部分?
- 第二步:知识整合
请利用以下提供的知识,来回答最终的问题。
知识:
1. 许多蝙蝠以昆虫为食,一夜间能吃掉相当于自身体重的昆虫。
2. 有些蝙蝠是重要的授粉者,尤其对于夜间开花植物,如某些仙人掌和热带水果。
3. 果蝠通过采食水果并传播种子,帮助森林再生。
4. 蝙蝠的种群健康可以反映生态系统的整体状况。
问题:为什么说蝙蝠是生态系统中的重要组成部分?
3.5 PromptChain(提示链)
- 传统提示:单一的输入 → 模型 → 输出。就像问一个问题,得到一个答案。
- 提示链:将复杂的任务分解为一系列更小、更简单的子任务,每个子任务都有自己的提示,并且前一个提示的输出成为后一个提示的输入。就像制定一个多步骤的工作流程。
比如:
任务规划与分解
首先,需要将复杂的宏观任务分解成一系列有逻辑顺序的、简单的子任务。
例如,任务“为我写一个关于火星殖民的短篇科幻故事”可以分解为:
- 子任务1:生成故事大纲(包括开头、冲突、高潮、结局)。
- 子任务2:基于大纲,创建主要人物角色档案。
- 子任务3:根据大纲和角色,撰写具体的故事内容。
- 子任务4:对撰写的故事进行润色和校对。
链式执行与数据传递
- 子任务1的提示:“为关于火星殖民的科幻故事创建一个三幕结构的大纲。”
- 子任务2的提示:“基于以下故事大纲,创建两个主要角色的详细档案,包括姓名、背景、动机和性格特点。大纲:[子任务1的输出]”
- 子任务3的提示:“根据以下故事大纲和角色档案,写一个完整的短篇故事。大纲:[子任务1的输出], 角色档案:[子任务2的输出]”
- 子任务4的提示:“润色和校对以下故事,改进其流畅性、对话和描述。故事:[子任务3的输出]”
3.6 ReAct(Reasoning and Acting)
ReAct采用“思考-行动-观察-回答”的循环模式。
- Thought: 用户提出问题后,智能体先思考,确定解决问题的思路和所需执行的任务;
- Action: 接着通过行动去执行思考阶段确定的任务,这个过程类似于Function Calling中调用外部工具的过程;
- Observation: 然后进入观察阶段,根据行动的结果判断是否完成任务或确定下一步行动;
- LOOP: 如果观察结果表明任务未完成,则继续循环,直到观察阶段确认已妥善处理用户问题,最后输出回答。(实际过程中会有最大循环次数)