AI百事通

从零搭建私有知识库:基于Llama 3.1的RAG系统实战教程

📅 2026-06-16📰 ai_generated👁 0 次阅读
从零搭建私有知识库:基于Llama 3.1的RAG系统实战教程
RAGLlama知识库大模型教程

引言

在企业场景中,通用大模型往往无法回答内部知识问题。检索增强生成(RAG)技术通过将外部知识库与大模型结合,有效解决了这一痛点。本文将使用Meta最新开源的Llama 3.1-8BLangChain框架,搭建一个完整的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系统将支持图片、表格等更丰富的知识形式。