什么是RAG?
RAG是一种结合了检索和生成技术的AI技术,它通过在大量文本数据中检索相关信息,并将其与生成模型相结合,以生成高质量的文本内容。RAG技术可以用于多种应用场景,如问答系统、对话机器人、内容生成等。
RAG的出现是为了解决什么问题?
- LLM知识范围的有限性(时限性/领域特定性)
- 时限性:OpenAI的模型在2024年3月之前都是基于2024年之前的训练数据,无法回答该时间点之后的问题
- 领域特定性:OpenAI的模型在2024年3月之前都是基于通用领域数据进行训练,无法回答特定领域的问题(比如企业内部问答,法律问答)
- LLM的输出结果可控性(避免出现回答幻觉,产生胡编乱造的回答)
- 回答幻觉:LLM在回答问题时,可能会产生一些不准确的答案,这些答案看起来像是正确的,但实际上是错误的。
RAG的实现原理
- (1) 用户上传文档:用户上传包含知识的文档,支持 txt、pdf、docx 等格式,将文档转换为特定的格式
- (2) 文本切割:为了便于分析和处理,将上步骤中获得的长文本切割为小块(chunk)
- (3) 文本向量化:将切割的 chunk 通过 embedding 技术,转换为算法可以处理的向量,存入向量数据库
- (4) 用户输入问题内容向量化:用户提问后,同样将用户的问句向量化
- (5) 语义检索匹配:将用户的问句与向量数据库中的 chunk 匹配,匹配出与问句向量最相似的 top k 个
- (6) 提交 prompt 至 LLM:将匹配出的文本和问句,一起添加到配置好的 prompt 模板中,提交给 LLM
- (7) 生成回答:LLM 生成回答,返回给用户
从实现原理引出的问题
-
- 步骤一中的文档上传,如何将文档转换为特定的格式?
-
- 步骤二中的文本切割,如何将文本切割为小块?切的颗粒度怎么控制?
-
- 步骤三中的文本向量化,如何将文本转换为向量?需要用到什么技术?
-
- 步骤四中的用户输入问题内容向量化,如何将输入转换为向量?用什么技术?
-
- 步骤五中的语义检索匹配,top k 如何确定?
-
- 步骤六中的提交 prompt 至 LLM,如何将问句和匹配出的文本一起添加到 prompt 模板中?
开始构建一个RAG pipeline
加载数据(Loading Data (Ingestion))
从此处我们开始研究 Llamaindex 的每个环节,Llamaindex 是一个成熟的开源LLM数据处理方案
- 使用 SimpleDirectoryReader 加载数据
SimpleDirectoryReader,它可以根据给定目录中的每个文件创建文档。
它内置于 LlamaIndex 中,可以读取各种格式,包括 Markdown、PDF、Word 文档、PowerPoint 幻灯片、图像、音频和视频。
- 从数据库中加载文档
- 创建新文档
转换数据 — 文本切割
加载数据后,需要处理和转换数据,然后再将其放入存储系统。
这些转换包括分块、提取元数据和嵌入每个块。这是确保LLM能够检索和最佳使用数据所必需的。
- 使用简单的文本分割器分割,使用chunk_size控制每个chunk的大小
输出结果:单个文件被切分为多个node
索引 & 嵌入(Index & Embedding)
什么是索引
在 LlamaIndex 术语中, Index是由Document对象组成的数据结构,旨在支持LLM查询。您的索引旨在补充您的查询策略。
(Vector Embedding)AKA Embedding
Embedding is a numerical representation of the semantics, or meaning of your text.
用数值表示的语义或含义,相似含义的两段文本具有相似的嵌入(Embedding),即使实际文本完全不同
这种数学关系支持语义搜索,用户提供查询术语,LlamaIndex 可以定位与查询术语含义相关的文本,而不是简单的关键字匹配。
这是检索增强生成的工作原理以及LLMs一般运作方式的重要组成部分。
嵌入有很多种类型,它们的效率、有效性和计算成本各不相同。默认情况下,LlamaIndex 使用text-embedding-ada-002 ,这是 OpenAI 使用的默认嵌入。如果您使用不同的LLMs您通常会希望使用不同的嵌入。
1. 矢量存储索引嵌入文档
2. Top K 语义检索
1.向量存储索引(Vector Store Index)
向量存储索引是最常见的索引类型。向量存储索引获取您的文档并将它们分成节点。然后,它创建每个节点文本的vector embeddings ,准备好由LLM查询。
2.概要索引(Summary Index)
索引存储
1. 存储在文件系统(磁盘)
存储在文件系统中,需要指定一个目录,将索引的元数据和向量存储在磁盘上。
从文件系统中加载索引
2. 向量存储(Vector Store)
使用:Chroma 存贮索引
- 安装Chroma
- 使用Chroma存贮索引
使用index插入document/node
查询(Query)
!pip install chromadb llama_index.vector_stores.chroma llama_index.embeddings.huggingface llama_index.llms.gemini
提供的data/data.txt