从零搭建你的第一个RAG应用:基于LangChain和ChromaDB
RAG(检索增强生成)是目前最实用的AI应用范式之一,它允许大模型基于私有知识库回答问题,而无需微调。本文将带你使用LangChain和ChromaDB,在本地搭建一个完整的RAG应用。
一、什么是RAG?
RAG架构包含三个核心组件:
- 文档加载与分割:将PDF、Word等文档切分成片段
- 向量存储:将片段嵌入为向量并存储(如ChromaDB)
- 检索+生成:根据用户问题检索相关片段,交给LLM生成答案
二、环境准备
安装依赖
pip install langchain chromadb sentence-transformers pypdf
选择模型
- 嵌入模型:
sentence-transformers/all-MiniLM-L6-v2(轻量,无需GPU) - LLM:使用OpenAI API或本地模型(如Ollama)
三、代码实现
1. 加载并分割文档
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = text_splitter.split_documents(documents)
print(f"共分割为 {len(docs)} 个片段")
2. 创建向量存储
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(docs, embeddings, persist_directory="./chroma_db")
3. 构建检索链
from langchain.chains import RetrievalQA
from langchain_community.llms import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0) # 或使用本地模型
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
4. 问答测试
query = "文档中提到了哪些关键指标?"
result = qa_chain.invoke(query)
print(result)
四、进阶优化
1. 改进检索质量
- 使用
MultiQueryRetriever生成多个相似问题 - 添加
ContextualCompressionRetriever过滤无关片段
2. 支持多种文件格式
- 使用
UnstructuredFileLoader加载txt、docx、markdown等
3. 添加记忆
- 使用
ConversationBufferMemory实现多轮对话
五、部署建议
- 本地运行:使用Ollama部署Llama 3,无需API费用
- 云端部署:使用Streamlit搭建前端,打包成Docker镜像
六、完整代码仓库
可访问 GitHub示例仓库 获取完整代码。
总结
通过本教程,你已学会搭建一个基本的RAG应用。你可以替换自己的文档,构建专属知识库。RAG的应用场景包括:企业知识问答、客服系统、个人助手等。动手试试吧!
提示:使用中文文档时,建议选择中文嵌入模型如 shibing624/text2vec-base-chinese。