LangChain FAISS索引已填充,调用similarity_search却返回空列表
问题背景
使用LangChain结合FAISS构建文档检索器,已完成多篇文档的索引,但调用similarity_search时始终返回空列表。
代码示例
from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.schema import Document docs = [ Document(page_content="Paris is the capital of France."), Document(page_content="Berlin is the capital of Germany."), Document(page_content="Tokyo is the capital of Japan.") ] embeddings = OpenAIEmbeddings(openai_api_key="<API_KEY>") vectorstore = FAISS.from_documents(docs, embeddings) query = "What is the capital of Germany?" results = vectorstore.similarity_search(query, k=2) print(results) # 预期返回包含柏林相关内容的Document,实际输出[]
环境信息
- langchain==0.0.297
- faiss-cpu==1.7.4
- openai==0.27.4
- Python 3.9.16
关键信息
- 预期行为:
similarity_search返回包含柏林相关内容的Document,至少返回非空列表 - 实际行为:所有查询均返回空列表
- 已尝试操作:验证docs内容正确、确认vectorstore.index存在向量(构建无报错)
排查与解决步骤
1. 验证嵌入向量的有效性
嵌入向量生成异常是最常见原因,比如API密钥无效、权限不足导致生成的向量无意义。可以手动计算查询与文档嵌入的相似度:
from sklearn.metrics.pairwise import cosine_similarity # 生成文档和查询的嵌入 doc_contents = [d.page_content for d in docs] doc_embeds = embeddings.embed_documents(doc_contents) query_embed = embeddings.embed_query(query) # 计算余弦相似度 similarities = cosine_similarity([query_embed], doc_embeds)[0] print("相似度分数:", similarities)
如果相似度分数都接近0,说明嵌入生成异常,需检查:
- OpenAI API密钥是否有效,是否开通了Embeddings权限
- 网络是否正常,是否能正常访问OpenAI服务
2. 查看检索的相似度分数
LangChain的similarity_search默认不返回分数,可能存在匹配到文档但分数过低被过滤的情况,改用similarity_search_with_score查看详情:
results_with_scores = vectorstore.similarity_search_with_score(query, k=2) print("带分数的检索结果:", results_with_scores)
如果返回结果的分数极低(比如小于0.1),可以考虑调整检索的相似度阈值,或者检查嵌入模型是否匹配(比如文档用text-embedding-ada-002生成,查询是否用了相同模型)
3. 检查向量维度一致性
确保文档嵌入和查询嵌入的维度一致,维度不匹配会导致FAISS无法正确计算相似度:
print("文档嵌入维度:", len(doc_embeds[0])) print("查询嵌入维度:", len(query_embed))
如果维度不一致,需确认OpenAIEmbeddings使用的模型是否一致(默认是text-embedding-ada-002,维度1536),是否有代码中修改了模型参数。
4. 版本兼容性排查
langchain0.0.297与faiss-cpu1.7.4可能存在兼容性问题,可以尝试升级FAISS到稳定版本(比如faiss-cpu==1.8.0),或者降级LangChain到适配版本,重新构建索引后测试。
5. 重新构建索引并验证
偶尔会出现索引构建时的隐性错误,尝试重新构建vectorstore并验证索引中的向量数量:
vectorstore = FAISS.from_documents(docs, embeddings) print("索引中的向量数量:", vectorstore.index.ntotal)
如果向量数量与文档数量不一致(这里应该是3),说明索引构建失败,需检查嵌入生成环节是否有异常。
内容的提问来源于stack exchange,提问作者Tony Guo

