如何解决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
相关产品推荐
相关产品推荐

