这节课就是传说中的 Stanford CS 25 中的一节讲座 < Retrieval Augmented Language Models >。授课人就是 RAG 论文的作者之一 Douwe Kiela,课程中他分享了一个检索增强语言模型的架构图,其实就是关于 LLM (大语言模型) 如何做 RAG (检索增强生成) 的框架。

这张图重要到让我觉得,LLM 做 RAG 只要记住这一张图就够了。所有相关概念和工程实践中的权衡,全都涵盖在这张图的架构和问题中了。
这个架构主要包括 input、prompt、通过 retriever 检索增强生成的 context,然后把这三部分一起输入给 generator 即模型,最终输出 output 作为结果。

1 RAG 核心概念
1️) input 和 prompt 的区别和联系
input 可理解为既包含 system prompt,又包含用户输入的检索范围的指向,而 prompt 则强调用户输入的指令。
- 以公司知识库 RAG 举例,比如用户输入 chatbot 的内容为"检索公司2023年的财务数据并生成总结报告",其中"公司2023年的财务数据"是对公司知识库检索范围的指向,应理解为 input 的一部分,而"检索并生成总结报告"则是指令,应理解为 prompt。
2️) retriever 的作用机制
retriever 的作用机制,我理解类似于在图书馆借书的过程,提供书名 (query) - 系统查找图书编号 (query编码) - 对应书架书籍编号 (docs编码) - 找到并借出图书 (context)。
- 接着上文公司知识库的例子,从 input 获取 query (如"2023年资产负债表, 2023年利润表, 2023年现金流量表"),对应的 query 编码 ("2023年资产负债表, 2023年利润表, 2023年现金流量表"的向量化表达) 在 docs 编码 (公司知识库所有文本的向量化表达) 中检索匹配,提取匹配的部分作为 context (涉及公司2023年财务数据的文本)。
- 其中 query 和 input 的关系,我想到两种可能性,一种是直接把 input 作为 query,另一种是模型基于 input 生成的 query,架构图简化表达了。
3️) reranker
retriever 和 context 之间可加一步 reranker 架构,对检索结果按特定规则进行重新排序。reranking 的机制既可通过模型判断,也可在模型基础上预设特定规则。
- 比如根据员工职级限制其可获取的企业知识库信息范围。
2 retrieve:RAG 的核心环节
目前工程实践上,大家把优化的重点基本都放在了 retrieve 环节里,这里面涉及三个重要的问题:
1️) how and what do I retrieve
从传统的相似性检索、文本检索,到目前最常用的依托于 embedding 的语义检索,大家在实践中仍在不断迭代。Kiela 后面也提到有研究希望把整个 retriever 过程做成一个模型,他也在课程中构想未来应该把 retriever 的训练也纳入到 LLM 的训练架构中。
- 文本的 embedding 可简化理解为文本的向量化表达,并且可根据不同文本的向量化表达,判断出文本之间语义的远近亲疏关系。
- 目前的文本 emebedding 也都是通过模型来实现的,这类模型也在不断迭代。OpenAI 在今年1月份推出了 text-embedding-3 ( small 和 large 两版),相比其2022年12月推出的 ada-002 模型,在性能上获得了显著提升。
- 用于多语言检索的常用基准 (MIRACL) 平均分数已从 31.4% (ada-002) 增加到 44.0% (3-small) 和 54.9% (3-large)。
- 附图之一是 OpenAI 对其 text emebedding 模型作用机制的示意。
2️) When to retrieve
一般就两种思路。一种是在获得检索范围后即 retrieve,另一种是让模型判断何时 retrieve。
3️) How to encode
如何编码也直接影响了如何检索的过程。
3 其他问题
1️) how to pre-process
实际上强调就是 input 要包含 system prompt,可设定角色、技能、任务、工作流、限制条件等。
2️) how to prompt
涉及提示词工程的方法论。
3️) how to pass context
可以把 context 作为 prompt 的一部分以文本形式输入,也可通过代码的方式代入。
4️) how to post-process
比如格式化输出的处理,如固定输出 json 格式,或固定在末尾输出 reference 列表等。
5️) how to verify
指的是如何验证 output 的效果或质量,比如验证 output 与知识库的相关性、准确性等。

4 RAG 整体架构的审视框架
最后,还有关于 RAG 整体架构的审视框架:
1️) How to optimize
各环节哪些地方可以优化。架构中已经列出的问题都是思考的重点。
2️) How to learn
这里的 learn 应该指的是机器学习的 learn,探讨各环节从 software 1.0 的静态架构向机器学习和 software 2.0 的演进。
3️) how to scale
如何应对规模化的问题。
- 比如关于知识库如何 chunk、何时编码,在知识库过大时就不适合提前预处理好 chunk 和编码。或者大量用户同时 prompt 该如何应对。
小结
今天上半年判断过2024年会是 RAG 应用爆发的一年,自己在 2B 业务中也涉及 RAG 工程的落地,所以花了些精力来学习这节课。以上内容夹杂了不少自己的个人理解,欢迎批评指正,一起交流学习。
注:
- Stanford CS25 V4 2024春季课程
- Stanford CS25 V3: Retrieval Augmented Language Models
- RAG论文原文<Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks>
- OpenAI text-embedding-3 models
- OpenAI text-embedding-ada-002 model
- Software 2.0 by Andrej Karpathy
- Kiela在讲这节课几个月后在其创立的Contextual AI正式推出RAG 2.0
