提示词工程(Prompt Engineering)学习笔记
目录
引言
嗨,这是我学习提示工程(Prompt Engineering)后整理的笔记,希望能帮助刚接触这个领域的朋友。
本文涵盖提示工程的理论基础与实践技巧,教你如何用最佳方法与大语言模型(LLM)交互和构建应用。
什么是提示工程?
提示工程(Prompt Engineering)是设计和优化与AI大语言模型(如ChatGPT)交流”指令”的技术。它是一门新兴学科,专注于开发和优化提示词,以便在各种应用场景中高效地使用和构建大语言模型(LLMs)。
掌握这项技能不仅能让我们理解LLM的能力和局限,更能帮助我们设计出更安全、更强大的AI应用。
为什么提示工程很重要?
- 提高效率:良好的提示可以节省时间,减少来回沟通的次数
- 提升质量:精心设计的提示能获得更准确、更有用的回答
- 拓展能力:通过高级提示技巧,可以突破 AI 表面上的限制
- 个性化体验:根据特定需求定制 AI 行为和输出风格
提示工程的核心原则
- 明确性:提供清晰、无歧义的指示
- 具体性:详细说明您需要的内容、格式和标准
- 上下文提供:给予充分的背景信息
- 示例展示:通过示例说明您期望的输出
- 角色设定:为 AI 分配特定角色或专业背景
我发现掌握提示工程就像学习一门新语言——只有理解了”语法规则”,才能准确表达我们的需求,获得满意的回应。在这份笔记中,我会分享提示工程的核心原则、常用模板、高级技巧和实际应用案例,帮助你也能写出高质量的提示,充分发挥AI的潜力。
补充:
我在学习过程中,所有示例都是用OpenAI的Playground或者Claude 3.5 Sonnet模型。这些提示方法也适用于其他类似能力的模型,但不同模型的响应可能会有所差异。
LLM参数介绍
在设计和测试提示时,我们通常通过API与大语言模型进行交互。通过调整几个关键参数,可以为同一个提示获得不同的结果,调整这些设置对于提高响应的可靠性和符合预期非常重要。以下是使用各种LLM提供商时会遇到的常见设置:
Temperature(温度)
简单来说,温度数值越低,结果越确定,模型总是选择概率最高的下一个词。低温度更加适合进行基于事实的查询,因为这将更加精确和简洁;而高温度本质上是增加了其他词的权重,更加适合更有创意但是可能不是很准确的情况,比如头脑风暴,创意写作。Top P(核采样)
核采样是一种与温度一起使用的采样技术,旨在控制模型的确定性。使用Top P意味着只考虑构成top_p概率质量的词进行响应,如果需要准确和事实性的答案,保持较低的值;如果需要更多样化的回答,可以设置更高的值。
一般建议是调整Temperature或Top P,但不要同时调整两者。
Max Length(最大长度)
通过调整最大长度可以管理模型生成的词元(token)数量。指定最大长度有助于防止冗长或不相关的回答,并控制成本。Stop Sequences(停止序列)
停止序列是一个能够使模型停止生成词元的字符串。指定停止序列是控制模型回答长度和结构的另一种方式。例如,可以通过添加”11”作为停止序列,告诉模型生成不超过10项的列表。Frequency Penalty(频率惩罚)
频率惩罚会对下一个词元施加与该词元在回答和提示中已出现次数成正比的惩罚。频率惩罚越高,一个词再次出现的可能性就越低。这个设置通过给出现更多的词元更高的惩罚来减少模型回答中词语的重复。Presence Penalty(存在惩罚)
存在惩罚也会对重复的词元施加惩罚,但与频率惩罚不同,所有重复词元的惩罚都是相同的。出现两次的词元和出现10次的词元受到的惩罚是一样的。这个设置可以防止模型在回答中过于频繁地重复短语。如果希望模型生成多样化或创意性的文本,可能需要使用较高的存在惩罚;或者,如果需要模型保持专注,可以尝试使用较低的存在惩罚。
与温度和top_p类似,一般建议是调整频率或存在惩罚,但不要同时调整两者。
让我们看一下具体的代码实例,下面是一个使用 OpenAI API 的 Python 代码示例,展示了如何在实际调用中设置这些参数:
1 | def get_completion(params, messages): |
代码解析:
- 这个函数封装了与 OpenAI API 的交互,接收参数字典和消息列表
- 所有我们前面讨论的参数都在这里体现:
temperature
、max_tokens
、top_p
、frequency_penalty
和presence_penalty
- 参数存储在字典中,方便灵活调整不同场景下的配置
- 函数返回完整的响应对象,包含生成的文本和其他元数据
这种设计使我们可以方便地为不同任务创建不同的参数配置。例如:
1 | # 适合事实性查询的参数配置 |
通过这种方式,我们可以根据任务需求轻松切换不同的参数配置,获得最适合的模型输出。
高级提示技巧
思维链(Chain of Thought):引导 AI 逐步思考问题
思维链是一种强大的提示技巧,通过引导AI展示其推理过程,而不仅仅是直接给出答案。简单来说,就是让AI”一步步思考”,像人类解决问题那样展示完整的思考路径。
思维链之所以有效,是因为:
- **减少”跳跃性思维”**:当AI直接给出答案时,往往会跳过中间推理步骤,可能导致错误
- 提高复杂推理能力:特别适合数学问题、逻辑推理和多步骤分析任务
- 增强可解释性:让我们看到AI是如何得出结论的,增强透明度
- 降低幻觉风险:逐步推理过程中更容易发现逻辑矛盾或事实错误
实现思维链主要有两种方式: - 零样本思维链:直接在提示中加入”让我们一步一步思考”这样的指令:
1
2问题:如果一件T恤原价80元,现在打7折,同时我有一张15元优惠券,最终需要支付多少钱?
让我们一步一步思考。 - 少样本思维链:通过举例展示你期望的思考过程:
1
2
3
4
5问题:小明有5个苹果,小红有3个苹果,他们一共有多少个苹果?
思考:小明有5个苹果,小红有3个苹果。要算出总数,我需要将两人的苹果数相加:5 + 3 = 8。所以他们一共有8个苹果。
问题:如果一件T恤原价80元,现在打7折,同时我有一张15元优惠券,最终需要支付多少钱?
思考:
同时使用思维链还可以要求AI进行:
- 自我评估:让AI评价自己的思考过程,比如请解答这个问题,然后评估你的解答是否正确:’问题’
- 多路径探索:鼓励AI考虑多种解决方案,比如请用两种不同的方法解决这个问题,并比较它们:’问题’
- 特定领域的思维链:针对特定领域设计思考框架,比如在Marketing领域,可以要求AI按照5C和4P得框架进行思考:’公司’
但是思维链也具有局限性,比如:
- 不是所有问题都需要思维链,简单问题可能适得其反
- 可能会产生更长的回答,消耗更多token
- 对于极其复杂的问题,可能需要结合其他技巧(如问题拆解)
角色扮演(Role Playing):赋予 AI 特定身份和专业知识
角色扮演是一种非常有效的提示技巧,通过给AI分配特定的专业身份或角色,引导它从特定的专业视角回答问题。这种方法能够激活模型中与特定领域相关的知识,产生更专业、更深入的回答。
角色扮演之所以有效,有几个关键原因:
- 激活领域知识:AI模型在训练时学习了不同专业人士的写作和思考方式,指定角色能够激活这些特定知识
- 提供思考框架:不同专业有不同的分析框架和方法论,角色设定为AI提供了特定的思考路径
- 增强回答深度:专业角色通常会考虑更多领域内的细节和边界情况
- 改变语言风格:不同角色会使用不同的术语、表达方式和沟通风格
实现有效的角色扮演需要注意以下几点: - 选择具体角色:越具体越好,”医生”不如”心脏科专家”;”程序员”不如”有10年经验的Python后端工程师”
- 提供角色背景:补充角色的资历、专长和经验,例如:
1
你是一位有20年经验的iOS开发工程师,曾参与多个百万用户级应用的开发,精通Swift和Objective-C,对性能优化和用户体验设计有独到见解。
- 设定回答风格:指定角色应该用什么风格或方式回答:
1
请用简明专业的语言回答,适当使用技术术语,但确保非专业人士也能理解核心概念。
- 多角色对比:让AI从多个角色视角分析同一问题:
1
请从投资者、用户和开发者三个视角分析这个产品创意的优缺点。
角色扮演模版
1 | [角色]: 你是一名[专业领域]专家 |
专家咨询模板:
1 | 我想请教你关于[主题]的问题。请以[专业领域]专家的身份,考虑[关键因素],并提供[具体需求]的建议。 |
提示词拆解(Prompt Decomposition):将复杂任务分解为简单步骤
提示词拆解是一种处理复杂问题的强大技巧,通过将大型、复杂的任务分解成一系列较小、较简单的子任务,使AI能够逐步解决问题,最终得到更准确的结果。这种方法类似于人类解决复杂问题的思路——将庞大的挑战分解为可管理的部分。
为什么提示词拆解有效?
提示词拆解之所以有效,有几个关键原因:
- 减轻认知负担:即使对于先进的AI模型,一次处理大量信息也会导致遗漏或错误。分解后,每个子任务都更加聚焦。
- 提高精确度:当任务被分解时,每个子步骤的错误率降低,整体结果更可靠。
- 便于调试:如果最终结果有问题,更容易识别是哪个子步骤出了错。
- 更好地利用上下文窗口:避免因模型上下文限制而丢失关键信息。
- 结构化思考:促使AI按照逻辑顺序处理信息,减少遗漏或重复。
如何实现有效的提示词拆解?
实现提示词拆解主要有两种方法:
单次提示中的任务分解:
在一个提示中明确列出解决问题的步骤,要求AI按顺序执行:1
2
3
4
5请帮我分析这家公司的财务状况。请按以下步骤进行:
1. 首先分析收入增长趋势
2. 然后评估利润率变化
3. 接着分析债务状况
4. 最后给出整体财务健康评估多轮交互的任务分解:
将复杂任务拆分为多次独立的AI交互,每次只解决一个子问题:- 第一轮:分析收入增长
- 第二轮:将第一轮结果提供给AI,要求分析利润率
- 第三轮:结合前两轮结果,分析债务状况
- 最后一轮:整合所有分析,得出综合评估
高级提示词拆解策略
问题分类拆解:
1
2
3在回答这个问题前,请先确定这是一个事实性问题还是意见性问题。
如果是事实性问题,请提供准确信息和来源。
如果是意见性问题,请分析不同立场并给出平衡的观点。复杂决策拆解:
1
2
3
4
5
6帮我决定是否应该投资这家初创公司。请按以下步骤进行:
1. 列出投资的所有潜在好处(至少3点)
2. 列出所有可能的风险(至少3点)
3. 分析市场状况和竞争格局
4. 评估创始团队的优势和劣势
5. 综合以上因素,提出最终建议MECE原则应用(Mutually Exclusive, Collectively Exhaustive,相互独立,完全穷尽):
1
2
3
4
5
6
7请对这个商业问题进行MECE分析。首先按以下类别分解问题:
1. 市场因素
2. 竞争因素
3. 内部运营因素
4. 财务因素
然后在每个类别下,确定相关的子因素,确保没有遗漏和重叠。
我发现提示词拆解特别适合以下场景:
- 复杂分析任务:市场研究、竞争分析、文献综述
- 多步骤创意过程:产品设计、内容策划、营销活动
- 综合评估问题:人才评估、项目评审、投资决策
- 教学和引导:引导学生逐步学习复杂概念
约束指令(Constraint Instructions):设定回答的边界和限制
约束指令是一种通过明确设定边界和限制条件来控制AI输出的技巧。通过告诉AI”做什么”和”不做什么”,我们可以获得更符合预期、更有针对性的回答,避免AI偏离主题或生成不必要的内容。
核心优势:
- 澄清期望,减少误解
- 减少无关内容,使输出更加聚焦
- 确保输出符合预期的格式和质量标准
常见约束类型:
- 内容约束:限制主题范围、信息来源、事实性要求
- 格式约束:指定输出结构、长度、特定格式(如表格、JSON)
- 风格约束:写作风格、专业度、复杂性水平
- 否定约束:明确指出不需要包含的内容
应用示例:
1 | 写一篇关于人工智能在医疗诊断中的应用的文章,须满足以下要求: |
实用技巧:
- 避免过度约束,可能限制AI创造性思考
- 约束之间保持一致,避免矛盾要求
- 结合积极引导,不只说”不要做什么”,也要说”应该做什么”
- 重要场景使用列表形式明确列出所有约束
约束指令特别适用于需要精确控制的场景,如专业文档创作、数据分析报告和客户沟通,能够显著提高AI回答的针对性和实用性。
反例教学(Learning from Mistakes):通过反面例子指导 AI
反例教学是通过向AI展示错误案例或不良回答,帮助它理解什么是应该避免的内容。这种方法既可以纠正常见错误,也能提高回答质量。
核心原理:
- 通过明确”不要这样做”来引导AI更好理解”应该这样做”
- 人类学习中也常用这种对比学习法,AI模型对此同样有效
简单应用方法:
1 | 以下是一个不好的回答示例: |
实际例子:
1 | 问题:如何写一篇好的商业提案? |
反例教学尤其适用于需要高质量输出的场景,如内容创作、代码编写和专业建议。与其他技巧结合使用效果更佳。
工具调用(Tool Calling):将外部工具集成到提示中
工具调用是一种允许AI模型与外部工具、API或数据源交互的高级提示技巧。通过这种方式,AI不仅能够生成文本回答,还能执行具体操作,如查询数据库、调用API、执行计算等。
核心概念:
- Function Calling:使AI能够识别何时需要调用预定义函数,并以正确格式提供所需参数
- **MCP(Multimodal Conversational Processor)**:多模态处理框架,能协调AI与多种工具的交互
Function Call示例:
1 | # 定义函数接口 |
MCP工作流程:
- 理解请求:AI分析用户输入,确定需要调用哪些工具
- 工具选择:从可用工具集中选择最合适的工具
- 参数提取:从用户输入中提取调用工具所需的参数
- 执行调用:以正确格式调用工具API
- 结果整合:将工具返回的结果整合到最终回答中
主要优势:
- 突破纯文本生成的限制,实现真实世界交互
- 提供最新数据和实时信息
- 执行复杂计算或查询而不受模型知识限制
- 创建实用的、能够执行操作的AI助手
RAGAS是一个用于衡量RAG系统性能的项目,它衡量了RAG系统在信息检索、内容生成和交互质量方面的表现。 https://github.com/explodinggradients/ragas
在实践中,工具调用特别适合构建功能强大的AI助手,如日程管理、数据分析、智能家居控制和内容搜索等场景。使用这种技术需要一定的编程基础,但能显著扩展AI应用的能力边界。
规范格式
- 使用Markdown语法
- 使用JSON格式
- 使用XML标签
1
2
3
4
5
6<examples>
<example1 type="Abbreviate">
<input>San Francisco</input>
<output>- SF</output>
</example1>
</examples>
##提示词流程 (OpenAI4.1 Workflow)
以下是我们推荐的开发和调试提示词的工作流程:
- 从高级指导开始:首先创建一个整体的”响应规则”或”指令”部分,提供高层次的指导和要点。
- 添加特定行为修改:如果你想改变更具体的行为,添加一个部分来为该类别指定更多细节,比如”举例”。
- 指定工作流程步骤:如果有特定步骤希望模型在其工作流程中遵循,添加一个有序列表并指示模型遵循这些步骤。
- 解决效果不佳的问题:如果行为仍然不符合预期:
- 检查是否存在冲突、未充分说明或错误的指令和示例。如果有冲突的指令,大语言模型通常会遵循提示词末尾附近的指令。
- 添加展示期望行为的例子;确保在你的规则中也引用了示例中展示的任何重要行为。
- 避免不必要的强调:通常不需要使用全大写字母或其他激励措施。建议一开始不使用这些技巧,只在必要时才采用。请注意,如果你现有的提示已包含这些技术,可能会导致模型过分关注它们。
提示词模版
结合以上的内容,接下来将是一个通用的提示词模版结构,适用于大多数复杂任务。这个框架可以根据需要进行调整,但包含这些元素通常会得到更好的结果:
1 | # 角色与目标(Role and Objective) |
这个模版的每个部分都有特定用途:
- 角色与目标:设定AI的专业身份和任务目的,帮助它理解回答的整体方向
- 指令:明确任务的具体要求和约束条件
- 推理步骤:指导AI如何分析问题,尤其适合复杂任务
- 输出格式:确保AI的回答符合你的使用需求和偏好
- 示例:通过实例直观地传达你的期望
- 背景信息:提供AI可能需要的额外参考数据
- 最终指示:引导AI采用特定的思考方式,如系统性、逐步分析
此外,在使用Prompt 的过程中,经过不断尝试需要添加以下几点来增强表现的能力
1 | ## PERSISTENCE |
在实际应用中,你可以根据任务的复杂性和具体需求选择性使用这些部分。对于简单任务,可能只需要指令和输出格式;而对于复杂分析,完整的模版可能会带来更好的结果。
LangGPT提示词模版
LangGPT 是一个创新的结构化提示词设计框架,旨在让每个人都能成为提示词专家。该项目由”云中江树”创建,通过将编程语言的思想应用到提示工程中,提供了一种系统化、可复用的提示词创建方法。
核心理念
LangGPT的核心是将提示词视为一种”编程语言”,通过结构化的模板来定义与AI的交互。这种方法有以下优势:
- 结构清晰:使用角色模板组织提示词,包含角色设定、技能、规则等元素
- 易于复用:模板化设计使提示词可以被重复使用和修改
- 提高效率:降低编写高质量提示词的门槛,节省时间
- 质量保证:通过标准化结构减少遗漏和错误
基本用法
LangGPT主要基于角色模板(Role Template)构建提示词,一个典型的LangGPT提示词包含以下部分:
1 | # Role: 角色名称 |
应用场景
LangGPT框架适用于广泛的场景,包括但不限于:
- 创建专业顾问角色(如医生、律师、教师)
- 设计创意写作助手
- 开发代码编程指导
- 构建个性化学习导师
- 创建数据分析专家
发展状态
该项目目前处于发展阶段,已经完成基础角色模板、文档和示例等功能,正在开发更高级的语法特性、提示链、JSON/YAML支持等功能。项目团队欢迎社区贡献,共同推动提示工程的发展。
用于帮助生成LangGPT结构的提示词
1 | # Role: LangGPT Prompt Assistant |
案例1:客服
1 | SYS_PROMPT_CUSTOMER_SERVICE = """You are a helpful customer service agent working for NewTelco, helping a user efficiently fulfill their request while adhering closely to provided guidelines. |