Skip to content

OpenAI Prompt Engineering

1. 摘要

Prompt Engineering,即提示工程,是一种在人工智能(特别是自然语言处理和生成领域)中设计和优化输入提示(prompt)以获得期望输出的技术。

OpenAI在其公开的文档中,给出了优化提示词的6个策略,其中前5个对普通用户使用AI有帮助。下表单击TAB查看每个策略的细节和例子。

markdown
- 在查询中包含细节以获得更相关的答案
    例如:要求模型写一篇关于气候变化的文章,提供具体细节如期望的长度和主题的特定方面
- 要求模型采用特定角色
    例如:指示模型扮演一名经济学家,回答有关市场趋势的问题
- 使用分隔符清晰指示输入的不同部分
    例如:用引号分隔不同的问题部分,以便模型能够区分和准确回答
- 明确指定完成任务所需的步骤
    例如:详细列出解决数学问题的步骤要求,指导模型逐步解答
- 提供例子
    例如:给模型展示一个良好的邮件格式,要求模仿该格式撰写邮件
- 指定输出的期望长度
    例如:指定生成的故事应该包含大约500个单词
markdown
- 指示模型使用参考文本来回答
    例如:提供一篇科学论文,让模型根据论文内容回答相关问题
- 指示模型使用参考文本中的引用来回答
    例如:要求模型在回答问题时,使用提供的参考书目中的引用
markdown
- 使用意图分类来识别用户查询中最相关的指令
    例如:分析用户的查询,识别出最相关的搜索意图并针对性地回答
- 对于需要非常长对话的对话应用程序,概括或过滤以前的对话
    例如:在长时间的聊天中,总结之前的对话内容,仅回答最关键的问题
- 分段概括长文档,并递归构建完整概括
    例如:分章节概括一本书的内容,然后整合成完整的摘要
markdown
- 指示模型在急于得出结论之前先计算出自己的解决方案
    例如:要求模型先推理出数学问题的解决方法,然后再给出答案
- 使用内部独白或一系列查询来隐藏模型的推理过程
    例如:通过一系列的问题引导模型深入思考问题,然后综合回答
- 询问模型是否在之前的回合中错过了什么
    例如:在多轮对话后,要求模型回顾并补充可能遗漏的重要信息
markdown
- 使用基于嵌入式搜索实现高效的知识检索
    例如:结合搜索引擎功能,为特定查询提供最相关的信息
- 使用代码执行进行更准确的计算或调用外部API
    例如:利用代码执行工具计算复杂的数学公式或访问特定API获取数据
- 给模型提供特定功能的访问权限
    例如:让模型能够调用特定的外部函数或服务以增强其功能
markdown
- 以参考标准答案评估模型输出
    例如:用一组标准答案来测试模型的性能,确保其准确性和可靠性

2. OpenAI Prompt Engineering

2.1. 写清晰的指令 / Write clear instructions

2.1.1. 在查询中包含细节以获得更相关的答案

“用一个段落总结会议记录。然后写下演讲者的 Markdown 列表以及他们的每个要点。最后,列出发言人建议的后续步骤或行动项目(如果有)。”

2.1.2. 要求模型采用特定角色

充当一个喜欢讲笑话的喜剧演员,每当我当我请求帮助写一些东西时,你会回复一份文档,其中每个段落至少包含一个笑话或有趣的评论。

2.1.3. 使用分隔符清晰指示输入的不同部分

用50个字符总结由三引号分隔的文本。"""在此插入文字"""

2.1.4. 明确指定完成任务所需的步骤

使用以下分步说明来响应用户输入。 步骤1 - 用户将为您提供三引号中的文本。用一个句子总结这段文字,并加上前缀“Summary:”。 步骤2 - 将步骤1中的摘要翻译成西班牙语,并添加前缀“翻译:”。

2.1.5. 提供例子

按这句话的风格来写XX文章:"""落霞与孤鹜齐飞,秋水共长天一色。渔舟唱晚,响穷彭蠡之滨"""

2.1.6. 指定输出的期望长度

用两个段落、100个字符概括由三引号分隔的文本。"""在此插入文字"""

2.2. 提供参考文本 / Provide reference text

2.2.1. 指示模型使用参考文本来回答

使用提供的由三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”。 """<在此插入文档>""" """<在此插入文档>""" 问题:<在此插入问题>

2.2.2. 指示模型使用参考文本中的引用来回答

您将获得一份由三重引号和一个问题分隔的文档。您的任务是仅使用提供的文档回答问题,并引用用于回答问题的文档段落。如果文档不包含回答此问题所需的信息,则只需写:“信息不足”。如果提供了问题的答案,则必须附有引文注释。使用以下格式引用相关段落({“引用”:…})。

"""<在此插入文档>"""

问题:<在此插入问题>

2.3. 将复杂任务分解为简单子任务 / Split complex tasks into simpler subtasks

2.3.1. 使用意图分类来识别用户查询中最相关的指令

预先给AI设定一个问题搜索树。让AI对收到的问题,根据搜索树来解决。

2.3.2. 对于需要非常长对话的对话应用程序,概括或过滤以前的对话

因为模型具有固定的上下文长度,因此用户和助手之间的对话无法无限期地继续。 解决此问题可以总结历史对话。一旦输入的大小达到预定的阈值长度,将总结作为系统消息的一部分包括在内。

2.3.3. 分段概括长文档,并递归构建完整概括

长文档受Token长度限制,无法一次总结。可以章节输入。章节摘要可以连接和总结,生成摘要的摘要。 摘要的摘要也可以再总结。 递归完成对超长文档的总结。

2.4. 给模型时间“思考” / Give the model time to "think"

2.4.1. 指示模型在急于得出结论之前先计算出自己的解决方案

比如你扔个数学题给大模型,你让他判断对或者不对,你会发现结果很随机,一会对或者不对,但是如果你先让他自己做一遍,再去判断对与不对,结果就会准非常多了。

比如你可以说:首先制定自己的问题解决方案。然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在你自己完成问题之前,不要决定学生的解决方案是否正确。

2.4.2. 使用内部独白或一系列查询来隐藏模型的推理过程

本质还是一步一步分布推理。 用独白是为了隐藏对外输出的信息。

2.4.3. 询问模型是否在之前的回合中错过了什么

比如我让他根据我的文档,给我列出这个问题在文档中的相关片段:“北京烤鸭到底好吃在哪”,然后让他用JSON格式输出

{"相关片段":"..."},

在输出停止以后,我们可以再问一句:

还有更多相关片段吗?注意不要重复摘录。还要确保相关片段包含解释它们所需的所有相关上下文 - 换句话说,不要提取缺少重要上下文的小片段。

“Are there more relevant excerpts? Take care not to repeat excerpts. Also ensure that excerpts contain all relevant context needed to interpret them - in other words don't extract small snippets that are missing important context.”

2.5. 使用外部工具 / Use external tools

2.5.1. 使用基于嵌入式搜索实现高效的知识检索

这个是使用RAG,Retrieval Augmented Generation, 在给AI的提问中预先准备好相关知识。 例如:

加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给大模型生成回答。

2.5.2. 使用代码执行进行更准确的计算或调用外部API

两种场景:

  1. 让AI写代码
  2. 给AI提供API,使用function calling。

2.5.3. 给模型提供特定功能的访问权限

给AI一堆API定义。 让AI根据问题选择该去调用哪个API。 再将AI的选择实际执行后得到的输出喂给AI来加工成人可以读懂的输出。

2.6. 系统地测试更改 / Test changes systematically

2.6.1. 以参考标准答案评估模型输出

可以忽略。 评估AI性能用。

3. 参考

  1. From https://www.linkedin.com/in/eric-vyacheslav-156273169/Alt text

  2. https://platform.openai.com/docs/guides/prompt-engineering