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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:12:41