LangChain 0.2 + LLaMA 3:轻量化本地知识库问答系统搭建指南

1. 环境准备
  • 操作系统:Linux (推荐Ubuntu 22.04)
  • Python 3.10+
  • 硬件要求
    • GPU:NVIDIA GTX 1080+ (8GB显存)
    • RAM:16GB+
  • 依赖库
    pip install langchain==0.2.0 transformers sentence-transformers faiss-cpu llama-cpp-python pdfminer.six
    

2. 模型部署
  1. 下载LLaMA 3量化模型(GGUF格式):
    wget https://huggingface.co/TheBloke/Llama-3-8B-Instruct-GGUF/resolve/main/llama-3-8b-instruct.Q4_K_M.gguf
    

  2. 初始化LLM接口
    from langchain.llms import LlamaCpp
    
    llm = LlamaCpp(
        model_path="llama-3-8b-instruct.Q4_K_M.gguf",
        n_ctx=4096,
        n_gpu_layers=40,
        temperature=0.1
    )
    

3. 知识库构建
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

# 加载文档(支持PDF/TXT)
loader = DirectoryLoader("knowledge_base/", glob="**/*.pdf")
documents = loader.load()

# 文本分块
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=512, 
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

# 向量化存储
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectorstore = FAISS.from_documents(chunks, embeddings)
vectorstore.save_local("faiss_index")

4. 问答系统集成
from langchain.chains import RetrievalQA

# 加载向量库
vectorstore = FAISS.load_local("faiss_index", embeddings)

# 构建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True
)

# 提问示例
query = "如何配置网络防火墙?"
response = qa_chain({"query": query})
print(f"答案:{response['result']}\n来源:{response['source_documents'][0].metadata['source']}")

5. 优化技巧
  1. 性能提升
    • 使用gguf格式4-bit量化模型
    • 启用n_batch=512加速推理
  2. 检索优化
    retriever = vectorstore.as_retriever(
        search_type="mmr",  # 最大边际相关性
        search_kwargs={"k": 5, "lambda_mult": 0.25}
    )
    

  3. 提示工程
    from langchain.prompts import PromptTemplate
    
    custom_prompt = PromptTemplate(
        template="""基于以下上下文:
        {context}
        回答:{query}""",
        input_variables=["context", "query"]
    )
    

6. 部署方案
# Gradio Web界面
import gradio as gr

def answer_question(question):
    result = qa_chain({"query": question})
    return result["result"]

gr.Interface(
    fn=answer_question,
    inputs="textbox",
    outputs="text",
    title="本地知识库问答系统"
).launch(server_port=7860)

常见问题解决
  1. 显存不足
    • 降低n_gpu_layers
    • 使用Q2_K量化模型
  2. 文档解析错误
    loader = UnstructuredPDFLoader("file.pdf", mode="elements")
    

  3. 回答不准确
    • 调整chunk_size(推荐256-1024)
    • 增加检索文档数量k

提示:系统可在消费级GPU运行,完整流程约30分钟完成部署。知识库支持动态更新,新增文档后重新执行向量化步骤即可。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐