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

检索增强语言模型的架构图及各环节最关键的问题

这张图重要到让我觉得,LLM 做 RAG 只要记住这一张图就够了。所有相关概念和工程实践中的权衡,全都涵盖在这张图的架构和问题中了。

这个架构主要包括 input、prompt、通过 retriever 检索增强生成的 context,然后把这三部分一起输入给 generator 即模型,最终输出 output 作为结果。

检索增强语言模型的架构图(包括 reranker )

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 的训练架构中。

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 与知识库的相关性、准确性等。

RAG 2.0 概念首次由 Kiela 提出,目前他所创立的 Contextual AI 公司已落地 RAG 2.0

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 工程的落地,所以花了些精力来学习这节课。以上内容夹杂了不少自己的个人理解,欢迎批评指正,一起交流学习。

 

 

注:

  1. Stanford CS25 V4 2024春季课程
  2. Stanford CS25 V3: Retrieval Augmented Language Models 
  3. RAG论文原文<Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks> 
  4. OpenAI text-embedding-3 models
  5. OpenAI text-embedding-ada-002 model
  6. Software 2.0 by Andrej Karpathy
  7. Kiela在讲这节课几个月后在其创立的Contextual AI正式推出RAG 2.0 
1
0