提示词工程(Prompt Engineering)
High Contrast
Dark Mode
Light Mode
Sepia
Forest
3 min read534 words

提示词工程(Prompt Engineering)

提示词工程是让LLM产生高质量输出的关键技能。

什么是提示词?

提示词是你给LLM的指令或输入,决定了输出的质量。

基本结构

[角色设定] + [任务描述] + [输入数据] + [输出格式] + [示例]

糟糕的提示词 vs 优秀的提示词

糟糕的提示词 优秀的提示词
"写个故事" "你是一位科幻小说作家。请写一个关于火星殖民的200字短篇故事,风格要类似《火星救援》。"
"这段代码什么意思?" "作为Python专家,请解释以下代码的功能、输入输出和可能的问题:\n\ncode..."
"总结这篇文章" "请用3个要点总结这篇文章,每个要点不超过50字。原文:\n\ntext..."

提示词设计原则

1. 明确角色(Persona)

让LLM扮演特定角色。

from langchain_openai import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage
llm = ChatOpenAI(model="gpt-4")
# 系统消息定义角色
system_prompt = """
你是一位经验丰富的Python开发者,擅长代码审查。
你的任务是:
1. 检查代码错误
2. 提供改进建议
3. 优化性能
4. 确保代码可读性
"""
user_prompt = """
请审查以下代码:
def calculate_sum(numbers):
s = 0
for n in numbers:
s = s + n
return s
"""
messages = [
SystemMessage(content=system_prompt),
HumanMessage(content=user_prompt)
]
response = llm.invoke(messages)
print(response.content)

2. 清晰任务

明确告诉LLM要做什么。

# ❌ 不清晰
prompt = "处理这段数据"
# ✅ 清晰
prompt = """
请将以下JSON数据转换为CSV格式:
1. 保留所有字段
2. 使用逗号分隔
3. 第一行为字段名
4. 确保正确处理引号和换行
数据:
{"name": "Alice", "age": 25, "city": "New York"}
{"name": "Bob", "age": 30, "city": "London"}
"""

3. 提供示例(Few-Shot)

给LLM几个例子,让它模仿。

prompt = """
以下是一些数学问题的例子:
Q: 2 + 2 = ?
A: 4
Q: 5 × 6 = ?
A: 30
Q: 10 ÷ 2 = ?
A: 5
现在请回答:
Q: 7 × 8 = ?
A:
"""
llm.invoke(prompt)

4. 指定输出格式

控制输出的结构。

prompt = """
分析以下文本的情感:
文本:"这部电影太棒了!我非常推荐。"
请以JSON格式输出:
{
"sentiment": "正面/负面/中性",
"confidence": 0-1,
"keywords": ["关键词1", "关键词2"]
}
"""

常用提示词模板

模板1: 分类任务

classification_prompt = """
作为文本分类专家,请将以下文本分类为:
- 积极情感
- 消极情感
- 中性
文本:{text}
输出格式:
类别: [你的答案]
理由: [简要理由]
"""
text = "今天天气真不错!"
llm.invoke(classification_prompt.format(text=text))

模板2: 提取任务

extraction_prompt = """
从以下文本中提取信息:
- 姓名
- 邮箱
- 电话号码
文本:{text}
输出格式(JSON):
{{
"name": "...",
"email": "...",
"phone": "..."
}}
如果找不到某项信息,该字段设为null。
"""
text = "我叫张三,邮箱是zhangsan@example.com,电话是13812345678。"
llm.invoke(extraction_prompt.format(text=text))

模板3: 重写任务

rewrite_prompt = """
请将以下文本重写为更正式的商务邮件风格:
原文:{original}
要求:
1. 使用正式语言
2. 保持核心信息
3. 简洁明了
4. 长度控制在200字以内
重写后的文本:
"""
original = "嘿,那个项目做完了,你看看吧,有什么问题随时找我。"
llm.invoke(rewrite_prompt.format(original=original))

模板4: 代码生成

code_prompt = """
作为Python专家,请编写一个函数完成任务。
任务:{task}
要求:
1. 使用Python 3.10+
2. 添加类型注解
3. 编写文档字符串(docstring)
4. 处理异常情况
5. 提供使用示例
代码:
"""
task = "实现一个快速排序算法"
response = llm.invoke(code_prompt.format(task=task))
print(response.content)

高级技巧

1. 思维链(Chain of Thought)

让LLM逐步思考。

cot_prompt = """
小明有5个苹果,他给了小红2个,又买了3个。
现在小明有多少个苹果?
请逐步思考:
1. 初始:小明有5个苹果
2. 第一步:...
3. 第二步:...
4. 最终答案:...
开始思考:
"""
response = llm.invoke(cot_prompt)
print(response.content)

2. 自我反思(Self-Reflection)

让LLM检查自己的输出。

reflection_prompt = """
请回答以下问题,然后检查你的答案:
问题:π(圆周率)小数点后第10位是多少?
步骤1:直接回答
你的答案:__
步骤2:检查答案
请检查你的答案是否正确,如果不对,请修正:
最终答案:__
"""
response = llm.invoke(reflection_prompt)

3. 分解任务

复杂任务分解为多个简单任务。

# 任务1: 提取关键信息
extract_prompt = "从以下文本中提取关键信息..."
# 任务2: 分析情感
sentiment_prompt = "分析上述信息的情感倾向..."
# 任务3: 生成总结
summary_prompt = "基于以上信息,生成总结..."
# 依次执行
step1 = llm.invoke(extract_prompt)
step2 = llm.invoke(sentiment_prompt + "\n" + step1.content)
step3 = llm.invoke(summary_prompt + "\n" + step2.content)

4. 角色扮演对话

模拟专家咨询。

conversation_prompt = """
你现在是一位资深的产品经理。
用户想开发一个笔记应用,请你提供专业建议。
用户:我想开发一个笔记应用,不知道从何开始。
请从以下方面提供建议:
1. 核心功能
2. 技术选型
3. 开发优先级
4. 可能的挑战
你的回复:
"""
response = llm.invoke(conversation_prompt)

使用LangChain的提示词模板

from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.chains import LLMChain
# 定义模板
template = """
你是一位{role}。
任务:{task}
输入:{input}
请按要求完成:
"""
# 创建提示词模板
prompt = PromptTemplate(
template=template,
input_variables=["role", "task", "input"]
)
# 创建链
llm = ChatOpenAI(model="gpt-4")
chain = LLMChain(llm=llm, prompt=prompt)
# 使用
result = chain.run(
role="Python开发者",
task="解释这段代码",
input="print('Hello, World!')"
)
print(result)

提示词调试技巧

1. A/B测试

prompt_a = "写一个Python函数计算阶乘"
prompt_b = """
作为Python专家,请编写一个高效的阶乘函数。
要求:
1. 使用递归
2. 添加类型注解
3. 编写文档字符串
"""
result_a = llm.invoke(prompt_a)
result_b = llm.invoke(prompt_b)
# 比较结果
print("Prompt A结果:", result_a.content)
print("Prompt B结果:", result_b.content)

2. 迭代优化

# 初始版本
prompt_v1 = "写一个故事"
result_v1 = llm.invoke(prompt_v1)
# 收集反馈,优化
prompt_v2 = """
写一个200字的科幻短篇故事。
主题:时间旅行
风格:悬疑
"""
result_v2 = llm.invoke(prompt_v2)
# 继续优化
prompt_v3 = """
作为科幻小说作家,写一个关于时间旅行的200字悬疑短篇故事。
要求:
1. 开头要有悬念
2. 中间有反转
3. 结尾留白让人思考
"""
result_v3 = llm.invoke(prompt_v3)

实践项目

项目1: 邮件分类器

email_classifier_prompt = """
作为邮件分类助手,请将以下邮件分类为:
- 工作
- 个人
- 广告
- 垃圾邮件
邮件:
主题:{subject}
内容:{content}
输出格式:
类别: [分类结果]
理由: [简短理由]
"""
# 使用示例
subject = "会议邀请:项目进度讨论"
content = "大家好,本周五下午3点开会讨论项目进度,请准时参加。"
result = llm.invoke(email_classifier_prompt.format(
subject=subject,
content=content
))
print(result.content)

项目2: 代码解释器

code_explanation_prompt = """
作为Python教学助手,请解释以下代码:
```python
{code}

解释要求: 1. 整体功能 2. 关键代码行注释 3. 输入输出 4. 可能的改进 5. 学习要点

请用清晰的格式输出。 """

code = """ def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + middle + quicksort(right) """

result = llm.invoke(code_explanation_prompt.format(code=code)) print(result.content) ```

学习要点

✅ 提示词工程是LLM应用的核心技能 ✅ 明确角色、任务、格式、示例是四大原则 ✅ 思维链、自我反思、任务分解是高级技巧 ✅ 使用模板可以提高复用性 ✅ A/B测试和迭代优化是持续改进的方法


下一步: 学习 API集成 构建实际应用 🔗