Prompt 工程与 LLM 基础知识

2025年5月20日

1. 预测/判别式 AI 和生成式 AI 有什么区别?

预测/判别式 AI 通常应用于非对话领域,领域专家会使用 CNN、基于树的算法、NER 模型等,来进行预测、推荐、决策和预测等

另一方面,生成式 AI 可以创建内容、代码、音乐和营销材料,并可以将数据翻译成不同的格式。

早期生成式 AI 模型的例子包括变分编码器 (Variational Autoencoders) 和 GAN,比如这个这个,它们在当时让我非常惊叹。

随着 Transformer 模型的兴起,我们已经看到了代码生成、音乐生成、视频到视频的转换、文本到视频的生成以及 LLM 的例子。

来自 Amazing ML Mastery Blog 的资源,他们教会了数百万人,向他们致敬

GENAI 的局限性

  • 资源消耗高
  • 幻觉
  • 仍在努力使算法更稳定,从 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 AIDigital 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 生成的虚假、捏造或不一致的输出,这些输出与输入或现实世界事实不符 此处此处此处此处

原因:

  • 训练数据偏差和空白
  • 模型上下文理解有限
  • 不完整或误导性的 prompt
  • 模型架构和随机解码缺陷 此处此处此处

示例:

  • 事实不准确:模型可能会说"埃菲尔铁塔在柏林"或"莎士比亚出生于 1609 年",这些都是错误的事实。
  • 无意义的陈述:它可能会生成诸如"我爱冬天,但我讨厌寒冷的天气"或"猫对着邮递员大声叫"之类的句子,这些句子在逻辑上或事实上都没有意义。
  • 上下文或指令不匹配:例如,如果你要求总结一本书,它可能会开始谈论作者的传记而不是情节。或者它可能会忽略以正式语气写作的请求,而随意回复。
  • 逻辑不一致:模型可能会说"如果所有的狗都是动物,而有些动物是猫,那么有些狗就是猫",这是一个基于错误逻辑的错误结论。此处

如何检测:

  • 分析 prompt 的歧义性
  • 生成内容内部的一致性和交叉检查
  • 使用知识库或 API 进行外部事实验证 此处

如何减少或消除幻觉:

  • 整理和改进训练数据质量
  • 使用领域特定数据对模型进行微调
  • 使用 prompt 工程
  • 使用低 temperature(温度)来控制混乱度
  • 结合检索增强生成 (RAG),将输出基于经过验证的外部知识 此处

检索增强生成 (RAG) 的作用:

  • 进行上下文学习,因此它根据其最新的信息来生成响应
  • 在生成过程中集成外部事实数据库
  • 将输出基于真实数据,显著减少幻觉 此处

由于固有的模型限制和学习约束,目前无法完全消除幻觉 此处

9. 在使用少样本 prompt 时,有哪些需要注意的方面?

待续。

10. 编写好的 prompt 有哪些策略?

待续。

11. 如何通过 prompt 工程提高 LLM 的推理能力?

待续。

12. 如果你的思维链 (COT) prompt 失败了,如何改进 LLM 的推理?

待续。

旁注:

  • 博客中 90% 的内容是/将由我撰写。
  • 我可能会使用 ChatGPT 来创建 10% 的博客内容,只是为了让内容更容易阅读/将算法格式化为 Markdown 格式。但仅限于此。只是为了提供帮助。
  • 这不意味着我使用 ChatGPT 创作文章,然后进行校对和补充。而是说我自己创作文章,在这个过程中发现 ChatGPT 可以比我更好地绘制图表/格式化算法,然后我向它提供我想解释的内容,它会为博客的某些部分提供更好的格式/更有趣的内容。
  • 原因是,我花时间创作内容,并且在写作的同时也在学习,但在写作之前我已经理解了内容,所以我想尽量减少写作时间。