AI 提示词工程指南
一、提示词(Prompt)技巧
1. 使用最新的模型
始终使用最新发布的模型版本,新模型通常具有更好的理解能力和更准确的输出。
| 模型 | 推荐版本 |
|---|---|
| OpenAI | GPT-4o / GPT-4-turbo |
| Claude | Claude 3.5 Sonnet |
| 国产 | 文心一言 4.0 / 通义千问 |
2. 把指令放到提示的开头,用分隔符分隔上下文
使用 ### 或 """ 来分隔指令和上下文,让模型更清晰地理解结构。
❌ 不推荐:
这是一篇关于人工智能的文章,人工智能正在改变世界...
请帮我总结这篇文章的要点。
✅ 推荐:
请总结以下文章的要点,用 3 个要点概括。
###
这是一篇关于人工智能的文章,人工智能正在改变世界...
###
或使用 """:
请将以下内容翻译成英文:
"""
今天天气很好,适合出去散步。
"""
3. 对输出给出具体的描述和详细的需求
明确指定:长度、格式、风格、语言
❌ 模糊:
写一篇关于 Go 语言的介绍
✅ 具体:
请写一篇关于 Go 语言的介绍文章。
要求:
- 长度:500-800 字
- 格式:Markdown,包含标题和代码示例
- 风格:技术博客风格,通俗易懂
- 受众:有一定编程基础的初学者
- 结构:简介 → 特点 → 代码示例 → 总结
4. 通过例子阐明想要的输出格式
提供示例让模型理解你期望的格式(Few-shot Learning)。
示例:
请将产品信息提取为 JSON 格式。
示例输入:苹果 iPhone 15 Pro,售价 8999 元,256GB 存储
示例输出:
{
"name": "iPhone 15 Pro",
"brand": "苹果",
"price": 8999,
"storage": "256GB"
}
现在请处理:华为 Mate 60 Pro,售价 6999 元,512GB 存储
5. 先零样本,后小样本
策略:
- 首先尝试 零样本提示(Zero-shot):直接提问,不给例子
- 如果效果不好,再使用 小样本提示(Few-shot):提供 2-3 个例子
【零样本 Zero-shot】
请判断以下评论的情感倾向(正面/负面):
"这个产品太棒了,强烈推荐!"
【小样本 Few-shot】
请判断以下评论的情感倾向。
评论:这个产品质量很差 → 负面
评论:物流很快,满意 → 正面
评论:包装破损,但产品还行 → 中性
评论:这个产品太棒了,强烈推荐!→
6. 减少空洞和不严谨的描述
❌ 空洞:
写一段比较好的代码
✅ 严谨:
用 Go 语言编写一个 HTTP 服务器:
- 监听 8080 端口
- 提供 /api/users 接口,返回 JSON 格式的用户列表
- 包含错误处理
- 添加必要的注释
7. 告知应该做什么,而非不应该做什么
❌ 负面指令:
不要写太长
不要使用复杂的词汇
不要偏离主题
✅ 正面指令:
- 控制在 200 字以内
- 使用简单易懂的词汇
- 紧扣"分库分表"这一主题
8. 思维链(Chain of Thought)
使用 "让我们分步骤思考" 引导模型进行逻辑推理。
示例:
问题:一个商店有 23 个苹果,卖掉了 15 个,又进货了 12 个,现在有多少个苹果?
让我们分步骤思考:
模型输出:
让我们分步骤思考:
1. 初始苹果数量:23 个
2. 卖掉后剩余:23 - 15 = 8 个
3. 进货后总数:8 + 12 = 20 个
答案:现在有 20 个苹果。
提示词模板汇总
# 角色设定
你是一位 [专业角色],擅长 [专业领域]。
# 任务描述
请完成以下任务:[具体任务]
# 输入内容
###
[上下文内容]
###
# 输出要求
- 格式:[Markdown/JSON/纯文本]
- 长度:[字数限制]
- 风格:[正式/口语化/技术文档]
- 语言:[中文/英文]
# 示例(可选)
输入:xxx
输出:xxx
# 特别说明
- [注意事项1]
- [注意事项2]
二、LangChain
什么是 LangChain
LangChain 是一个用于开发 大语言模型(LLM)应用 的框架,简化了与 LLM 交互的复杂性。
核心概念
| 概念 | 说明 |
|---|---|
| Prompt Templates | 提示词模板,动态生成提示词 |
| Chains | 链式调用,组合多个步骤 |
| Agents | 智能体,让 LLM 自主决策使用工具 |
| Memory | 记忆,保存对话历史 |
| Retrieval | 检索,结合向量数据库实现 RAG |
基本示例(Python)
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
# 1. 创建模型
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# 2. 创建提示词模板
prompt = ChatPromptTemplate.from_template(
"你是一位{role}专家,请回答以下问题:{question}"
)
# 3. 创建链
chain = LLMChain(llm=llm, prompt=prompt)
# 4. 运行
result = chain.run(role="Go语言", question="什么是 goroutine?")
print(result)
链式调用示例
from langchain.chains import SimpleSequentialChain
# 链1:生成标题
chain1 = LLMChain(llm=llm, prompt=prompt_title)
# 链2:根据标题生成内容
chain2 = LLMChain(llm=llm, prompt=prompt_content)
# 组合成顺序链
overall_chain = SimpleSequentialChain(
chains=[chain1, chain2],
verbose=True
)
result = overall_chain.run("人工智能")
LangChain 应用场景
| 场景 | 实现方式 |
|---|---|
| 智能问答 | LLM + Retrieval (RAG) |
| 文档总结 | LLM + Document Loader |
| 代码生成 | LLM + Code Agent |
| 数据分析 | LLM + SQL Agent |
| 多轮对话 | LLM + Memory |
三、智能体(Agent)
什么是智能体
智能体 = 大模型 + 工具使用能力
让 LLM 能够:
- 理解 用户意图
- 决策 使用哪些工具
- 执行 工具调用
- 整合 结果返回用户
智能体架构
┌─────────────────────────────────────────────────────────┐
│ 用户输入 │
└─────────────────────────┬───────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────┐
│ 智能体 Agent │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 大语言模型 │ │
│ │ (理解意图 + 规划步骤 + 决策) │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────┼───────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ 工具1 │ │ 工具2 │ │ 工具3 │ │
│ │ 搜索 │ │ 计算器 │ │ 数据库 │ │
│ └────────┘ └────────┘ └────────┘ │
└─────────────────────────┬───────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────┐
│ 最终结果 │
└─────────────────────────────────────────────────────────┘
常用工具类型
| 工具类型 | 功能 | 示例 |
|---|---|---|
| 搜索工具 | 联网搜索信息 | Google Search, Bing |
| 计算工具 | 数学计算 | Calculator, Wolfram |
| 代码工具 | 执行代码 | Python REPL |
| 数据库工具 | 查询数据库 | SQL Database |
| API 工具 | 调用外部 API | Weather API, Stock API |
| 文件工具 | 读写文件 | File Reader/Writer |
LangChain Agent 示例
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import DuckDuckGoSearchRun
# 创建模型
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 定义工具
search = DuckDuckGoSearchRun()
tools = [
Tool(
name="Search",
func=search.run,
description="用于搜索网络上的实时信息"
),
Tool(
name="Calculator",
func=lambda x: eval(x),
description="用于数学计算,输入数学表达式"
)
]
# 创建智能体
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行
result = agent.run("今天上海的天气怎么样?气温换算成华氏度是多少?")
Agent 执行流程
用户:今天北京天气怎么样?
Agent 思考过程:
┌────────────────────────────────────────────────────────┐
│ Thought: 我需要查询北京今天的天气,应该使用搜索工具 │
│ Action: Search │
│ Action Input: 北京今天天气 │
│ Observation: 北京今天晴,气温 15-25℃,空气质量良好 │
│ Thought: 我已经获得了天气信息,可以回答用户了 │
│ Final Answer: 北京今天天气晴朗,气温 15-25℃... │
└────────────────────────────────────────────────────────┘
ReAct 模式
ReAct = Reasoning + Acting
循环执行:
1. Thought(思考):分析当前状态,决定下一步
2. Action(行动):选择并使用工具
3. Observation(观察):获取工具返回结果
4. ... 重复直到得出最终答案
5. Final Answer(最终答案):返回给用户
自定义工具示例
from langchain.tools import tool
@tool
def get_user_info(user_id: str) -> str:
"""根据用户ID查询用户信息。输入用户ID,返回用户详细信息。"""
# 模拟数据库查询
users = {
"001": {"name": "张三", "age": 25, "city": "北京"},
"002": {"name": "李四", "age": 30, "city": "上海"},
}
user = users.get(user_id)
if user:
return f"用户信息:姓名={user['name']}, 年龄={user['age']}, 城市={user['city']}"
return "未找到该用户"
# 将自定义工具加入 Agent
tools = [get_user_info, search, calculator]
四、RAG vs 微调:如何选择
什么是 RAG 和微调
| 方案 | 说明 | 原理 |
|---|---|---|
| RAG | 检索增强生成 | 从外部知识库检索相关内容,注入 Prompt |
| 微调 | Fine-tuning | 用特定数据重新训练模型参数 |
┌─────────────────────────────────────────────────────────┐
│ RAG │
│ │
│ 用户问题 → 向量检索 → 获取相关文档 → 注入Prompt → LLM │
│ ↓ │
│ 向量数据库 │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 微调 │
│ │
│ 训练数据 → 模型训练 → 新模型 → 用户问题 → 直接回答 │
│ │
└─────────────────────────────────────────────────────────┘
选择对比表
| 维度 | RAG | 微调 | 说明 |
|---|---|---|---|
| 动态数据 | ✅ 推荐 | ❌ | 数据频繁更新时,RAG 只需更新知识库 |
| 模型能力定制 | ❌ | ✅ 推荐 | 需要改变模型行为/风格时用微调 |
| 减少幻觉 | ✅ 更好 | ⚠️ 一般 | RAG 有真实数据支撑,幻觉更少 |
| 可解释性 | ✅ 推荐 | ❌ | RAG 可追溯答案来源 |
| 成本 | ✅ 更低 | ❌ 更高 | 微调需要 GPU 训练,成本高 |
| 依赖通用能力 | ✅ 推荐 | ❌ | 保持模型原有能力用 RAG |
| 延迟 | ❌ 较高 | ✅ 更低 | 微调无需检索,响应更快 |
| 智能设备/边缘 | ❌ | ✅ 推荐 | 离线场景用微调后的小模型 |
详细分析
1️⃣ 动态数据 → RAG
场景:公司产品文档、新闻资讯、实时数据
RAG:更新向量数据库即可,无需重新训练
微调:每次数据变化都要重新训练,成本高
2️⃣ 模型能力定制 → 微调
场景:让模型学会特定风格、专业术语、特殊格式
微调:改变模型内在能力
RAG:只能提供参考,不能改变模型行为
3️⃣ 减少幻觉 → RAG > 微调
RAG:答案基于检索到的真实文档,可验证
微调:模型仍可能编造不存在的内容
4️⃣ 可解释性 → RAG
RAG:可以返回引用来源,用户知道答案从哪来
微调:黑盒,无法解释答案来源
5️⃣ 成本 → RAG
RAG:
- 向量数据库托管费用
- API 调用费用(Token 略多)
微调:
- GPU 训练费用(昂贵)
- 模型托管费用
- 数据标注费用
6️⃣ 依赖通用能力 → RAG
RAG:使用原始模型,保留全部通用能力
微调:可能导致"灾难性遗忘",丢失部分能力
7️⃣ 延迟 → 微调
RAG:问题 → 向量检索 → LLM 生成(多一步检索)
微调:问题 → LLM 直接生成(更快)
8️⃣ 智能设备/边缘部署 → 微调
场景:手机、IoT 设备、离线环境
微调:可训练小模型,本地部署
RAG:需要联网访问向量数据库
决策流程图
开始
│
▼
┌─────────────────┐
│ 数据是否频繁更新?│
└────────┬────────┘
│
┌────Yes──┴──No────┐
▼ ▼
RAG ┌─────────────────┐
│ 需要改变模型行为?│
└────────┬────────┘
│
┌───Yes───┴───No───┐
▼ ▼
微调 ┌─────────────────┐
│ 需要可解释性? │
└────────┬────────┘
│
┌───Yes───┴───No───┐
▼ ▼
RAG ┌─────────────────┐
│ 是边缘/离线设备?│
└────────┬────────┘
│
┌───Yes───┴───No───┐
▼ ▼
微调 RAG
混合方案(推荐)
RAG + 微调 结合使用:
1. 先用 RAG 快速上线
2. 收集用户反馈数据
3. 用反馈数据微调模型
4. 微调后的模型 + RAG 一起使用
| 阶段 | 方案 | 目的 |
|---|---|---|
| MVP 阶段 | RAG | 快速验证,低成本 |
| 优化阶段 | RAG + 微调 | 提升效果和速度 |
| 生产阶段 | 微调模型 + RAG | 最佳效果 |
五、总结
提示词工程核心原则
| 原则 | 要点 |
|---|---|
| 清晰 | 使用分隔符,结构化指令 |
| 具体 | 明确格式、长度、风格 |
| 示例 | 提供输入输出样例 |
| 正向 | 说明要做什么,而非不做什么 |
| 分步 | 使用思维链引导推理 |
技术栈选择
| 需求 | 推荐方案 |
|---|---|
| 简单问答 | 直接调用 LLM API |
| 复杂流程 | LangChain Chains |
| 需要外部数据 | LangChain + RAG |
| 自主决策 | LangChain Agent |
| 生产部署 | LangServe / FastAPI |