《让LLM更懂你:prompts 构建技巧》
一、为什么提示词这么重要?
在深入技巧之前,先理解一个核心问题:为什么同样的需求,不同的提问方式会得到完全不同的结果?
大模型的本质
之前的文章有说过,大模型可以看做是在玩”词语接龙”游戏。每一个字、每一句话,都会影响它接下来生成的内容。
就像跟一个人聊天:
- 如果你说话含糊不清,对方只能猜你的意思
- 如果你表达清晰、提供足够背景,对方就能给出更准确的回应
大模型也是一样的道理,只不过它更”较真”——你怎么问,它就怎么答。
提示词工程的价值
好的提示词能让大模型:
- 理解更准确:减少歧义,明确你的真实意图
- 输出更可控:按照你期望的格式和风格生成内容
- 质量更稳定:减少”一本正经胡说八道”的情况
- 效率更高:一次就能得到满意的结果,不用反复调整
二、构建高质量提示词的四步法
经过大量实践,我发现 COSTAR 框架是一套非常系统化的方法,有助于建出高质量的提示词。
第一步:选择合适的表达框架
找一个合适的”容器”,让大模型知道这是什么类型的任务。
以 COSTAR 框架为例
COSTAR 框架由新加坡政府科技局(GovTech)提出,是六个英文单词的首字母缩写:
- Context (上下文)
- Objective (目标)
- Style (风格)
- Tone (语气)
- Audience (受众)
- Response (响应格式)
C - Context (上下文)
作用:告诉大模型这个任务的背景信息,帮助它理解你在讨论什么场景。
为什么重要?
- 同样一个词在不同场景下含义完全不同
- 提供上下文能让大模型的理解更精准
- 减少不必要的猜测和误解
举个例子:
❌ 不好的提问:
1
帮我写个测试
✅ 好的提问:
1
2
我正在开发一个电商网站的购物车功能,需要为"添加商品到购物车"这个 API 编写单元测试。
这个 API 接收商品 ID 和数量,返回更新后的购物车信息。
第二个提问提供了:
- 项目背景(电商网站)
- 具体功能(购物车)
- 技术细节(API 的输入输出)
O - Objective (目标)
作用:明确告诉大模型你希望它完成什么任务。
为什么重要?
- 清晰的目标能让大模型聚焦在正确的方向
- 避免大模型”发散思维”,给你一堆不相关的内容
技巧:
- 使用动词开头:”生成”、”分析”、”总结”、”优化”
- 说清楚期望的结果是什么
- 如果有多个子目标,可以用列表形式列出
举个例子:
❌ 模糊的目标:
1
帮我处理一下这段代码
✅ 清晰的目标:
1
2
3
4
5
请帮我完成以下任务:
1. 检查这段代码中的潜在 bug
2. 优化性能瓶颈
3. 添加必要的错误处理
4. 补充代码注释
S - Style (风格)
作用:指定你希望大模型使用什么样的写作风格。
为什么重要?
- 不同场景需要不同的表达方式
- 风格统一能让输出更符合你的需求
常见风格:
- 专业正式:适合商务文档、技术报告
- 轻松口语:适合博客文章、社交媒体
- 教学讲解:适合教程、说明文档
- 简洁直接:适合代码注释、API 文档
举个例子:
1
2
请用轻松幽默的口吻,像跟朋友聊天一样,解释什么是 Docker。
避免使用过多专业术语,多用比喻和生活化的例子。
T - Tone (语气)
作用:设定回应的情感态度。
为什么重要?
- 语气会影响内容的感染力和可读性
- 合适的语气能让内容更贴近目标受众
常见语气:
- 正式严谨:学术论文、法律文件
- 友好亲切:客服回复、用户指南
- 激励鼓舞:演讲稿、宣传文案
- 客观中立:新闻报道、分析报告
举个例子:
1
2
请用鼓励和支持的语气,给刚开始学编程的新手写一封欢迎信。
要让他们感受到学习编程是一件有趣且值得坚持的事情。
A - Audience (受众)
作用:明确这个内容是给谁看的。
为什么重要?
- 不同受众的知识背景不同
- 同样的内容,给专家看和给小白看,表达方式完全不同
考虑因素:
- 专业水平(专家/从业者/初学者)
- 年龄层次(儿童/青少年/成人)
- 文化背景(不同地区的表达习惯)
举个例子:
1
2
这篇文章的读者是刚毕业的计算机专业学生,他们有基本的编程基础,
但对分布式系统还不太了解。请用他们能理解的方式解释什么是微服务架构。
R - Response (响应格式)
作用:指定你希望得到什么格式的输出。
为什么重要?
- 明确的格式要求能让输出更规范
- 方便后续处理和使用
- 特别是在需要程序化处理输出时,格式非常关键
常见格式:
- Markdown:适合文档、博客
- JSON:适合程序调用、数据交换
- 表格:适合对比、统计
- 代码:指定编程语言和风格
举个例子:
1
2
3
4
5
6
7
请以 JSON 格式输出,包含以下字段:
{
"title": "文章标题",
"summary": "一句话总结",
"keyPoints": ["要点1", "要点2", "要点3"],
"tags": ["标签1", "标签2"]
}
一个完整的例子
把 COSTAR 框架应用到一个实际场景中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Context (上下文)
我正在为一个在线教育平台开发用户注册功能。
这个平台面向中小学生和他们的家长。
# Objective (目标)
请帮我生成一套完整的单元测试用例,覆盖用户注册的各种场景,
包括正常流程、异常情况和边界条件。
# Style (风格)
使用清晰易懂的测试用例描述方式,让团队其他成员能快速理解每个测试的目的。
# Tone (语气)
保持专业但不失友好,测试描述要简洁明了。
# Audience (受众)
这些测试用例主要给开发团队和测试团队使用,
他们都有基本的软件测试知识。
# Response (响应格式)
请以表格形式输出,包含以下列:
- 测试场景
- 优先级(P0/P1/P2)
- 测试类型(正向/负向/边界)
- 测试步骤
- 预期结果
第二步:选择合适的表达方式
有了框架,接下来就是如何更好地表达你的需求。这里我常用的两个技巧。
技巧 1: 善用”变量”
就是用特殊符号标记出来的占位符,让大模型知道这是一个需要替换的部分。
为什么要用变量?
- 让提示词更加模块化和可复用
- 清晰地区分”模板”和”内容”
- 方便批量处理类似任务
常见的变量标记方式:
<<<变量名>>>- ``
[变量名]<变量名>
举个例子:
假设经常需要让大模型优化不同的文案,你可以这样写:
1
2
3
4
5
6
7
8
9
10
# 任务
请按照 COSTAR 框架优化下面的<<<文案类型>>>
注意事项:
- 不要改变<<<文案类型>>>的核心意思
- 保持原有的风格和语气
<<<文案类型>>>
[用户输入的实际文案]
<<<文案类型>>>
使用时,你只需要:
- 把
<<<文案类型>>>替换成具体类型(如”产品介绍”、”活动通知”) - 把
[用户输入的实际文案]替换成真实内容
更进一步:引用外部内容
还可以让变量引用外部文件或模板:
1
2
3
4
5
6
请参考 <<<Context:接口文档.md>>> 的格式,
为以下 API 生成文档:
API 名称: getUserInfo
功能: 获取用户详细信息
...
这样做的好处是:
- 提示词更简洁
- 可以复用已有的文档和模板
- 便于维护和更新
技巧 2: 善用 Few-shot 示例
什么是 Few-shot?
Few-shot 就是”少样本学习”,意思是给大模型提供几个示例,让它模仿这些例子来处理新任务。
为什么 Few-shot 这么有效?
| 对比维度 | 效果 |
|---|---|
| 教小孩做题 | 先看两道例题 → 自己做第三道 |
| 学习写作风格 | 看几篇范文 → 写出相似风格的新文章 |
| 不教规则,只给例子 | 模型自动”归纳”出规律 |
Few-shot 的三大优势:
- 比文字描述更直观
- 与其说”用简洁的语言”,不如直接给个简洁的例子
- 一个好例子胜过千言万语
- 降低理解成本
- 不需要精确定义每个细节
- 大模型能从例子中学习模式
- 提高输出质量
- 有了参考,输出更稳定
- 减少”创造性发挥”带来的偏差
例如:生成测试用例
可以这样写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
请参考以下测试用例模板,为新的 API 生成类似的测试用例:
<<<Context:测试用例模板.md>>>
## 测试用例设计
### 测试矩阵
| 测试场景 | 优先级 | 测试类型 | 验证点 | 预期结果 |
|---------|--------|---------|--------|---------|
| 正常获取用户信息 | P0 | 正向测试 | 接口返回 | 返回完整用户信息,状态码 200 |
| 用户ID不存在 | P1 | 负向测试 | 错误处理 | 返回错误信息,状态码 404 |
| 用户ID格式错误 | P1 | 边界测试 | 参数校验 | 返回参数错误,状态码 400 |
### Mock 策略
- **需要 Mock 的依赖**: 用户数据库、缓存服务
- **Mock 工具**: Mockito
- **测试数据策略**: 使用固定测试数据,避免随机数据
<<<Context:测试用例模板.md>>>
---
现在请为以下 API 生成测试用例:
API 名称: createOrder
功能: 创建订单
参数: userId, productId, quantity
返回: orderId, status
Few-shot tips:
- 示例数量: 通常 2-3 个就够了,太多反而会让提示词过长
- 示例质量: 确保示例本身是高质量的,因为大模型会模仿
- 示例多样性: 如果任务有多种情况,最好每种情况都给一个例子
第三步:让 AI 帮你优化提示词
为什么需要 AI 优化?
即使已经掌握了 COSTAR 框架和各种技巧,但要写出完美的提示词仍然不容易:
- 可能遗漏了某些重要信息
- 表达不够精确
- 没有考虑到边界情况
让大模型帮你优化提示词,可以事半功倍。
三阶段优化流程
我总结了一个实用的三阶段流程:
阶段 1: 提示词优化阶段
目标: 让 AI 理解你的需求,并帮你完善提示词。
做法:
1
2
3
4
5
6
7
8
9
10
11
12
13
我需要让 AI 完成一个任务,但我的提示词可能不够完善。
请帮我分析并优化这个提示词。
我的原始需求:
[你的需求描述]
我当前的提示词:
[你写的提示词]
请帮我:
1. 指出提示词中可能存在的问题
2. 建议需要补充的信息
3. 给出优化后的版本
AI 会帮你:
- 识别模糊不清的地方
- 补充缺失的上下文
- 调整表达方式
- 优化结构和格式
阶段 2: 人工反馈阶段
目标: 你来审核 AI 优化后的提示词,给出反馈。
做法:
1
2
3
4
5
6
7
你优化后的提示词我看了,整体不错,但有几个地方需要调整:
1. [具体问题 1]
2. [具体问题 2]
3. [具体问题 3]
请根据我的反馈再次优化。
为什么需要这一步?
- AI 可能误解了你的某些意图
- 你可能想到了新的需求
- 需要根据实际情况微调
这就像软件开发中的”迭代”过程,通过多轮反馈不断完善。
阶段 3: 任务执行阶段
目标: 使用优化后的提示词执行实际任务。
做法:
1
2
3
很好,现在请使用这个优化后的提示词,帮我完成实际任务:
[具体任务内容]
注意事项:
- 如果结果不理想,回到阶段 2 继续优化
- 记录下好用的提示词模板,方便以后复用
- 不同类型的任务可能需要不同的优化策略
一个完整的例子
原始需求:
1
帮我写一个 Python 函数,计算斐波那契数列。
阶段 1: AI 优化
AI 可能会这样优化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
请帮我编写一个 Python 函数,实现斐波那契数列的计算。
# Context
这个函数将用于一个算法学习平台,帮助学生理解递归和动态规划。
# Objective
1. 实现斐波那契数列计算
2. 提供两种实现方式:递归和动态规划
3. 添加详细的代码注释
4. 包含时间复杂度分析
# Style
代码风格遵循 PEP 8 规范,注释清晰易懂。
# Audience
面向有基础 Python 知识的编程学习者。
# Response
请提供:
1. 函数定义和实现
2. 使用示例
3. 性能对比说明
阶段 2: 人工反馈
1
2
3
4
优化得不错,但我还需要:
1. 添加输入参数的类型检查和异常处理
2. 提供单元测试用例
3. 说明两种方法的适用场景
阶段 3: 执行任务
使用最终优化后的提示词,AI 就能给出高质量的代码和文档。
优化提示词的通用模板
我整理了一个通用模板,你可以直接使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 任务背景
我需要 AI 帮我完成 [任务类型],目标是 [具体目标]。
# 当前问题
我写的提示词可能存在以下问题:
- [问题 1]
- [问题 2]
# 优化需求
请帮我:
1. 按照 COSTAR 框架重新组织提示词
2. 补充必要的上下文信息
3. 明确输出格式要求
4. 添加必要的约束条件
# 我的原始提示词
[你的提示词]
# 期望的优化方向
[你希望如何改进]
第四步:善用系统提示词
最后一个技巧,也是最容易被忽视的:系统提示词。
什么是系统提示词?
系统提示词(System Prompt)是在对话开始前,预先设定的”角色和规则”,相当于给 AI 设定了一个”人设”。
类比一下:
- 用户提示词 = 你每次具体的问题
- 系统提示词 = AI 的”职业设定”和”行为准则”
为什么系统提示词很重要?
关键发现: 系统提示词对模型行为的约束力,远强于用户提示词中的设定。
实验数据表明:
- 使用系统提示词后,模型遵守约束的概率提升 40%+
- 输出格式的一致性提高 60%+
- 减少”创造性发挥”导致的偏差
系统提示词的三大作用
1. 定义角色与身份
告诉 AI “你是谁”,决定它的说话方式和专业程度。
示例:
1
2
3
4
5
6
7
8
你是一位资深的软件架构师和 TDD(测试驱动开发)专家,
精通六边形架构(Hexagonal Architecture)的设计原则。
你的专长包括:
- API 层设计(接口适配器)
- 应用层设计(应用服务)
- 领域层设计(业务逻辑核心)
- 基础设施层设计(外部依赖)
效果:
- AI 会以专家的口吻回答
- 回答会更专业、更深入
- 会主动考虑架构层面的问题
2. 设定行为规范
控制 AI 的行为方式,确保输出符合你的期望。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
请严格遵循以下协议:
## 流程控制协议
- 按照 <<<Workflow>>> 定义的步骤顺序执行
- 每完成一个 <<<Task: [任务名称]>>>,输出: ✅ [任务名称] 已完成
- 收到用户明确确认后才可继续下一步
## 格式遵循协议
- 严格按照 <<<Context:[输出内容名称]>>> 要求输出
- 如果输出格式要求的内容不清楚,请明确询问而不是猜测
- 格式不明确的先询问: 📋 请确认输出格式要求
## 信息准确性协议
- 仅基于已验证的真实信息回答
- 信息不足时明确回复: ❌ 信息不足,无法提供准确回答
- 绝不生成虚构或推测性内容
- 遵循现有技术规范和架构约束
## 主动澄清协议
- 遇到模糊信息时立即询问: 💭 需要澄清:[具体问题]
- 获得明确回复后再继续执行
效果:
- AI 会严格按照流程执行
- 遇到不确定的情况会主动询问
- 减少”自作主张”的情况
3. 限制知识范围与领域
让 AI 专注于特定领域,避免泛化或编造答案。
示例:
1
2
3
4
5
6
7
你只能基于公司内部文档提供客服支持,不得使用外部知识。
知识范围限制:
- 仅回答产品功能、使用方法、常见问题
- 不涉及公司战略、财务信息、未发布功能
- 遇到超出范围的问题,回复:"抱歉,这个问题超出了我的服务范围,
建议您联系人工客服获取帮助。"
效果:
- 避免 AI “发散思维”
- 确保回答的准确性和一致性
- 降低风险
系统提示词的最佳实践
1. 系统提示词可以引用用户提示词中的变量
这是一个很实用的技巧:
1
2
3
4
5
6
7
8
9
10
11
# 系统提示词
你是一位 [专业领域] 专家,请按照以下规则回答问题:
- 使用 <<<Context:[输出内容名称]>>> 中定义的格式
- 保持 [风格要求] 的表达方式
# 用户提示词
<<<Context:输出内容名称>>>
[具体格式定义]
<<<Context:输出内容名称>>>
请帮我 [具体任务]
好处:
- 系统提示词更通用
- 用户提示词更灵活
- 两者配合更强大
2. 分层设计
将系统提示词分成几个层次:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 第一层:角色定义
你是一位 [角色]
# 第二层:核心能力
你擅长:
- [能力 1]
- [能力 2]
# 第三层:行为准则
你必须遵守:
- [规则 1]
- [规则 2]
# 第四层:输出规范
你的回答应该:
- [要求 1]
- [要求 2]
3. 使用清晰的标记
用特殊符号让 AI 更容易识别:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
**🎯 流程控制**
- 按步骤执行
- 等待确认
**📋 格式遵循**
- 严格按照模板
- 不添加额外说明
**✅ 信息准确性**
- 基于事实回答
- 不确定时询问
**💭 主动澄清**
- 遇到歧义立即询问
- 获得明确回复后继续
三、综合实际案例
案例背景
现在我是一个技术团队的负责人,需要让 AI 帮你为团队的 API 生成标准化的技术文档。这个任务涉及多个步骤,需要精心设计提示词才能得到高质量的输出。
第一步:选择表达框架 - 使用 COSTAR
首先,用 COSTAR 框架来组织用户提示词:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Context (上下文)
我们正在开发一个 SaaS 平台的用户管理模块,需要为前端团队和第三方集成商提供标准化的 API 文档。
# Objective (目标)
请为"创建用户"API 生成完整的技术文档,包括:
1. 接口基本信息(URL、方法、认证方式)
2. 请求参数说明(类型、必填、校验规则)
3. 响应格式(成功和失败情况)
4. 错误码列表
5. 代码示例(cURL 和 JavaScript)
# Style (风格)
使用清晰的技术文档风格,专业但易懂,避免过于复杂的术语。
# Tone (语气)
保持客观中立,重点突出关键信息和注意事项。
# Audience (受众)
面向有一定开发经验的前端工程师和第三方集成商的技术人员。
# Response (响应格式)
请使用 Markdown 格式输出,包含清晰的章节划分和代码块。
第二步:选择表达方式 - 使用变量和 Few-shot
使用变量让提示词更灵活
我们可以把 API 的具体信息抽取成变量:
1
2
3
4
5
6
7
请为 <<<API名称>>> 生成技术文档。
API 基本信息:
- 路径: <<<API路径>>>
- 方法: <<<HTTP方法>>>
- 功能: <<<功能描述>>>
- 参数: <<<参数列表>>>
提供 Few-shot 示例
为了让 AI 理解我们期望的文档格式,提供一个完整的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
参考以下示例格式:
**示例: 获取用户信息 API**
接口路径: GET /api/v1/users/{userId}
请求参数:
- userId (必填): 用户唯一标识
响应示例:
{
"code": 0,
"data": {
"userId": "123",
"username": "张三"
}
}
---
现在请按照类似格式,为"创建用户"API 生成文档。
第三步:AI 优化提示词
在实际使用中,我们可以先让 AI 帮我们优化提示词:
第一轮 - 请求优化:
1
2
3
4
我需要让 AI 生成 API 文档,但我的提示词可能不够完善。
请帮我优化以下提示词,使其更清晰、更完整:
[你的初始提示词]
第二轮 - 人工反馈:
1
2
3
4
优化得不错,但还需要:
1. 增加错误处理的说明
2. 补充安全性注意事项
3. 添加性能优化建议
第三轮 - 执行任务:
1
很好,现在请使用优化后的提示词,为我生成实际的文档。
第四步:设置系统提示词
为了确保输出质量的一致性,我们设置系统提示词:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
你是一位资深的 API 文档工程师,专注于编写清晰、准确、易用的技术文档。
你的核心能力:
- 熟悉 RESTful API 设计规范
- 精通 OpenAPI/Swagger 标准
- 擅长用简洁的语言解释复杂的技术概念
你必须遵守:
- 使用标准的 Markdown 格式
- 确保所有示例代码可以直接运行
- 每个参数都要有清晰的说明
- 考虑各种边界情况和错误处理
你的输出应该:
- 结构清晰,层次分明
- 包含完整的代码示例
- 便于开发者快速上手
完整提示词示例
综合以上四步,最终的完整提示词如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 系统提示词
你是一位资深的 API 文档工程师,专注于编写清晰、准确、易用的技术文档。
# 用户提示词
## Context
我们正在开发一个 SaaS 平台的用户管理模块,需要为开发者提供标准化的 API 文档。
## Objective
请为"创建用户"API 生成完整的技术文档。
## Style & Tone
使用清晰的技术文档风格,专业但易懂,保持客观中立。
## Audience
面向有一定开发经验的前端工程师和第三方集成商。
## Response
请使用 Markdown 格式,参考以下示例结构:
[示例文档结构]
## API 信息
- 路径: POST /api/v1/users
- 功能: 创建新用户账号
- 参数: username, email, password
预期效果
使用这套完整的提示词,AI 会生成:
- ✅ 结构清晰的文档
- ✅ 完整的参数说明
- ✅ 可运行的代码示例
- ✅ 详细的错误处理说明
- ✅ 实用的注意事项
如果输出不理想,可以根据第三步的方法进行迭代优化,直到满意为止。
四、总结
选择一个科学的框架是基础
- 善用变量和模板
- 让提示词更模块化
- 提高复用性
- 便于维护
- Few-shot 是利器
- 示例比描述更直观
- 能显著提升输出质量
- 2-3 个示例通常就够了
- 让 AI 帮你优化提示词
- 三阶段迭代流程
- 不断完善和优化
- 积累好用的模板
- 系统提示词是关键
- 定义角色和能力
- 设定行为规范
- 限制知识范围
参考资源
COSTAR 框架出处
COSTAR 框架最早由新加坡政府科技局(GovTech)的数据科学与人工智能部门(DSAID)提出,旨在帮助开发者和用户更好地构建提示词。
相关资源:
- COSTAR Framework - GovTech Singapore
- Sheila Teo, Senior AI Engineer at GovTech Singapore - “How to write good prompts: using the COSTAR framework”
其他参考资料
本文基于实际项目经验总结,COSTAR 框架引用自新加坡政府科技局,部分案例经过简化处理。