Prompt Engineering 实战指南:5 大原则 + Python 代码实操,让 LLM 输出更精准

2 阅读9分钟

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-20=严谨确定,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 Engineering LLM AI Python DeepSeek OpenAI 学习笔记


觉得有收获?点个赞鼓励一下吧!有问题欢迎评论区留言~ 👍