You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LangChain RAG无法检索到任何文档的问题排查求助

LangChain RAG无法检索到任何文档的问题排查求助

大家好,我最近在搭建基于LangChain + MongoDB Atlas Vector Search的RAG代理,遇到了一个卡了好久的棘手问题:无论怎么调整检索参数,调用retriever.invoke(query)始终返回空列表[],完全拿不到明明存在的向量数据。想请社区的大佬们帮我看看问题出在哪?

先贴一下我的核心代码,方便大家定位:

1. 向量嵌入与存储代码(只运行过一次)

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
vector_store = MongoDBAtlasVectorSearch.from_connection_string(
    connection_string = DB_CONNECTION,
    namespace = "gpt.embeddings",
    embedding = embeddings,
    index_name = "vector_index",
    relevance_score_fn="cosine"
)
loader = PyPDFLoader("./manual.pdf")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=50, add_start_index=True)
all_splits = text_splitter.split_documents(docs)
document_ids = vector_store.add_documents(documents=all_splits)

2. 代理与检索工具代码

model = init_chat_model("openai:gpt-4.1")
retriever = vector_store.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={
        "k": 3,
        "score_threshold": -99999999999999999999999999999999999999999999999999999999,
    }
)

@tool(response_format="content_and_artifact")
def retrieve_context(query: str):
    """Retrieve information to help answer a query."""
    retrieved_docs = retriever.invoke(query)
    print(retrieved_docs)  # 这里永远打印出[]
    serialized = "\n\n".join([
        (f"Source: {doc.metadata}\nContent: {doc.page_content}") 
        for doc in retrieved_docs
    ])
    return serialized, retrieved_docs

tools = [retrieve_context]
prompt = """
Always use the `retrieve_context` tool first. Append the retrieved context to the user prompt and answer the user's question.
"""
agent = create_agent(model, tools, system_prompt=prompt)

我已经排查过的点:

  • ✅ MongoDB集合gpt.embeddings里确实有100+个文档分片,每个都带embedding字段的向量数据
  • ✅ OpenAI API Key和MongoDB连接字符串都配置正确,能直接通过MongoDB客户端查询到完整的向量文档
  • ✅ 特意把score_threshold设成了超级小的负数,就为了强制返回结果,但还是空列表
  • ✅ 确认代理确实调用了retrieve_context工具,因为控制台稳定输出[]

目前摸不着头脑的疑惑:

  1. 会不会是MongoDB的向量索引vector_index配置有问题?我是用Atlas自动创建的索引,选的cosine相似度,和代码里的relevance_score_fn是一致的
  2. similarity_score_threshold这个检索类型是不是有特殊的阈值范围要求?我之前查cosine相似度范围是[-1,1],改成-1也没用
  3. 有没有可能是text-embedding-3-large生成的向量维度,和MongoDB索引识别的维度不匹配?但我创建索引时是自动读取集合里的embedding字段维度的
  4. 会不会是检索时生成的查询向量,和存储的向量用的不是同一个Embedding模型?但我代码里都是用的OpenAIEmbeddings(model="text-embedding-3-large")

有没有大佬遇到过类似的坑?或者能给我一些新的排查方向?万分感谢!

火山引擎 最新活动