Prompt Engineering 实战指南:用 DeepSeek API 写出高质量提示词
从零开始掌握提示词工程核心技巧,结合 DeepSeek API 实战演示,让你的 AI 对话精准高效。
前言
你有没有遇到过这样的情况:给大模型提了一个问题,回答总是"答非所问"或者"泛泛而谈"?
问题往往不在模型,而在提示词(Prompt)。
本文将带你从原理到实战,系统掌握 Prompt Engineering 的核心技巧。
一、环境准备:调用 LLM API
1.1 初始化客户端
以 DeepSeek 为例,使用 OpenAI 兼容接口:
python
from openai import OpenAI
client = OpenAI(
api_key="your-api-key",
base_url="https://api.deepseek.com"
)
DeepSeek、Gemini、Claude 等主流模型都兼容 OpenAI 接口格式,JS 也借鉴了 Python 的模块化引入方式。
1.2 封装调用函数
python
def get_completion(prompt, model='deepseek-chat'):
response = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": prompt}
],
temperature=0.5, # 自由度参数:0 严谨,1 随机性强
max_tokens=1024 # 问题+回复的 token 数量上限
)
return response.choices[0].message.content
关键参数:
| 参数 | 说明 | 取值范围 |
|---|---|---|
temperature |
控制模型随机性 | 0(完全确定)~ 1(完全随机) |
max_tokens |
控制生成最大 token 数 | 1 ~ 1024,默认 1024 |
二、Prompt 核心原则
2.1 原则一:撰写清晰、具体的指令
目标:让大模型回答符合预期,不偏离主题或出错。
具体一些,为大模型提供完整的说明与背景信息(上下文)。
python
text = f"""
你应当通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。
这能引导模型产出符合预期的结果,同时降低回复内容偏离主题或出现错误的概率。
不要把编写清晰的提示词和精简提示词混为一谈。
很多时候,篇幅更长的提示词能为模型提供更完整的说明与背景信息,
进而让输出内容更加详实、贴合需求。
"""
prompt = f"""
将三个反引号之间的文本总结为一句话
```{text}```
"""
print(get_completion(prompt))
# 输出:清晰的指令应具体而非精简,长提示词能提供更完整背景,
# 从而提升模型输出的准确性和相关性。
关键认知:清晰的提示词 ≠ 精简的提示词。篇幅更长但信息完整的提示词,效果往往更好。
2.2 原则二:引导模型逐步推理
将复杂任务拆解为多个步骤,让模型按步骤执行。
示例:提取操作步骤
python
text_1 = f"""
泡一杯茶其实很简单!首先把水烧开。烧水的同时,拿出茶杯,放入
茶包。水烧开后,将热水冲入杯中浸泡茶包。静置片刻让茶香析出。
几分钟后,根据个人口味,还可以加入糖或牛奶。这样一杯美味的
茶饮就泡好了。
"""
prompt = f"""
你将收到由三引号包裹的文本。若文本中包含一系列操作指令,
请按照下述格式重新整理这些指令。
步骤 一 ...
步骤 二 ...
...
步骤 N ...
如果文本中没有一系列操作指引,直接输出**"没有操作步骤。"**
\"\"\"{text_1}\"\"\"
"""
print(get_completion(prompt))
# 输出:
# 步骤 一 把水烧开。
# 步骤 二 烧水的同时,拿出茶杯,放入茶包。
# 步骤 三 水烧开后,将热水冲入杯中浸泡茶包。
# 步骤 四 静置片刻让茶香析出。
# 步骤 五 根据个人口味,加入糖或牛奶。
无操作步骤的文本也能正确处理:
python
text_2 = f"""
今日阳光明媚,鸟儿欢唱。这样的好天气很适合去公园散步。
花儿竞相绽放,树木在微风中轻轻摇曳。
人们纷纷出门,享受这宜人的天气。
"""
prompt = f"""
你将收到由三引号包裹的文本。若内容包含一系列操作指令,请按以下格式重新整理:
第 1 步 - ...
第 2 步 - ...
如果文本中没有相关操作指令,直接输出:未提供步骤。
\"\"\"{text_2}\"\"\"
"""
print(get_completion(prompt))
# 输出:未提供步骤
三、进阶技巧
3.1 指定输出格式
让模型以特定格式(如 JSON)输出,方便后续程序处理:
python
prompt = f"""
请列出四大名著,并标注对应的作者与书籍类型。
使用JSON格式呈现,需包含以下字段:
book_id(数据编号)、title(书名)、author(作者)、
desc(简介)、genre(书籍类型)
"""
print(get_completion(prompt))
# 输出 JSON 格式的四大名著数据
3.2 Few-Shot 少量样本提示
通过提供示例,让模型保持统一的风格:
python
prompt = f"""
你的任务是保持统一的行文风格作答。
提问:请讲讲何为耐心。
回答:能凿出幽深峡谷的江河,源自涓涓细流;
恢弘壮阔的交响乐,起于单个音符;
精美繁复的织锦,始于一缕丝绒。
请问:请讲讲何为韧性。
"""
print(get_completion(prompt))
# 输出:
# 能弯折千次而不折断的竹,因根须深扎岩缝;
# 能穿越沙漠的旅人,因脚印刻着不灭的星斗;
# 能重燃的灰烬,因火种藏在风干的骨血里。
Few-Shot 利用 LLM 的随机性,通过示例"校准"输出风格,效果显著。
3.3 多任务组合
在一个 Prompt 中要求模型完成多个操作:
python
text = f"""
在一座风光宜人的小村庄里,姐弟俩杰克和吉尔动身前往山顶的水井取水。
两人一路欢歌向上攀登,不料意外突生
------ 杰克被石头绊倒,滚下山坡,吉尔也跟着摔了下去。
二人虽受了些轻伤,还是回到了家中,得到家人温柔的安抚。
这场小意外并未磨灭他们冒险的兴致,此后他们依旧满心欢喜地四处游玩。
"""
prompt = f"""
执行以下操作:
1. 将三个反引号内的文本概括为一句话。
2. 把这句摘要翻译成法语。
3. 列出法语摘要中出现的所有人名。
4. 输出JSON对象,包括字段:french_summary、num_names。
5. 答案分行展示。
文本:
```{text}```
"""
print(get_completion(prompt))
输出:
perl
杰克和吉尔在取水途中摔倒受伤,但回家得到安抚后仍继续快乐冒险。
Jack et Gil sont tombés et se sont blessés en allant chercher de l'eau,
mais après avoir été réconfortés chez eux, ils ont continué à s'amuser joyeusement.
{"french_summary": "Jack et Gil sont tombés...", "num_names": 2}
四、警惕:LLM 的幻觉问题
大模型会"一本正经地胡说八道",这是使用时必须注意的:
python
prompt = f"""
介绍以下李宁品牌的喜多多饮料
"""
print(get_completion(prompt))
# 模型会编造一段看似合理的回答,但实际上李宁从未推出过喜多多饮料
应对策略:对关键信息进行事实核查,不要盲目信任模型输出。
五、实用模板总结
| 场景 | Prompt 模板 |
|---|---|
| 文本摘要 | 将以下文本总结为一句话/N个要点:{text} |
| 格式转换 | 将以下内容转换为JSON/Markdown/表格格式:{text} |
| 步骤提取 | 若文本包含操作指令,按步骤格式整理:{text} |
| 风格模仿 | 保持以下风格作答。示例:{example} 提问:{question} |
| 多任务 | 执行以下操作:1. ... 2. ... 3. ... 文本:{text} |
六、总结
本文涵盖了 Prompt Engineering 的核心要点:
- 清晰具体:提供完整上下文,不要吝啬提示词的篇幅
- 逐步推理:将复杂任务拆解为多个步骤
- 指定格式:用 JSON 等结构化格式方便程序处理
- Few-Shot:通过示例校准输出风格
- 多任务组合:一个 Prompt 完成多个操作
- 警惕幻觉:对模型输出进行事实核查
写好 Prompt 是一门实践的艺术,多写多试,你会找到最适合自己场景的表达方式。
如果本文对你有帮助,欢迎点赞、收藏、评论!有任何问题可以在评论区留言讨论。
标签 :Prompt Engineering DeepSeek LLM AI 提示词工程 Python