Prompt 工程与 LLM 基础知识
2025年5月20日
1. 预测/判别式 AI 和生成式 AI 有什么区别?
预测/判别式 AI 通常应用于非对话领域,领域专家会使用 CNN、基于树的算法、NER 模型等,来进行预测、推荐、决策和预测等。
另一方面,生成式 AI 可以创建内容、代码、音乐和营销材料,并可以将数据翻译成不同的格式。
早期生成式 AI 模型的例子包括变分编码器 (Variational Autoencoders) 和 GAN,比如这个和这个,它们在当时让我非常惊叹。
随着 Transformer 模型的兴起,我们已经看到了代码生成、音乐生成、视频到视频的转换、文本到视频的生成以及 LLM 的例子。
来自 Amazing ML Mastery Blog 的资源,他们教会了数百万人,向他们致敬 |
- 资源消耗高
- 幻觉
- 仍在努力使算法更稳定,从 GAN 到今天花了多年时间
- 难以删除敏感数据/内容过滤
2. 语言模型中的 Token 是什么?
Token 是数据的最小/充分信息封装表示,用于模仿。它不一定是音节,而可以是图像向量的一部分。
基于训练数据的大小,token 的数量可能达到数十亿或数万亿 —— 并且,根据预训练缩放定律,用于训练的 token 越多,AI 模型的质量就越好。
关于著名模型中 Token 数量的旁注
根据 Chinchilla 缩放定律和相关研究,最佳训练 token 数量约为模型参数数量的 20 倍。例如:
- 一个 50 亿参数的模型在约 1 万亿个 token 上进行训练。
- 一个 90 亿参数的模型在约 2.1 万亿个 token 上进行训练。
- 一个 30 亿参数的模型在约 2.8 万亿个 token 上进行训练。
- 一个 60 亿参数的模型在超过 6.1 万亿个 token 上进行训练。
- 具有数百亿参数的更大模型可能在数万亿个 token 上进行训练(例如,200 亿个参数在 60+ 万亿个 token 上)关于此的优秀资源和另一个
来自 Eden AI,LLM 计费的资源 |
在 LLM 模型的上下文中,它们经过训练以正确预测_下一个 token_。
"The cat is beautiful." 由 LLM 生成为:
Token ID | Token | 注释 |
---|---|---|
1 | The | 冠词 |
32 | Ġcat | 带空格前缀的词 |
542 | Ġis | 常用动词带空格 |
123 | Ġbeautiful | 形容词带空格 |
13 | . | 标点符号 |
在每一步,它都会根据前一个词预测下一个词(或 token):
输入 Token | 到目前为止的文本 | 接下来是什么? |
---|---|---|
[1] |
"The" | 下一个词是什么? |
[1, 32] |
"The cat" | 下一个词是什么? |
[1, 32, 542] |
"The cat is" | 下一个词是什么? |
[1, 32, 542, 123] |
"The cat is beautiful" | 下一个词是什么? |
[1, 32, 542, 123, 13] |
"The cat is beautiful." | 下一个词是什么?我想我应该停止了。 |
Token 也被用作 LLM 部署中要考虑的首要指标。特别是决定同一 LLM 模型的 GPU,或者在同一 GPU 上决定较小 (1.7B) 或较大 (70B) 模型时,基于 token 的指标非常有用,除了模型的语义性能/评估之外。
指标 | 描述 | 何时重要 |
---|---|---|
首个 Token 时间 (TTFT) | 从发送 prompt 到接收第一个 token 的时间。 | 🧠 对于交互式应用、聊天机器人、编码助手、低延迟 UI 很重要 |
每秒 Token 数 (TPS) | 模型在第一个 token 之后生成 token 的速度。 | 📊 对于批量处理、摘要和更长的输出至关重要 |
Prompt 长度(输入 Token) | 输入中的 token 数量。影响内存和上下文成本。 | 🧾 选择上下文窗口大小、管理 VRAM 使用的关键 |
输出长度(生成的 Token) | 模型需要生成的 token 数量。 | 🎯 用于估计延迟、吞吐量和推理成本 |
总 Token(输入 + 输出) | 每个请求的组合 token 计数。用于吞吐量和成本估算。 | 💸 定价、速率限制和 SLA 规划的必要条件 |
3. 如何估算运行 SaaS 和开源 LLM 模型的成本?
这是一个很好的问题,可以区分部署/决定部署 LLM 模型的人。我们团队的目的是评估我们是否应该在 GPU 上部署模型(如 runpod, Lambda Labs, Modal,或 AWS Bedrock, Google Cloud Vertex, Azure)或使用公共 SaaS API(如 OpenAI, Anthropic, Cohere, 或 Mistral API)。
我不会在这里点名(品牌宣传),而是试图在面试中使用这些名字。我希望他们雇用我,我发誓我不会通过这个 GitHub 托管的网站赚钱 :) 。
让我们举一些例子。
假设我们有一个 AI 应用程序,我们估计一个月有 100,000 个 API 请求,周末的需求/流量不高。我们预计下午的请求量会达到峰值。我们的应用程序读取 3 页长的 PDF 并返回一个摘要,通常为 250 个单词。
你应该阅读这个
3.1 SaaS 模型
API 定价主要固定为
- 每个模型的定价(模型越智能/越大,成本越高)
- 基于输入/输出 token 的定价(对于每个模型,我们都有输入/输出 token 成本)
让我们看一下 OpenAI 定价(2025 年 5 月 15 日):
模型 | 描述 | 输入(1M tokens) | 缓存输入(1M tokens) | 输出(1M tokens) |
---|---|---|---|---|
GPT-4.1 | 用于复杂任务的最智能模型 | $2.00 | $0.50 | $8.00 |
GPT-4.1 Mini | 平衡速度和智能的经济实惠模型 | $0.40 | $0.10 | $1.60 |
GPT-4.1 Nano | 用于低延迟任务的最快、最具成本效益的模型 | $0.100 | $0.025 | $0.400 |
我们已经尝试过,我们的任务足以使用 GPT-4.1 Mini 完成,所以我们选择它。
由于扩展对我们来说不是问题,而是由 OpenAI 解决的(我们仍然会遇到问题)。
- 3 页长的 PDF 应该是 500 * 3 = 1500 个单词。
- 1 个单词大约是 0.75 个 token (来源)。
- 这意味着我们将有: 1500 个单词 * 0.75 个 token/单词 = 每个请求 1125 个输入 token。
- 平均而言,每个输出 250 个单词意味着: 250 个单词 * 0.75 个 token/单词 = 187.5 个输出 token。
- 输入 Token: 1125 个 token * 100,000 个请求 * $0.4 / 1 百万个 token = $45
- 输出 Token: 187.5 个 token * 100,000 个请求 * $1.60 / 1 百万个 token = $30
$45.00(输入)+ $1.875(输出)= $75
但是,OpenAI 和任何 API 提供商都可能有停机时间,并且它们都有速率限制,因此你应该考虑添加另一个 API 提供商作为备份,以防 API 请求失败。
例如,在我们的应用程序中,我们经常达到每分钟 60 个请求的限制 (x-ratelimit-limit-requests
)。为了解决这个问题:
- 如果响应时间不重要,你可以使用批量处理或延迟代码库中的请求
- 使用另一个 LLM API 作为备份。
字段 | 示例值 | 描述 |
---|---|---|
x-ratelimit-limit-requests |
60 | 达到速率限制之前允许的最大请求数。 |
x-ratelimit-limit-tokens |
150000 | 达到速率限制之前允许的最大 token 数。 |
x-ratelimit-remaining-requests |
59 | 达到速率限制之前允许的剩余请求数。 |
x-ratelimit-remaining-tokens |
149984 | 达到速率限制之前允许的剩余 token 数。 |
x-ratelimit-reset-requests |
1s | 请求速率限制重置之前的剩余时间。 |
x-ratelimit-reset-tokens |
6m0s | token 速率限制重置之前的剩余时间。 |
但很明显,70 美元比部署 LLM 模型便宜得多。
5. 解释 Prompt 工程的基本结构
注:我可能需要在这部分添加更多内容。
在深入探讨之前,对我来说,以下结构在我的月活用户达 5000 的应用和两个概念验证项目中都非常有用。尽管你可能之前见过这张图,并会说"又是某个 AI 网红的内容",但请三思。
learnprompting.org |
我们现在要讨论的这种结构,实际上主要用于用户期望获得单一、非对话式答案的应用:
- 根据某些规则生成面试问题。-> 你给出问题,就此结束。
- 用中立的语气总结内容。-> 内容被总结出来,然后给你。
然而,如果你正在开发一个对话式应用,你需要考虑:
- 当消息数量增加时,规则往往会被忽略。
- 用户可能会尝试越狱劫持。
- 如果对话持续很长时间(通常发生在你将一些文本/文档粘贴到对话中时),你就会超出模型的上下文长度,你一开始的"命令式 prompt"会根据 FIFO(先进先出)原则被排除,以适应上下文长度。
让我们来看一下上述情况,插图非常有用。
5.1 角色 Prompting
角色是定义 AI 在回应你时应该扮演什么。它可以是历史学家,也可以是提问尖锐的面试官,或者是一个友善的客服人员。
切记,这是你的 AI 读取到的第一件事! 尽管在实践中,你可能会发现随意放置命令仍然有效,但事实证明,你放置命令/输入重要上下文的位置很重要。
《Lost in the Middle: How Language Models Use Long Contexts》 及论文精彩摘要
《LLMs Get Lost in Multi-turn Conversation》 及论文精彩摘要
定义 AI 的角色/情绪会使其为思考主题的风格/方式做好准备。
让我们在 qwen:1-7B 上看看这个:
用户:你是一名专业的面试官。你会向产品经理提出哪些面试问题?
助手:好的,我需要想出专业的面试官会在面试中向产品经理提出哪些问题。让我先回忆一下我对产品经理面试的了解。产品经理负责定义产品目标、管理产品生命周期,并确保一致性......很多事情......首先,我应该考虑产品经理角色的不同方面......* 我记得面试通常以问候和介绍开始。*...
助手:你好,欢迎来到面试......
在思考过程中,AI 意识到专业的面试官会问候面试者。
而如果你不通过说"你是一名专业的面试官"来分配角色,AI 会直接跳到问题:
助手:……例如,他们不应该问"你认为产品管理怎么样?",而应该问"你如何着手为新功能定义产品策略?"……
因此,在第一段中,你应该充分定义:
- 角色 (Role)
- 心态 (Mindset)
- 语气 (Tone)
- 风格 (Style)
- 行为 (Behavior)
- 目标 (Goal)
- 受众 (Audience)
- 约束 (Constraints)
5.2 指令 Prompt
你已经为 AI 分配了角色,接下来你应该限制它专注于其职责范围内的特定任务。
在这一部分,你应该具体并直接命令 AI 做什么,以以下词语开头:指定 (Specify)、总结 (Summarize)、翻译 (Translate)、执行 (Do)、分类 (Classify)、划分 (Divide)、区分 (Distinguish)。
然后,你应该继续泛泛地阐述行动要点。
用户:将给定文本翻译成土耳其语,考虑土耳其语中同义词的本地化,就如同同义词的直接翻译对目标语言有意义一样。
在定义规则时,你也应该考虑 Markdown 标签,这已经被证明有效:
/## 通用规则
- 尽量与翻译后的词数保持一致,以便翻译不增加页数。
/## 避免
- 绝不要翻译文章中的技术词汇,DuckDB 在土耳其语中不是 ordekDB!
5.3 定义示例
我用 LLM 和 RAG 构建了三个大型应用程序。我可以向你保证,好的示例比冗长的指令式 prompt 好十倍。无论你在指令中定义了什么,在一些上下文之后,AI 要么不遵循,要么会陷入细节。即使没有任何指令 prompt,好的示例也能奏效。
你需要定义好示例,包括:
- 要做什么(这肯定要)
- 不要做什么
例如:
#### ✅ 好的示例:
Q: 你能解释一下 Transformer 中的自注意力机制吗?
A: 当然!可以想象每个词都在看其他所有词,并问:"我应该关心你吗?"...
#### ❌ 坏的示例:
A: 自注意力是一种允许每个 token... [复制粘贴的维基百科级别的信息堆砌]...
如果你想获得 JSON 输出,通过使用 ==JSON 模式== 或 ==结构化输出==,你需要在 prompt 中定义响应格式:
{
"title": "NLP 中 Transformer 的兴起",
"author": "简·多伊",
"main_points": [
"Transformer 通过使用自注意力彻底改变了 NLP。",
"它们实现了 token 的并行处理。",
"它们已成为现代语言模型的基础。"
]
}
或者
{
"title": str 电影标题,
"author": str 作者,
"main_points": List of str 包含 3-4 个词的要点解释
}
或者
在 OpenAI Python 中:
from pydantic import BaseModel, Field
class MovieSummary(BaseModel):
title: str = Field(..., description="电影标题")
author: str = Field(..., description="电影或文章的作者")
main_points: List[str] = Field(
...,
description="要点列表(每个 3-4 个词),总结内容"
)
OpenAI 也会从这里读取描述!我受益匪浅。
6. 解释上下文学习 (in-context learning)
《Language Models are Few-Shot Learners》
AI 不可能每天都用最新数据进行训练。这根本不现实。但 AI 有其智能,可以解读给定的数据。检索增强生成 (RAG) 正是利用这一原理,通过管道将数据引入 prompt,从而让你的 AI 了解这些信息。
以莎士比亚英语的风格继续以下故事片段:
故事开头:"The sun dipped below the horizon, casting a golden glow on the ancient castle."
(夕阳西下,金色的余晖洒落在那座古老的城堡上。)
续写:
Lo, the amber light did kiss yon aged stones,
Where whispered secrets dwell in shadowed tones.
(看啊,琥珀色的光亲吻着那古老的石头,
低语的秘密在阴影中回荡。)
然后,AI 就会按照你训练它的方式进行。
! 说实话,我很不好意思解释这个,不幸的是现在我们都需要知道这些"守门员"式的名词了 :/
上下文学习 (ICL) 的独特之处在于什么?
- 不更新参数:模型的权重保持不变;学习仅通过 prompt 上下文发生。
- 瞬时知识:获得的知识是暂时的,并且仅限于当前的 prompt;它不会被永久存储。
- 少样本学习:通常被称为少样本或少样本 prompt,因为模型只需要少数几个示例就能泛化任务。
- 利用预训练:模型越好,ICL 效果越好。
7. 解释 Prompt 工程的类型
PromptingGuide AI 和 Digital Adoption Blog 拥有关于 prompt 类型最棒的内容。所以我的资源主要会依赖它们。
Digital Adoption 的 Prompt 工程类型 |
7.1 零样本 Prompting
你信任 LLM,并直接提出你的任务。
用户:撰写一封冷启动邮件,向潜在客户介绍我们新的 SaaS 产品。
助手:请看:……
7.2 少样本 Prompting
你还会通过几个示例来解释应该怎么做。我记得 2018-19 年 Bilkent 大学的一些教授(Gokberk Cinbis 和另一位女士)在研究少样本 prompt。那时我心想:"这不可能。"
用户:撰写一封冷启动邮件,向潜在客户介绍我们新的 SaaS 产品。它应该看起来像:主题:使用 [您的 SaaS 产品名称] 🚀 解锁效率和增长!您好 [名字],……
助手:这是模仿示例生成的邮件:……
或者你可以添加要做和不要做的示例:
用户:这太棒了! // 负面 用户:这很有前景! // 正面
助手:……附件看起来很有前景……
7.3 Prompt 链
当你希望 AI 先摄取/预处理部分数据,然后应用其他流程来获得最终结果时,这种方法很有用。
它主要用于文档问答或基于检索的管道。
placeholder_for_statements = get_statements_from_db(id=[123,32,124,523])
messages = []
initial_prompt = [
{"role":"user", "content":f"判断哪些陈述与公司财务相关,并对其进行排名。{placeholder_for_statements}",
]
ai_response = ai.response(initial_prompt)
chain = [
initial_prompt,
ai_response,
{"role":"user", "content":"总结前两份文档。......假设你在这里添加了大量的指令,因为 AI 会更专注于这里,因为文档很长,而且我们知道如果我们将所有内容都转储到一个 prompt 中,AI 会出现幻觉/迷失在上下文中,正如我们之前讨论的那样......"]
final_response = ai.response(chain)
7.4 思维链 (COT) Prompting
这个简单的 prompt 思想为大多数 LLM 模型带来了巨大的性能提升,尤其是 Deepseek。
我们在这里尝试让 AI 做的是让它思考、定义步骤并尝试解决问题;而不是让它在第一次尝试(单个 prompt)中就解决问题。
系统:你是一个乐于助人的助手,通过在给出最终答案之前解释每个步骤来解决问题。
用户:如果你有 4 支笔,又买了 3 支,你总共有多少支笔?
助手:让我们一步步思考:
1.你最初有 4 支笔。 2.你又买了 3 支笔。 3.把它们加起来:4 + 3 = 7。 答案:7
8. 什么是幻觉,以及如何使用 Prompt 工程来控制它?
幻觉是 LLM 生成的虚假、捏造或不一致的输出,这些输出与输入或现实世界事实不符 此处、此处、此处、此处。
原因:
示例:
- 事实不准确:模型可能会说"埃菲尔铁塔在柏林"或"莎士比亚出生于 1609 年",这些都是错误的事实。
- 无意义的陈述:它可能会生成诸如"我爱冬天,但我讨厌寒冷的天气"或"猫对着邮递员大声叫"之类的句子,这些句子在逻辑上或事实上都没有意义。
- 上下文或指令不匹配:例如,如果你要求总结一本书,它可能会开始谈论作者的传记而不是情节。或者它可能会忽略以正式语气写作的请求,而随意回复。
- 逻辑不一致:模型可能会说"如果所有的狗都是动物,而有些动物是猫,那么有些狗就是猫",这是一个基于错误逻辑的错误结论。此处
如何检测:
- 分析 prompt 的歧义性
- 生成内容内部的一致性和交叉检查
- 使用知识库或 API 进行外部事实验证 此处
如何减少或消除幻觉:
- 整理和改进训练数据质量
- 使用领域特定数据对模型进行微调
- 使用 prompt 工程
- 使用低 temperature(温度)来控制混乱度
- 结合检索增强生成 (RAG),将输出基于经过验证的外部知识 此处
检索增强生成 (RAG) 的作用:
- 进行上下文学习,因此它根据其最新的信息来生成响应
- 在生成过程中集成外部事实数据库
- 将输出基于真实数据,显著减少幻觉 此处
由于固有的模型限制和学习约束,目前无法完全消除幻觉 此处。
9. 在使用少样本 prompt 时,有哪些需要注意的方面?
待续。
10. 编写好的 prompt 有哪些策略?
待续。
11. 如何通过 prompt 工程提高 LLM 的推理能力?
待续。
12. 如果你的思维链 (COT) prompt 失败了,如何改进 LLM 的推理?
待续。
旁注:
- 博客中 90% 的内容是/将由我撰写。
- 我可能会使用 ChatGPT 来创建 10% 的博客内容,只是为了让内容更容易阅读/将算法格式化为 Markdown 格式。但仅限于此。只是为了提供帮助。
- 这不意味着我使用 ChatGPT 创作文章,然后进行校对和补充。而是说我自己创作文章,在这个过程中发现 ChatGPT 可以比我更好地绘制图表/格式化算法,然后我向它提供我想解释的内容,它会为博客的某些部分提供更好的格式/更有趣的内容。
- 原因是,我花时间创作内容,并且在写作的同时也在学习,但在写作之前我已经理解了内容,所以我想尽量减少写作时间。