高级检索增强生成(RAG)应用与LlamaIndex
**引言**
在最近由Zilliz(旧金山)主办的非结构化数据聚会上,LlamaIndex的开发者关系副总裁Laurie Voss发表了一场关于“使用LlamaIndex构建高级RAG应用”的演讲。他分享了如何使检索增强生成(RAG)框架更简单、更易于生产准备的知识,并通过LlamaIndex实现。
**观看Laurie的演讲**
让我们深入探讨RAG的概念,并看看LlamaIndex 🦙如何协助开发RAG应用。快速回顾一下LlamaIndex(以前称为GPTIndex),他们早期的许多工作是与像OpenAI这样的强大闭源技术合作。然而,随着开源模型开始迎头赶上,他们开始整合开源替代品。无论是大型语言模型(LLMs)、嵌入模型还是重新排名技术,他们现在都提供了许多选项,供用户使用自己的数据构建RAG应用。
**什么是检索增强生成(RAG)?**
**系统化RAG工作流程**
RAG是一个旨在通过检索能力帮助大型语言模型(LLMs)克服其局限性的框架。LLMs的主要缺点是它们有有限的上下文窗口,并且只能同时处理组织数据的一部分(一次不超过一百万个标记)。RAG通过选择性地检索最相关的文本/数据来提供最准确的响应,从而解决这个问题。
**RAG的关键优势:**
- **准确性**:当通过实施的检索方法检索到相关且简明的数据并发送到LLM时,它确保了准确的响应。
- **时效性**:一些人可能会问,为什么公司不使用他们的数据训练LLM。微调的挑战在于,将LLM加载到任何环境中,尤其是高质量的环境,已经是昂贵的。另一方面,检索增强生成(RAG)允许轻松、实时的数据更新。这使得RAG成为动态数据环境的实际解决方案,例如在大型私人律师事务所或工业公司中发现的环境。
- **出处**:RAG可以追溯信息的特定来源,这对于需要可验证数据的应用程序至关重要。
简单来说,还记得你小时候参加的理解测试吗?RAG与此非常相似。检索到的文本块充当理解内容,从中LLM(孩子)必须回答查询。就是这么简单 ;-)
**RAG如何工作**
RAG是解决LLMs有限上下文窗口的解决方案。它检索最相关的数据,用上下文增强查询,并生成响应。
**检索技术**
两种技术广泛用于信息检索。
- **关键词搜索**:传统的关键词搜索方法在基于特定术语检索数据时仍然有效。
- **向量搜索(最强大)**:将向量搜索视为将单词转换为称为向量的数字列表。这些向量捕捉每个单词含义的本质。我们可以通过比较这些向量的数字接近度(主要通过余弦相似度或点积来衡量)来找到相似的单词。向量搜索帮助我们更有效、更可靠地检索数据。一旦我们执行了向量搜索,LLM就可以访问最相关的文本来回答查询。
当您想到向量搜索时,请想象您的牛津词典。然而,按字母序列而不是按含义对单词进行分组。向量嵌入模型在维度上做同样的事情。
**使用向量搜索对术语进行维度和语义分组**
另外,开源向量数据库如Milvus可以免费设置向量存储!点击这里查看。
**LlamaIndex:简化RAG实现**
LlamaIndex是一个开源框架,将您的数据连接到LLMs,提供Python和TypeScript版本。它简化了RAG应用的创建,允许开发人员用最少的代码构建功能性RAG系统。借助LlamaIndex,您只需要五行Python代码即可实现基本的RAG功能。
```python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("作者在成长过程中做了什么?")
```
**LlamaIndex提供的高级RAG数据摄取和查询功能**
LlamaIndex还为您的RAG应用提供了广泛的高级数据摄取和查询功能。
**摄取**
- **数据连接器**:LlamaHub由LlamaIndex提供,为各种数据源提供连接器,包括Google Drive、Notion、Slack以及像Postgres和MongoDB这样的数据库。
- **PDF解析**:LlamaIndex提供高级PDF解析功能,将复杂的PDF转换为Markdown,以更好地理解LLM,因为LLM是在大量Markdown数据上训练的。
- **嵌入模型**:LlamaIndex支持各种开源和闭源嵌入模型,允许根据领域进行定制。
- **向量存储**:LlamaIndex与多个向量数据库集成,包括Milvus和Zilliz Cloud,用于高效存储和检索。
**查询**
- **子问题查询引擎**:对于需要多个简单查询的复杂问题,子问题查询引擎将主查询分解为更小的部分,从不同的来源检索答案,并将它们组合成单个响应。
- **查询分解以更好地检索**
- **单独响应收集**
- **最终编译响应**
- **从小到大数据检索**
这种方法涉及将文本的极小片段(与用户查询高度相关的可能性很高的句子)嵌入向量,并检索该句子周围的向量窗口,包括上下文。
- **从小到大数据检索方法可视化**
- **实际实现**
- **元数据过滤**
预标记文档的元数据(例如,年份、用户、公司、关键词),如下面的例子,允许更精确的过滤和检索,提高LLM响应的准确性。此功能可以帮助关键词搜索。将元数据视为文本的自定义属性。
- **混合搜索**
通过结合关键词搜索和向量搜索,混合搜索通过指定的方法运行查询。它根据置信度分数合并结果,确保检索到最相关的数据 - 这里有一个详细的示例和代码。
**代理**
LlamaIndex代理是半自主的软件片段,使用各种工具来实现目标。它们可以结合多种检索策略和工具,有效回答复杂查询。
这样想:工具是用户可以设置其功能描述的预定义用户功能,而代理是与这些工具合作的工程师。如果用户直接提示LLM两个大数的乘积结果,它很可能会给出接近实际真实答案的答案,但不是相同的。但如果我们给它一个乘法工具,它可以根据设置的描述调用,无论数字大小,它都将始终获得正确的答案。
- **简单代理工作流程**
同样,用户可以通过给LLM提供工具及其描述,并让它决定对于特定的RAG查询使用哪个工具,来构建代理RAG工作流程。
**总结**
Laurie的演讲展示了基本和高级RAG应用框架,我们可以使用LlamaIndex用最少的代码行构建。LlamaIndex还为我们提供了LlamaParse,这可以帮助我们将数据索引到我们最喜欢的向量数据库,如Milvus,无论是本地还是云端。最终取决于用户选择最适合他们用例的内容。这次演讲还展示了各种RAG策略,人们可以选择优化检索和生成。
**引用**
Liu, Jerry. “Llamahub.” Llamahub, 2023, https://cloud.llamaindex.ai/parse.
Liu, Jerry. “Starter Tutorial (OpenAI).” LlamaIndex, 2023, https://docs.llamaindex.ai/en/stable/getting_started/starter_example/.
“Llama Hub.” Llama Hub, 2023, https://llamahub.ai/.
LlamaIndex. “Hybrid Search.” LlamaIndex, 2023, https://docs.llamaindex.ai/en/stable/examples/vector_stores/MilvusHybridIndexDemo/.
LlamaIndex. “LLM based Agents.” LlamaIndex, 2023, https://docs.llamaindex.ai/en/stable/use_cases/agents/.
LlamaIndex. “Metadata Replacement + Node Sentence Window.” LlamaIndex, 2023, https://docs.llamaindex.ai/en/stable/examples/node_postprocessor/MetadataReplacementDemo/.
LlamaIndex. “Sub Question Query Engine.” LlamaIndex, 2023, https://docs.llamaindex.ai/en/stable/examples/query_engine/sub_question_query_engine/.
Milvus. “Milvus.” Milvus: Vector database, 2019, https://milvus.io/.
Milvus. “Milvus Vector Datbases.” Milvus: Vector database, 2023, https://milvus.io/.
Milvus. “Quickstart Milvus documentation.” Milvus, 5 May 2024, https://milvus.io/docs/quickstart.md.