Xinwei Xiong · 2024 年 5 月 15 日
16 分钟 · 7908 字 · | EN

从语言模型到 RAG:理解大模型的能力、边界与工程方法

从预测下一个词出发,理解 Transformer、规模化与所谓涌现能力,再走进检索增强生成的完整工程链路。本文不追逐模型榜单,而是解释大模型为何有效、何时会失败,如何设计检索、引用、评估与安全边界,帮助开发者把概率性的语言能力变成可验证、可维护、能持续演进的知识系统。 也给出一条从原型走向生产环境的务实路径。

从语言模型到 RAG:理解大模型的能力、边界与工程方法

引言:不要从聊天窗口理解大模型

第一次使用大语言模型,很容易产生一种错觉:屏幕另一端似乎住着一个读过许多书、能够推理也愿意解释的人。它会写代码,会概括论文,会在同一段对话里保持语气,甚至会为自己的错误给出一套听起来完整的理由。

但聊天界面展示的是结果,不是机制。语言流畅会掩盖证据缺失,答案完整会掩盖不确定性,拟人的语气则会让我们高估它对世界的理解。

理解大模型,更可靠的起点不是“它像什么”,而是“它在优化什么”:给定一段已经出现的 token,预测下一个 token 的概率分布。今天的大模型当然不只经历预训练;指令微调、偏好优化、工具调用和系统提示都会改变它的行为。但那条朴素的训练目标,仍然解释了许多能力,也解释了许多失败。

我更愿意把大模型看成一种语言空间里的压缩与重组系统。它把海量文本中的关系压进参数,在上下文的约束下重建一个最可能的延续。它很强,因为人类的大量知识与推理痕迹本来就以语言存在;它也不可靠,因为“像一个正确答案”与“由可靠证据支持”从来不是同一件事。

RAG(Retrieval-Augmented Generation,检索增强生成)正是从这条裂缝里生长出来的工程方法:不要求模型只凭参数回答,而是在生成前寻找外部证据,把答案锚定在可检查的材料上。它不是万能补丁,却是理解如何把大模型变成系统的最佳入口。

一、语言模型究竟学到了什么

1. 从词频到分布式表示

语言模型的基本问题可以写成:

[ P(x_t \mid x_1, x_2, \ldots, x_{t-1}) ]

也就是根据已有序列,估计下一个 token 的概率。早期统计语言模型依赖 n-gram:只观察前面有限数量的词,并用语料中的共现频率估计概率。这种方法直观,但稀疏性严重,也难以表达距离较远的依赖关系。

神经语言模型把离散的词映射到连续向量,使相似用法能够共享统计强度。Bengio 等人在 2003 年发表的神经概率语言模型工作,是这条路线的重要节点。随后,循环神经网络和 LSTM 改善了序列建模,却仍受到长距离依赖和顺序计算效率的限制。

这里有一个经常被忽略的变化:模型不再保存“某个词后面通常接什么”这样孤立的表格,而是在高维空间中学习词义、语法、语境和任务之间可以复用的表示。能力的扩展不只是数据更多,也是表示方式发生了变化。

2. Transformer 为什么成为基础架构

2017 年的论文 Attention Is All You Need 提出了 Transformer。它最重要的工程优势,是用自注意力直接计算序列中不同位置的关系,并让训练可以高度并行化。

对序列中某个位置而言,注意力机制会计算它与其他位置的相关程度,再按权重汇总信息。简化后,可以写成:

[ \operatorname{Attention}(Q,K,V)

\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V ]

其中 (Q)、(K)、(V) 分别是查询、键和值。多头注意力让模型可以同时关注不同类型的关系:有的头偏向局部搭配,有的头连接指代对象,有的头可能捕捉结构边界。我们不应把单个注意力头直接解释成人类概念,但这种动态的信息路由能力,确实比固定窗口更适合表达复杂上下文。

Transformer 并没有消灭序列长度的成本。标准注意力的计算和存储通常随序列长度呈二次增长,长上下文还会遭遇注意力稀释、位置偏差和有效利用率下降。上下文窗口写着“可放入多少”,并不等于模型“同等理解多少”。

3. 预训练不是把互联网复制进参数

预训练让模型在大量文本上不断预测被遮蔽或后续的 token。为了做好预测,它会学习许多可复用的结构:

  • 词语与句法的规律;
  • 实体、事件和概念之间的统计关系;
  • 文本体裁、论证方式与代码结构;
  • 在语料中反复出现的推理轨迹;
  • 对任务形式的隐式归纳。

但模型参数不是一个可以精确寻址的数据库。某个事实可能被模糊地编码在许多参数的组合中,也可能因为冲突语料、长尾分布或训练时间边界而缺失。要求模型回忆事实,本质上是在概率分布中采样,不是从主键确定的记录里读取。

这解释了一个表面矛盾:模型可以概括一个领域的结构,却在一个具体日期或数字上犯错;可以写出正确的程序骨架,却虚构一个不存在的函数。它擅长模式,却不天然拥有证据链。

二、规模化带来了什么,又没有带来什么

1. 规模定律是一条经验规律

语言模型的损失通常会随着模型参数量、训练数据量和计算量增加而按幂律下降。OpenAI 的 Scaling Laws for Neural Language Models 与 DeepMind 的 Training Compute-Optimal Large Language Models 分别从不同配置研究了这种关系。

规模定律的重要意义不是“越大越好”,而是它让训练从经验炼丹部分转向可预测的资源配置。Chinchilla 的研究尤其提醒我们:如果数据不足,继续增加参数可能只是训练一个没有被充分喂饱的模型。参数、数据质量、数据数量、训练计算量之间必须平衡。

同样重要的是,训练损失的小幅下降不等于产品价值按相同比例增加。用户感知的质量取决于任务阈值:代码只差一个字符也可能无法运行,事实问答只错一个关键数字就可能失去价值。模型指标连续改善,产品体验却可能呈现突然可用或突然失效。

2. “涌现能力”需要谨慎解释

大模型常被描述为在规模达到某个阈值后突然获得新能力,例如少样本学习、多步推理或指令遵循。2022 年的论文 Emergent Abilities of Large Language Models 系统整理了这种现象。

但“突然出现”不一定意味着模型内部发生了清晰的相变。论文 Are Emergent Abilities of Large Language Models a Mirage? 指出,若评价指标是离散或非线性的,平滑的底层改善也可能在图上表现为跳跃。例如,严格字符串匹配只有 0 和 1;模型逐渐接近正确答案的过程,在跨过最终阈值前都被记为失败。

所以,谈涌现至少要问四个问题:

  1. 指标是连续的,还是通过阈值离散化的?
  2. 不同规模是否使用了可比的数据、提示和训练方法?
  3. 能力在任务扰动后是否仍然存在?
  4. 这是模型自身的能力,还是脚手架、工具或评测提示带来的能力?

我的判断是:规模化确实扩大了模型能稳定完成的任务集合,但“量变必然产生某种神秘智能”不是一个足够精确的工程结论。 对开发者而言,重要的不是争论能力是否配得上“涌现”这个词,而是测量它在自己的任务上何时出现、何时消失,以及失败是否可控。

3. 上下文学习不是参数更新

大模型可以根据提示中的说明和示例完成未专门训练的任务,这通常被称为上下文学习。它看起来像“现场学习”,但推理时模型参数并没有改变。更准确地说,示例在上下文中建立了一个临时任务结构,引导模型沿着某种分布继续生成。

这带来三个实用结论:

  • 示例的选择和顺序可能改变结果;
  • 与任务无关的信息会消耗注意力,并可能误导模型;
  • 对话结束后,临时结构不会自动成为可靠的长期记忆。

提示工程能改善表达,不能替代知识治理。把越来越多规则塞进系统提示,只会把维护成本转移到一段难以测试的文本里。成熟的系统应当把规则放进明确的数据结构、工具权限和校验器,把提示留给真正需要语言解释的部分。

三、能力边界:流畅不是可靠

1. 幻觉是目标函数的自然结果

当证据不足时,语言模型仍然被要求输出下一个 token。只要系统没有提供“拒绝回答”的训练信号、外部证据或验证步骤,它就可能生成语言上合理但事实错误的内容。所谓幻觉不是偶然的软件异常,而是概率生成与事实约束之间的结构性张力。

常见失败包括:

  • 捏造论文、链接、函数或配置项;
  • 把相似实体的属性混在一起;
  • 对训练截止时间之后的事件作确定性陈述;
  • 在多步推导中早期出错,随后用流畅叙述掩盖;
  • 面对错误前提时顺从用户,而不是先纠正前提。

降低温度可以减少随机性,却不能把错误知识变成正确知识。同样的问题稳定答错,往往比偶尔答错更危险。

2. 推理文字不等于可审计的推理

模型可以生成分步骤解释,但自然语言解释本身仍是模型输出。它可能帮助模型组织答案,也可能只是对既有结论的事后包装。对于数学、财务、权限或数据处理任务,可执行验证通常比“看上去有条理”的推理更可信。

因此,应当优先要求模型给出:

  • 可引用的来源;
  • 可以由程序检查的结构化结果;
  • 可运行的代码与测试;
  • 明确的假设和不确定项;
  • 无证据时的拒答。

不要使用 eval 解析模型输出。即使提示要求模型只返回一个字典,它仍可能输出任意文本;eval 会把文本当代码执行。需要结构化结果时,应使用 JSON Schema 约束、标准 JSON 解析器和字段校验,并把解析失败当成正常的可处理状态。

3. 模型不是系统

一个可靠应用至少还需要数据、检索、权限、状态、工具、监控、评估和降级路径。模型只是其中一个不确定组件。把一次漂亮的演示扩展为长期运行的产品时,最大的工作往往发生在模型之外。

这也是我看待 AI 工程的一个基本立场:不要试图消灭不确定性,要把不确定性关进可以测量的边界。 模型可以负责理解模糊意图和生成自然语言;数据库负责确定性事实,程序负责规则,权限系统负责边界,评估集负责告诉我们系统有没有悄悄退化。

四、为什么需要 RAG

RAG 最初由 Lewis 等人在 2020 年的论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 中系统提出。其基本过程很简单:

  1. 接收用户问题;
  2. 从外部知识源检索相关片段;
  3. 将问题与片段组成上下文;
  4. 由语言模型依据上下文生成答案。

它解决的不是“模型不够聪明”,而是三个更具体的问题。

第一,知识时效性。模型训练完成后,参数不会自动跟随文档变化;检索可以在查询时读取最新版本。

第二,私有知识。企业制度、项目文档和个人笔记不适合全部写入公共模型参数,也经常变化;RAG 可以在权限范围内按需取用。

第三,可追溯性。参数记忆很难指出来源,而检索片段可以附带文档、章节、版本和链接,让读者检查答案。

RAG 并不保证事实正确。它只是把“模型凭什么回答”从隐藏参数的一部分,转化成可观察、可调试的检索上下文。若取回了错误、过期或无关的材料,生成仍然会错;若上下文中同时出现冲突版本,模型还可能选择更流畅而非更新的一个。

因此,RAG 的核心不是向量数据库,而是证据供应链

五、一条完整的 RAG 工程链路

1. 从数据治理开始

在切分和嵌入之前,先回答这些问题:

  • 文档的权威来源是什么?
  • 谁可以读取,权限能否继承到片段?
  • 版本、发布时间和失效时间如何记录?
  • 同一事实冲突时,以哪个来源为准?
  • 删除源文档后,索引能否同步删除?

如果源数据没有所有权、版本和生命周期,向量化只会让混乱检索得更快。应把标题、路径、章节、作者、时间、权限、文档类型等信息作为元数据保留。答案引用也应指向人能读懂的原文位置,而不是只给一个内部 chunk ID。

2. 切分不是按固定字符数剪纸

检索的基本单元通常是 chunk。切得太大,一个片段混入多个主题,向量表示变得模糊,同时浪费上下文;切得太小,定义与限定条件被拆开,片段失去独立语义。

更稳妥的策略是优先尊重文档结构:

  • 按标题、段落、列表、代码块和表格边界切分;
  • 为片段补充父标题与文档标题;
  • 对短段落合并,对超长章节递归切分;
  • 适度重叠,只用于保留跨边界语义;
  • 针对代码、API 参考和叙事文章使用不同规则。

没有全局最佳 chunk 大小。产品手册中的一个配置项,和长篇研究报告中的一个论证段落,适合的粒度完全不同。切分参数必须通过真实问题评估,而不是照抄教程中的数字。

3. 嵌入与检索

嵌入模型把文本映射到向量空间,使语义相近的文本距离更近。查询也被编码为向量,再通过近似最近邻搜索找到候选片段。

纯向量检索擅长语义改写,却可能漏掉精确标识符、错误码、版本号和人名。关键词检索恰好相反。因此,实际系统常使用混合检索:

[ \text{score}

\alpha \cdot \text{dense} + (1-\alpha)\cdot \text{sparse} ]

向量分数与关键词分数的尺度未必一致,不能机械相加;可以先分别排序,再用倒数排名融合等方法合并。对于租户、语言、产品版本和权限,应尽量在检索阶段过滤,而不是取回后再交给模型判断。

还有一个容易被忽略的问题:用户问题不总是适合直接检索。对话里的“它为什么失败”缺少实体,需要根据历史改写成独立查询;复杂问题可能需要拆成多个子查询;过于抽象的问题则可生成若干更具体的检索表达。但查询改写也可能改变原意,所以必须保留原问题参与最终生成和评估。

4. 重排:先扩大召回,再提高精度

第一阶段检索强调召回,快速拿到一批候选;第二阶段重排使用更精细的模型判断“这个片段是否真正回答问题”。这种两阶段架构通常比直接把 top-k 向量结果送入模型更稳。

重排后还要去重和增加多样性。如果前五个片段都来自同一段落的不同重叠窗口,看似相关度很高,实际提供的信息却很少。最大边际相关性或按文档、章节限制配额,可以减少重复证据。

检索并非越多越好。无关片段会稀释真正的证据,冲突片段会增加生成歧义,长上下文还可能出现“中间信息利用较差”的现象。上下文预算应该留给最能支持结论的材料。

5. 上下文组装:让证据保持边界

送入模型的上下文应当是结构化的,而不是把片段直接拼成一堵文字墙。每个片段至少包含来源标识、标题、正文和必要的时间信息。例如:

任务:仅根据“资料”回答;资料不足时明确说明无法确认。

问题:
{user_question}

资料:
[S1] 标题:退款政策
版本:2026-06-01
内容:……

[S2] 标题:企业客户补充条款
版本:2026-07-15
内容:……

输出要求:
1. 每个事实性结论标注 [S1] 这类来源;
2. 指出资料间的冲突;
3. 不要使用资料之外的信息补全事实。

还要把检索内容视为不可信输入。文档里可能存在“忽略系统指令”之类的提示注入文本。应用需要明确区分指令与资料,限制模型可调用的工具,并在执行敏感动作前重新鉴权。检索到一段文字不代表它获得了指挥系统的权限。

6. 生成、引用与拒答

一个高质量回答不仅要“像答案”,还要满足三项要求:

  • 结论由上下文支持;
  • 引用能够准确定位到支持该结论的片段;
  • 证据不足时愿意停下来。

引用最好在生成过程中绑定来源标识,再由应用层映射为链接。让模型在没有来源元数据时自行编造 URL,只是在制造另一种幻觉。

拒答也不应只靠一句提示。可以综合使用检索最高分、候选一致性、答案支持度和业务规则决定是否回答。阈值必须从验证集校准,因为不同检索器的分数不可直接比较。

六、评估:把“感觉不错”变成可重复实验

RAG 的错误可能来自检索,也可能来自生成。只看最终答案,会让定位变得困难。至少应把评估拆成三层。

1. 检索层

建立“问题—相关片段”标注集,关注:

  • Recall@k:前 k 个结果是否包含所需证据;
  • MRR:第一个相关结果出现得有多靠前;
  • nDCG:多个不同相关度结果的排序质量;
  • 权限过滤、语言过滤和版本过滤是否正确。

如果正确证据根本没有进入上下文,再强的生成模型也只能猜。检索召回是 RAG 的上限之一。

2. 生成层

最终回答要分别检查:

  • 正确性:结论与参考事实是否一致;
  • 忠实度:结论是否真的由给定上下文支持;
  • 引用准确性:引用片段是否支撑它前面的陈述;
  • 完整性:关键问题是否都被回答;
  • 拒答质量:资料不足时是否避免猜测。

模型评审可以扩大评估规模,但不能成为唯一裁判。评审模型同样会受措辞、答案顺序和自身知识偏差影响。高风险样本需要人工复核;自动评审则应使用固定量表、校准样本,并定期检查与人工判断的一致性。

3. 系统层

线上还要观察延迟、成本、失败率、缓存命中率、索引新鲜度和用户纠错。一次回答可能事实正确,却用了已经撤销的权限;也可能质量很好,却慢到用户离开。这些都属于系统质量。

最有价值的评估集不是一次写完的题库,而是失败历史的沉淀。每遇到一个真实问题,就把它匿名化后加入回归集,并标注失败发生在哪一层。模型、嵌入、切分或提示每次升级,都用同一组核心样本比较。

一个实用的评估表可以长这样:

维度核心问题典型失败
数据来源是否权威、最新、可访问旧版本进入索引
检索正确证据是否进入候选关键词或实体未召回
重排关键片段是否排在前面重复片段占满 top-k
生成结论是否受证据支持模型补写资料外事实
引用来源是否精确对应结论引用存在但不支持
安全文档能否越权影响系统提示注入触发工具
运行延迟、成本是否可接受查询扩展失控

七、RAG 何时不适合

RAG 很流行,但并非所有问题都需要它。

使用普通搜索或数据库查询

如果用户要的是精确订单状态、账户余额或库存数量,应查询业务数据库并由程序生成结果。把精确数据转成向量,再让模型从相似片段中猜,是把确定问题主动改造成概率问题。

使用长上下文

当材料数量少、总长度可控,而且问题需要跨全文比较时,直接提供完整文档可能比切分检索更好。即使如此,也要评估模型对长上下文不同位置的利用率,不能只看窗口上限。

使用微调

微调更适合改变稳定的行为模式、格式、语气或领域任务能力,不适合频繁更新事实。把每日变化的产品价格训练进参数,更新慢、难删除,也难追溯来源。RAG 管知识,微调管行为——这不是绝对分界,却是很有用的第一原则。

使用工具与工作流

需要计算、执行或修改外部状态时,应调用受控工具。例如汇率换算交给计算程序,提交工单交给有权限检查的 API。RAG 可以提供操作规则,但不能代替事务系统。

很多可靠应用最终是组合系统:先分类意图,再决定查数据库、检索文档、调用工具或直接生成;最后统一做校验与呈现。模型负责路由的一部分,但关键权限与业务约束仍由代码执行。

八、从原型到生产的最小路线

如果从零开始,我会按下面的顺序推进,而不是先购买一个功能最全的向量数据库。

第一步:定义可回答范围

写下系统允许回答和必须拒答的问题。确定权威数据源、更新频率、权限与成功标准。选择二三十个真实问题作为第一版评估集,其中要包含无答案、歧义和越权问题。

第二步:建立最简单基线

用结构化切分、一个嵌入模型和基础 top-k 检索跑通链路。保留每次查询的候选片段、分数、最终上下文和回答,确保错误可复现。此时先不加入复杂代理和多轮循环。

第三步:用失败驱动改进

若正确片段未召回,改查询、切分、元数据或混合检索;若召回后排序靠后,加重排;若证据正确但回答失真,改上下文组织、输出约束或模型;若引用不准,在应用层增加引用验证。

一次只改变一类变量。否则分数提高后,你无法知道是哪项修改生效,也无法判断成本是否值得。

第四步:建立发布门槛

为核心指标设最低值,为高风险问题设置人工复核或确定性流程。新模型、新索引和新提示先通过离线回归,再灰度上线。日志中避免记录秘密和完整私人文档,但要保留足够的可观测信息。

第五步:设计降级

检索超时怎么办?重排服务不可用怎么办?找不到证据时显示什么?来源被删除后缓存如何失效?可靠系统不是永不失败,而是在失败时不越界、不伪装成功,并能给用户下一步选择。

九、我对大模型工程的几个判断

1. 真正稀缺的不是回答,而是可信的上下文

生成成本会继续下降,能写出流畅文字的模型会越来越多。真正决定系统差异的,是谁能在正确时间,把正确权限下的正确信息,组织成模型能使用、人能检查的上下文。

这也是为什么 RAG 的长期价值不在“接一个向量库”,而在知识的治理能力:来源、版本、结构、权限、反馈与淘汰机制。索引只是知识经过治理后的一个投影。

2. 模型升级不会替你偿还系统债务

更强的模型可能掩盖切分差、数据乱和提示脆弱,却不会从根本上修复它们。模型一换,原本被掩盖的问题还可能以新的形式出现。把全部希望寄托在下一代模型,是一种昂贵的拖延。

系统应尽量让组件可替换:模型、嵌入、检索器和重排器都有清晰接口,并由同一评估集约束。这样升级才是一次实验,而不是一次信仰迁移。

3. 好的 AI 产品允许用户看见边界

不少产品把“不知道”视为体验失败,于是逼模型给出答案。我认为恰好相反:能够展示来源、承认缺口、指出冲突并邀请用户补充信息,是智能系统成熟的表现。

人真正需要的不是一个永远开口的模型,而是一个知道何时该说、依据什么说,以及何时应该停下来的系统。

结语

从语言模型到 RAG,看似是从一种模型走向一种应用架构,实际是认知方式的变化。

只看模型时,我们关心参数量、榜单和新能力;看系统时,我们开始关心证据从哪里来、是否仍然有效、谁有权使用、失败如何暴露、改动怎样评估。前者容易制造惊叹,后者才能积累信任。

大模型把语言变成了新的计算界面,却没有废除工程常识。概率输出需要确定性边界,广泛知识需要可追溯证据,快速迭代需要稳定评估。RAG 的意义也正在这里:它不是给模型外挂一份记忆,而是把回答重新接回现实。

参考资料

  1. Bengio, Y. et al. A Neural Probabilistic Language Model , 2003.
  2. Vaswani, A. et al. Attention Is All You Need , 2017.
  3. Brown, T. et al. Language Models are Few-Shot Learners , 2020.
  4. Kaplan, J. et al. Scaling Laws for Neural Language Models , 2020.
  5. Hoffmann, J. et al. Training Compute-Optimal Large Language Models , 2022.
  6. Wei, J. et al. Emergent Abilities of Large Language Models , 2022.
  7. Schaeffer, R. et al. Are Emergent Abilities of Large Language Models a Mirage? , 2023.
  8. Lewis, P. et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks , 2020.
  9. Gao, Y. et al. Retrieval-Augmented Generation for Large Language Models: A Survey , 2023.

读者回响

加入讨论

新文章写好,先寄给你

每有新文章,寄一封信到你的邮箱。双重确认,随时退订。