LLM 全景(第一部分):上下文窗口管理入门指南
本入门指南聚焦于构建真实世界 LLM 应用时最重要的挑战之一:上下文窗口管理。 大型语言模型(LLM)正迅速改变我们构建软件、处理知识及自动化复杂任务的方式。与此同时,LLM 生态演进之快,以至于我们很难把真正有用的工程工具从噪声中分辨出来。 当应用变得越来越复杂时,决定向 LLM 提供哪些信息、省略哪些信息,以及如何结构化并维护上下文,就变得对可靠性、性能和成本至关重要。在本文中,你将学到管理上下文的业界前沿实用方法,包括:上下文选择、压缩、摘要、检索、记忆,以及避免上下文过载和"中途丢失(lost-in-the-middle)“现象的技巧。目标是为你在构建真实世界 LLM 应用时理解并运用上下文窗口管理,提供一个实用的起点。每一节都会介绍相关的博客和实用工具,你可以亲自尝试和使用。 如果你觉得这篇文章有帮助,欢迎关注我,因为我会写更多数据科学的内容!我建议你亲自尝试本文中的动手示例,这能帮你学得更快、理解更深、记得更牢。泡杯咖啡,享受乐趣! LLM 全景概览 要理解快速演进的 LLM 生态,最好把眼光放到单个 LLM 模型之外,去理解围绕它们构建的工具与工作流。已经很清楚的一点是:这个大型语言模型本身充当着整个系统的"计算核心”,而它的周围需要许多构建模块。下图给出了 LLM 全景的概览,可以看到现代 LLM 技术栈的开发涉及众多组件。本文聚焦于上下文管理以及(外部)数据的处理。在下一节,我们会看到一些帮助我们进行窗口上下文管理的工具与技术。你将学习如何为系统指令和结构化输出构建上下文架构。 切勿低估上下文窗口的重要性 与 LLM 协作感觉很直观,这既是优点也是缺点;你随便聊几句,它就能返回结果。 LLM 可以极其强大,但其输出在很大程度上取决于它所收到的系统、指令、上下文、技能与约束。提示工程(Prompting)与其说是找到完美的问题,不如说是与模型一起设计一套可靠的架构。其目标是让 LLM 更可预测、更可靠、更高效。而这一切都要从上下文窗口说起。 提示工程与其说是寻找完美的问题,不如说是与模型一起设计一套可靠的架构。 总上下文窗口大小就是限制 上下文窗口的重要性不容低估;它是你 LLM 流水线中最重要的部分之一,因为它是模型的临时工作记忆。然而,就像真正的记忆一样,上下文窗口空间有限,却需要容纳几十种不同的功能。即便是支持超大上下文窗口(比如 200K token)的模型,也容易被推到实际极限。结果,关键段落(例如文档中的某部分)可能被隐式压缩或忽略,导致推理不完整。下图列出了一些最重要的组成部分,即:密集的系统指令、标准与严格的输出格式 schema,以及以块(chunk)形式存在的文档、聊天历史等等。 可以把上下文窗口看作你拥有的内存(RAM)大小。一旦超出它的极限,它就会崩溃并返回错误。 当你使用 OpenAI、Anthropic 或 Kimi K3 时,很可能拥有 1M token 的上下文窗口。这很棒,但在解决庞大而复杂的任务时,把所有信息都塞进聊天窗口(所谓的"单体式 monolithic"方法)有诸多缺点。详细的拆解和其他细节推演可以在<构建个人 Agentic 系统的分步指南>这篇文章里找到。下一节我们会介绍如何有效利用上下文窗口的方法,其中系统和指令是关键。 上下文管理:可靠且高效的 LLM 像 OpenAI 和 Anthropic 这样的领跑者,会大量利用上下文来提升模型性能,综合运用专门化的系统提示词、指令、工具以及其他相关信息来有效引导模型。但 LLM 上下文窗口的内容已不再局限于提示词和用户消息。新技术,尤其是 Agent、记忆、检索和工具使用,正不断改变进入上下文窗口的内容。归根结底,最优的上下文取决于具体任务与使用场景,这使得有效的上下文管理成为构建可靠、高效 LLM 应用不可或缺的一环。下图描绘了上下文窗口中几大知名组成部分的概览。在接下来的小节里,每个部分都会连同最相关的博客和 GitHub 仓库一起介绍。 ...