目 录CONTENT

文章目录

LLM - 应用开发基础

PySuper
2025-04-12 / 0 评论 / 0 点赞 / 42 阅读 / 0 字
温馨提示:
本文最后更新于2026-08-08,若内容或图片失效,请留言反馈。 所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

大型语言模型(LLM)在应用开发层面的核心技术概念,涵盖从 Token 计费到上下文工程的完整应用链路,适合作为 LLM 应用开发的核心知识参考资料

1. Tokenization

1.1 定义

在应用开发层面,Tokenization 不仅是模型内部的分词过程,更是 计费单位、预算估算和上下文管理的基础。

应用开发者不需要实现分词算法,但必须理解 Token 如何影响成本、延迟和功能边界。

1.2 Token 计费模型

LLM API 的计费以 Token 为单位,而非字符或字节。

理解 Token 与文本的换算关系直接决定成本估算的准确性。

计费公式:
  总成本 = (输入 Token 数 × 输入单价) + (输出 Token 数 × 输出单价)

示例 (GPT-4 定价):
  输入: $0.03 / 1K tokens
  输出: $0.06 / 1K tokens

  用户输入 500 tokens, 模型输出 200 tokens:
  成本 = 500 × 0.03/1000 + 200 × 0.06/1000
       = 0.015 + 0.012
       = $0.027

1.3 不同文本类型的 Token 换算

不同语言和格式的文本,Token 效率差异巨大:

文本类型

字符数

Token 数

字符/Token 比

说明

英文短句

44

9

~4.9

英文效率最高

中文短句

14

14

~1.0

中文通常 1 字 ≈ 1-2 token

Emoji

10

10~30

~0.3~1.0

Emoji 占用大量 Token

Python 代码

42

16

~2.6

代码含符号和关键字

中英混合

42

20

~2.1

混合文本效率居中

关键规律:
  英文:   1 token ≈ 4 字符  (效率最高)
  中文:   1 字  ≈ 1-2 token  (成本约为英文 4-8 倍)
  Emoji:  1 个  ≈ 1-3 token  (尽量避免大量使用)
  代码:   1 token ≈ 2-3 字符  (符号多, 效率较低)

1.4 Token 预算估算

def estimate_token_budget(text: str, model: str = "gpt-3.5-turbo") -> dict:
    """估算文本的 Token 数量和成本"""
    enc = tiktoken.get_encoding("cl100k_base")
    tokens = enc.encode(text)
    token_count = len(tokens)

    # 不同模型的上下文窗口
    context_windows = {
        "gpt-3.5-turbo": 4096,
        "gpt-4": 8192,
        "gpt-4-turbo": 128000,
        "claude-3": 200000,
    }

    max_tokens = context_windows.get(model, 4096)
    usage_rate = token_count / max_tokens

    return {
        "token_count": token_count,
        "max_tokens": max_tokens,
        "usage_rate": f"{usage_rate:.1%}",
        "remaining": max_tokens - token_count,
    }

1.5 应用层最佳实践

  • 成本预估:在发送请求前预估 Token 数,避免意外高额账单

  • 上下文规划:根据模型窗口大小规划对话历史长度

  • 多语言优化:中文场景下 Token 成本约为英文 4-8 倍,翻译策略需权衡

  • 输入预处理:去除冗余空白、HTML 标签等无意义内容以节省 Token

1.6 与其他概念的关联

  • -> 上下文窗口管理:Token 数量决定是否超出窗口限制

  • -> LLM API 调用:Token 是 API 计费和限流的基本单位

  • -> Context Engineering:Token 预算分配是上下文工程的核心约束


2. Embedding 与语义搜索

2.1 定义

Embedding(嵌入)在应用层用于将文本转换为高维向量,使语义相近的文本在向量空间中距离更近

语义搜索(Semantic Search)基于向量相似度匹配查询与文档,超越传统关键词匹配的限制,能理解"意思"而非"字面"

2.2 核心原理

2.2.1 文本向量化

文本 -> Embedding 模型 -> 高维向量 (如 1536 维)

"机器学习"  -> [0.12, -0.34, 0.56, ..., 0.78]  (1536维)
"深度学习"  -> [0.11, -0.32, 0.55, ..., 0.77]  (向量相近)
"天气预报"  -> [0.89, 0.23, -0.67, ..., 0.01]  (向量差异大)

2.2.2 相似度计算

余弦相似度(最常用):cosine_sim(A,B)=A⃗⋅B⃗∣A⃗∣×∣B⃗∣{cosine\_sim}(A, B) = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| \times |\vec{B}|}

值域为 [-1, 1],越接近 1 表示语义越相似。

def cosine_similarity(vec_a: list[float], vec_b: list[float]) -> float:
    """计算两个向量的余弦相似度"""
    dot = sum(a * b for a, b in zip(vec_a, vec_b))
    norm_a = math.sqrt(sum(a * a for a in vec_a))
    norm_b = math.sqrt(sum(b * b for b in vec_b))
    if norm_a == 0 or norm_b == 0:
        return 0.0
    return dot / (norm_a * norm_b)

2.2.3 其他相似度度量

度量方法

公式

特点

适用场景

余弦相似度

A⋅B∣A∣∣B∣\frac{A \cdot B}{|A||B|}

忽略向量长度,关注方向

文本语义匹配(推荐)

点积

A⋅BA \cdot B

计算简单,考虑向量长度

已归一化的向量

欧氏距离

∑(ai−bi)2\sqrt{\sum(a_i - b_i)^2}

关注绝对距离

图像、聚类

曼哈顿距离

∑∣ai−bi∣\sum|a_i - b_i|

对异常值不敏感

高维稀疏数据

2.3 语义搜索流程

┌─────────────────────────────────────────────────────────────┐
│                    语义搜索完整流程                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  离线建库:                                                   │
│  文档库 -> 分块 -> Embedding -> 向量存储                      │
│              ↓               ↓          ↓                    │
│           ["文档1块1"]    [0.1,...]   向量数据库               │
│           ["文档1块2"]    [0.2,...]   (Qdrant/Chroma)         │
│           ["文档2块1"]    [0.3,...]                            │
│                                                             │
│  在线查询:                                                   │
│  用户问题 -> Embedding -> 向量检索 -> Top-K -> 排序 -> 结果    │
│  "如何训练模型"  [0.15,...]   比较相似度   [块1,块3,块7]        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.4 语义搜索 vs 关键词搜索

维度

关键词搜索

语义搜索

匹配方式

字面精确匹配

语义相似度匹配

理解同义词

不能

能

理解上下文

不能

能

查询表述要求

需包含关键词

自然语言即可

计算成本

低

高(需 Embedding)

适合场景

精确查找(ID、代码)

语义查找(问答、推荐)

2.5 实际应用场景

场景1: 语义文档检索
  用户: "怎么提高模型准确率"
  关键词搜索: 找不到(文档中没有"提高"和"准确率")
  语义搜索: 找到"优化模型性能的方法"(语义匹配)

场景2: 智能客服
  用户: "退货流程是什么"
  语义搜索: 匹配到"退换货政策"相关文档

场景3: 代码搜索
  用户: "排序算法"
  语义搜索: 匹配到 sort(), quicksort, merge_sort 相关代码

2.6 与其他概念的关联

  • <- Tokenization:Embedding 以 Token 为输入

  • -> 上下文窗口管理:检索结果需要注入上下文窗口

  • -> RAG:语义搜索是 RAG 系统的核心检索组件


3. 上下文窗口管理

3.1 定义

上下文窗口(Context Window)是模型一次推理能处理的最大 Token 数

应用开发者需要在有限窗口内合理分配系统提示、对话历史、检索内容和响应空间

上下文窗口管理是在有限 Token 预算下最大化信息价值的关键工程

3.2 Token 预算分配

上下文窗口 (如 4096 tokens)
┌──────────────────────────────────────────────┐
│  System Prompt    │  系统提示词  (固定)        │  ~500 tokens
├───────────────────┼──────────────────────────┤
│  Conversation     │  对话历史  (可变)          │  ~2500 tokens
│  History          │  (多轮对话消息)            │
├───────────────────┼──────────────────────────┤
│  RAG Context      │  检索增强内容  (可变)      │  ~500 tokens
├───────────────────┼──────────────────────────┤
│  Reserved for     │  模型响应预留  (必须保留)   │  ~596 tokens
│  Response         │                          │
└──────────────────────────────────────────────┘

3.3 消息截断策略

当对话历史超出预算时,需要截断旧消息:

class ContextWindow:
    """管理对话上下文的 Token 预算"""

    def __init__(self, max_tokens: int = 4096, reserved_for_response: int = 500):
        """初始化窗口大小和响应预留空间"""
        self.max_tokens = max_tokens
        self.reserved_for_response = reserved_for_response
        self.messages: list[dict[str, str]] = []

    def get_budget(self) -> int:
        """获取可用于历史消息的 Token 预算"""
        return self.max_tokens - self.reserved_for_response

    def add_message(self, role: str, content: str) -> None:
        """添加消息,超预算则触发截断"""
        self.messages.append({"role": role, "content": content})
        while self.get_current_usage() > self.get_budget() and len(self.messages) > 1:
            self._truncate_oldest()

    def _truncate_oldest(self) -> None:
        """截断最旧的非系统消息(保护 System Prompt)"""
        for i, msg in enumerate(self.messages):
            if msg["role"] != "system":
                self.messages.pop(i)
                break

3.4 截断策略对比

策略

原理

优点

缺点

FIFO 截断

删除最旧的消息

实现简单

丢失早期重要上下文

摘要压缩

将旧消息摘要后保留

保留关键信息

摘要有损,需额外 LLM 调用

滑动窗口

只保留最近 N 轮

控制精确

可能丢失关键任务上下文

重要性筛选

按重要性评分保留

智能保留

评分逻辑复杂

3.5 摘要压缩

def summarize_messages(messages: list[dict], llm_handler) -> str:
    """将旧消息列表压缩为摘要"""
    conversation = "\n".join(f"{m['role']}: {m['content'][:100]}" for m in messages)
    prompt = f"请将以下对话历史压缩为简洁摘要,保留关键信息:\n{conversation}"
    return llm_handler(prompt)
截断 + 摘要组合策略:

  原始历史 (8条消息, 3000 tokens):
    [system] [user1] [ai1] [user2] [ai2] [user3] [ai3] [user4]

  Step 1: 保护 system, 截断 user1~ai2
  Step 2: 将 user1~ai2 摘要为 summary (200 tokens)
  Step 3: 保留 [system] [summary] [user3] [ai3] [user4]

  结果: 3000 tokens -> 1200 tokens (节省 60%)

3.6 不同模型的上下文窗口

模型

上下文窗口

约等于

适用场景

GPT-3.5-Turbo

4K

~3000 字中文

短对话

GPT-4

8K

~6000 字中文

中等任务

GPT-4-Turbo

128K

~96000 字中文

长文档处理

Claude-3-Opus

200K

~150000 字中文

超长文档

Gemini 1.5 Pro

1M

~750000 字中文

海量上下文

3.7 与其他概念的关联

  • <- Tokenization:Token 计数是窗口管理的基础

  • -> Context Engineering:窗口管理是上下文工程的具体实现

  • -> Function Calling:工具调用的结果也占用窗口预算


4. 采样参数实战

4.1 定义

采样参数(Temperature / Top-k / Top-p)控制 LLM 生成过程中的随机性和多样性。在应用开发中,不同任务需要不同的采样配置,正确组合使用这些参数是保证输出质量和适用性的关键。

对应 Demo: demos/01_LLM应用基础/04_温度与采样策略.py

4.2 三个核心参数

4.2.1 Temperature(温度)

Temperature 调整概率分布的"锐度":

  原始 Logits: [3.0, 2.0, 1.0, 0.5]

  T = 0.0:  [1.00, 0.00, 0.00, 0.00]  <- 完全确定 (贪婪)
  T = 0.7:  [0.70, 0.22, 0.05, 0.03]  <- 偏向最优,适度随机
  T = 1.0:  [0.64, 0.24, 0.09, 0.03]  <- 原始分布
  T = 1.5:  [0.42, 0.31, 0.19, 0.08]  <- 更随机,更有创意

4.2.2 Top-k(固定截断)

Top-k = 5: 只从概率最高的 5 个 Token 中采样

  原始分布: A(0.30) B(0.25) C(0.15) D(0.10) E(0.08) F(0.05) G(0.03) ...
  Top-5:   A(0.34) B(0.28) C(0.17) D(0.11) E(0.09)  <- 重新归一化
  其余:     置 0,不参与采样

4.2.3 Top-p(动态截断)

核采样

Top-p = 0.9: 保留累积概率达到 0.9 的最小集合

  排序: A(0.45) B(0.25) C(0.12) D(0.08) E(0.05) ...
  累积:  0.45   0.70    0.82    0.90 <- 达到 0.9, 截断
  核集合: {A, B, C, D} -> 重新归一化后采样

4.3 参数组合处理流程

完整采样流水线:

  模型输出 Logits
       |
       v
  +-------------+
  | Temperature  |  调整分布锐度 (logits / T -> softmax)
  +------+------+
         |
         v
  +-------------+
  |   Top-k     |  截断为概率最高的 k 个候选
  +------+------+
         |
         v
  +-------------+
  |   Top-p     |  从累积概率达 p 的核集合中采样
  +------+------+
         |
         v
    最终 Token
def apply_temperature(logits: list[float], temperature: float) -> list[float]:
    """应用温度缩放:高温更随机,低温更确定"""
    scaled = [l / max(temperature, 0.01) for l in logits]
    return softmax(scaled)


def top_k_sampling(logits: list[float], k: int, temperature: float = 1.0) -> list[float]:
    """Top-k 采样:只保留概率最高的 k 个 token"""
    probs = apply_temperature(logits, temperature)
    indexed = sorted(enumerate(probs), key=lambda x: x[1], reverse=True)
    top_indices = set(idx for idx, _ in indexed[:k])
    filtered = [p if i in top_indices else 0.0 for i, p in enumerate(probs)]
    total = sum(filtered)
    return [p / total for p in filtered] if total > 0 else filtered


def top_p_sampling(logits: list[float], p: float, temperature: float = 1.0) -> list[float]:
    """Top-p 核采样:保留累计概率达到 p 的最小 token 集合"""
    probs = apply_temperature(logits, temperature)
    indexed = sorted(enumerate(probs), key=lambda x: x[1], reverse=True)
    cumulative = 0.0
    keep_indices = set()
    for idx, prob in indexed:
        cumulative += prob
        keep_indices.add(idx)
        if cumulative >= p:
            break
    filtered = [p if i in keep_indices else 0.0 for i, p in enumerate(probs)]
    total = sum(filtered)
    return [p / total for p in filtered] if total > 0 else filtered

4.4 场景化参数推荐

场景

Temperature

Top-p

Top-k

说明

代码生成

0.0 ~ 0.2

0.9

-

需要确定性、准确性

事实问答

0.0 ~ 0.3

0.8

-

避免编造信息

数据提取

0.0

0.9

-

严格按格式输出

通用对话

0.7

0.9

-

平衡准确与自然

创意写作

0.9 ~ 1.0

0.95

-

鼓励多样性

头脑风暴

1.0 ~ 1.2

0.97

-

最大化创意

4.5 实际应用中的注意事项

注意事项:

1. Temperature = 0 不等于完全确定性
   - 不同 API 实现可能略有差异
   - 浮点精度可能导致微小变化

2. Top-k 和 Top-p 可以同时使用
   - 处理顺序: Temperature -> Top-k -> Top-p
   - 两者叠加会进一步缩小候选集

3. 参数选择的影响
   - 过低温度: 输出重复、呆板
   - 过高温度: 输出不连贯、幻觉
   - 建议从推荐值开始,根据效果微调

4. 流式输出中的采样
   - 采样参数在每一步 Token 生成都生效
   - 每步独立采样,不影响后续步的分布

4.6 与其他概念的关联

  • <- LLM核心.md 第7-10节:采样参数的底层原理

  • -> LLM API 调用:采样参数通过 API 请求传递

  • -> 结构化输出:低温度 + Top-p 确保 JSON 输出可靠性


5. Function Calling

5.1 定义

Function Calling 是 LLM 与外部世界交互的核心机制。LLM 根据用户意图决定调用哪个工具函数、生成调用参数,系统执行函数后将结果返回给 LLM,LLM 再基于结果生成最终回复。这使得 LLM 能访问实时数据、执行计算、操作外部系统。

对应 Demo: demos/01_LLM应用基础/05_Function_Calling.py

5.2 完整调用流程

+------------------------------------------------------------------+
|                  Function Calling 完整流程                        |
+------------------------------------------------------------------+
|                                                                  |
|  用户: "北京今天天气怎么样?"                                       |
|       |                                                          |
|       v                                                          |
|  +-------------+                                                 |
|  | 1. 构建请求  |  system + user message + tool_definitions      |
|  +------+------+                                                 |
|         |                                                        |
|         v                                                        |
|  +------------------+                                           |
|  | 2. LLM 推理      |  模型分析意图,决定调用 search_web 工具     |
|  |    返回 tool_call|  {name: "search_web", args: {query:"..."}} |
|  +------+-----------+                                           |
|         |                                                        |
|         v                                                        |
|  +------------------+                                           |
|  | 3. 参数校验      |  校验 query 参数类型和必填性                |
|  +------+-----------+                                           |
|         |                                                        |
|         v                                                        |
|  +------------------+                                           |
|  | 4. 执行函数      |  search_web("北京天气") -> "北京晴, 25 C"  |
|  +------+-----------+                                           |
|         |                                                        |
|         v                                                        |
|  +------------------+                                           |
|  | 5. 结果返回      |  将函数结果作为 tool message 送回 LLM       |
|  +------+-----------+                                           |
|         |                                                        |
|         v                                                        |
|  +------------------+                                           |
|  | 6. LLM 生成回复  |  "北京今天晴天,气温25度,适合户外活动。"    |
|  +------------------+                                           |
|                                                                  |
+------------------------------------------------------------------+

5.3 工具定义格式

# OpenAI 标准
TOOL_DEFINITIONS = [
    {
        "type": "function",
        "function": {
            "name": "search_web",
            "description": "搜索网络获取实时信息",
            "parameters": {
                "type": "object",
                "properties": {"query": {"type": "string", "description": "搜索关键词"}},
                "required": ["query"],
            },
        },
    }
]

5.4 工具定义的关键要素

要素

说明

重要性

name

函数名,需唯一且语义清晰

模型通过名称选择工具

description

功能描述,告诉模型何时使用

直接影响工具选择准确率

parameters

参数 Schema(JSON Schema 格式)

约束参数类型和结构

required

必填参数列表

确保关键参数不被遗漏

enum

枚举值约束

限制参数取值范围

5.5 参数校验与错误处理

def execute_tool(tool_name: str, arguments: dict, tools: dict) -> str:
    """执行工具调用,包含参数校验和错误处理"""
    if tool_name not in tools:
        return f"错误: 未知工具 '{tool_name}'"

    tool = tools[tool_name]
    handler = tool["handler"]
    params = tool.get("parameters", {})

    # 参数校验
    for param_name, param_def in params.items():
        if param_def.get("required") and param_name not in arguments:
            return f"错误: 缺少必填参数 '{param_name}'"

    # 类型检查
    for param_name, value in arguments.items():
        expected_type = params.get(param_name, {}).get("type", "string")
        if not check_type(value, expected_type):
            return f"错误: 参数 '{param_name}' 类型错误"

    # 执行
    try:
        result = handler(**arguments)
        return str(result)
    except Exception as e:
        return f"执行错误: {e}"

5.6 多工具选择

用户: "帮我查一下天气,然后算一下 25 * 37 等于多少"

LLM 决策:
  Step 1: 调用 search_web(query="今天天气")
  Step 2: 调用 calculate(expression="25 * 37")
  Step 3: 综合两个结果生成回复

多工具调用模式:
  - 串行: 工具 B 依赖工具 A 的结果
  - 并行: 工具 A 和 B 独立执行
  - 条件: 根据前一个工具结果决定是否调用下一个

5.7 与其他概念的关联

  • -> Agent 核心能力:Function Calling 是 Agent 调用工具的基础

  • -> 结构化输出:工具参数本身就是一种结构化输出

  • <- 上下文窗口管理:工具结果占用上下文窗口预算


6. 结构化输出

6.1 定义

结构化输出确保 LLM 返回可解析的格式化数据(如 JSON),而非自由文本。通过 JSON Mode、Schema 约束和输出验证,将不可靠的自然语言转换为程序可信赖的结构化对象,是 LLM 与传统软件系统集成的关键桥梁。

对应 Demo: demos/01_LLM应用基础/06_结构化输出.py

6.2 为什么需要结构化输出

无结构化输出 (不可靠):
  用户: "提取这句话的信息: 张三,25岁,北京"
  LLM:  "这个人叫张三,今年25岁,住在北京市。"
  -> 程序无法直接解析,需正则提取,容易出错

有结构化输出 (可靠):
  用户: "提取这句话的信息: 张三,25岁,北京" (要求 JSON)
  LLM:  {"name": "张三", "age": 25, "city": "北京"}
  -> 程序直接 json.loads() 解析,类型安全

6.3 实现方式

6.3.1 JSON Mode

# 在 API 请求中指定 response_format
response = client.chat.completions.create(
    model="gpt-4",
    messages=[...],
    response_format={"type": "json_object"},  # 强制 JSON 输出
)

6.3.2 Schema 验证

@dataclass
class FieldSchema:
    """字段模式定义,模拟 Pydantic 的字段约束"""

    name: str
    field_type: str  # str, int, float, bool, list, dict
    required: bool = True
    default: Any = None
    description: str = ""
    enum: list[str] | None = None


@dataclass
class ModelSchema:
    """模型模式定义"""

    name: str
    fields: list[FieldSchema] = field(default_factory=list)

    def validate(self, data: dict) -> tuple[bool, str, dict]:
        """验证数据是否符合 schema"""
        result = {}
        for f in self.fields:
            if f.name not in data:
                if f.required:
                    return False, f"缺少必填字段: {f.name}", {}
                result[f.name] = f.default
                continue
            val = data[f.name]
            type_map = {"str": str, "int": int, "float": (int, float), "bool": bool, "list": list, "dict": dict}
            expected = type_map.get(f.field_type)
            if expected and not isinstance(val, expected):
                return False, f"类型错误: 期望{f.field_type}", {}
            if f.enum and val not in f.enum:
                return False, f"值 {val} 不在允许范围 {f.enum} 内", {}
            result[f.name] = val
        return True, "", result

6.4 输出解析与修复

def parse_llm_output(raw_output: str, schema: ModelSchema) -> dict:
    """解析 LLM 输出并验证,支持自动修复"""
    # 1. 尝试直接解析 JSON
    try:
        data = json.loads(raw_output)
    except json.JSONDecodeError:
        # 2. 尝试从文本中提取 JSON
        json_match = re.search(r"\{[^{}]*\}", raw_output, re.DOTALL)
        if json_match:
            data = json.loads(json_match.group())
        else:
            raise ValueError("无法解析为 JSON")

    # 3. Schema 验证
    success, error, cleaned = schema.validate(data)
    if not success:
        raise ValueError(f"Schema 验证失败: {error}")

    return cleaned

6.5 结构化输出的层次

可靠性递增:

  Level 1: 自然语言提示 ("请返回JSON格式")
    -> 模型可能不遵循,格式不稳定

  Level 2: JSON Mode (response_format)
    -> 保证输出是合法 JSON,但不保证字段结构

  Level 3: Schema 约束 (Function Calling / Structured Output)
    -> 模型按指定 Schema 输出,字段名和类型有保障

  Level 4: Schema 验证 + 自动重试
    -> 输出后验证,失败则重试,最高可靠性

6.6 实际应用场景

场景

输出格式

用途

信息抽取

{"name": "...", "age": ...}

从非结构化文本提取实体

分类任务

{"category": "A/B/C"}

文本分类、意图识别

代码生成

{"code": "...", "language": "..."}

生成可执行代码

数据转换

{"sql": "SELECT ..."}

自然语言转 SQL

评估打分

{"score": 0.85, "reason": "..."}

LLM as Judge

6.7 与其他概念的关联

  • <- Function Calling:工具参数依赖结构化输出

  • -> Few-Shot:示例可引导结构化输出格式

  • -> Prompt Chaining:链中每步的结构化输出是下一步的输入


7. System Prompt 设计

7.1 定义

System Prompt 是 LLM 的"操作系统",定义角色身份、能力边界、行为约束和输出格式。优秀的系统提示词让模型行为可预测、可控制;差的提示词导致幻觉和越界行为。System Prompt 拥有最高指令优先级,能约束后续所有用户输入。

对应 Demo: demos/01_LLM应用基础/07_System_Prompt设计.py

7.2 指令层级体系

指令优先级 (从高到低):

+-------------------------------------------+
|  System Prompt (最高优先级)               |  定义身份、边界、规则
|  "你是一个专业的客服助手,只能回答..."    |
+-------------------------------------------+
|  Task Prompt (中优先级)                   |  定义当前任务要求
|  "请总结以下文档的核心要点..."            |
+-------------------------------------------+
|  User Input (低优先级)                    |  用户实际输入
|  "帮我写一首诗"                           |
+-------------------------------------------+

规则: 高层级指令可以覆盖低层级指令
      System Prompt 约束所有后续交互

7.3 系统提示词的结构化构建

class SystemPromptBuilder:
    """结构化系统提示词构建器"""

    def __init__(self):
        self.role: str = ""
        self.capabilities: list[str] = []
        self.constraints: list[str] = []
        self.output_format: str = ""
        self.examples: list[dict[str, str]] = []

    def set_role(self, persona: str, expertise: str) -> SystemPromptBuilder:
        """设定角色身份和专业领域"""
        self.role = f"你是一个{persona},擅长{expertise}。"
        return self

    def add_constraint(self, constraint: str) -> SystemPromptBuilder:
        """添加行为约束"""
        self.constraints.append(constraint)
        return self

    def build(self) -> str:
        """组装完整的系统提示词"""
        sections = [self.role]
        if self.capabilities:
            caps = "\n".join(f"  - {c}" for c in self.capabilities)
            sections.append(f"【你的能力】\n{caps}")
        if self.constraints:
            cons = "\n".join(f"  - {c}" for c in self.constraints)
            sections.append(f"【行为约束】\n{cons}")
        if self.output_format:
            sections.append(f"【输出格式】\n{self.output_format}")
        return "\n\n".join(sections)

7.4 系统提示词的五大组件

+-----------------------------------------------------------+
|                   优秀 System Prompt 的结构                 |
+-----------------------------------------------------------+
|                                                           |
|  1. 角色定义 (Role)                                       |
|     "你是一个资深 Python 开发工程师"                        |
|     -> 设定专业领域和知识边界                               |
|                                                           |
|  2. 能力描述 (Capabilities)                                |
|     "你可以:编写代码、审查代码、解释技术概念"              |
|     -> 明确能做什么                                        |
|                                                           |
|  3. 行为约束 (Constraints)                                 |
|     "你不能:执行代码、访问网络、讨论非技术话题"            |
|     -> 明确不能做什么(安全边界)                          |
|                                                           |
|  4. 输出格式 (Output Format)                               |
|     "回答时请使用 Markdown 格式,代码块标注语言"            |
|     -> 规范输出结构                                        |
|                                                           |
|  5. 示例引导 (Examples)                                    |
|     "示例:用户问X,你回答Y"                              |
|     -> 通过示例锚定行为模式                                |
|                                                           |
+-----------------------------------------------------------+

7.5 常见设计模式

模式

说明

示例

角色锚定

赋予明确专业身份

"你是儿科医生"

边界约束

限制回答范围

"只回答与编程相关的问题"

格式指定

规定输出格式

"输出 JSON,包含 code 和 explanation"

语气控制

设定交流风格

"用简洁专业的方式回答"

安全策略

防止有害输出

"拒绝任何涉及暴力的请求"

Fallback 策略

兜底行为

"不确定时回答'我需要更多信息'"

7.6 Token 预算考量

System Prompt 的 Token 成本:

  每次请求都会发送 System Prompt
  -> 如果 System Prompt 1000 tokens,1000 次请求 = 1M tokens

  优化策略:
  1. 精简描述,去除冗余
  2. 使用列表而非段落(更紧凑)
  3. 将固定规则缓存(Prompt Caching)
  4. 分层设计:核心规则放 System,场景规则放 Task

7.7 与其他概念的关联

  • -> Few-Shot 与提示模板:示例是 System Prompt 的组件之一

  • -> 上下文窗口管理:System Prompt 占用固定 Token 预算

  • -> Context Engineering:System Prompt 是上下文中最高优先级的内容


8. Few-Shot 与提示模板

8.1 定义

Few-Shot Learning 通过在提示词中提供少量输入-输出示例来引导模型行为,使其无需微调即可适应新任务。提示模板(Prompt Template)将变量与固定文本组合,实现可复用、可管理的提示词工程。两者结合构成了应用层提示工程的核心工具。

对应 Demo: demos/01_LLM应用基础/08_Few_Shot与提示模板.py

8.2 Few-Shot 原理

Zero-Shot (零样本):
  "判断情感:'这个产品太棒了'"
  -> 模型可能不确定输出格式

Few-Shot (少样本):
  "判断情感:
   输入: '太难用了' -> 输出: 负面
   输入: '非常满意' -> 输出: 正面
   输入: '一般般' -> 输出: 中性
   输入: '这个产品太棒了' -> 输出: ?"
  -> 模型学会格式和分类标准,输出: 正面

8.3 示例数据结构

@dataclass
class FewShotExample:
    """单个 Few-Shot 示例: 输入 + 输出 + 可选解释"""

    input: str
    output: str
    explanation: str = ""

    def render(self) -> str:
        """渲染为提示词文本"""
        text = f"输入: {self.input}\n输出: {self.output}"
        if self.explanation:
            text += f"\n(理由: {self.explanation})"
        return text

8.4 示例选择策略

策略

原理

适用场景

固定示例

预设一组通用示例

任务简单、模式固定

随机采样

从示例池随机选取

避免过拟合特定示例

相似度选择

选与输入最相似的示例

任务复杂、模式多样

聚类选择

从不同聚类中各选一个

保证示例多样性

class ExampleSelector:
    """示例选择器:根据输入动态选择最相关的示例"""

    def __init__(self, examples: list[FewShotExample], max_examples: int = 3):
        self.examples = examples
        self.max_examples = max_examples

    def select(self, query: str) -> list[FewShotExample]:
        """选择与查询最相似的示例"""
        scored = [(self._similarity(query, ex.input), ex) for ex in self.examples]
        scored.sort(key=lambda x: x[0], reverse=True)
        return [ex for _, ex in scored[: self.max_examples]]

8.5 提示模板

class PromptTemplate:
    """带变量替换的提示词模板"""

    def __init__(self, name: str, template: str, input_variables: list[str]):
        self.name = name
        self.template = template
        self.input_variables = input_variables

    def render(self, **kwargs) -> str:
        """用实际值填充模板变量"""
        missing = set(self.input_variables) - set(kwargs.keys())
        if missing:
            raise ValueError(f"缺少变量: {missing}")
        return self.template.format(**kwargs)

    def token_count(self, **kwargs) -> int:
        """渲染后统计 Token 数"""
        enc = tiktoken.get_encoding("cl100k_base")
        return len(enc.encode(self.render(**kwargs)))

8.6 模板管理最佳实践

模板库管理:

  templates/
  +-- classification/
  |   +-- sentiment.txt       # 情感分类模板
  |   +-- intent.txt          # 意图分类模板
  +-- extraction/
  |   +-- entity.txt          # 实体抽取模板
  |   +-- relation.txt        # 关系抽取模板
  +-- generation/
      +-- summary.txt         # 摘要生成模板
      +-- code_review.txt     # 代码审查模板

  版本管理:
  - 每个模板标注版本号和变更记录
  - A/B 测试不同模板的效果
  - 模板变量需有默认值和类型约束

8.7 Few-Shot vs Fine-Tuning

维度

Few-Shot

Fine-Tuning

成本

低(仅推理时多花 Token)

高(需训练数据和算力)

灵活性

高(随时修改示例)

低(需重新训练)

效果

适合简单任务

适合复杂、高频任务

延迟

增加(示例占 Token)

不增加

数据需求

3-10 个示例

数千条数据

8.8 与其他概念的关联

  • <- System Prompt 设计:Few-Shot 示例可作为 System Prompt 组件

  • -> Prompt Chaining:每步链使用独立模板

  • -> 结构化输出:示例可引导结构化输出格式


9. Prompt Chaining

9.1 定义

链式提示

Prompt Chaining 将复杂任务拆解为多个步骤,前一步的输出作为后一步的输入,形成链式处理流程。支持顺序链、并行分支和条件路由,实现可组合、可调试的 LLM 工作流。这是从单次 LLM 调用走向复杂 Agent 工作流的过渡技术。

对应 Demo: demos/01_LLM应用基础/09_Prompt_Chaining.py

9.2 链式架构

+----------------------------------------------------------+
|                    Prompt Chaining 架构                   |
+----------------------------------------------------------+
|                                                          |
|  顺序链 (Sequential Chain):                              |
|                                                          |
|  Step 1      Step 2      Step 3      Step 4             |
|  +-----+    +-----+    +-----+    +-----+              |
|  |理解  |--->|检索  |--->|分析  |--->|生成  |             |
|  |意图  |    |信息  |    |数据  |    |回复  |             |
|  +-----+    +-----+    +-----+    +-----+              |
|                                                          |
|  并行分支 (Parallel Branches):                           |
|                                                          |
|             +-----+                                      |
|        +--->|分支A |---+                                 |
|  +-----+|   +-----+   |+-----+                          |
|  |输入  |              ||合并  |                          |
|  +-----+|   +-----+   |+-----+                          |
|        +--->|分支B |---+                                 |
|             +-----+                                      |
|                                                          |
|  条件路由 (Conditional Routing):                         |
|                                                          |
|  +-----+    +---------+                                  |
|  |输入  |--->|分类判断  |---> 条件A -> Step A             |
|  +-----+    +----+----+---> 条件B -> Step B             |
|                  |        +-> 默认  -> Step C             |
|                  v                                        |
+----------------------------------------------------------+

9.3 链步骤定义

@dataclass
class ChainStep:
    """链中的一个步骤"""

    name: str
    prompt_template: str
    input_keys: list[str]
    output_key: str
    handler: Callable[[str], str] | None = None
    retry_count: int = 0
    fallback: str | None = None

    def execute(self, context: dict[str, Any]) -> str:
        """执行步骤:渲染提示词 -> 调用处理器 -> 返回结果"""
        prompt = self.render_prompt(context)
        for attempt in range(self.retry_count + 1):
            try:
                if self.handler:
                    return self.handler(prompt)
                return f"[模拟输出] {self.name} 已处理"
            except Exception:
                if attempt < self.retry_count:
                    continue
                if self.fallback is not None:
                    return self.fallback
                raise

9.4 提示链管理

class PromptChain:
    """提示链:管理步骤序列和中间结果传递"""

    def __init__(self, name: str = "chain"):
        self.name = name
        self.steps: list[ChainStep] = []
        self.context: dict[str, Any] = {}

    def add_step(self, step: ChainStep) -> PromptChain:
        """添加步骤到链尾"""
        self.steps.append(step)
        return self

    def run(self, initial_context: dict[str, Any]) -> dict[str, Any]:
        """执行整条链"""
        self.context.update(initial_context)
        for step in self.steps:
            output = step.execute(self.context)
            self.context[step.output_key] = output
        return self.context

9.5 链式 vs 单次调用

维度

单次调用

链式调用

任务复杂度

简单任务

复杂多步任务

可调试性

难(黑盒)

高(每步可检查)

成本

低

高(多次调用)

延迟

低

高(串行执行)

可靠性

低(一步错全错)

高(每步可重试)

灵活性

低

高(可组合)

9.6 实际应用示例

场景: 智能文档分析

  Chain:
  Step 1 [提取关键信息] -> "文档主题、关键实体、核心论点"
       |
       v
  Step 2 [情感分析]     -> "整体情感倾向、情感强度"
       |
       v
  Step 3 [风险评估]     -> "风险等级、风险因素、建议措施"
       |
       v
  Step 4 [生成报告]     -> "结构化分析报告"

  优势:
  - 每步可独立测试和优化
  - 中间结果可用于其他链
  - 某步失败可重试而不影响其他步

9.7 错误处理与容错

# 链式调用的三种容错策略

# 1. 重试机制
step.retry_count = 3  # 最多重试 3 次

# 2. 兜底输出
step.fallback = "无法处理此步骤,请人工检查"


# 3. 条件跳过
def should_skip(context):
    return context.get("skip_analysis", False)

9.8 与其他概念的关联

  • -> Agent 核心能力:Prompt Chaining 是 Agent 任务分解的简化版

  • <- Few-Shot 与提示模板:每步链使用独立模板

  • -> LangGraph:LangGraph 是 Prompt Chaining 的图化升级


10. LLM API 调用

10.1 定义

LLM API 调用是应用层与大模型交互的核心接口,涵盖请求构建、流式响应、错误重试、Token 计费和多模型管理。正确封装 API 调用层是构建可靠 LLM 应用的基础设施。

对应 Demo: demos/01_LLM应用基础/10_LLM_API调用.py

10.2 API 调用完整流程

+----------------------------------------------------------+
|                    LLM API 调用完整流程                    |
+----------------------------------------------------------+
|                                                          |
|  1. 构建请求                                              |
|     - 选择模型 (model)                                   |
|     - 组装消息 (messages: system + user + assistant)     |
|     - 设置参数 (temperature, max_tokens, tools)          |
|     - 选择模式 (stream: true/false)                      |
|                                                          |
|  2. 发送请求                                              |
|     - HTTP POST -> /v1/chat/completions                  |
|     - 认证 (Authorization: Bearer {api_key})            |
|     - 超时设置                                           |
|                                                          |
|  3. 处理响应                                              |
|     - 非流式: 等待完整响应 -> 解析 JSON                   |
|     - 流式: SSE 逐 Token 接收 -> 拼接文本                |
|                                                          |
|  4. 错误处理                                              |
|     - 429 Rate Limit -> 指数退避重试                      |
|     - 500 Server Error -> 重试                           |
|     - 400 Bad Request -> 不重试,返回错误                 |
|                                                          |
|  5. 成本追踪                                              |
|     - 记录 input_tokens, output_tokens                  |
|     - 计算费用                                           |
|     - 累计统计                                           |
|                                                          |
+----------------------------------------------------------+

10.3 流式输出

def stream_chat(messages: list[dict], model: str = "gpt-4") -> Generator:
    """流式输出:逐 Token 返回,前端实时展示"""
    stream = client.chat.completions.create(
        model=model,
        messages=messages,
        stream=True,  # 开启流式
    )
    for chunk in stream:
        if chunk.choices[0].delta.content:
            yield chunk.choices[0].delta.content
流式 vs 非流式:

  非流式:
    用户请求 -> [等待 5 秒] -> 完整回复一次性返回
    体验: 等待时间长,无进度反馈

  流式 (SSE):
    用户请求 -> "你" -> "好" -> "!" -> "今天" -> "天气" -> ...
    体验: 实时打字效果,首 Token 延迟低

  关键指标:
  - TTFT (Time To First Token): 首 Token 延迟
  - TPOT (Time Per Output Token): 每 Token 生成时间

10.4 错误重试机制

def retry_with_backoff(func, max_retries=3, base_delay=1.0):
    """指数退避重试"""
    for attempt in range(max_retries):
        try:
            return func()
        except RateLimitError:
            delay = base_delay * (2**attempt)  # 1, 2, 4 秒
            time.sleep(delay)
        except ServerError:
            if attempt < max_retries - 1:
                time.sleep(base_delay)
                continue
            raise
错误处理决策树:

  收到错误
    +-- 429 (Rate Limit)
    |   +-- 指数退避重试 (1s -> 2s -> 4s)
    +-- 500 (Server Error)
    |   +-- 重试 2-3 次
    +-- 400 (Bad Request)
    |   +-- 不重试,修正请求
    +-- 401 (Auth Error)
    |   +-- 不重试,检查 API Key
    +-- Timeout
        +-- 重试,增加超时时间

10.5 成本追踪

@dataclass
class TokenUsage:
    """Token 使用量和成本追踪"""

    input_tokens: int = 0
    output_tokens: int = 0
    model: str = "gpt-3.5-turbo"
    total_calls: int = 0

    @property
    def cost(self) -> float:
        """计算总成本(美元)"""
        pricing = MODEL_PRICING.get(self.model, {"input": 0, "output": 0})
        return self.input_tokens * pricing["input"] + self.output_tokens * pricing["output"]

    def report(self) -> str:
        """生成成本报告"""
        return (
            f"调用次数: {self.total_calls}\n"
            f"输入Token: {self.input_tokens}\n"
            f"输出Token: {self.output_tokens}\n"
            f"总Token: {self.total_tokens}\n"
            f"总成本: ${self.cost:.4f}"
        )

10.6 模型定价对比

模型

输入 ($/1K)

输出 ($/1K)

上下文窗口

适用场景

GPT-4

$0.03

$0.06

8K

复杂推理

GPT-3.5-Turbo

$0.001

$0.002

4K

通用对话

Claude-3

$0.025

$0.05

200K

长文档处理

10.7 多模型管理

class ModelRouter:
    """根据任务复杂度路由到不同模型"""

    def select_model(self, task_type: str, token_estimate: int) -> str:
        """选择最合适的模型"""
        if task_type == "complex_reasoning":
            return "gpt-4"
        elif token_estimate > 4096:
            return "claude-3"  # 长上下文
        else:
            return "gpt-3.5-turbo"  # 经济选择

10.8 与其他概念的关联

  • <- Tokenization:API 以 Token 为计费单位

  • -> Context Engineering:API 调用前需做上下文预算

  • -> Agent 核心能力:Agent 的每轮推理都是一次 API 调用


11. Context Engineering

11.1 定义

Context Engineering 是管理 LLM 上下文窗口的工程实践,通过优先级排序、Token 预算分配和信息压缩,在有限窗口内最大化信息价值。它不是简单的"把所有信息塞给模型",而是系统性地决定"什么信息进入上下文、以什么顺序、占多少预算"。

对应 Demo: demos/01_LLM应用基础/11_Context_Engineering.py

11.2 上下文优先级体系

上下文信息优先级 (从高到低):

+--------------------------------------------------+
| Priority: CRITICAL (4)                           |
|   - System Prompt (角色定义、安全约束)             |
|   - 当前用户指令                                  |
|   -> 必须保留,不可压缩                            |
+--------------------------------------------------+
| Priority: HIGH (3)                               |
|   - RAG 检索结果(与问题直接相关)                 |
|   - 关键工具调用结果                              |
|   -> 优先保留,必要时摘要                          |
+--------------------------------------------------+
| Priority: NORMAL (2)                             |
|   - 近期对话历史                                  |
|   - 任务上下文                                    |
|   -> 按预算截断或摘要                              |
+--------------------------------------------------+
| Priority: LOW (1)                                |
|   - 远期对话历史                                  |
|   - 补充信息                                      |
|   -> 首先被截断或丢弃                              |
+--------------------------------------------------+
class Priority(IntEnum):
    """上下文优先级:数值越大优先级越高"""

    LOW = 1
    NORMAL = 2
    HIGH = 3
    CRITICAL = 4


@dataclass
class ContextItem:
    """单条上下文:内容 + 优先级 + Token数 + 来源"""

    content: str
    priority: Priority
    source: str  # system / task / rag / memory / history
    token_count: int = 0
    compressed: bool = False

11.3 Token 预算分配

@dataclass
class TokenBudget:
    """Token 预算分配: system(20%) + task(10%) + RAG(40%) + history(30%)"""

    total: int = 4096

    @property
    def system(self) -> int:
        return int(self.total * 0.20)  # 819 tokens

    @property
    def task(self) -> int:
        return int(self.total * 0.10)  # 409 tokens

    @property
    def rag(self) -> int:
        return int(self.total * 0.40)  # 1638 tokens

    @property
    def history(self) -> int:
        return int(self.total * 0.30)  # 1228 tokens
预算分配可视化 (4096 tokens):

  系统 20%  ########               819
  任务 10%  ####                   409
  RAG  40%  ################       1638
  历史 30%  ############           1228
  响应预留   (从总预算中扣除)

  分配原则:
  - System: 固定占比,不可压缩
  - Task: 当前任务指令,简短但关键
  - RAG: 检索结果是最有价值的信息源
  - History: 近期对话,可压缩

11.4 上下文组装流程

+----------------------------------------------------------+
|                    上下文工程组装流程                      |
+----------------------------------------------------------+
|                                                          |
|  输入源:                                                  |
|  +----------+ +----------+ +----------+ +----------+    |
|  |System    | |Task      | |RAG       | |History   |    |
|  |Prompt    | |Instruction| |Results   | |(对话历史) |    |
|  +----+-----+ +----+-----+ +----+-----+ +----+-----+    |
|       |            |            |            |           |
|       v            v            v            v           |
|  +-----------------------------------------------+      |
|  |        优先级排序 + Token 预算控制              |      |
|  |                                               |      |
|  |  1. 按优先级分组 (CRITICAL>HIGH>NORMAL>LOW)   |      |
|  |  2. 从高到低分配 Token 预算                    |      |
|  |  3. 超预算的低优先级内容: 截断/摘要/丢弃       |      |
|  |  4. 组装为最终 messages 列表                  |      |
|  +----------------------+------------------------+      |
|                         |                                |
|                         v                                |
|  +-----------------------------------------------+      |
|  | 最终上下文 (<= max_tokens - reserved)          |      |
|  |                                               |      |
|  |  [system] 你是一个助手...      (CRITICAL)     |      |
|  |  [system] 安全规则: 不讨论...   (CRITICAL)     |      |
|  |  [user]   请根据以下信息回答... (HIGH)         |      |
|  |  [tool]   RAG检索: 根据文档...  (HIGH)         |      |
|  |  [user]   前面提到的方案是什么? (NORMAL)       |      |
|  |  [assistant] 方案是...          (NORMAL)       |      |
|  |  [user]   最新问题              (CRITICAL)     |      |
|  +-----------------------------------------------+      |
|                                                          |
+----------------------------------------------------------+

11.5 信息压缩策略

策略

原理

压缩率

信息损失

截断

删除低优先级内容

高

高

摘要

LLM 生成旧消息摘要

中

中

抽取

提取关键句/实体

中

中低

去重

移除重复信息

低

无

引用替换

用引用替代长文本

高

中

11.6 Context vs Prompt

Prompt Engineering (提示工程):
  关注: "如何写好一条提示词"
  范围: 单次交互
  目标: 优化单次输出质量
  方法: 角色设定、Few-Shot、格式约束

Context Engineering (上下文工程):
  关注: "如何管理进入上下文的所有信息"
  范围: 多轮交互、多信息源
  目标: 在有限窗口内最大化信息价值
  方法: 优先级管理、预算分配、压缩策略

  关系: Context Engineering 包含 Prompt Engineering
        Prompt Engineering 是 Context Engineering 的子集

11.7 实际应用模式

模式1: RAG 场景的上下文管理
  -> 检索结果按相关性排序,Top-K 注入上下文
  -> 低相关性结果被截断

模式2: 长对话场景的上下文管理
  -> 近 3 轮对话完整保留
  -> 4-10 轮对话摘要压缩
  -> 10 轮以上对话丢弃

模式3: Agent 场景的上下文管理
  -> System Prompt + 工具定义 (固定)
  -> 当前任务目标 (CRITICAL)
  -> 工具调用历史 (可压缩)
  -> 观察结果 (可截断)

11.8 与其他概念的关联

  • <- 上下文窗口管理:窗口管理是上下文工程的具体实现

  • <- Tokenization:Token 计数是预算分配的基础

  • -> Agent 核心能力:Agent 的短期记忆管理即上下文工程

  • -> RAG:RAG 检索结果是上下文的重要来源


12. 概念关系总览

                    +--------------------------------------------------+
                    |            LLM 应用开发技术体系                    |
                    +--------------------------------------------------+

  基础层                                                        应用层
    |                                                              |
    v                                                              v
+-----------+                                              +---------------+
|Tokenization|--- 计费/预算 ---> 上下文窗口管理 --------->   |Context         |
|(应用层理解) |                 (Token预算/截断/摘要)      |Engineering    |
+-----+-----+                                              |(上下文工程)    |
      |                                                    +-------+-------+
      v                                                            |
+-----------+         +--------------+                           |
| Embedding |-------->| 语义搜索      |                           |
|(语义向量化)|         |(向量相似度匹配)|                           |
+-----------+         +--------------+                           |
                                                                 |
+-----------+         +--------------+         +--------------+  |
|采样参数    |-------->| LLM API 调用  |-------->| Prompt        |<-+
|(Temp/Top-k)|         |(流式/重试/计费)|         | Chaining      |
+-----------+         +--------------+         |(链式提示)      |
                                               +-------+-------+
+-----------+         +--------------+                 |
|System      |-------->| Few-Shot 与   |-----------------+
|Prompt 设计 |         | 提示模板      |
|(角色/约束)  |         |(示例/模板管理) |
+-----------+         +--------------+

+-----------+
|Function    |--- 工具调用流程 ---> Agent 核心能力
|Calling     |--- 参数结构化 -----> 结构化输出
+-----------+
Tokenization -> 上下文窗口管理 -> Context Engineering
                                    ^
Embedding -> 语义搜索 ----------------+
                                    ^
System Prompt -> Few-Shot -> Prompt Chaining
                    |                   |
              结构化输出 <---- Function Calling
                                    |
                              LLM API 调用 (串联所有)

概念

核心作用

依赖概念

下游概念

Tokenization 应用

计费与预算基础

无

上下文窗口管理、API 调用

Embedding 与语义搜索

语义匹配与检索

Tokenization

RAG、Context Engineering

上下文窗口管理

Token 预算控制

Tokenization

Context Engineering

采样参数实战

输出质量控制

无

LLM API 调用

Function Calling

外部工具交互

结构化输出

Agent 核心能力

结构化输出

可靠数据格式

无

Function Calling、Prompt Chaining

System Prompt 设计

行为控制

Few-Shot

Context Engineering

Few-Shot 与提示模板

行为引导

无

System Prompt、Prompt Chaining

Prompt Chaining

任务分解

提示模板、结构化输出

LangGraph

LLM API 调用

交互接口

Tokenization、采样参数

所有上层应用

Context Engineering

信息价值最大化

上下文窗口管理、所有信息源

Agent、RAG

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区