引言
在企业场景中,通用大模型往往无法回答内部知识问题。检索增强生成(RAG)技术通过将外部知识库与大模型结合,有效解决了这一痛点。本文将使用Meta最新开源的Llama 3.1-8B和LangChain框架,搭建一个完整的RAG问答系统。
环境准备
硬件要求
- GPU:至少8GB显存(推荐RTX 4070或以上)
- 内存:16GB以上
- 存储:50GB可用空间
软件安装
pip install langchain langchain-community chromadb pypdf sentence-transformers
此外,需要从Hugging Face下载Llama 3.1模型(需申请权限):
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "meta-llama/Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
构建知识库
1. 文档加载
支持多种格式:
from langchain_community.document_loaders import PyPDFLoader, TextLoader, WebBaseLoader
# 加载PDF
loader = PyPDFLoader("company_policy.pdf")
docs = loader.load()
# 加载网页
web_loader = WebBaseLoader("https://example.com/wiki")
web_docs = web_loader.load()
2. 文档分割
使用语义分割器保持段落完整性:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", "!", "?", ".", "!"],
)
splits = text_splitter.split_documents(docs)
3. 向量化与存储
使用all-MiniLM-L6-v2嵌入模型:
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectordb = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db"
)
vectordb.persist()
构建检索与生成链
1. 检索器
retriever = vectordb.as_retriever(search_kwargs={"k": 3})
2. 提示模板
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个知识库助手。请根据以下上下文回答问题。如果无法回答,请说不知道。"),
("human", "上下文:{context}\n问题:{question}"),
])
3. 构建链
from langchain.chains import RetrievalQA
from langchain.llms import HuggingFacePipeline
import torch
llm = HuggingFacePipeline.from_model_id(
model_id="meta-llama/Llama-3.1-8B-Instruct",
task="text-generation",
pipeline_kwargs={"max_new_tokens": 512, "temperature": 0.3},
device=0 if torch.cuda.is_available() else -1,
)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": prompt},
return_source_documents=True,
)
使用示例
question = "公司年假政策是什么?"
result = qa_chain({"query": question})
print(result["result"])
print("来源文档:", [doc.metadata["source"] for doc in result["source_documents"]])
优化建议
- 混合检索:结合关键词搜索(BM25)和向量检索,提高召回率
- 重排序:使用Cross-Encoder对检索结果重新排序
- 多轮对话:添加记忆组件,支持连续问答
总结
通过本教程,你已成功搭建了一个基于Llama 3.1的私有知识库RAG系统。你可以将公司内部文档、技术手册等导入系统,实现智能问答。未来,结合多模态能力,RAG系统将支持图片、表格等更丰富的知识形式。