青训营X豆包MarsCode 技术训练营第五课 | 豆包MarsCode AI 刷题

53 阅读3分钟

RAG(Retrieval-Augmented Generation,即检索增强生成)

一、工作原理

1.检索:对于给定的输入(问题),模型首先使用检索系统从大型文档集合中查找相关的文档或段落。这个检索系统通常基于密集向量搜索,例如ChromaDB、Faiss这样的向量数据库。

  1. 上下文编码:找到相关的文档或段落后,模型将它们与原始输入(问题)一起编码。

  2. 生成:使用编码的上下文信息,模型生成输出(答案)。这通常当然是通过大模型完成的。

二、文档加载

一些常用的文档加载器列表 图片.png

三、文本转换

1.文本分割器

LangChain中,文本分割器的工作原理如下:

(1) 将文本分成小的、具有语义意义的块(通常是句子)。

(2) 开始将这些小块组合成一个更大的块,直到达到一定的大小。

(3) 一旦达到该大小,一个块就形成了,可以开始创建新文本块。这个新文本块和刚刚生成的块要有一些重叠,以保持块之间的上下文。

四、文本嵌入

两种方法:

  1. 第一种是 embed_documents 方法,为文档创建嵌入。这个方法接收多个文本作为输入,意味着你可以一次性将多个文档转换为它们的向量表示。
  2. 第二种是 embed_query 方法,为查询创建嵌入。这个方法只接收一个文本作为输入,通常是用户的搜索查询。

五、存储嵌入

要初始化一个CacheBackedEmbeddings,主要的方式是使用from_bytes_store。其需要以下参数:

  • underlying_embedder:实际计算嵌入的嵌入器。
  • document_embedding_cache:用于存储文档嵌入的缓存。
  • namespace(可选):用于文档缓存的命名空间,避免与其他缓存发生冲突。

不同的缓存策略如下:

  1. InMemoryStore:在内存中缓存嵌入。主要用于单元测试或原型设计。如果需要长期存储嵌入,请勿使用此缓存。
  2. LocalFileStore:在本地文件系统中存储嵌入。适用于那些不想依赖外部数据库或存储解决方案的情况。
  3. RedisStore:在Redis数据库中缓存嵌入。当需要一个高速且可扩展的缓存解决方案时,这是一个很好的选择。

六、数据检索

图片.png

七、总结

🤩简单来说,RAG就是通过检索和生成两步来得到答案。先是用检索系统在大文档库里找相关的文档或段落,然后再用这些找到的信息和原始问题一起编码,最后生成答案。📝

在文档加载、文本转换和文本嵌入这些环节,都有很多实用的方法和工具,比如文本分割器、不同的嵌入方法和存储嵌入的缓存策略。💾

我觉得最厉害的是存储嵌入部分,有好多种缓存方式可以选,可以根据需求选最适合的。比如内存缓存适合快速测试,本地文件存储适合不想用外部数据库的情况,Redis数据库缓存就适合需要高速和可扩展性的时候。🚀

总的来说,RAG技术让AI更聪明了,能更准确地回答我们的问题!🎉