
langchain结合检索增强生成(rag)技术,在构建基于私有文档的问答系统时展现出巨大潜力。然而,开发者常会遇到一个挑战:即便文档中明确包含问题的答案,rag系统也可能无法准确检索到相关的文档片段,导致生成不准确或不完整的回答。这在处理结构化程度较高的faq(常见问题解答)类pdf文档时尤为突出。
Langchain RAG流程通常涉及文档加载、文本分割、嵌入(Embeddings)和向量存储、以及检索与生成。当检索结果不尽人意时,问题往往出在以下几个环节:
解决上述问题的关键在于提升嵌入模型的性能和灵活集成更强大的LLM。
将GPT4AllEmbeddings替换为更成熟、在广泛语料上训练过的模型,例如HuggingFace提供的sentence-transformers系列模型,可以显著提高嵌入质量。这些模型能够更好地捕捉文本的语义信息,从而在向量空间中实现更准确的相似度匹配。
以下代码示例展示了如何使用HuggingFaceEmbeddings来构建向量存储:
from langchain.document_loaders import PyPDFLoader, DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI, HuggingFaceHub # 导入OpenAI和HuggingFaceHub
# 1. 文档加载
# 假设您的PDF文档位于指定路径
loader = PyPDFLoader("doc.pdf") # 或者 DirectoryLoader('/tmp/', glob="./*.pdf")
documents = loader.load()
# 2. 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
# 3. 嵌入与向量存储 - 使用HuggingFace Embeddings
# 可以选择不同的模型,例如:
# "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" (多语言,轻量级)
# "bert-base-multilingual-cased" (多语言,更通用)
# "sentence-transformers/all-MiniLM-L6-v2" (英文,高性能)
embeddings = HuggingFaceEmbeddings(
model_name="bert-base-multilingual-cased" # 选择一个合适的模型
)
persist_directory = "./chromadb_store" # 定义向量数据库的持久化路径
vectordb = Chroma.from_documents(documents=texts, embedding=embeddings, persist_directory=persist_directory)
vectordb.persist() # 持久化向量数据库,以便后续复用
print(f"向量数据库已创建并持久化到: {persist_directory}")
# 4. 集成LLM并构建QA链
# 使用OpenAI LLM作为示例
# 请确保您已设置OPENAI_API_KEY环境变量
llm_openai = OpenAI(temperature=0, model_name="text-davinci-003") # 或 "gpt-3.5-turbo" 等
qa_chain_openai = RetrievalQA.from_chain_type(
llm=llm_openai,
retriever=vectordb.as_retriever(),
chain_type="stuff", # 常见的链类型,将所有检索到的文档填充到提示中
return_source_documents=True
)
question = "您的问题是什么?"
response_openai = qa_chain_openai({"query": question})
print("\n--- OpenAI LLM 响应 ---")
print(response_openai)
# 也可以尝试使用HuggingFaceHub上的开源LLM
# 请确保您已设置HUGGINGFACEHUB_API_TOKEN环境变量
# llm_hf = HuggingFaceHub(
# repo_id="google/flan-t5-base",
# model_kwargs={"temperature": 0.6, "max_length": 500, "max_new_tokens": 200}
# )
# # 或者
# # llm_hf = HuggingFaceHub(repo_id="EleutherAI/gpt-neo-2.7B")
# qa_chain_hf = RetrievalQA.from_chain_type(
# llm=llm_hf,
# retriever=vectordb.as_retriever(),
# chain_type="stuff",
# return_source_documents=True
# )
# response_hf = qa_chain_hf({"query": question})
# print("\n--- HuggingFaceHub LLM 响应 ---")
# print(response_hf)注意事项:
对于FAQ文档,可以尝试以下优化:
除了嵌入模型,选择合适的LLM也至关重要。
当Langchain RAG系统在文档检索方面表现不佳时,核心优化方向应放在提升嵌入模型的质量上,例如从GPT4AllEmbeddings转向更专业的HuggingFaceEmbeddings。同时,细致调整文本分割策略以适应文档结构,并灵活选择和配置LLM,是构建高效、准确的RAG问答系统的关键。通过上述优化,可以显著提高系统从复杂文档中准确提取所需信息的能力,从而生成更专业、更可靠的答案。持续的测试和迭代是确保系统性能达到预期的重要环节。
以上就是优化Langchain RAG检索:提升文档匹配准确性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号