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工具,因为控制台稳定输出[]
目前摸不着头脑的疑惑:
- 会不会是MongoDB的向量索引
vector_index配置有问题?我是用Atlas自动创建的索引,选的cosine相似度,和代码里的relevance_score_fn是一致的 similarity_score_threshold这个检索类型是不是有特殊的阈值范围要求?我之前查cosine相似度范围是[-1,1],改成-1也没用- 有没有可能是
text-embedding-3-large生成的向量维度,和MongoDB索引识别的维度不匹配?但我创建索引时是自动读取集合里的embedding字段维度的 - 会不会是检索时生成的查询向量,和存储的向量用的不是同一个Embedding模型?但我代码里都是用的
OpenAIEmbeddings(model="text-embedding-3-large")
有没有大佬遇到过类似的坑?或者能给我一些新的排查方向?万分感谢!




