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

如何解决ChromaDB查询返回内容不完整的问题?

解决多PDF查询返回内容不完整问题

我正在开发一个基于多份PDF文档响应用户查询的项目,现有加载PDF、创建ChromaDB及查询的代码如下,但部分场景下查询无法得到完整响应——源PDF内容完整,返回结果却仅包含部分内容,增大chunk_overlap参数无效果,需解决该问题。

现有加载PDF代码

def loadFiles():
    loader = DirectoryLoader('./static/upload/', glob="*.pdf", loader_cls=PyPDFLoader)
    documents = loader.load()

    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
    texts = text_splitter.split_documents(documents)
    return texts

创建ChromaDB代码

def createDb(load):
    embeddings = OpenAIEmbeddings()
    persist_directory = './ChromaDb'

    vectordb = Chroma.from_documents(documents=load, embedding=embeddings, persist_directory=persist_directory)
    vectordb.persist()
    return vectordb

查询代码

qa_chain = RetrievalQA.from_chain_type(
        llm=OpenAI(temperature=0,model_name = "text-davinci-003"),
        retriever=vectordb.as_retriever(),chain_type="stuff",
        chain_type_kwargs=chain_type_kwargs,
       
        return_source_documents=True
        )

解决方案

  • 调整检索器召回数量
    默认检索器仅返回少量相关文档(通常是4个),若完整内容分散在多个chunk中,会导致遗漏。修改检索器参数,增大召回的chunk数量:

    retriever = vectordb.as_retriever(search_kwargs={"k": 10}) # k值可根据实际内容调整
    
  • 优化文本分割策略
    固定字符数的分割可能破坏语义完整性,可调整分割优先级,优先按段落、标点分割,或更换更适合PDF的加载器:

    # 优化分割规则
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1500, # 可适当增大chunk_size
        chunk_overlap=100,
        separators=["\n\n", "\n", ".", "!", "?", ",", " ", ""] # 按语义优先级分割
    )
    
    # 更换PDF加载器,更好保留结构
    loader = DirectoryLoader('./static/upload/', glob="*.pdf", loader_cls=PyMuPDFLoader)
    
  • 更换Chain类型
    当前使用的stuff模式会将所有检索文档塞进prompt,若总长度超过LLM上下文窗口会被截断。换成map_reduce或refine模式处理长内容:

    qa_chain = RetrievalQA.from_chain_type(
        llm=OpenAI(temperature=0, model_name="text-davinci-003"),
        retriever=vectordb.as_retriever(search_kwargs={"k": 8}),
        chain_type="map_reduce", # 或"refine"
        return_source_documents=True
    )
    
  • 检查LLM上下文限制
    text-davinci-003的最大上下文为4096 tokens,若检索内容总token数超过限制,LLM会截断输入。可更换大上下文模型(如gpt-3.5-turbo-16k),同时匹配调整chunk_size和召回数量,确保总token数在模型限制内。

  • 验证检索结果完整性
    查询后打印return_source_documents返回的内容,确认召回的chunk是否包含所有相关信息。若召回不完整,需优化embedding或检索参数;若召回完整但输出缺失,则调整Chain处理逻辑。

内容的提问来源于stack exchange,提问作者Pmd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:11:07