RAG 入门教程:LangChain 框架中的向量存储
什么是向量存储
向量存储是一种专门用于存储和管理向量嵌入的数据库。它旨在高效处理大量向量,提供根据特定标准添加、查询和检索向量的功能。它可用于支持语义搜索等应用程序,在这些应用程序中,您可以查找与给定查询在语义上相似的文本段落或文档。
嵌入向量原理
嵌入向量是文本的数字表示,可以捕捉文本的内容和含义。内容和含义相似的文本会具有相似的向量,也就是说,它们在嵌入空间中的向量之间的距离会很小。
例如,'猫在沙发上睡觉'和'小猫在沙发上打盹'这两个句子的单词不同,但含义相似。它们的嵌入向量在嵌入空间中彼此接近,反映了它们的语义相似性。嵌入向量的这一特性对于各种任务至关重要,例如语义搜索、文本聚类等,在这些任务中,理解文本的含义至关重要。
工作流程
如前所述,我们使用文档加载器加载文档,然后使用文档转换器将文本分成块。接下来,我们为每个块生成嵌入,并将这些嵌入及其相应的拆分存储在向量存储中。
当您在向量存储中执行查询时,查询文本首先会使用与生成存储在向量存储中的文本的嵌入相同的流程或模型转换为嵌入向量。这可确保查询和存储的文本在同一向量空间中表示,从而实现有意义的比较。
将查询转换为嵌入后,向量存储会根据相似度度量(例如余弦相似度)搜索最相似的向量(即最相似的文本)。然后检索与这些相似向量相对应的文本作为查询结果。
在 LangChain 工作流中,这些检索到的文本可以进一步处理,方法是将它们与原始查询一起传递给大型语言模型 (LLM) 进行进一步分析或处理。例如,LLM 可以根据查询和检索到的文本生成响应,或者可以执行一些需要理解类似文本提供的上下文的任务。
LangChain 中存在不同的向量存储实现,每种实现都针对不同的用例和存储要求进行了优化。一些向量存储可能使用内存存储以实现快速访问,而另一些向量存储可能使用基于磁盘的存储以实现可扩展性。
环境准备与数据预处理
首先,让我们处理向量存储之前的部分,包括 API 密钥配置、模型初始化以及文档加载与分块。
import os
os.environ["OPENAI_API_KEY"] = "your-key"
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 初始化 LLM 模型
llm_model = "gpt-4"
llm = ChatOpenAI(temperature=0.0, model=llm_model)
# 加载 PDF 文档
loader = PyPDFLoader("book.pdf")
docs = loader.load()
# 文本分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1500,
chunk_overlap=150
)
text_splits = text_splitter.split_documents(docs)
print(len(text_splits))


