
本文旨在解决基于chromadb和langchain进行pdf文档问答时,响应内容不完整的问题。通过深入探讨文档切分策略(`chunk_size`和`chunk_overlap`)以及检索器配置(`k`参数),并结合langchain的`retrievalqa`链,提供一套优化方案,确保从多份pdf文档中获取全面、准确的回答。
在使用ChromaDB结合LangChain处理PDF文档进行问答时,用户可能会遇到模型返回的响应不完整,未能充分利用源文档信息的情况。这通常是由于文档处理流程中的几个关键环节配置不当所致,包括文档切分、向量存储构建以及检索链的设置。本教程将详细介绍如何通过调整这些参数来优化ChromaDB的检索效果,从而获得更全面、准确的问答响应。
一个典型的基于RAG(Retrieval-Augmented Generation)的问答系统,其核心流程包括:
响应不完整的问题,往往发生在文档切分和检索阶段。
文档切分是构建高效RAG系统的基础。RecursiveCharacterTextSplitter是LangChain中常用的文本切分器,它通过递归地尝试不同分隔符来智能地切分文本。其两个核心参数是:
优化建议:
当通过vectordb.as_retriever()创建检索器时,可以指定一个重要的参数 k,它决定了检索器在响应用户查询时将返回多少个最相关的文档块。
优化建议:
RetrievalQA.from_chain_type中的chain_type参数决定了如何将检索到的文档传递给LLM。
优化建议:
以下代码展示了如何结合上述优化建议,构建一个能够提供更完整响应的ChromaDB问答系统。
import os
from langchain.document_loaders import DirectoryLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings # 或 HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 设置OpenAI API密钥 (如果使用OpenAIEmbeddings和OpenAI LLM)
# os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
def load_documents_from_pdf_directory(directory_path: str = './static/upload/') -> list:
"""
从指定目录加载所有PDF文档。
"""
print(f"Loading PDF documents from: {directory_path}")
loader = DirectoryLoader(directory_path, glob="./*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()
print(f"Loaded {len(documents)} documents.")
return documents
def split_documents(documents: list, chunk_size: int = 1000, chunk_overlap: int = 100) -> list:
"""
将加载的文档切分成文本块。
"""
print(f"Splitting documents with chunk_size={chunk_size} and chunk_overlap={chunk_overlap}")
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
texts = text_splitter.split_documents(documents)
print(f"Split into {len(texts)} text chunks.")
return texts
def create_and_persist_vectordb(texts: list, persist_directory: str = './ChromaDb') -> Chroma:
"""
创建ChromaDB向量数据库并持久化。
"""
print(f"Creating embeddings and ChromaDB at: {persist_directory}")
# 可以选择OpenAIEmbeddings或HuggingFaceEmbeddings
# embeddings = HuggingFaceEmbeddings(model_name="bert-base-multilingual-cased")
embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=texts, embedding=embeddings, persist_directory=persist_directory)
vectordb.persist()
print("ChromaDB created and persisted.")
return vectordb
def setup_retrieval_qa_chain(vectordb: Chroma, llm_model_name: str = "text-davinci-003", k_retrieval: int = 4) -> RetrievalQA:
"""
设置RetrievalQA链。
"""
print(f"Setting up RetrievalQA chain with LLM: {llm_model_name} and retriever k={k_retrieval}")
llm = OpenAI(temperature=0, model_name=llm_model_name)
# 配置检索器,指定 k 参数
retriever = vectordb.as_retriever(search_kwargs={"k": k_retrieval})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff", # 确保所有检索到的文档被一次性送入LLM
return_source_documents=True
)
print("RetrievalQA chain setup complete.")
return qa_chain
if __name__ == "__main__":
# 1. 加载文档
loaded_documents = load_documents_from_pdf_directory()
# 2. 切分文档 (调整 chunk_size 和 chunk_overlap)
# 示例中将 chunk_overlap 增加到 100
split_texts = split_documents(loaded_documents, chunk_size=1000, chunk_overlap=100)
# 3. 创建并持久化向量数据库
vector_database = create_and_persist_vectordb(split_texts)
# 4. 设置检索QA链 (调整 k 参数)
# 示例中将 k 增加到 4,以检索更多相关文档
qa_pipeline = setup_retrieval_qa_chain(vector_database, k_retrieval=4)
# 5. 执行查询
query = "请总结这份文件中的主要内容" # 假设你的PDF有类似“书”的内容
print(f"\nQuerying: '{query}'")
response = qa_pipeline({"query": query})
print("\n--- Response ---")
print(response["result"])
if "source_documents" in response:
print("\n--- Source Documents ---")
for i, doc in enumerate(response["source_documents"]):
print(f"Document {i+1} (Page {doc.metadata.get('page', 'N/A')}):")
print(doc.page_content[:200] + "...") # 打印前200字符作为示例
print("-" * 20)代码说明:
通过对文档切分策略和检索器配置的精细化调整,并结合合适的LangChain RetrievalQA链类型,可以显著提升ChromaDB在PDF文档问答场景中的响应完整性和准确性。
以上就是优化ChromaDB检索:提升PDF文档问答完整性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号