保姆级指南:基于 LangChain 搭建 RAG 系统全流程

一、RAG 系统核心原理与技术选型

1.1 RAG 技术架构解析

RAG(检索增强生成)系统通过向量检索+LLM 生成的双轮驱动架构,解决传统 LLM 的三大痛点:

  • 知识滞后:实时接入最新数据
  • 内容幻觉:基于检索结果生成保证事实性
  • 私有数据缺失:支持企业知识库集成

核心流程包括:

  1. 数据摄取:加载 PDF/Word/ 网页等格式文件
  2. 文本分块:将长文本拆分为 500-1000 字的语义片段
  3. 向量索引:通过 Embedding 模型生成向量存储到数据库
  4. 检索增强:根据用户问题检索相关文档片段
  5. 生成优化:将检索结果与问题结合生成最终回答

1.2 技术栈选型建议

组件推荐方案替代方案
文本加载PyPDF2/UnstructuredBeautifulSoup(网页)
分块工具RecursiveCharacterTextSplitterCharacterTextSplitter
EmbeddingBAAI/BGE-large-zh-v1.5text-embedding-ada-002
向量数据库FAISS(本地)/Pinecone(云端)Chroma/Qdrant
LLMQwen-1.8/InternLM-3.0GPT-4-Turbo
部署框架FastAPI+UvicornFlask+Gunicorn

二、数据准备与预处理

2.1 数据采集与清洗

2.1.1 多源数据加载

python

from langchain.document_loaders import PyPDFLoader, TextLoader, WebBaseLoader

# 加载PDF文件
loader = PyPDFLoader("data/report.pdf")
documents = loader.load()

# 加载本地文本文件
loader = TextLoader("data/faq.txt")
documents += loader.load()

# 加载网页内容
loader = WebBaseLoader("https://example.com")
documents += loader.load()

2.1.2 文本清洗

python

import re

def clean_text(text):
    # 去除特殊字符
    text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]', '', text)
    # 合并连续空格
    text = re.sub(r'\s+', ' ', text).strip()
    # 去除过长空白行
    text = '\n'.join([line for line in text.split('\n') if len(line) > 10])
    return text

# 批量清洗文档
cleaned_docs = [Document(page_content=clean_text(doc.page_content), metadata=doc.metadata) for doc in documents]

2.2 文本分块策略

python

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    length_function=len,
    separators=["\n\n", "\n", " ", ""]
)

chunks = text_splitter.split_documents(cleaned_docs)

2.3 向量数据库初始化

python

from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
vector_db = FAISS.from_documents(chunks, embeddings)

# 保存索引
vector_db.save_local("faiss_index")

三、RAG 系统核心组件构建

3.1 检索器配置

python

# 从本地加载索引
vector_db = FAISS.load_local("faiss_index", embeddings)

# 配置检索参数
retriever = vector_db.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 5, "score_threshold": 0.7}
)

3.2 LLM 选择与优化

3.2.1 本地模型部署

python

from langchain.llms import LlamaCpp
from langchain import PromptTemplate, LLMChain

llm = LlamaCpp(
    model_path="models/qwen-1.8-chat-int4.bin",
    n_ctx=4096,
    temperature=0.6,
    top_p=0.95
)

3.2.2 云端模型调用

python

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(
    model_name="gpt-4-1106-preview",
    temperature=0.2,
    max_tokens=1000
)

3.3 RAG 链构建

python

from langchain.chains import RetrievalQA

prompt_template = """
已知信息:
{context}

用户问题:
{question}

请基于已知信息,以专业技术文档的格式回答用户问题,要求逻辑清晰、步骤明确。
"""

chain_type_kwargs = {
    "prompt": PromptTemplate.from_template(prompt_template),
    "verbose": True
}

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    chain_type_kwargs=chain_type_kwargs
)

四、系统评估与优化

4.1 核心评估指标

指标计算方法优化方向
上下文召回率检索到的关键信息数 / 总关键信息数调整分块策略、优化 Embedding
答案忠实度基于检索内容的事实数 / 答案总事实数强化 prompt 约束、增加检索结果权重
响应相关性人工标注相关性评分优化检索排序、调整 prompt 模板

4.2 性能优化技巧

4.2.1 检索优化

python

# 混合检索(向量+关键词)
from langchain.retrievers import EnsembleRetriever

vector_retriever = vector_db.as_retriever()
bm25_retriever = BM25Retriever.from_documents(chunks)

ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.7, 0.3]
)

4.2.2 生成优化

python

# 流式输出
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = ChatOpenAI(
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()],
    temperature=0.1
)

五、系统部署与监控

5.1 API 服务搭建

python

# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class QueryRequest(BaseModel):
    query: str
    top_k: int = 5

@app.post("/query")
async def handle_query(request: QueryRequest):
    try:
        result = qa_chain({"query": request.query, "top_k": request.top_k})
        return {"answer": result["result"]}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

5.2 容器化部署

dockerfile

# Dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

5.3 监控与日志

python

# 集成Prometheus
from prometheus_fastapi_instrumentator import Instrumentator

Instrumentator().instrument(app).expose(app)

# 日志配置
import logging
logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

六、进阶优化与扩展

6.1 多模态支持

python

from langchain.llms import OpenAI
from langchain.agents import initialize_agent, Tool

tools = [
    Tool(
        name="ImageSearch",
        func=lambda query: image_search_api(query),
        description="用于搜索与查询相关的图片"
    )
]

agent = initialize_agent(
    tools,
    OpenAI(temperature=0),
    agent="zero-shot-react-description",
    verbose=True
)

6.2 长期记忆增强

python

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    memory=memory
)

6.3 安全与隐私保护

python

# 数据加密存储
from cryptography.fernet import Fernet

key = Fernet.generate_key()
cipher_suite = Fernet(key)

encrypted_docs = [Document(page_content=cipher_suite.encrypt(doc.page_content.encode()), metadata=doc.metadata) for doc in documents]

# 访问控制
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

@app.post("/query")
async def handle_query(request: QueryRequest, token: str = Depends(oauth2_scheme)):
    # 验证token
    pass

七、总结与资源推荐

7.1 关键步骤回顾

  1. 数据处理:清洗→分块→向量化
  2. 核心组件:检索器 + LLM+RAG 链
  3. 部署优化:API 服务→容器化→监控
  4. 扩展方向:多模态→记忆增强→安全加固

7.2 推荐学习资源

通过本指南,您可以完整掌握基于 LangChain 的 RAG 系统搭建全流程。在实际应用中,建议根据具体业务场景调整分块策略、优化检索算法,并持续监控系统性能。随着大模型技术的发展,未来可探索多模态检索、动态知识库更新等前沿方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值