RAG Day04 向量数据库
通过这种方式,可以在检索时实现“元数据过滤”和“向量搜索”的结合。
1.什么是向量数据库
将文档向量化后,我们现在有向量,文档,元数据(文档摘要)这些数据对象。
向量数据库,是为了方便文档的存储,查询。
存储就需要分配一个标识符,则会个标识符就是这个对象集合的索引,他和向量之间是一种映射关系。
# 完整的映射结构
rag_mapping = {
# 1. 向量ID到原始文本的映射
"embedding_vectors": {
"v_001": [0.123, 0.456, 0.789, ...], # 向量表示
"v_002": [0.234, 0.567, 0.890, ...],
},
# 2. 向量ID到文档内容的映射
"vector_to_content": {
"v_001": {
"text": "苹果是一种水果,富含维生素C。",
"metadata": {"doc_id": "doc_1", "section": "水果分类", "page": 1},
"chunk_id": "chunk_001"
},
"v_002": {
"text": "苹果公司发布了新款iPhone手机。",
"metadata": {"doc_id": "doc_2", "section": "科技新闻", "page": 1},
"chunk_id": "chunk_002"
}
},
# 3. 文档到所有块向量的反向映射
"doc_to_vectors": {
"doc_1": ["v_001", "v_003", "v_005"],
"doc_2": ["v_002", "v_004", "v_006"]
}
}
2.为什么要构建向量数据库
向量数据库的出现其实只有一个原因,这份外置数据太大了。我们无法直接提取出他的有效信息,所以需要外置一些索引和元数据,以便于更快的检索到他的相关信息。
在这个基础上,RAG与大语言模型是互为补充的。当外置数据库积累的足够大时,就可以训练最新的专属ai了。
3.怎样构建向量数据库
现在已经有很多成熟的框架体系了,比如ChromaDB
, FAISS,Milvus等。
主要是看看怎么使用。
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
# 1. 示例文本和嵌入模型
texts = [
"张三是法外狂徒",
"FAISS是一个用于高效相似性搜索和密集向量聚类的库。",
"LangChain是一个用于开发由语言模型驱动的应用程序的框架。"
]
docs = [Document(page_content=t) for t in texts]
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
# 2. 创建向量存储并保存到本地
vectorstore = FAISS.from_documents(docs, embeddings)
local_faiss_path = "./faiss_index_store"
vectorstore.save_local(local_faiss_path)
print(f"FAISS index has been saved to {local_faiss_path}")
# 3. 加载索引并执行查询
# 加载时需指定相同的嵌入模型,并允许反序列化
loaded_vectorstore = FAISS.load_local(
local_faiss_path,
embeddings,
allow_dangerous_deserialization=True
)
# 相似性搜索
query = "FAISS是做什么的?"
results = loaded_vectorstore.similarity_search(query, k=1)
print(f"\n查询: '{query}'")
print("相似度最高的文档:")
for doc in results:
print(f"- {doc.page_content}")
4.索引优化
(1)句子窗口检索(Sentence Window Retrieval):它在检索时聚焦于高度精确的单个句子,在送入LLM生成答案前,又智能地将上下文扩展回一个更宽的“窗口”,从而同时保证检索的准确性和生成的质量。
从实现上来说,它在索引的阶段和其他方法一样,但是在索引到相应的内容时,不仅返回了当前节点,也返回了当前节点的上下文部分一起送入大模型。它的主要优点是:索引给出的答案足够的丰富,但又不失精确。
(2)给出摘要作为大的“文本块”的索引(这里的大的文本块)
通过这种方式,可以在检索时实现“元数据过滤”和“向量搜索”的结合。例如,当用户查询“请总结一下2023年第二季度财报中关于AI的论述”时,系统可以:
- 元数据预过滤:首先通过元数据筛选,只在
document_type == '财报'
、year == 2023
且quarter == 'Q2'
的文档子集中进行搜索。 - 向量搜索:然后,在经过滤的、范围更小的文本块集合中,执行针对查询“关于AI的论述”的向量相似度搜索。
这种“先过滤,再搜索”的策略,能够极大地缩小检索范围,显著提升大规模知识库场景下RAG应用的检索效率和准确性。LlamaIndex 提供了包括“自动检索”(Auto-Retrieval)在内的多种工具来支持这种结构化的检索范式。
参考来源
all-in-rag/docs/chapter3/08_vector_db.md at main · datawhalechina/all-in-rag · GitHub

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐
所有评论(0)