为什么要 RAG
- LLM 知识是有时间节点的
- LLM 输入的token是有限的
- LLM 可能会出现幻觉,但可以通过prompt来解决(阅读理解的能力还不错)
RAG 流程图
检索增强生成(RAG) 是一种使用来自私有或专有数据源的信息来辅助文本生成的技术。 它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型(LLM),此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。
RAG 核心部分主要包括:非结构化数据处理、数据索引、数据检索、prompt拼接
非结构化数据处理
- 文档load
- 文档拆分成文本
现实中,我们很多知识都是以pdf、word、excel等文档的形式存在的,我们需要把这些文档转换成易于检索的文本数据,同时应该尽量保证每个文本的知识点应该是很完整独立的(难点)。langchain 有提供很多文档加载器,包括csv、markdown等。
文档加载之后,需要把文档的内容按照一定的逻辑拆成单个的知识点。理想的拆分当然是一个知识点是一个独立且完整的内容,但是很难。langchain也提供了很多Text Splitters,比较常用的是Split by tokens,按照token来拆分,因为后续的embedding的模型对于文本的token也是有限制的。
索引indexing
- embedding
embedding向量化Massive Text Embedding Benchmark (MTEB) Leaderboard
中文领域较好用的embedding模型有openai的、bge、m3e(这是好几个月前我开始搞rag的时候的数据,这个领域更新也很快,可能已经有更多更好的embedding模型了)
将获取的知识点通过向量模型向量化之后存储到向量数据库里。
检索search
将用户的query同样经过向量化之后,去向量数据库里检索。获取与用户query相似度较高的TOP N的知识点。
prompt combine
将用户的query和检索到的TOP N的知识点拼接之后,一起提交到模型进行处理,得出答案。
其他
以上是一个最普通的RAG模型,里面的每一个步骤都有很大的优化空间。