前言

大语言模型(LLM)很强大,但它并不是“读心术大师”。想让模型输出符合预期的结果,清晰的指令合理的 API 调用封装是关键。本文将结合一个完整的 Python 示例,带你掌握:

  • ✅ Prompt 编写的核心原则

  • ✅ 如何封装一个通用的 get_completion 函数

  • ✅ 控制输出随机性与长度

  • ✅ 引导模型逐步推理、按格式输出

  • ✅ 认识模型“幻觉”并加以防范

无论你是刚入门 AI 开发,还是想系统提升 Prompt 工程能力,这篇文章都能给你带来实实在在的帮助。


一、Prompt 编写原则:清晰、具体、给上下文

很多人误以为“越短的 Prompt 越好”,其实恰恰相反。清晰、具体的指令才能让模型准确理解你的意图。

1.1 核心要点

原则 说明
清晰明确 告诉模型你希望它做什么,不要留太多模糊空间
提供背景 用三个反引号(```)或明确的段落给出上下文 |
指定输出格式 如 JSON、Markdown 列表、分步骤等
引导推理 要求模型“先思考,再回答”,降低错误率

1.2 反面 vs 正面示例

❌ 模糊指令

“介绍一下四大名著。”

✅ 清晰指令

“请列出四大名著,并标注对应的作者与书籍类型。使用 JSON 格式呈现,需包含以下字段:book_id、title、author、desc、genre。”


二、封装 LLM API 调用函数(以 DeepSeek 为例)

各大模型(OpenAI、Gemini、Claude)接口不尽相同,但 Python 封装思路是通用的。这里我们使用 DeepSeek 的 API(兼容 OpenAI SDK)。

2.1 安装与初始化

pip install openai
from openai import OpenAI

client = OpenAI(
    api_key="your-api-key",          # 替换成你的 key
    base_url="https://api.deepseek.com"
)

2.2 核心函数 get_completion

def get_completion(prompt, model='deepseek-chat', temperature=0.5, max_tokens=1024):
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "user", "content": prompt}
        ],
        temperature=temperature,   # 0~1,0 最确定,1 最随机
        max_tokens=max_tokens,     # 输入+输出的最大 token 数
        n=1
    )
    return response.choices[0].message.content

参数说明

  • temperature:控制随机性。0 表示几乎每次输出相同(适合严谨任务),1 表示更富创造性。

  • max_tokens:限制回复长度,防止超长输出浪费 token。

2.3 测试一下

print(get_completion("写一首夏天游玩的七言诗"))

输出示例:
夏日荷风拂柳塘,轻舟泛水笑声扬。
青山倒影随波舞,一曲清歌醉夕阳。


三、实战案例:从简单到进阶

下面用几个真实例子展示如何用好上述函数。

3.1 案例1:文本总结(一句话 + 上下文)

text = """
你应当通过尽可能清晰、具体的指令,来明确你希望模型完成的任务。
这能引导模型产出符合预期的结果,同时降低回复偏离主题的概率。
不要把编写清晰的提示词和精简提示词混为一谈。
很多时候,篇幅更长的提示词能为模型提供更完整的背景信息。
"""

prompt = f"""
将三个反引号之间的文本总结为一句话
```{text}```
"""

print(get_completion(prompt))

输出

编写清晰具体的指令并提供完整背景信息,能有效引导大模型产出符合预期的结果,避免输出偏离主题。

3.2 案例2:结构化输出(JSON)

prompt = """
请列出四大名著,并标注对应的作者与书籍类型。
使用JSON格式呈现,需包含以下字段:book_id(书籍编号)、title(书名)、author(作者)、desc(简介)、genre(书籍类型)
"""

print(get_completion(prompt))

输出(美观化后):

[
  {
    "book_id": 1,
    "title": "红楼梦",
    "author": "曹雪芹",
    "desc": "以贾、史、王、薛四大家族为背景,描写贾宝玉与林黛玉的爱情悲剧。",
    "genre": "章回体长篇小说"
  },
  ...
]

3.3 案例3:整理操作步骤(条件判断)

text_1 = """
泡一杯茶其实很简单!首先把水烧开。烧水的同时拿出茶杯,放入茶叶。
水烧开后,将热水冲入杯中浸泡茶包。静置几分钟后,可以加入糖或牛奶。
"""

prompt = f"""
你将收到由三引号包裹的文本。若文本中包含一系列操作指令,
请按照下述格式重新整理。
步骤 一...
步骤 二...
...
如果没有步骤,直接输出"没有提供步骤。"
```{text_1}```
"""

print(get_completion(prompt))

输出

步骤 一:把水烧开。
步骤 二:拿出茶杯,放入茶叶(或茶包)。
步骤 三:将热水冲入杯中浸泡茶包。
步骤 四:静置几分钟,让茶香析出。
步骤 五:根据口味加入糖或牛奶。

如果文本中没有步骤(比如一段风景描写),模型会正确输出 “没有提供步骤”

3.4 案例4:Few-shot 保持风格统一

prompt = """
你的任务是保持统一的行文风格作答。

提问:请讲讲何为耐心。
回答:能凿出幽深峡谷的江河,源自涓涓细流;
恢弘壮阔的交响乐,起于单个音符;
精美繁复的织锦,始于一缕丝绒。

请问:请讲讲何为韧性。
"""

print(get_completion(prompt))

输出(风格延续得很好):

能让巨轮破浪前行的船体,始于一块钢板;
能参天耸立的古木,源于一粒种子;
能横跨天堑的长桥,起于一座桥墩。

3.5 案例5:引导模型逐步推理(多步 + 多语言)

text = """
在一座小村庄里,姐弟俩杰克和吉尔动身前往山顶的水井取水。
不料杰克被石头绊倒,滚下山坡,吉尔也跟着摔了下去。
二人受了些轻伤,还是回到了家中,得到家人安抚。
"""

prompt = f"""
执行以下操作:
1. 将三个反引号内的文本概括为一句话
2. 把这句摘要翻译成法语
3. 列出法语摘要中出现的所有人名
4. 输出JSON对象,包含字段:french_summary、num_names
答案分行展示。

文本:```{text}```
"""

print(get_completion(prompt))

输出(示例):

1. 杰克和吉尔在山顶取水时摔倒受伤,但最终安全回家。
2. Jack et Gil sont tombés et se sont blessés en puisant de l'eau au sommet de la montagne, mais sont finalement rentrés chez eux sains et saufs.
3. Jack, Gil
4. {"french_summary": "Jack et Gil sont tombés...", "num_names": 2}

四、注意点:随机性 & 幻觉

4.1 随机性控制

设置 temperature=0 会让模型几乎确定性输出,适合事实性任务(如分类、翻译)。
设置 temperature=0.8 则更适合创意写作、头脑风暴。

4.2 模型“幻觉”

LLM 有时会“一本正经地胡说八道”。比如问一个不存在的产品:

prompt = "介绍一下博依品牌的喜多多饮料"
print(get_completion(prompt))

模型可能编造出产品名称、口味、价格等。
解决方案

  • 要求模型引用可信来源(如“请在回答中注明信息来源”)

  • 使用 RAG(检索增强生成)技术

  • 对关键事实进行人工或自动化验证


五、总结

场景 推荐做法
撰写指令 清晰、具体、提供示例(Few-shot)
输出格式 明确要求 JSON / Markdown / 分步骤
控制随机性 严肃任务用 temperature=0,创意任务用 0.6~0.8
限制长度 设置合理的 max_tokens
防止幻觉 要求引用来源,或结合外部知识库

记住:Prompt 不是越短越好,而是越“懂你”越好。把模型当作一个聪明但需要明确指令的实习生,你会获得更满意的结果。

希望这篇笔记能帮助你在实际项目中更好地驾驭大模型。如果你有更多有趣的 Prompt 实践,欢迎在评论区分享交流!


📌 本文代码已整合为可直接运行的 Python 脚本,只需替换 API Key 即可上手体验。

如果觉得有用,请点赞、收藏、转发支持~

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐