使用 LangChain 掌握检索增强生成 (RAG) 的终极指南:6、索引

快速上手LangChain(三)构建检索增强生成(RAG)应用 典型的 RAG 应用程序有两个主要组件 * 索引:一个从源头摄取数据并对其进行索引的管道。这**通常离线进行**。 * 检索和生成:实际的 RAG 链,它在运行时获取用户查询,从索引中检索相关数据,然后将其传递给模型。 阅读详情

6.索引

在 RAG 中,我们做的第一件事是创建一个向量存储来存储所提供文档的“块”。它们以一种可以根据查询轻松有效地检索的方式存储在我们的矢量数据库中。这称为索引。在本节中,我们将研究 Langchain 所采用的用于优化 RAG 的不同索引技术。

%load_ext dotenv
%dotenv secrets/secrets.env

6.1.多表示索引

在多表示索引中,我们首先生成每个文档的摘要,而不是对整个文档进行分块和嵌入。然后,摘要的嵌入将存储在向量存储中,而通过 id 与这些摘要相关的完整文档则存储在单独的内存数据库(即文档存储)中。一旦用户提出问题,我们的多向量检索器将首先从向量存储中获取最相似的摘要,然后从文档存储中获取相应的文档。因此,不仅由于嵌入空间较小,相似性搜索将得到优化,而且 LLM 可以使用整个原始文档作为上下文(而不是块)来准确回答问题。

from langchain_core.documents import Document
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import WebBaseLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.prompts import ChatPromptTemplate
from langchain import hub

首先我们创建两个文档来回答用户的问题。

loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
docs = loader.load()

loader = WebBaseLoader("https://lilianweng.github.io/posts/2024-02-05-human-data-quality/")
docs.extend(loader.load())

然后我们创建一个链,根据每个文档的页面内容生成摘要。

chain = (
    {
   
   "doc": lambda x: x.page_content}
    | ChatPromptTemplate.from_template("Summarize the following document:\n\n{doc}")
    | ChatOpenAI(model="gpt-3.5-turbo",max_retries=0)
    | StrOutputParser()
)

summaries = chain.batch(docs, {
   
   "max_concurrency": 5})
summaries[0]

‘The document discusses the concept of building autonomous agents
powered by Large Language Models (LLMs). It explains the key
components of such agents, including Planning, Memory, and Tool Use.
Several proof-of-concept examples are provided, such as AutoGPT and
GPT-Engineer, showcasing the potential of LLMs in various tasks.
Challenges related to finite context length, planning, and reliability
of natural language interfaces are also addressed. Finally, the
document includes citations and references for further reading.’

生成摘要后,我们将docstore创建为InMemoryByteStore来存储使用 UUID 索引的文档,并创建 Chroma vectorestore来存储转换为文档的摘要的嵌入。在这里,我们使用 UUID 将摘要与文档链接起来,该 UUID 作为元数据添加到每个摘要中。最后,我们使用创建的vectorstore 、 docstore和doc_id作为它们之间的链接来创建MultiVectorRetriever 。

from langchain.storage import InMemoryByteStore
from langchain.retrievers.multi_vector import MultiVectorRetriever
import uuid

docstore = InMemoryByteStore() # To store the documents
vectorstore = Chroma(collection_name="summaries", embedding_function=OpenAIEmbeddings()) # To store the embeddings from the summeries of the documents

# ids that map summeries to the documents
doc_ids = [str(uuid.uuid4()) for _ in docs]

# Create documents from summeries. 
summary_docs = [Document(page_content=s, metadata={
   
   "doc_id": doc_id}) for s, doc_id in zip(summaries, doc_ids)]

# Create the retriever
retriever = MultiVectorRetriever(
    vectorstore=vectorstore,
    byte_store=docstore,
    id_key="doc_id"
)

# Add summaries to the vectorstore
retriever.vectorstore.add_documents(summary_docs)

# Add docuemnts to the docstore
retriever.docstore.mset(list(zip(doc_ids, docs)))

然后我们可以查询向量库以获取与用户查询相关的摘要。

query = "Memory in agents"
sub_docs = vectorstore.similarity_search(query,k=1)
sub_docs[0]

Document(page_content=‘The document discusses the concept of building
autonomous agents powered by Large Language Models (LLMs). It explains
the key components of such agents, including Planning, Memory, and
Tool Use. Several proof-of-concept examples are provided, such as
AutoGPT and GPT-Engineer, showcasing the potential of LLMs in various
tasks. Challenges related to finite context length, planning, and
reliability of natural language interfaces are also addressed.
Finally, the document includes citations and references for further
reading.’, metadata={‘doc_id’:
‘997d7f6e-3911-49e8-b23f-3dca97361902’})

此外,我们还可以直接获取与用户查询相关的文档,该文档可以用作LLM的上下文来回答用户问题。

警告

您必须确保 LLM 有足够的上下文长度来容纳整个文档和问题。

retrieved_docs = retriever.invoke(query)
len(retrieved_docs[0].page_content)

Number of requested results 4 is greater than number of elements in
index 2, updating n_results = 2

43902

6.2. RAPTOR(树组织检索的递归抽象处理)

尽管多表示索引允许我们索引大型文档并将它们作为上下文检索,但将整个原始文档提供给LLM将是昂贵且缓慢的。此外,如果需要多个文档来回答用户问题,则很难使用多表示索引来做到这一点。因此,引入了RAPTOR作为解决方案,它使用分层索引来递归地嵌入、聚类和汇总文本块,从下到上构建具有不同汇总级别的树。

在该树中,叶节点将是文本块(根据论文)或本例中的完整文档。然后 RAPTOR 嵌入叶节点并对它们进行聚类。每个集群都被概括为跨相似文档的更高级别(更抽象)的信息整合。这一过程递归地完成,直到只剩下一个簇。

让我们看看如何使用 Langchain 来实现!

6.2.1.加载文档

首先,我们从 2 篇论文创建 2 个文档并将它们合并。我们还初始化 LLM 和嵌入模型。

lora_doc = PyPDFLoader("data/LORA.pdf")
docs = lora_doc.load(<
LangChain使用实例——RAG LLMs支持的最强大的应用程序之一是复杂的问答 (Q&A) 聊天机器人,这些应用程序可以回答有关特定源信息的问题,使用一种称为(RAG)的技术。 阅读详情

相关推荐

Langchain 基本概念:组件和链,模式、模型、提示、索引、内存、链和代理

随着我们继续探索和利用人工智能的力量,像LangChain这样的工具只会成为我们工作中不可或缺的一部分,提高我们的生产力并改变我们与技术的互动方式。在自然语言处理的上下文中,嵌入类似于每个单词或短语的神奇本质,捕获其独特的上下文以及与其他单词的关系。想象一下,VectorStores 大库中的每个音符都具有独特的颜色、形状和风味,捕捉其精确的曲调、节奏以及与信息交响乐中其他音符的关系。总之,LangChain的模型正在改变我们构建和与AI系统交互的方式,使我们离实现人工智能的全部潜力更近了一步。

AI天才研究院 1万+

使用Python和LangChain构建检索增强生成(RAG)应用的详细指南

RAG是一种技术,用于增强LLM的知识,使其能够处理额外的数据。尽管LLM能够处理广泛的话题,但其知识仅限于训练时所用的公共数据,且截至时间有限。如果希望构建能够处理私有数据或模型截止日期之后的数据的AI应用,就需要通过RAG来增强模型的知识。具体来说,RAG通过检索相关信息并将其插入到模型提示中,从而实现这一目标。LangChain提供了一系列组件,旨在帮助构建Q&A应用和更广泛的RAG应用。本文将重点介绍处理非结构化数据的Q&A技术。我们还可以轻松自定义提示,以适应不同的应用场景。{context}

m0_57781768的博客 1599

RAG 技术实战:LangChain4j 的文档处理与检索增强生成

**文章摘要**: 本文深入解析 LangChain4j 中的 RAG(检索增强生成)技术,详细阐述其核心原理与应用场景。RAG 通过检索相关信息并注入提示,显著提升 LLM 的回答准确性,减少幻觉。文章从简单 RAG、基本 RAG 到高级 RAG 的实现路径逐步展开,涵盖文档加载、嵌入存储、内容检索等关键环节,并提供 LangChain4j 的 API 使用指南。通过优化查询转换、多源检索与内容聚合,RAG 技术在问答系统、知识库检索等领域展现出强大的实用性。本文为开发者提供从入门到精通的完整实践路径

洛阳泰山的博客 2797

吉比特-笔试

1. 题一:打雷后下雨的概率是80%,而打闪电后下雨的概率是70%,那么即打雷又打闪电后下雨的概率是多少?   答:打雷后下雨和打闪电后下雨都是独立事件,P=1-又打雷又闪电但没下雨的概率= 1 - 0.2 *0.3 = 94%        题二:打雷后下雨的概率是80%,但是没打闪电后下雨的概率是20%,那么打雷了但没打闪电后下雨的概率是多少?答:P=0.8 *0.2 / ( 0.8 *0

naturism的专栏 2495

【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)

1. 简介 卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。详情见:卡尔曼滤波简介 MPU6050的解算主要有三种姿态融合算法:四元数法 、一阶互补算法和卡尔曼滤波算法。我们常用的DMP库使用的是四元数法,本文采用卡尔曼滤波算法,使用RT-Thread国产操作系统,利用env工具进行串口、模拟IIC环境配置,使用10ms的线程进行卡尔曼滤波解算。 2.

weixin_44549777的博客 3万+

ComfyUI Impact Pack实战:如何用三大检测器打造高效人脸修复工作流(附2025最新模板)

本文详细解析了如何利用ComfyUI Impact Pack中的BBOX、Segm和SAM三大检测器构建高效人脸修复工作流。通过技术选型、参数优化和实战案例,帮助用户掌握从精准定位到细节修复的全流程技巧,特别适用于商业摄影和影视制作场景。文章还提供了2025年最新模板和性能优化方案,显著提升人脸精修效率。

weixin_29040367的博客 244

西门子S7-1200与汇川SV660F伺服Profinet通讯调试实战

在工业自动化领域,Profinet作为工业以太网标准协议,凭借其高实时性和灵活组网能力,已成为伺服驱动器与PLC通讯的主流选择。其核心原理是通过设备名识别、IP分配以及标准报文(如111速度报文、105定位报文)传输控制字与状态字,实现驱动器的精准控制。相比传统脉冲或CANOpen方案,Profinet直连省去了协议转换网关,降低了成本与故障点,尤其适用于绕线设备、包装机械等中小型单轴或多轴运动控制系统。本文以西门子S7-1200 PLC搭配汇川SV660F伺服为例,完整梳理了从GSDMD组态、InoDri

weixin_29184371的博客 222

YOLO 系列专栏(二十九)YOLO26 × StarNet 轻量化涨点方案(CVPR 2024)轻量化、主干改进篇 | 星星卷积虽小,却蕴藏着巨大的高效潜力

StarNet 出自 CVPR 2024 轻量化主干网络工作,核心创新是,依靠逐元素乘法实现高阶特征融合,在几乎不增加参数量与 FLOPs 的前提下,大幅提升特征表达能力,天然适合等多任务统一建模。本文将 StarNet 完整替换 YOLO26 原有主干,保留 YOLO26 无 NMS 检测头与轻量化结构,实现,并提供。

qq_36130719的博客 409

超声波传感器(CHx01) 学习笔记 Ⅲ - I2C读写操作

CH-x01 通过 2 线 I2C 协议与主机处理器通信

nicole088的专栏 1737

手把手教你学GPU的KMD专栏--3.1 设备初始化流程深度解析

本文深入解析了KMD(内核模式驱动)设备初始化流程,这是GPU驱动开发最基础且关键的环节。初始化流程包括6个核心阶段:KMD模块加载、PCIe设备探测匹配、GPU硬件初始化、显存分配映射、中断系统配置和设备注册。每个阶段都有详细步骤解析,涉及关键数据结构和错误处理机制。文章还分析了常见问题(驱动加载失败、显存分配失败、中断配置失败)的解决方案,并指出未来趋势将向动态初始化、安全增强和AI优化方向发展。正确高效的初始化流程是确保GPU被操作系统安全使用的前提,也是后续内存管理、任务调度等功能的基础。

MHD0815的博客 262

MinerU 系列教程 | 第二课:快速上手 -- 安装与第一次解析

本篇教程作为的第二课,将带你从零完成 MinerU 的环境搭建、模型下载,并成功运行第一次文档解析。上一课我们从宏观视角认识了 MinerU,本课开始正式动手实践。

weixin_43674738的博客 299

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 1.1、AI及LLM基础:AI 领域基础概念
下一篇: 1.2、AI及LLM基础:OpenAI 开发
Hugo_Hoo
博客等级 码龄11年 1279粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hugo_Hoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值