You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过索引编号从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:47:44