如何通过索引编号从FAISS数据库提取嵌入向量(Python)
从FAISS数据库提取指定文档的嵌入向量
FAISS本身仅存储向量数据,不会自动关联原文档的元信息(比如属于哪份文档),所以要提取第x份文档的嵌入向量,核心是提前维护向量与原文档的映射关系,具体操作如下:
1. 嵌入阶段需同步记录映射关系
在将文档分块嵌入并添加到FAISS索引时,要同时保存每个向量对应的原文档编号。比如用一个列表来存储:
import faiss import numpy as np # 假设你有N份文档,已分块得到所有向量embeddings(shape: [total_blocks, embedding_dim]) # 同时维护一个映射列表,每个元素对应向量所属的原文档编号 doc_mapping = [] # 长度等于total_blocks,每个元素是原文档的编号(比如第x份文档编号为x-1或x,按你的编号规则来) # 初始化FAISS索引 embedding_dim = embeddings.shape[1] index = faiss.IndexFlatL2(embedding_dim) index.add(embeddings) # 保存映射表(可选,比如存为json文件,方便后续加载) import json with open("doc_mapping.json", "w") as f: json.dump(doc_mapping, f)
2. 提取指定文档的向量
加载FAISS索引和映射表后,筛选出属于第x份文档的向量索引,再用FAISS的reconstruct方法提取对应向量:
# 加载FAISS索引和映射表 index = faiss.read_index("faiss_index.faiss") with open("doc_mapping.json", "r") as f: doc_mapping = json.load(f) # 假设第x份文档的编号是x(根据你的实际编号调整,比如从0开始就用x-1) target_doc_id = x # 找到所有属于目标文档的向量在FAISS中的索引 vector_indices = [i for i, doc_id in enumerate(doc_mapping) if doc_id == target_doc_id] # 提取这些向量 target_embeddings = [] for idx in vector_indices: vec = index.reconstruct(idx) target_embeddings.append(vec) # 转成numpy数组方便后续处理 target_embeddings = np.array(target_embeddings)
注意事项
- 如果之前嵌入时没有保存映射表,无法直接从FAISS索引中反向推导向量所属的原文档,只能回溯之前的文档分块流程,重新生成映射表。
- 若文档分块数量极大,遍历映射表效率较低,可以提前用字典分组,比如
from collections import defaultdict,将文档编号映射到对应的向量索引列表,这样提取时直接查找即可。
内容的提问来源于stack exchange,提问作者user6515293
相关产品推荐
相关产品推荐

