Prompt Engineering 实战指南:5 大原则 + Python 代码实操,让 LLM 输出更精准
为什么同样的模型,有人能写出惊艳的文案,有人却得到一堆废话?答案在 Prompt。本文从 5 大核心原则出发,结合 Python 代码实操,带你掌握 Prompt Engineering 的精髓。
前言
今天课程深入学习了 Prompt Engineering(提示工程)——这是用好大语言模型(LLM)的核心技能。
课程中老师总结了 5 大 Prompt 原则,并用 Python 代码在 DeepSeek 上进行了大量实操。这篇文章将完整复盘这些内容,帮你从"会提问"进化到"精准控制输出"。
一、LLM API 调用基础
1.1 环境准备
from openai import OpenAI
# 实例化客户端(Python 不需要 new)
client = OpenAI(
api_key="sk-xxx", # 你的 API Key
base_url="https://api.deepseek.com/v1" # DeepSeek 接口地址
)
💡 Python 的模块化引入:
from openai import OpenAI,不需要new,直接调用即可实例化。
1.2 封装调用函数
def get_completion(prompt, model='deepseek-chat'):
"""
调用 LLM 获取回复
@param prompt: 提示词
@param model: 模型名称,默认 deepseek-chat
@return: 模型生成的文本
"""
response = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": prompt}
],
temperature=0.5, # 自由度参数
max_tokens=1024, # 最大输出长度
)
return response.choices[0].message.content
1.3 核心参数详解
| 参数 | 作用 | 取值范围 | 建议 |
|---|---|---|---|
temperature | 控制随机性 | 0-2 | 0=严谨确定,2=创意随机,一般 0.5-0.7 |
max_tokens | 最大输出长度 | 1-8192 | 根据任务调整,避免浪费 |
model | 模型选择 | 视平台而定 | deepseek-chat / gpt-4 等 |
📌
temperature是控制模型"性格"的关键:
0:完全确定,同样的输入永远输出同样的结果1:平衡2:非常随机,创意写作可用
二、Prompt 五大原则
原则一:撰写清晰、具体的指令
核心思想:给模型提供完善的说明与背景信息,让回答符合预期,不偏离主题或出错。
# ❌ 不好的 Prompt
prompt = "总结一下这段话"
# ✅ 好的 Prompt - 清晰具体
prompt = """
将三个反引号之间的文本总结为一句话。
不要偏离主题,确保准确概括核心内容。
你应当通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。 这能引导模型产出符合预期的结果,同时降低回复内容偏离主题或出现错误的概率。 不要把编写清晰的提示词和精简提示词混为一谈。 很多时候,篇幅更长的提示词能为模型提供更完整的说明与背景信息, 进而让输出内容更加详实、贴合需求。
"""
print(get_completion(prompt))
# 输出:清晰的指令能引导模型产出符合预期的结果,...
🎯 关键区别:清晰的提示词 ≠ 精简的提示词。很多时候,更长的提示词能提供更完整的上下文,让输出更精准。
原则二:引导模型逐步推理
核心思想:复杂任务不要期望模型一步到位,引导它分步骤思考。
text = """
在一座风光宜人的小村庄里,姐弟俩杰克和吉尔动身前往山顶的水井取水。
两人一路欢歌向上攀登,不料意外突生——杰克被石头绊倒,滚下山坡,
吉尔也跟着摔了下去。二人虽受了些轻伤,还是回到了家中,
得到家人温柔的安抚。这场小意外并未磨灭他们冒险的兴致,
此后他们依旧满心欢喜地四处游玩。
"""
prompt = f"""
执行以下操作:
1. 将三个反引号内的文本概括为一句话。
2. 把这句摘要翻译成法语。
3. 列出法语摘要中出现的所有人名。
4. 输出 JSON 对象,包含字段:french_summary、num_names。
请按步骤依次完成,答案分行展示。
文本:
```{text}```
"""
print(get_completion(prompt))
输出结果:
杰克和吉尔在取水途中摔倒受伤,但回家得到安抚后继续快乐冒险。
Jack et Gil sont tombés et se sont blessés en allant chercher de l'eau...
人名:Jack, Gil
```json
{
"french_summary": "Jack et Gil sont tombés...",
"num_names": 2
}
> 💡 **分步骤提示**让模型按逻辑顺序处理,避免遗漏或混乱。
---
### 原则三:输出格式规范
**核心思想**:明确要求输出格式,便于后续程序化处理。
```python
# 要求 JSON 格式输出
prompt = """
请列出四大名著,并标注对应的作者与书籍类型。
使用 JSON 格式呈现,需包含以下字段:
- book_id(书籍编号)
- title(书名)
- author(作者)
- desc(简介)
- genre(书籍类型)
"""
response = get_completion(prompt)
print(response)
输出结果:
[
{
"book_id": 1,
"title": "三国演义",
"author": "罗贯中",
"desc": "描写了东汉末年至西晋初年之间的政治和军事斗争...",
"genre": "历史演义小说"
},
{
"book_id": 2,
"title": "水浒传",
"author": "施耐庵",
"desc": "讲述了北宋末年一百零八位好汉在梁山泊聚义的故事...",
"genre": "英雄传奇小说"
}
// ... 其他两本
]
🎯 格式约束的价值:JSON 输出可以直接用
json.loads()解析,进入后续自动化流程。
原则四:Few-Shot 样本提示
核心思想:给模型提供少量示例,让它学习并模仿特定的风格或格式。
# Few-Shot:给示例,让模型模仿风格
prompt = """
你的任务是保持统一的行文风格作答。
提问:请讲讲何为耐心。
回答:能凿出幽深峡谷的江河,源自涓涓细流;
恢弘壮阔的交响乐,起于单个音符;
精美繁复的织锦,始于一缕丝绒。
请问:请讲讲何为韧性。
"""
print(get_completion(prompt))
输出结果:
能劈开顽石的竹笋,生于无声的积蓄;
穿越荒漠的胡杨,立于千年的风沙;
锻成利剑的玄铁,忍过万次的锤击。
🎨 风格一致性:通过示例,模型学会了"排比句 + 自然意象"的风格,输出的"韧性"定义与"耐心"示例风格完全一致。
原则五:避免幻觉(Hallucination)
核心思想:LLM 有时会"编造"不存在的信息,需要警惕。
# 测试幻觉
prompt = "介绍一下李宁品牌的喜多多饮料"
print(get_completion(prompt))
# 模型可能会编造一段看似合理但实际上不存在的产品介绍
⚠️ 幻觉(Hallucination):LLM 为了回答而"脑补"内容,生成看似合理但实际错误的信息。这是大模型的固有问题,需要通过 RAG(检索增强生成)等技术来缓解。
三、Python 字符串技巧:f-string 与三引号
3.1 f-string:字符串模板
name = "张三"
age = 25
# f-string 支持嵌入变量
message = f"我叫{name},今年{age}岁"
print(message) # 我叫张三,今年25岁
# 多行 f-string
prompt = f"""
请将以下文本翻译成英文:
{name}是一位{age}岁的程序员。
"""
💡 f-string 是 Python 3.6+ 的特性,类似 JS 的模板字符串,但功能更强大。
3.2 三引号:多行字符串
text = """
泡一杯茶其实很简单!首先把水烧开。烧水的同时,拿出茶杯,放入
茶包。水烧开后,将热水冲入杯中浸泡茶包。静置片刻让茶香析出。
几分钟后,根据个人口味,还可以加入糖或牛奶。这样一杯美味的
茶饮就泡好了。
"""
3.3 结合使用:构建复杂 Prompt
text = """
泡一杯茶其实很简单!首先把水烧开...
"""
prompt = f"""
你将收到由三引号包裹的文本。若文本中包含一系列操作指令,
请按照下述格式重新整理这些指令。
步骤 一 ...
步骤 二 ...
...
步骤 N ...
如果文本中没有一系列操作指引,直接输出**"没有提供步骤。"**
\"\"\"{text}\"\"\"
"""
print(get_completion(prompt))
输出:
步骤 一 把水烧开。
步骤 二 烧水的同时,拿出茶杯,放入茶包。
步骤 三 水烧开后,将热水冲入杯中浸泡茶包。
步骤 四 静置片刻让茶香析出。
步骤 五 几分钟后,根据个人口味,加入糖或牛奶。
四、条件判断与边界处理
4.1 让模型处理不同情况
text_2 = """
今日阳光明媚,鸟儿欢唱。这样的好天气很适合去公园散步。
花儿竞相绽放,树木在微风中轻轻摇曳。
人们纷纷出门,享受这宜人的天气。
"""
prompt = f"""
你将收到由三引号包裹的文本。若内容包含一系列操作指令,
请按以下格式重新整理:
第 1 步 - …
第 2 步 - …
……
第 N 步 - …
如果文本中没有相关操作指令,直接输出:未提供步骤。
\"\"\"{text_2}\"\"\"
"""
print(get_completion(prompt))
# 输出:未提供步骤
🎯 边界处理:好的 Prompt 要考虑各种情况,包括"不符合条件"的场景。
五、知识图谱
📚 Prompt Engineering 知识图谱
五大原则
├── 1. 清晰具体的指令
│ └── 提供完善说明与背景信息
│
├── 2. 引导逐步推理
│ └── 复杂任务分步骤完成
│
├── 3. 输出格式规范
│ └── JSON / 特定结构
│
├── 4. Few-Shot 样本提示
│ └── 给示例,让模型模仿风格
│
└── 5. 避免幻觉
└── 警惕模型编造信息
Python 技巧
├── f-string 字符串模板
│ └── f"{variable}"
│
└── 三引号多行字符串
└── """..."""
API 参数
├── temperature(随机性)
│ ├── 0 = 严谨确定
│ └── 2 = 创意随机
│
└── max_tokens(输出长度)
LLM 接口
├── OpenAI SDK(行业标准)
├── messages 格式
│ ├── role: user / assistant
│ └── content: 内容
│
└── DeepSeek / Claude / Gemini 兼容
六、Prompt 模板速查表
| 场景 | Prompt 模板 |
|---|---|
| 文本总结 | 将以下文本总结为一句话:\n\``{text}```` |
| 翻译 | 将以下文本翻译成{语言}:\n\``{text}```` |
| JSON 输出 | 使用 JSON 格式输出,包含字段:{字段列表} |
| 分步骤 | 执行以下操作:\n1. ...\n2. ...\n3. ... |
| Few-Shot | 提问:{示例问题}\n回答:{示例答案}\n\n提问:{实际问题} |
| 条件判断 | 如果...请...;否则... |
结语
Prompt Engineering 不是"玄学",而是一门可以系统学习的技能。掌握这 5 大原则,你就能让 LLM 输出更精准、更符合预期的结果。
记住:清晰的指令 + 具体的上下文 + 明确的格式 = 高质量的输出。
希望这篇文章对你有帮助!如果有任何问题,欢迎在评论区交流。
📌 参考资源
📌 文章标签
Prompt EngineeringLLMAIPythonDeepSeekOpenAI学习笔记
觉得有收获?点个赞鼓励一下吧!有问题欢迎评论区留言~ 👍