如何从LangChain将预计算嵌入加载到FAISS向量存储中?
使用LangChain的FAISS导入预计算向量
直接导入预计算向量到LangChain FAISS
LangChain的FAISS类支持直接对接原生FAISS索引,或者通过预计算向量+文档的组合快速构建向量存储,以下是两种常见方式:
方式1:基于已构建的原生FAISS索引转换
如果你已经像示例中那样构建了原生FAISS索引,可以直接将其转换为LangChain兼容的向量存储:
from langchain_community.vectorstores import FAISS from langchain_core.embeddings import Embeddings import faiss # 假设d是向量维度,xb是你的预计算向量数组 d = 128 xb = ... # 形状为(n, d)的预计算向量集合 # 构建原生FAISS索引 index = faiss.IndexFlatL2(d) index.add(xb) # 准备对应文档列表(无文本需求时可传入等量空字符串) docs = ["文档1内容", "文档2内容", ...] # 数量需与xb的向量数一致 # 定义空嵌入类(因向量已预计算,无需再生成) class DummyEmbeddings(Embeddings): def embed_documents(self, texts): return [] def embed_query(self, text): return [] # 转换为LangChain FAISS向量存储 langchain_faiss = FAISS( embedding=DummyEmbeddings(), index=index, docstore=FAISS.faiss_to_docstore(index, docs), index_to_docstore_id={i: str(i) for i in range(len(docs))} )
方式2:直接用预计算向量+文档构建
如果还未构建原生索引,可通过FAISS.from_embeddings方法直接传入预计算向量和文档,自动完成索引构建:
from langchain_community.vectorstores import FAISS from langchain_core.embeddings import Embeddings # 预计算向量与对应文档的配对列表 text_embeddings = list(zip(docs, xb)) # 同样使用空嵌入类(或对应真实嵌入模型) langchain_faiss = FAISS.from_embeddings( text_embeddings=text_embeddings, embedding=DummyEmbeddings() )
更顺畅的LangChain交互方式
如果后续需要对接LangChain的检索链、LLM等组件,建议注意以下两点:
- 使用真实嵌入模型:如果预计算向量是通过特定嵌入模型生成的,传入该模型的实例(而非Dummy类),确保查询时生成的向量与存储向量维度、语义一致,比如用OpenAI嵌入的场景:
from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() langchain_faiss = FAISS.from_embeddings( text_embeddings=text_embeddings, embedding=embeddings ) - 保留元数据:构建时可以给文档添加元数据(如来源、标签),后续检索时能直接获取更丰富的上下文信息:
# 带元数据的文档列表 docs_with_metadata = [ {"page_content": "文档1内容", "metadata": {"source": "file1.txt"}}, {"page_content": "文档2内容", "metadata": {"source": "file2.txt"}} ] # 配对时取page_content text_embeddings = [(doc["page_content"], xb[i]) for i, doc in enumerate(docs_with_metadata)] langchain_faiss = FAISS.from_embeddings( text_embeddings=text_embeddings, embedding=embeddings, metadatas=[doc["metadata"] for doc in docs_with_metadata] )
转换完成后,你就可以直接调用langchain_faiss.as_retriever()生成检索器,无缝对接LangChain的各类链组件。
内容的提问来源于stack exchange,提问作者youneedtoread1
相关产品推荐
相关产品推荐

