04 - 提示词(Prompts):模板与技巧
约 1318 字大约 4 分钟
LangChainPrompts提示词工程
2026-03-08
第 04 课:提示词(Prompts)- 模板与技巧
课程目标
通过本节课,你将学到:
- ✅ Prompt Templates 的基本用法
- ✅ Few-shot Learning(少样本学习)
- ✅ 提示词工程最佳实践
- ✅ 高级技巧:角色扮演、思维链
一、Prompt Templates 基础
1.1 为什么需要模板?
问题:每次都要手动拼接字符串
# ❌ 不推荐:手动拼接
name = "张三"
age = 25
prompt = f"你好,我叫{name},今年{age}岁,请介绍一下我自己。"解决方案:使用 Prompt Templates
# ✅ 推荐:使用模板
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template(
"你好,我叫{name},今年{age}岁,请介绍一下我自己。"
)
prompt = template.format(name="张三", age=25)1.2 基础用法
from langchain.prompts import PromptTemplate
# 方法 1:from_template(推荐)
template = PromptTemplate.from_template("给我讲一个关于{topic}的笑话")
# 方法 2:构造函数
template = PromptTemplate(
input_variables=["topic"],
template="给我讲一个关于{topic}的笑话"
)
# 使用模板
prompt = template.format(topic="程序员")
print(prompt) # "给我讲一个关于程序员的笑话"1.3 ChatPromptTemplate
针对 Chat Models,使用 ChatPromptTemplate:
from langchain.prompts import ChatPromptTemplate
# 创建模板
template = ChatPromptTemplate.from_messages([
("system", "你是一个{role},擅长{skill}"),
("human", "{question}")
])
# 使用模板
messages = template.format_messages(
role="Python 专家",
skill="编写高质量代码",
question="如何优化 Python 性能?"
)
# 调用 LLM
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
response = llm.invoke(messages)二、Few-shot Learning(少样本学习)
2.1 什么是 Few-shot?
通过提供少量示例,让 LLM 快速学习任务模式。
from langchain.prompts import FewShotPromptTemplate
# 定义示例
examples = [
{"input": "开心", "output": "😊"},
{"input": "难过", "output": "😢"},
{"input": "生气", "output": "😤"},
]
# 定义示例格式
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="输入: {input}\n输出: {output}"
)
# 创建 Few-shot 模板
few_shot_template = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="将情绪转换为表情符号:",
suffix="输入: {adjective}\n输出:",
input_variables=["adjective"]
)
# 使用
prompt = few_shot_template.format(adjective="惊讶")
print(prompt)输出:
将情绪转换为表情符号:
输入: 开心
输出: 😊
输入: 难过
输出: 😢
输入: 生气
输出: 😤
输入: 惊讶
输出:2.2 动态选择示例
根据输入自动选择最相关的示例:
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 示例库
examples = [
{"input": "感冒", "output": "建议多休息、多喝水"},
{"input": "发烧", "output": "建议物理降温、及时就医"},
{"input": "头痛", "output": "建议放松、避免用眼过度"},
]
# 创建示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(),
Chroma,
k=2 # 选择最相似的 2 个示例
)
# 使用选择器
selected_examples = example_selector.select_examples({"input": "咳嗽"})
print(selected_examples)三、提示词工程最佳实践
3.1 CLEAR 原则
| 原则 | 说明 | 示例 |
|---|---|---|
| Concise | 简洁明了 | ❌ "请帮我写一个关于..." ✅ "写一篇..." |
| Logical | 逻辑清晰 | 分步骤说明任务 |
| Explicit | 明确具体 | 明确输出格式、长度 |
| Adaptive | 适应性 | 提供上下文信息 |
| Reflective | 反思性 | 要求 AI 解释推理过程 |
3.2 好提示词的结构
good_prompt = """
# 角色
你是一个资深的 Python 开发工程师,擅长代码优化和性能调优。
# 任务
分析以下 Python 代码,找出性能瓶颈并提供优化建议。
# 代码
```python
{code}要求
- 指出性能瓶颈(最多 3 个)
- 提供优化建议(包含代码示例)
- 预估性能提升幅度
输出格式
性能瓶颈
- 瓶颈 1: ...
- 瓶颈 2: ...
优化建议
- 建议 1: ...
- 建议 2: ...
性能预估
优化后预计提升 X% 的性能。 """
### 3.3 常见技巧
**1. 角色扮演**
```python
prompt = "你是一个资深翻译,精通中英双语,擅长翻译技术文档。"2. 思维链(Chain of Thought)
prompt = """
请一步步思考:
1. 首先分析问题
2. 然后列出解决方案
3. 最后给出推荐方案
问题:{question}
"""3. 输出格式控制
prompt = """
请以 JSON 格式输出:
{
"name": "姓名",
"age": 年龄,
"skills": ["技能1", "技能2"]
}
用户信息:{user_input}
"""四、高级技巧
4.1 条件模板
根据条件选择不同的提示词:
from langchain.prompts import ConditionalPromptSelector
# 定义多个模板
simple_template = PromptTemplate.from_template(
"简单解释:{topic}"
)
detailed_template = PromptTemplate.from_template(
"详细解释{topic},包括定义、原理、应用场景、优缺点"
)
# 条件选择器
prompt_selector = ConditionalPromptSelector(
default_prompt=simple_template,
conditionals=[
(lambda x: len(x["topic"]) > 20, detailed_template)
]
)
# 使用
prompt = prompt_selector.get_prompt({"topic": "量子计算"})4.2 模板组合
from langchain.prompts import PipelinePromptTemplate
# 定义子模板
introduction_template = PromptTemplate.from_template(
"你好,我是{assistant_name},是一个{role}。"
)
example_template = PromptTemplate.from_template(
"示例:\n{example}"
)
# 组合模板
full_template = PromptTemplate.from_template(
"{introduction}\n\n{example}\n\n现在请{task}"
)
pipeline_prompt = PipelinePromptTemplate(
final_prompt=full_template,
pipeline_prompts=[
("introduction", introduction_template),
("example", example_template)
]
)
# 使用
prompt = pipeline_prompt.format(
assistant_name="AI助手",
role="Python专家",
example="问:如何排序列表?\n答:使用 sorted() 函数",
task="回答用户问题"
)五、本课小结
核心要点
Prompt Templates:
- 使用变量化模板
- ChatPromptTemplate 用于对话
Few-shot Learning:
- 提供少量示例
- 动态选择相关示例
提示词工程:
- CLEAR 原则
- 角色扮演、思维链、格式控制
高级技巧:
- 条件模板
- 模板组合
下节预告
下一课,我们将学习 输出解析(Parsers),包括:
- 结构化输出
- Pydantic 数据验证
- JSON Parser
🎯 课后练习
- 模板练习:创建一个代码审查模板,包含代码、语言、审查重点等变量。
- Few-shot:为"情感分析"任务设计 3-5 个示例。
- 优化提示词:优化一个你之前使用过的提示词,对比效果。