文章目录
Prompt实战之构建语义搜索引擎 5)构建向量数据库与检索器
前一章我们已经将文档片段向量化,现在需要将这些向量结构化地存储起来,并提供高效检索能力。
这就是向量数据库(Vector Store)和检索器(Retriever)的作用。
5.1 向量数据库的作用
向量数据库用于存储:
- 文档片段(原文)
- 对应的向量(Embedding)
- 可选的元信息(metadata)
并支持以下操作:
- 插入(Indexing)
- 相似度搜索(Similarity Search)
- 过滤与排序
5.2 LangChain 支持的向量数据库
向量数据库 | 类型 | 是否支持本地 | 备注 |
---|---|---|---|
FAISS | 本地 | ✅ | 快速轻量,离线优选 |
Chroma | 本地+服务端 | ✅ | 支持过滤、持久化等高级功能 |
Milvus / Qdrant | 向量服务端 | ❌(需部署) | 商业场景、支持大规模数据 |
Weaviate / Pinecone | 向量服务端 | ❌(需注册) | 商业服务,适用于云部署 |
本章重点使用 FAISS 和 Chroma。
5.3 使用 FAISS 存储向量
安装依赖
pip install faiss-cpu
构建向量数据库
from langchain.vectorstores import FAISS
# 构建 FAISS 向量数据库
vectorstore = FAISS.from_documents(
documents=split_docs,
embedding=embedding_model
)
向量搜索示例
query = "中国的法律体系如何演变?"
docs = vectorstore.similarity_search(query, k=3)
for i, doc in enumerate(docs):
print(f"第{i+1}条结果:\n{doc.page_content}\n")
5.4 使用 Chroma 存储向量(支持持久化)
安装依赖
pip install chromadb
构建 Chroma 向量库
from langchain.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=split_docs,
embedding=embedding_model,
persist_directory="chroma_db"
)
vectorstore.persist()
💡 Chroma 支持 metadata 过滤、删除、更新等操作,更适合构建长期项目。
5.5 检索器(Retriever)介绍
Retriever 是向量数据库的封装,LangChain 使用它来做“语义搜索”。
创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity", # 可选:"mmr", "similarity_score_threshold"
search_kwargs={"k": 5}
)
使用检索器
retrieved_docs = retriever.get_relevant_documents(query)
📌
Retriever
是 LangChain Agent / Chain 模块的重要输入组件。
5.6 检索器的高级用法
用法 | 说明 |
---|---|
MMR 检索 | 结果去冗余,覆盖更多主题 |
分数阈值过滤(score_threshold) | 仅返回相似度高于设定值的文档 |
向量 + 元信息过滤组合 | 如限制“文档年份 > 2020 且作者为张三” |
示例:
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"score_threshold": 0.8, "k": 3}
)
5.7 本章小结
你已经掌握了:
- 向量数据库的结构与作用;
- 如何使用 FAISS 与 Chroma 存储向量;
- 如何使用检索器执行语义搜索;
- 常见的高级检索策略与参数配置。
练习区 🛠️
- 使用 FAISS 构建一个向量数据库,并搜索关键词“机器学习的发展史”,输出前 3 个文档片段。
- 改用 Chroma,并添加自定义
metadata={"source": "chapter1.pdf"}
,尝试基于 source 进行过滤检索。 - 比较两种检索器类型:
similarity
与mmr
,观察返回文档的差异。 - 尝试更换向量模型(如 bge-large),观察相似度排序是否变化。