OpenAI在官方的文档里上线了Prompt engineering,也就是提示词工程指南,其中OpenAI有提到写提示词的6条大的原则,它们分别是:
(1)Write clear instructions(写出清晰的指令)
(2)Provide reference text(提供参考文本)
(3)Split complex tasks into simpler subtasks(将复杂的任务拆分为简单的子任务)
(4)Give the model time to "think"(给模型时间“思考”)
(5)Use external tools(使用外部工具)
(6)Test changes systematically(系统地测试变更)
写出清晰的指令
1. 把话说详细:尽量多的提供任何重要的详细信息和上下文。
用一个段落总结会议记录。然后写下演讲者的 Markdown 列表以及他们的每个要点。最后,列出发言人建议的后续步骤或行动项目(如果有)。
2. 让模型充当某个角色:把大模型想象成一个演员,告诉他饰演的角色。
充当一个喜欢讲笑话的喜剧演员,每当我请求帮助写一些东西时,你会回复一份文档,其中每个段落至少包含一个笑话或有趣的评论。
3. 使用分隔符指示输入的不同部分
三引号、XML 标签、节标题等分隔符可以帮助划分要区别对待的文本节。可以帮助大模型更好的理解文本内容。
用50个字符总结由三引号分隔的文本。"""在此插入文字"""。
4. 指定完成任务所需的步骤
将任务拆解为一系列步骤,明确地写出这些步骤,让模型更容易去实现它们。
5. 提供示例:few-shot
请按以下内容的风格来书写文章:"""落霞与孤鹜齐飞,秋水共长天一色。渔舟唱晚,响穷彭蠡之滨"""。
6. 指定内容输出长度
可以要求模型生成给定目标长度的输出。目标输出长度可以根据单词、句子、段落、要点等的计数来指定。但是不是精确的答案。
用两个段落、100个字符概括由三引号分隔的文本。"""在此插入文字"""。
提供参考文本
1. 让模型使用参考信息作答
使用提供的由三重引号引起来的文章来回答问题。如果在文章中找不到答案,请回答“找不到答案”。"""<在此插入文档>""","""<在此插入文档>"""。
问题:<在此插入问题>
2. 让模型通过引用参考文本来回答
可以要求模型通过引用所提供文档中的段落来为其答案添加引用。可以提高正确性,增加可验证性。
您将获得一份由三重引号和一个问题分隔的文档。您的任务是仅使用提供的文档回答问题,并引用用于回答问题的文档段落。如果文档不包含回答此问题所需的信息,则请回答:“信息不足”。如果提供了问题的答案,则必须附有引文注释。使用以下格式引用相关段落({“引用”:…})。
"""<在此插入文档>"""
问题:<在此插入问题>
将复杂的任务拆分为简单的子任务
1. 使用意图分类来识别与用户查询最相关的指令
2. 对于对话中的历史记录,总结或过滤之前的对话
3. 分段总结长文档并递归构建完整总结
章节摘要可以连接和总结,生成摘要的摘要。这个过程可以递归地进行,直到总结整个文档。 https://openai.com/research/summarizing-books
给模型时间“思考”
链式思考(CoT),Chain-of-Thought Prompting,think step by step。
1. 让模型在给出结论之前找出自己的解决方案
2. 使用内心独白来隐藏模型的推理过程
3. 询问模型在之前的过程中是否遗漏了什么内容
如果源文档很大,模型通常会过早停止并且无法列出所有相关信息。在这种情况下,通过使用后续的promtp让模型查找之前传递中错过的任何相关信息,通常可以获得更好的性能。例如根据文档来列出这个问题在文档中的相关片段:“北京烤鸭到底好吃在哪”,然后让他用JSON格式输出
[{"相关片段":"..."},
在输出停止以后,可以再问一句:
还有更多相关片段吗?注意不要重复摘录。还要确保相关片段包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。
使用外部工具
1. 使用基于嵌入的搜索实现高效的知识检索
检索增强生成 (RAG),Retrieval Augmented Generation,常见步骤:加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给大模型生成回答。
2. 使用代码执行来进行更准确的计算或调用外部API
3. 给模型提供特定的功能
通过 API 请求,传递一系列特定的函数描述。告诉模型哪些函数是可用的,以及这些函数的参数应该是什么样的。然后模型模可以生成相应的函数参数,这些参数随后会以 JSON 格式通过 API 返回。拿到JSON数组,跟数据库交互,做数据查询、数据处理等等。
处理完以后再返回一个JSON数组给大模型,让大模型变成人类语言输出给用户。
系统地测试变更
主要是帮助开发者判断更改Prompt(例如新指令或新设计)是否使系统变得更好或更差。
https://platform.openai.com/docs/guides/prompt-engineering/strategy-test-changes-systematically