Langchain CSV查询仅返回4条结果?排查向量检索问题
排查CSV查询仅返回少量结果的建议
问题背景
使用Langchain结合OpenAI API查询500行的CSV文件,代码可正常运行,但仅返回4条结果。已确认CSVLoader能加载所有记录,推测问题出在嵌入/向量环节。
排查步骤
- 检查文本拆分后的文档数量:打印
len(documents),确认拆分后的文档总数是否与CSV行数匹配。CharacterTextSplitter按字符数拆分,若CSV单条记录过长被拆分,或拆分逻辑误将多条记录合并,会导致文档数量异常。 - 调整检索器返回条数:默认检索器仅返回4条结果,可通过指定
search_kwargs调整返回数量:
增加返回条数后,观察结果是否包含更多目标数据。retriever = persisted_vectorstore.as_retriever(search_kwargs={"k": 20}) - 验证嵌入与检索的相关性:
- 手动挑选几条符合查询条件(2024年3月1日之后的交易)的文档。
- 生成查询向量:
query_vector = embeddings.embed_query(query) - 执行向量检索:
results = vectorstore.similarity_search_by_vector(query_vector, k=10)
检查返回结果是否包含目标数据,若不包含,说明嵌入模型未能正确捕捉查询与文档的语义关联,需调整文档格式或查询表述。
- 确认CSVLoader的输出格式:打印
data中的几条Document内容,检查日期、金额等字段的格式是否清晰(比如日期是否为YYYY-MM-DD标准格式)。格式不规范会导致嵌入模型无法准确识别关键信息,影响检索结果。 - 更换文本拆分策略:CSV的每行记录本身是独立语义单元,可尝试跳过拆分直接使用原加载数据:
或改用documents = data # 替代splitter.split_documents(data)RecursiveCharacterTextSplitter,避免CharacterTextSplitter破坏单条记录的完整性。 - 验证FAISS向量库的存储量:打印
vectorstore.index.ntotal,确认向量总数与拆分后的文档数量一致。若数量不匹配,说明部分文档生成嵌入时丢失(比如空内容文档),需检查documents中是否存在无效条目。
原代码
csv_loader = CSVLoader(csv_file_path) data = csv_loader.load() splitter = CharacterTextSplitter(separator = "\n", chunk_size=500, chunk_overlap=0, length_function=len) documents = splitter.split_documents(data) embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(documents, embeddings) vectorstore.save_local("faiss_index_constitution") persisted_vectorstore = FAISS.load_local("faiss_index_constitution", embeddings, allow_dangerous_deserialization=True) query = "What's the sum of amount of the transactions since 1 March 2024?" retriever = persisted_vectorstore.as_retriever() chain = RetrievalQA.from_llm(llm=model, retriever=retriever, verbose=True) chain_input = {"query": query, "context": None} result = chain(chain_input) return result
内容的提问来源于stack exchange,提问作者DJ Mutti
相关产品推荐
相关产品推荐

