清晰指令 + 逐步推理 = 让AI真正理解你的意图
写在前面
最近在深入学习和使用大语言模型的过程中,发现一个很有意思的现象:同样的模型,不同人用起来效果天差地别。有时候不是模型不够强,而是我们的"沟通方式"出了问题。
今天就来聊聊如何写好Prompt,以及如何用Python优雅地封装LLM调用。这篇文章会带你从基础到进阶,掌握让AI乖乖听话的核心技巧。
一、Prompt核心九法
| 原则 | 核心要义 |
|---|---|
| 一 | 清晰具体 ≠ 精简,长 prompt 往往效果更好 |
| 二 | 引导逐步推理 (Chain-of-Thought),别让模型一步到位 |
| 三 | 给模型"退路" ------允许它说"不知道",防止幻觉 |
| 四 | 正向指令 > 负向指令 |
| 五 | 角色设定让回答聚焦 |
| 六 | Few-shot:示例比描述更有效 |
| 七 | 结构化输出,方便程序解析 |
| 八 | 迭代优化------把 prompt 当代码来 Debug |
| 九 | temperature、max_tokens 参数控制 |
下面我们就结合这九大原则,从实战角度逐一攻破。
二、LLM API调用封装实战
2.1 基础配置
首先,我们需要初始化OpenAI风格的客户端(以DeepSeek为例):
python
ini
from openai import OpenAI
# 实例化客户端
client = OpenAI(
api_key="your-api-key-here",
base_url="https://api.deepseek.com/v1"
)
2.2 函数封装技巧
python
ini
def get_completion(prompt, model='deepseek-chat'):
response = client.chat.completions.create(
model=model,
messages=[
{"role": "user", "content": prompt}
],
temperature=0.5, # 原则九:随机性控制,0严谨,2随意
max_tokens=1024 # 原则九:输出长度限制
)
return response.choices[0].message.content
# 测试一下
print(get_completion("写一首夏天游玩的七言诗"))
参数说明:
temperature:0-2之间。0表示确定性输出,2表示高随机性max_tokens:控制输入+输出的总token数
三、九大原则实战演练
原则一:清晰具体 ≠ 精简
❌ 不好的提问:
text
写首诗
✅ 好的提问:
text
写一首关于夏天游湖的七言诗,要求意境优美,包含荷花、清风等元素
关键点:不要把"清晰"等同于"精简" 。很多时候,更长的Prompt反而能提供更完整的背景信息,让输出更贴合需求。
python
ini
text = """
你应当通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。
这能引导模型产出符合预期的结果,同时降低回复内容偏离主题的概率。
不要把编写清晰的提示词和精简提示词混为一谈。
"""
prompt = f"""
将三个反引号之间的文本总结为一句话
'''{text}'''
"""
原则二:引导逐步推理
复杂任务拆解成多步,让模型按步骤思考(Chain-of-Thought):
python
ini
text = """
在一座风光宜人的小村庄里,姐弟俩杰克和吉尔动身前往山顶的水井取水。
两人一路欢歌向上攀登,不料意外发生
------杰克被石头绊倒,滚下山坡,吉尔也跟着摔了下去。
二人虽受了些轻伤,还是回到了家中,得到家人温柔的安抚。
"""
prompt = f"""
执行以下操作:
1. 将文本概括为一句话
2. 把这句话翻译成法语
3. 列出法语摘要中出现的所有人名
4. 输出JSON对象,包含字段:french_summary、num_names
文本:'''{text}'''
"""
原则三:给模型"退路"------防止幻觉
当模型遇到不熟悉的内容,可能会"一本正经地胡说八道":
python
ini
# ❌ 不加限制时,模型可能编造信息
prompt = "介绍一下博依品牌的喜多多饮料"
# ✅ 正确的做法:让模型明确表示"不知道"
prompt = """
如果你不确定答案,请直接说"未找到相关信息",不要编造。
介绍一下博依品牌的喜多多饮料
"""
原则四:正向指令 > 负向指令
❌ 负向指令(模型容易困惑):
text
不要写太长的诗,不要用生僻字,不要写悲伤的内容
✅ 正向指令(清晰明确):
text
写一首短诗,使用常见汉字,表达欢乐的情感
原则五:角色设定让回答聚焦
python
ini
prompt = """
你是一位资深的茶叶品鉴师,拥有20年从业经验。
请介绍如何泡好一杯龙井茶。
"""
角色设定能让模型从特定视角回答问题,输出更专业、更聚焦。
原则六:Few-shot学习(示例比描述更有效)
给模型提供示例,让它学习你的"风格":
python
ini
prompt = """
你的任务是保持统一的行文风格作答
提问:请讲讲何为耐心
回答:能凿出幽深峡谷的江河,源自涓涓细流;
恢弘壮阔的交响乐,起于单个音符;
精美繁复的织锦,始于一缕丝线。
请问:请讲讲何为韧性
"""
print(get_completion(prompt))
输出:
能承受千钧之重的古藤,生于石缝间的幼苗;
历经烈火淬炼的利剑,成于反复锻打的铁坯;
穿越千年风沙的胡杨,长于寸草不生的荒漠。
原则七:结构化输出
让模型按指定格式返回,方便程序解析:
python
ini
prompt = """
请列出四大名著,并标注对应的作者与书籍类型。
使用JSON格式呈现,需包含以下字段:
- book_id(书籍编号)
- title(书名)
- author(作者)
- genre(书籍类型)
【注意】必须输出合法的JSON格式
"""
response = get_completion(prompt)
print(response)
输出示例:
json
json
{
"book_id": 1,
"title": "红楼梦",
"author": "曹雪芹",
"desc": "以贾、史、王、薛四大家族的兴衰为背景...",
"genre": "古典小说(世情小说)"
}
原则八:迭代优化------把prompt当代码来Debug
python
ini
# 版本1:太模糊
prompt_v1 = "分析这段文本"
# 版本2:添加具体任务
prompt_v2 = "分析这段文本的情感倾向"
# 版本3:明确输出格式
prompt_v3 = """
分析以下文本的情感倾向,输出JSON格式:
{"sentiment": "positive/negative/neutral", "confidence": 0.0-1.0}
文本:{text}
"""
# 像调试代码一样,持续优化你的prompt
原则九:temperature与max_tokens参数控制
| 场景 | 推荐Temperature | 原因 |
|---|---|---|
| 代码生成、数学题 | 0.1-0.3 | 需要精确性 |
| 创意写作、诗歌 | 0.7-1.0 | 需要多样性 |
| 头脑风暴 | 1.0-1.5 | 需要发散思维 |
| 事实问答 | 0.0-0.2 | 需要确定性 |
四、综合实战:步骤化处理
当输入包含操作指令时,可以让模型重新整理格式:
python
ini
text = """
泡一杯茶其实很简单!首先把水烧开。烧水的同时,拿出茶杯,放入茶包。
水烧开后,将热水冲入杯中浸泡茶包。静置片刻让茶香析出。
几分钟后,根据个人口味,还可以加入糖或牛奶。
"""
prompt = f"""
【原则二:引导逐步推理】
你将收到三个引号之间的文本,若文本中包含一系列操作指令
请按照下述格式重新整理这些指令:
步骤一...
步骤二...
步骤n...
【原则三:给模型退路】
如果没有操作指引,输出:**没有提供步骤**
【原则四:正向指令】
请使用简洁、积极的语言描述每个步骤
'''{text}'''
"""
print(get_completion(prompt))
输出:
text
步骤一:把水烧开。
步骤二:烧水的同时,拿出茶杯,放入茶包。
步骤三:水烧开后,将热水冲入杯中浸泡茶包。
步骤四:静置片刻让茶香析出。
步骤五:根据个人口味,加入糖或牛奶。
五、避坑指南速查表
| 常见错误 | 正确做法 |
|---|---|
| 指令过于模糊 | 提供具体约束和示例 |
| 要求一步完成复杂任务 | 拆解成多步,引导推理 |
| 模型编造信息 | 明确允许说"不知道" |
| 用"不要做X" | 改成"请做Y" |
| 没有角色设定 | 添加角色让回答更专业 |
| 只描述不示范 | 用Few-shot给示例 |
| 输出格式随意 | 要求结构化输出 |
| Prompt写一次就放弃 | 持续迭代优化 |
| 忽略temperature参数 | 根据场景调整 |
总结
写好Prompt的九字真言:
清、步、退、正、角、例、构、迭、参
翻译一下:
- 清晰具体 ≠ 精简
- 引导逐步推步
- 给模型退路
- 正向指令
- 角色设角
- Few-shot示例
- 结构化构
- 迭代优化(迭)
- 调参(temperature + max_tokens)
记住:你不是在使用AI,而是在和AI协作。沟通越清晰,协作越高效。