Post

Claude Code(三)核心解密:从提示词工程到上下文引擎

深度解析 AI 开发范式的演变:回顾提示词工程的发展历程,揭秘上下文引擎的运作原理,并从底层向量与张量计算的角度,剖析 Token 经济学的本质。

Claude Code(三)核心解密:从提示词工程到上下文引擎

要真正掌握 Claude Code 这样的 CLI Agent,我意识到不能只停留在”如何写好 Prompt”的层面。我需要把视角拉高,回顾 AI 交互范式的演变,并深入到底层,看看数据是如何在硅基大脑中流动的。

本文记录了我对三个维度的深度解构:从提示词工程的历史,到上下文引擎的崛起,最后直抵大模型的物理底层——向量与张量。

提示词工程 (Prompt Engineering) 的诞生与演变

在 ChatGPT 刚刚横空出世时,Prompt Engineering 被称为”未来的编程语言”。它的核心逻辑是通过自然语言的技巧,激发大模型潜在的能力。回顾这段历史,我能清晰地看到开发者是如何一步步从”玄学”走向”工程”的。

手工时代 (The Manual Era)

早期的 Prompt Engineering 就像中世纪的炼金术。我在那个阶段没有固定的范式,完全依赖直觉和反复试错,试图找到那句能让模型”点石成金”的咒语。

那个时候的模型(如 GPT-3)虽然博学但”性格顽固”。如果我直接扔给它一个复杂的指令,比如”帮我写个贪吃蛇游戏”,它往往不知所措,或者只吐出一堆毫无逻辑的代码片段。为了解决这个问题,我开始摸索 Few-Shot(少样本)CoT(思维链) 等技巧。

我开始在 Prompt 中手动拼接示例,像教小学生一样引导模型:先演示把”Hello”变成”HELLO”,再演示把”World”变成”WORLD”,最后才让它处理”Claude”。这种方式虽然笨拙,但它确实有效地强迫模型进入了特定的模式,避免了它在无限的生成空间中迷路。

模板化时代 (The Template Era)

随着 LangChain 等框架的流行,我进入了模板化时代。手动拼接字符串的方式显然无法适应批量化的任务——我不可能为了分析 100 个不同的 Bug 日志而手写 100 次 Prompt。

于是,Prompt Template 应运而生。我将 Prompt 视为一个函数,通过预留的”槽位”(Slots)来动态注入外部数据。

1
2
3
4
5
6
template = """
System: 你是一个 {role} 专家。
Context: 以下是相关的代码片段:
{code_snippet}
Task: 请分析代码中的 {bug_type} 问题。
"""

这种变革解决了复用性的难题,让 Prompt 变成了可维护的代码。但很快,我又撞上了一个更坚硬的天花板:容量瓶颈。无论我的模板设计得多么精妙,它最终都要塞进那个有限的 Context Window 里。

为什么单纯的 Prompt Engineering 不够了?

当我的战场从简单的脚本编写扩展到复杂的企业级项目维护时,Prompt Engineering 显得力不从心。我面临着静态 Prompt 与动态代码库之间的根本矛盾。

代码库是活的,每时每刻都在 git commit 中演进;而 Prompt 是死的。更糟糕的是,注意力稀释 (Lost in the Middle) 现象开始显现:当我试图把整个项目的文档都塞给模型时,它反而像个被大量信息淹没的实习生,开始忽略最关键的指令。

为了突破这一瓶颈,我的关注点开始向 Context Engine 转移。我不再执着于”写出完美的 Prompt”,而是转向”构建更智能的上下文管理系统”。

上下文引擎 (Context Engine) 的崛起

如果说 Prompt System 是”导演”,负责讲戏;那么 Context Engine 就是”剪辑师”,负责在海量的素材中,剪辑出最关键的片段交给导演。

核心原理:预算与取舍

Context Engine 本质上是一个动态资源分配系统。它运作的核心逻辑在于”预算”(Budget)。

Token 不仅仅是金钱,更是时间。如果每次交互都把整个项目的所有文件重新发给模型,昂贵的 API 成本和漫长的等待时间会瞬间摧毁开发体验。Context Engine 必须在毫秒级内做出残酷的决策:在 20k Token 的预算内,是保留刚才的报错日志?还是保留 README.md?还是保留我 5 分钟前的一句指令?

工作流水线

Claude Code 的 Context Engine 并不是简单地存储历史,它像一个精密的搜索引擎,对每一条流入的信息进行清洗、排序和压缩。

Context Engine Workflow Context Engine 的工作流程示意图

flowchart TD
    Input[原始输入源] --> Filter(清洗 Filtering)
    Filter --> Rank(优先级排序 Ranking)
    Rank --> Budget{Token 预算检查}

    subgraph Sources
    User[用户指令]
    Files[加载的文件]
    Term[终端输出流]
    end

    Sources --> Input

    Budget -- 溢出 --> Compress[智能压缩 Compression]
    Budget -- 充足 --> Final[构建 Context]
    Compress --> Final

    Compress --> A[截断头部/尾部]
    Compress --> B[提取摘要]
    Compress --> C[移除冗余日志]

    style Filter fill:#e1f5fe,stroke:#01579b
    style Compress fill:#fff9c4,stroke:#fbc02d

首先是清洗(Filtering)。终端输出中往往充斥着对模型无意义的噪音,比如进度条 [=====>] 或是 ANSI 颜色代码。引擎会通过正则过滤器无情地剔除这些垃圾,只保留纯粹的文本信息。

接着是排序(Ranking)。并非所有文件都生而平等。Context Engine 会利用启发式算法,给最近修改的文件、报错的文件赋予更高的权重,而那些仅仅被引用的静态文件则会被降权。

最后是压缩(Compression)。当 Token 依然超标时,引擎会启动智能截断机制:保留代码文件的头部(通常包含 import)和尾部(通常包含 export),而将中间的具体实现逻辑用 ... 代替。甚至,它会将早期的多轮对话压缩成一段简短的摘要,只保留”我之前尝试修改 Auth 模块但失败了”这样的关键信息。

对抗上下文腐烂

为什么要费这么大劲做这一套系统?因为上下文腐烂 (Context Rot) 是大模型应用中的隐形杀手。

研究表明,随着上下文窗口的填充,Transformer 模型的计算复杂度呈 $O(n^2)$ 指数级增长。上下文翻倍,意味着计算成本和推理延迟翻四倍。更可怕的是,过多的干扰信息(Distractors)会显著增加模型产生幻觉的概率。

Context Engine 通过实时熵减,始终保持上下文的纯净度。它不仅仅是为了帮我省钱,更是为了在海量信息中保住模型的智商

底层解密——从文本到张量

为了真正理解为什么我要”惜 Token 如金”,我钻进了模型的物理底层,看看数据究竟是如何被计算的。

映射:从 Token 到 向量 (Embedding)

计算机并不认识”苹果”或”if”,它只认识数字。当我输入文本时,首先发生的是人类语言向机器语言的翻译。

这个过程的第一步是 Tokenization (分词)。输入文本被切分成 Token,这也就是为什么中文比英文贵的原因:中文的信息密度极高,但 Token 密度低(通常一个汉字对应 1-2 个 Token)。表达同样的意思,中文往往需要消耗更多的 Token。

紧接着是 Embedding (向量化)。每个 Token ID 被查表映射成一个高维向量(例如 4096 维)。在这个高维向量空间中,词与词之间的语义关系被数学化了——意思相近的词,它们的向量距离也更近。

计算:张量 (Tensor) 的洪流

当这些向量进入模型内部,它们被堆叠成张量(多维数组),并在 Transformer 的层级中开始流动。

flowchart TD
    Text[文本输入] --> Tokenizer[Tokenizer分词]
    Tokenizer --> TokenID[Token ID]
    TokenID --> Embedding[嵌入层转换]
    Embedding --> Vector[向量表示]
    Vector --> TensorStack[堆叠成张量]
    TensorStack --> ModelProcessing[Transformer 层级计算]
    ModelProcessing --> OutputProb[输出概率分布]
    OutputProb --> TokenOut[Token 输出]

    style Text fill:#e1f5fe
    style Tokenizer fill:#fff9c4
    style Embedding fill:#f1f8e9
    style Vector fill:#ffebee
    style ModelProcessing fill:#f3e5f5

模型需要理解词与词之间的关系(语法、指代、逻辑),这完全依赖于核心的 Self-Attention (自注意力机制)

在这个过程中,每一个 Token 都要和所有其他 Token “打招呼”,计算相关性分数。这种全员互动的代价是昂贵的——$O(n^2)$ 的复杂度意味着,如果上下文长度增加 10 倍,计算量将暴增 100 倍。这正是 200k 上下文不是线性的 2 倍成本,而是指数级计算压力的物理根源。

输出:概率的坍缩

模型最终输出的也不是确定的文字,而是一个概率分布表。它预测”下一个 Token”最可能是谁。

比如在”我”字后面,接”爱”的概率可能是 60%,接”是”的概率是 20%。我们通过 Temperature (温度) 参数来控制这种采样的随机性。温度越高,选词越狂野;温度越低,选词越保守。

Token 经济学的第一性原理

理解了底层的 $O(n^2)$ 计算原理,我就明白了为什么 Token 经济学是 AI 开发的第一性原理:

  1. 物理算力: 每一个 Token 的增加,都会导致 GPU 需要进行数亿次的浮点运算 (FLOPS)。
  2. 显存占用: KV Cache(键值缓存)随着上下文线性增长,过大的上下文会直接撑爆显存(OOM)。
  3. 响应延迟: First Token Time (首字延迟) 直接受限于计算量。

最佳实践 除了依赖 Context Engine 的自动压缩,作为开发者我也养成了良好习惯:

  • 使用 /clear 定期清理上下文。
  • 使用 /rm 移除不再需要的大文件。
  • 在涉及大量日志分析时,先用 grep 过滤关键信息。

总结

Claude Code 的强大,不仅在于它背后有一个聪明的模型(Claude 4.5 Sonnet),更在于它构建了一套精密的工程体系

  1. Prompt Engineering 负责设定模型的人设和知识边界。
  2. Context Engine 负责在海量信息中提炼精华,对抗上下文腐烂。
  3. 底层计算 时刻提醒我,每一分算力都来之不易。

作为开发者,当我使用 /clear 清理上下文,或者使用 /add 精确加载文件时,我实际上是在协助这个精密的系统,进行更高效的熵减操作。


下一篇预告:Claude Code 实战:使用 Hooks 自动化你的工作流 - 学习如何配置 Pre-command 和 Post-command 钩子。

This post is licensed under CC BY 4.0 by the author.