使用Langchain生成向量库时出现长度为1的错误Embedding问题求助
解决OpenAI Embedding返回[NaN]导致FAISS构建失败的问题
问题根源
你的问题出在部分文档生成的Embedding是仅含NaN的1维数组,而非text-embedding-ada-002模型应返回的1536维向量,导致FAISS无法将异构形状的数组存入索引。
解决方案
1. 过滤无效文档块
爬取的HTML可能包含大量空白、空内容的文档块,这类内容传给OpenAI会生成异常Embedding。在分割文档后添加过滤逻辑:
# 分割文档后过滤空内容 documents = text_splitter.split_documents(all_raw_documents) # 保留非空白的文档 valid_documents = [doc for doc in documents if doc.page_content.strip()] # 用过滤后的文档构建向量库 vectorstore = FAISS.from_documents(valid_documents, embeddings)
2. 显式指定正确的Embedding模型
确保LangChain使用的是返回1536维向量的模型,显式声明model_name:
embeddings = OpenAIEmbeddings(model_name="text-embedding-ada-002")
3. 添加异常处理与重试机制
针对API返回异常的情况,手动处理每个文档的Embedding生成,跳过或重试失败的请求:
from langchain.embeddings.openai import OpenAIEmbeddings import numpy as np embeddings = OpenAIEmbeddings(model_name="text-embedding-ada-002") valid_texts = [] valid_metadatas = [] valid_embeddings = [] for doc in documents: text = doc.page_content.strip() if not text: continue try: # 单独生成当前文本的Embedding embed = embeddings.embed_query(text) # 检查Embedding维度是否正确 if len(embed) == 1536 and not any(np.isnan(x) for x in embed): valid_texts.append(text) valid_metadatas.append(doc.metadata) valid_embeddings.append(embed) else: print(f"跳过无效Embedding的文本: {text[:50]}...") except Exception as e: print(f"生成Embedding失败: {e}, 文本: {text[:50]}...") # 用验证后的内容构建FAISS向量库 vectorstore = FAISS.__from( texts=valid_texts, embeddings=valid_embeddings, metadatas=valid_metadatas, embedding=embeddings )
4. 检查OpenAI API配置
- 确认API密钥有效,且账户余额充足(免费额度耗尽会导致异常返回)
- 检查网络环境,确保能正常访问OpenAI API,无代理或防火墙拦截
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

