提示工程(Prompt Engineering)是学习和使用大语言模型(LLM)时必须掌握的核心技能。它指的是通过设计、优化输入给模型的文本指令,以引导模型生成更准确、更符合预期的输出。本文将结合官方文档与实战经验,系统讲解提示工程的策略、结构、技巧及进阶方法。
提示工程基础策略
根据 OpenAI 官方指南,有效的提示工程通常遵循以下六种核心策略:
- Include details in your query to get more relevant answers:在查询中包含详细信息,以获得更相关的答案。模糊的指令往往导致泛泛的回答。
- Ask the model to adopt a persona:要求模型采用特定角色。例如设定为'资深 Python 工程师'或'专业翻译',能显著改变输出的语气和专业度。
- Use delimiters to clearly indicate distinct parts of the input:使用分隔符(如
###, """)清晰区分输入的不同部分,防止模型混淆指令与数据。
- Specify the steps required to complete a task:指定完成任务所需的步骤。对于复杂任务,分步指令比单句指令更有效。
- Provide examples:提供示例。Few-shot learning(少样本学习)能极大提升模型对特定格式或逻辑的理解。
- Specify the desired length of the output:指定所需的输出长度。这有助于控制生成的篇幅,避免冗长或过短。
提示词的典型构成
一个高质量的 Prompt 通常包含以下六个要素:
- 角色(Role):定义 AI 的身份,如'你是一位软件架构师'。
- 指示(Instruction):明确描述需要执行的任务。
- 上下文(Context):提供背景信息,特别是在多轮对话中保持连贯性。
- 例子(Examples):必要时给出 Few-shot 示例,帮助模型理解期望的输出模式。
- 输入(Input Data):待处理的具体信息,需明确标识。
- 输出(Output Format):规定输出的格式,如 JSON、XML 或 Markdown,便于后续程序解析。
常用提示技巧
1. 使用清晰明确的提示词
模糊的指令会导致不可预测的结果。例如,直接让模型'写首诗'可能得到平庸之作;而'模仿李白的《静夜思》风格,给 OpenAI 写一首诗'则能得到更具针对性的结果。务必将意图描述清楚,避免歧义。
2. 角色扮演
通过 System Message 设定角色可以显著提升效果。
messages = [
{"role": "system", "content": "你是一位专业的健身私人教练。利用运动科学和营养建议为客户定制计划。"},
{"role": "user", "content": "给我一个减肥的计划。"}
]
在此例中,System 消息设定了 AI 的行为边界和知识领域,User 消息则是具体请求。
3. 使用分隔符
随着模型能力提升,虽然有时不加分隔符也能识别,但在处理长文本或多段内容时,使用 ### 或 """ 依然推荐。
### 指令 ###
总结以下内容。
### 内容 ###
这里是需要总结的长文本...
4. 指定输出格式
开发场景中常需结构化数据。明确要求返回 JSON 格式可简化后端处理。
请输出 JSON 格式:{"status": "success", "data": [...]}
5. 少样本提示(Few-Shot Prompting)
当模型无法理解任务模式时,提供示例至关重要。
1. 生成文本:ChatGPT 可以生成文章。
2. 语言翻译:ChatGPT 可以翻译文本。
...
请将上述每段的开头词翻译成英文。
示例:
1. 生成文本 -> generate text
进阶推理技术
零样本提示(Zero-Shot)
经过大量训练的 LLM 具备零样本能力,即无需示例即可执行任务。
prompt = """
将文本分类为中性、负面或正面。
文本:我认为这次假期还非常不好。
情感:
"""
尽管强大,但在复杂推理任务上,零样本表现可能不稳定。
少样本提示的限制
仅提供示例并不保证解决所有问题。例如在数学推理中,若示例未展示计算过程,模型可能直接猜测答案。
这组数字中的奇数加起来是一个偶数:4、8、9、15、12、2、1。
A:答案是 False。
这组数字中的奇数加起来是一个偶数:15、32、5、13、82、7、1。
A:
若不提供中间步骤,模型容易出错。此时需引入思维链。
链式思考(Chain of Thought, CoT)
CoT 要求模型展示推理步骤,显著提升复杂任务的准确率。
这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
A:将所有奇数相加(15、5、13、7、1)得到 41。答案为 False。
通过强制模型输出中间逻辑,减少了幻觉和计算错误。
自我一致性(Self-Consistency)
针对单一推理路径的局限性,可通过多次采样并投票选出最终结果,对抗幻觉。
Q:当我 6 岁时,我的妹妹是我的一半年龄。现在我 70 岁了,我的妹妹多大?
A:我 6 岁,妹妹 3 岁。差值 3 岁。现在 70 岁,妹妹 67 岁。
运行多次 prompt,统计高频答案作为最终结果。
思维树(Tree of Thoughts, ToT)
ToT 基于 CoT,维护一棵思维树,允许模型探索多种解题路径并进行评估。结合广度优先搜索(BFS)或深度优先搜索(DFS),适用于战略规划等复杂场景。
应用场景扩展
1. 生成测试数据
利用 LLM 快速生成符合特定分布的测试用例,加速开发流程。
生成 10 个情感分析范例。2 个负面,8 个正面。格式:Q:<句子>A:<情感>
2. 代码生成
将自然语言注释转换为代码,或生成完整函数。
1. 创建一个电影名称列表
2. 创建评分列表
3. 组合成 JSON 对象
3. SQL 查询生成
将业务需求转化为数据库查询语句。
departments 表,columns = [DepartmentId, DepartmentName]
students 表,columns = [DepartmentId, StudentId, StudentName]
为计算机科学系的所有学生创建 MySQL 查询
输出:
SELECT s.StudentId, s.StudentName
FROM students s
JOIN departments d ON s.DepartmentId = d.DepartmentId
WHERE d.DepartmentName = 'Computer Science';
注意:生产环境中需验证生成的 SQL 安全性,防止注入风险。
参数调优与最佳实践
关键参数说明
- Temperature:控制随机性。0 表示确定性最强,适合任务型应用;1 表示创造性更强,适合创意写作。
- Max Tokens:限制最大生成长度,防止无限输出。
- Stop Sequences:指定停止标记,用于精确控制输出结束位置。
提示优化清单
- 明确目标:确保指令无歧义。
- 提供上下文:补充必要的背景信息。
- 结构化输入:使用分隔符区分指令与数据。
- 格式化输出:指定 JSON 或特定模板。
- 迭代测试:根据反馈不断调整 Prompt。
- 安全审查:检查生成内容是否合规,特别是涉及代码和 SQL 时。
结语
提示工程不仅是调用 API 的技巧,更是理解模型行为逻辑的关键。通过掌握角色设定、思维链、少样本学习等核心策略,开发者可以更高效地利用大模型解决实际问题。随着模型能力的演进,提示工程也在不断发展,建议持续关注官方文档与技术社区的最新动态,结合具体业务场景进行实验与优化。
在实际项目中,建议建立 Prompt 版本管理系统,记录不同版本的 Prompt 及其对应的效果指标,以便回溯和优化。同时,结合 RAG(检索增强生成)等技术,可以进一步提升模型在垂直领域的准确性和可靠性。