从零构建RAG管道:使用LangChain和ChromaDB实现本地知识库问答系统
检索增强生成(Retrieval-Augmented Generation, RAG)是当前将大语言模型(LLM)与企业私有数据结合的最主流技术方案。本文将手把手教你使用LangChain和ChromaDB构建一个完整的本地知识库问答系统。
什么是RAG?
RAG的核心思想是:在用户提问时,先从知识库中检索出最相关的文档片段,然后将这些片段作为上下文提供给LLM,让LLM基于检索到的信息生成答案。这种方法有效解决了LLM知识更新不及时、无法获取私有数据等问题。
环境准备
首先安装所需的依赖库:
pip install langchain chromadb sentence-transformers pypdf
第一步:文档加载与分割
加载PDF文档并将其分割成适合检索的文本块:
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
print(f"共分割为 {len(chunks)} 个文本块")
第二步:创建向量数据库
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-small-zh-v1.5",
model_kwargs={'device': 'cpu'}
)
vectorstore = Chroma.from_documents(
documents=chunks, embedding=embeddings,
persist_directory="./chroma_db"
)
vectorstore.persist()
print("向量数据库创建完成!")
第三步:构建检索链
from langchain.chains import RetrievalQA
from langchain_community.llms import Ollama
retriever = vectorstore.as_retriever(
search_type="similarity", search_kwargs={"k": 3}
)
llm = Ollama(model="qwen2.5:7b", temperature=0.1)
qa_chain = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff",
retriever=retriever, return_source_documents=True
)
第四步:运行问答
query = "什么是RAG架构?它的优势是什么?"
result = qa_chain.invoke({"query": query})
print(f"答案:{result['result']}")
进阶优化建议
1. 混合检索:结合BM25关键词检索和向量检索,提升召回率。
2. 重排序:使用Cross-Encoder对检索结果重排序,提高答案质量。
3. 查询重写:在检索前让LLM重写用户问题,使其更适合检索。
4. 多轮对话:添加历史对话管理,支持连续问答。
通过以上步骤,你就拥有了一个完全本地运行的RAG知识库问答系统,无需依赖任何外部API。
©️版权声明:若无特殊声明,本站所有文章版权均归AI工具集原创和所有,未经许可,任何个人、媒体、网站、团体不得转载、抄袭或以其他方式复制发表本站内容,或在非我站所属的服务器上建立镜像。否则,我站将依法保留追究相关法律责任的权利。