langchain(八)向量存储与检索
介绍
向量存储是LangChain框架中用于高效存储和检索非结构化数据(如文本)的核心组件,它通过将文本转换为向量表示,并利用向量相似性度量实现快速查询。12 本节介绍向量存储的基本概念、常用数据库集成、关键操作方法及检索器的使用。
向量存储的核心作用是将文本转换为向量并支持相似性搜索。 其工作原理是使用嵌入模型(如OpenAI或Hugging Face模型)将文本编码为高维向量,然后存储这些向量以支持基于相似度的检索。23 在LangChain中,向量存储通常与检索增强生成(RAG)应用结合,通过检索相关文档来增强语言模型的生成能力。

LangChain支持多种向量数据库,包括开源和托管选项。 常见选择包括:
- Chroma:轻量级开源数据库,适合本地开发和小型项目,支持内存或持久化存储。
- FAISS:由Facebook AI开发,专注于高效相似性搜索和密集向量聚类,适用于大规模数据集。
- Pinecone:完全托管的服务,提供高可扩展性和高性能,适合生产环境。
- Qdrant:开源向量搜索引擎,支持向量存储、语义搜索和过滤功能。
- Elasticsearch:分布式搜索引擎,支持向量搜索和大规模数据集的高效相似度查询。
- MongoDB Atlas:提供向量搜索功能,便于与结构化数据结合使用。
- pgvector:PostgreSQL扩展,支持在关系数据库中进行向量相似度搜索。
- Weaviate:开源数据库,支持多模态数据和语义搜索。
- Neo4j:图形数据库,原生支持向量搜索,适用于复杂图查询。
向量存储的关键操作包括文档管理、基本检索和高级搜索策略。 主要方法包括:
- 文档管理:使用
add_documents或upsert_documents方法添加或更新文档,支持手动指定ID以方便管理;delete_documents用于删除文档。 - 基本检索:
similarity_search方法基于查询向量的余弦相似度检索最相关的文档。 - 高级搜索策略:例如最大边际相关性搜索(MMR),在相关性和多样性之间取得平衡,避免检索结果过于相似。
向量搜索是一种常见的存储和搜索非结构化数据(例如非结构化文本)的方法。其思想是存储与文本相关联的数值向量。给定一个查询,我们可以将其 嵌入 为相同维度的向量,并使用向量相似性度量来识别存储中的相关数据。
LangChain 向量存储对象 包含用于将文本和文档对象添加到存储中以及使用各种相似性度量进行查询的方法。它们通常使用 嵌入模型 进行初始化,这决定了文本数据如何转换为数值向量。
LangChain 包含与不同向量存储技术的集成套件。一些向量存储由提供商(例如各种云提供商)托管,并需要特定的凭据才能使用;一些(如 Postgres)在可以本地运行或通过第三方运行的独立基础设施中运行;其他可以在内存中运行以处理轻量级工作负载。
要实例化一个向量存储,我们通常需要提供一个 嵌入模型,以指定文本应如何转换为数值向量。这里我们将使用阿里云的 DashScope嵌入(灵积模型),如下所示
pip install faiss-cpu
实例
#导入和使用 WebBaseLoader
from langchain_community.document_loaders import WebBaseLoader
from dotenv import load_dotenv
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
load_dotenv()
import bs4
import os
loader = WebBaseLoader(
web_path="https://www.gov.cn/yaowen/liebiao/202512/content_7052417.htm",
bs_kwargs=dict(parse_only=bs4.SoupStrainer(id="UCAP-CONTENT"))
)
docs = loader.load()
# 分割文档(chunk_size=500,重叠50个字符)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = text_splitter.split_documents(docs)
print(f"文档分割后片段数量:{len(documents)}")
# 3. 初始化阿里百炼嵌入模型(核心替换)
# 方式1:从环境变量读取API_KEY(推荐,需在.env中配置 DASHSCOPE_API_KEY=你的密钥)
embeddings = DashScopeEmbeddings(
model="txt-embedding-v1", # 阿里百炼嵌入模型默认值,也可使用其他嵌入模型
dashscope_api_key=os.getenv("DASHSCOPE_API_KEY")
)
# 4. 将文档片段转换为向量并存储到FAISS
vector = FAISS.from_documents(documents, embeddings)
print("阿里百炼嵌入 + FAISS向量存储构建完成!")
# 可选:测试向量检索(验证是否配置成功)
query = "文档中核心内容是什么?"
# 相似性检索(返回最相似的3个文档片段)
similar_docs = vector.similarity_search(query, k=3)
print("\n检索到的相似文档:")
for i, doc in enumerate(similar_docs):
print(f"\n【第{i+1}条】")
print(f"内容:{doc.page_content[:200]}...") # 只打印前200字符
更多推荐
所有评论(0)