首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于RAG架构的DeepSeek大模型本地知识库构建实战(一站式企业级解决方案)

基于RAG架构的DeepSeek大模型本地知识库构建实战(一站式企业级解决方案)

原创
作者头像
搜weiranit.fun
发布2026-08-17 14:23:36
发布2026-08-17 14:23:36
2080
举报

基于RAG架构的DeepSeek大模型本地知识库构建实战(一站式企业级解决方案)

全栈实战:涵盖 LLM 本地量化部署、RAG 索引优化、混合检索、重排序、Agentic 工作流与生产级容器化。全文 9000+ 字,拒绝调包即止,深入每个性能瓶颈的底层解法。


一、RAG vs 微调:为什么企业知识库必须选 RAG?

在 2026 年的企业 AI 落地中,RAG(检索增强生成) 已成为私有知识库的事实标准,相比微调(Fine-tuning),RAG 具备三大压倒性优势:

维度

微调(Fine-tuning)

RAG(检索增强)

知识更新

需重新训练,耗时数天,成本高昂

实时更新,知识库增删改即查即用

幻觉控制

无法溯源,黑盒生成

可解释性强,引用原文片段

权限管理

难以实现精细化的文档级隔离

通过 元数据过滤 + 分区键 实现多租户隔离

本文目标:基于 DeepSeek-R1-Distill-Qwen-32B(量化版) + LangGraph + Milvus(分布式向量库) + BGE-M3(Embedding + Reranker),从零搭建一个支持 千万级文档毫秒级检索多轮对话上下文记忆 的企业级本地知识库系统。


二、硬件选型与模型量化部署(生产级基准)

2.1 硬件配置推荐

模型规格

精度

显存需求

推荐 GPU

吞吐量(Token/s)

DeepSeek-R1-Distill-Qwen-1.5B

Q4_K_M

2GB

消费级 3060

120+

DeepSeek-R1-Distill-Qwen-7B

Q4_K_M

6GB

RTX 3090 / 4070

60-80

DeepSeek-R1-Distill-Qwen-14B(首选)

Q4_K_M

10GB

RTX 4090 / A10

40-50

DeepSeek-R1-Distill-Llama-70B

Q4_K_M

42GB

A100 80GB x1

15-20

经济型方案:若并发 < 5,使用 Ollama + 14B Q4 即可;若并发 > 20,必须使用 vLLM + 连续批处理(Continuous Batching)

2.2 基于 vLLM 的高并发部署(OpenAI 兼容接口)

安装 vLLM 并启动 DeepSeek 蒸馏模型(以 14B 为例):

代码语言:javascript
复制
# 安装依赖
pip install vllm transformers torch

# 下载模型(提前使用 modelscope 或 huggingface)
git lfs install
git clone https://modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B.git /models/deepseek-14b

# 启动 vLLM 服务(生产环境关键参数)
python -m vllm.entrypoints.openai.api_server \
  --model /models/deepseek-14b \
  --tensor-parallel-size 1 \          # 单卡设为1,多卡使用2/4
  --gpu-memory-utilization 0.85 \     # 预留15%显存给KV Cache
  --max-model-len 8192 \              # 最大上下文长度
  --max-num-seqs 32 \                 # 最大并发序列数
  --swap-space 16 \                   # CPU 交换空间
  --dtype bfloat16 \
  --port 8000 \
  --served-model-name deepseek-14b

验证接口

代码语言:javascript
复制
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-14b",
    "messages": [{"role": "user", "content": "请介绍RAG架构的核心组件"}],
    "temperature": 0.1,
    "max_tokens": 1024
  }'

坑点预警:若遇到 torch.cuda.OutOfMemoryError,降低 --max-num-seqs--max-model-len。DeepSeek-R1 系列强制要求 eos_token_id 设为 100001,需在启动时追加 --tokenizer hf-internal-testing/llama-tokenizer(若支持)。

2.3 Ollama 轻量方案(非生产,仅开发验证)

代码语言:javascript
复制
# 下载并导入 GGUF 量化模型
ollama pull deepseek-r1:14b-q4_K_M
ollama list

# 启动服务(默认 11434 端口)
ollama serve

三、企业级 RAG 架构全景设计

我们不采用简单的“向量检索 + LLM生成”两段式,而是引入 “前置改写 -> 多路召回 -> 精排重排 -> 上下文压缩 -> 生成反思” 的五层流水线。

代码语言:javascript
复制
┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  Query      │    │  Query      │    │  Hybrid     │    │  Rerank &   │    │  LLM        │
│  Rewrite    │ -> │  Expansion  │ -> │  Retrieval  │ -> │  Context    │ -> │  Generation │
│  (HyDE)     │    │  (Multi-    │    │  (Dense+    │    │  Compress   │    │  (with      │
│             │    │   Query)    │    │   Sparse)   │    │  (LLMLingua)│    │   Citations)│
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
       │                   │                   │                   │                   │
       └───────────────────┴───────────────────┴───────────────────┴───────────────────┘
                                         │
                                     ┌────┴────┐
                                     │ Milvus  │
                                     │ (LVQ+   │
                                     │  IVF)   │
                                     └─────────┘

四、向量数据库生产环境搭建(Milvus 集群版)

4.1 Docker Compose 部署 Milvus Standalone(开发)与 Cluster(生产)

生产环境强制使用 Milvus Cluster,这里给出 K8s + Helm 部署方式,但为了统一,我们使用 Docker Compose 升级版(带 etcd + minio + pulsar):

代码语言:javascript
复制
# docker-compose-milvus-cluster.yml
version: '3.5'
services:
  etcd:
    image: quay.io/coreos/etcd:v3.5.5
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
    volumes:
      - ./volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd

  minio:
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ./volumes/minio:/minio_data
    command: minio server /minio_data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    image: milvusdb/milvus:v2.4.0
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
      MINIO_ACCESS_KEY_ID: minioadmin
      MINIO_SECRET_ACCESS_KEY: minioadmin
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - etcd
      - minio
    volumes:
      - ./volumes/milvus:/var/lib/milvus

启动并创建 Collection(带分区键和动态 Schema):

代码语言:javascript
复制
# connect_milvus.py
from pymilvus import connections, Collection, CollectionSchema, FieldSchema, DataType, utility

connections.connect(host='localhost', port='19530')

# 定义 Schema - 支持多租户 (tenant_id 作为分区键)
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024),  # BGE-M3 为 1024 维
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="doc_name", dtype=DataType.VARCHAR, max_length=255),
    FieldSchema(name="chunk_index", dtype=DataType.INT64),
    FieldSchema(name="tenant_id", dtype=DataType.VARCHAR, max_length=64, is_partition_key=True),  # 自动分区
    FieldSchema(name="metadata", dtype=DataType.JSON),  # 存储标签、时间等
]
schema = CollectionSchema(fields, description="Enterprise RAG Knowledge Base")
collection = Collection("rag_knowledge", schema, consistency_level="Strong")

# 创建索引(IVF_SQ8 平衡性能与精度,生产用 HNSW)
index_params = {
    "metric_type": "IP",  # 内积,配合 BGE 使用
    "index_type": "IVF_SQ8",
    "params": {"nlist": 4096}
}
collection.create_index(field_name="embedding", index_params=index_params)
collection.load()
print("Collection ready.")


五、文档解析与智能分块(进阶:语义分块 + 父子递归)

企业文档格式复杂(PDF、Word、Markdown、扫描件),我们采用 PyMuPDF(文本)+ Tesseract(OCR)+ Unstructured(表格提取) 组合,并实现 基于嵌入密度的语义分块

5.1 多格式解析器

代码语言:javascript
复制
# parsers/document_parser.py
import fitz  # PyMuPDF
from unstructured.partition.docx import partition_docx
import pytesseract
from PIL import Image

def parse_pdf_with_ocr(file_path: str) -> list[str]:
    doc = fitz.open(file_path)
    pages_text = []
    for page_num in range(len(doc)):
        page = doc[page_num]
        text = page.get_text()
        if text.strip():
            pages_text.append(text)
        else:
            # 若无可提取文本,触发 OCR
            pix = page.get_pixmap(dpi=150)
            img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
            ocr_text = pytesseract.image_to_string(img, lang='chi_sim+eng')
            pages_text.append(ocr_text)
    return pages_text

5.2 语义分块(基于 SentenceTransformer 的密度聚类)

传统固定长度切分(如 512 token)会切断语义。我们利用 BGE-M3 的 Embedding 计算句子向量相似度,当滑动窗口内的相似度变化率超过阈值时切分。

代码语言:javascript
复制
# splitters/semantic_chunker.py
from langchain.text_splitter import RecursiveCharacterTextSplitter
from sentence_transformers import SentenceTransformer
import numpy as np

embedder = SentenceTransformer('BAAI/bge-m3', device='cuda')

def semantic_split(text: str, max_chunk_size: int = 512, threshold: float = 0.3):
    sentences = RecursiveCharacterTextSplitter(
        separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""],
        chunk_size=50,
        chunk_overlap=10,
        length_function=len
    ).split_text(text)
    
    if len(sentences) <= 1:
        return [text]
    
    # 计算每个句子的向量
    sentence_embeddings = embedder.encode(sentences, normalize_embeddings=True)
    
    chunks = []
    current_chunk = [sentences[0]]
    current_embedding = sentence_embeddings[0]
    
    for i in range(1, len(sentences)):
        # 计算当前句子与现有块平均向量的余弦相似度
        sim = np.dot(current_embedding, sentence_embeddings[i])
        if sim < threshold or len("".join(current_chunk)) > max_chunk_size:
            chunks.append("".join(current_chunk))
            current_chunk = [sentences[i]]
            current_embedding = sentence_embeddings[i]
        else:
            current_chunk.append(sentences[i])
            # 滑动平均更新块向量
            current_embedding = (current_embedding + sentence_embeddings[i]) / 2
            current_embedding = current_embedding / np.linalg.norm(current_embedding)
    
    if current_chunk:
        chunks.append("".join(current_chunk))
    return chunks

六、混合检索:BM25(Sparse) + Dense(BGE-M3)融合

单纯向量检索会丢失关键词精准匹配(如财务编号、产品型号)。我们使用 Elasticsearch 做 BM25 + Milvus 做向量检索,通过 RRF(倒数排名融合) 合并结果。

6.1 双路召回实现

代码语言:javascript
复制
# retrievers/hybrid_retriever.py
from elasticsearch import Elasticsearch
from pymilvus import Collection
from sentence_transformers import SentenceTransformer
import numpy as np

es_client = Elasticsearch("http://localhost:9200")
milvus_collection = Collection("rag_knowledge")
embedder = SentenceTransformer('BAAI/bge-m3')

def hybrid_search(query: str, tenant_id: str, top_k: int = 20):
    # 1. Dense 向量检索
    query_emb = embedder.encode(query, normalize_embeddings=True).tolist()
    
    milvus_res = milvus_collection.search(
        data=[query_emb],
        anns_field="embedding",
        param={"metric_type": "IP", "params": {"nprobe": 16}},
        limit=top_k,
        expr=f'tenant_id == "{tenant_id}"',
        output_fields=["id", "text", "doc_name", "metadata"]
    )
    dense_hits = {hit.id: (hit.score, hit.entity.get('text')) for hit in milvus_res[0]}
    
    # 2. Sparse 检索 (BM25 via ES)
    es_query = {
        "bool": {
            "must": {"match": {"text": query}},
            "filter": {"term": {"tenant_id": tenant_id}}
        }
    }
    es_res = es_client.search(index="rag_index", query=es_query, size=top_k)
    sparse_hits = {hit['_id']: (hit['_score'], hit['_source']['text']) for hit in es_res['hits']['hits']}
    
    # 3. RRF 融合 (Reciprocal Rank Fusion)
    all_ids = set(dense_hits.keys()) | set(sparse_hits.keys())
    rrf_scores = {}
    rank_constant = 60
    
    for doc_id in all_ids:
        score = 0
        if doc_id in dense_hits:
            rank = list(dense_hits.keys()).index(doc_id) + 1
            score += 1 / (rank + rank_constant)
        if doc_id in sparse_hits:
            rank = list(sparse_hits.keys()).index(doc_id) + 1
            score += 1 / (rank + rank_constant)
        rrf_scores[doc_id] = score
    
    sorted_ids = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)[:top_k]
    results = []
    for doc_id, score in sorted_ids:
        text = dense_hits.get(doc_id, [None, None])[1] or sparse_hits.get(doc_id, [None, None])[1]
        results.append({"id": doc_id, "text": text, "rrf_score": score})
    return results

七、重排序(BGE-Reranker)与上下文压缩(LLMLingua)

混合检索得到的 Top-20 可能包含大量噪音,使用 Cross-Encoder 重排序 修正相关性,再用 LLMLingua 压缩上下文,解决 DeepSeek 上下文窗口被无关文本浪费的问题。

7.1 BGE-Reranker 精排

代码语言:javascript
复制
# rerankers/bge_reranker.py
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)

def rerank(query: str, passages: list[str], top_n: int = 5):
    # 计算交叉编码器分数(比双编码器更准)
    scores = model.compute_lexical_matching_scores(query, passages)  # 或 compute_similarity 直接计算
    # 注意:bge-m3 的 compute_similarity 返回 [query_len, passage_len]
    # 这里简化使用 sentence_transformers 的 CrossEncoder
    from sentence_transformers import CrossEncoder
    ce_model = CrossEncoder('BAAI/bge-reranker-v2-m3', max_length=512)
    
    pairs = [[query, p] for p in passages]
    ce_scores = ce_model.predict(pairs)
    
    sorted_idx = np.argsort(ce_scores)[::-1][:top_n]
    return [passages[i] for i in sorted_idx], [ce_scores[i] for i in sorted_idx]

7.2 上下文压缩(LLMLingua)

代码语言:javascript
复制
# compressors/llm_lingua.py
from llmlingua import PromptCompressor
compressor = PromptCompressor()

def compress_context(context: str, ratio: float = 0.3):
    compressed = compressor.compress_prompt(
        context,
        rate=ratio,
        force_tokens=['\n', '。', '!', '?']  # 强制保留标点,确保语义完整
    )
    return compressed['compressed_prompt']

八、LangGraph 构建 Agentic RAG(拒绝线性问答)

企业场景下,用户经常问多跳问题(如“对比去年和今年的销售额前三名”),需要 Agent 自主决策:调用检索工具、查询数据库、或进行数学计算。我们基于 LangGraph 构建状态机。

8.1 定义工具(Tools)

代码语言:javascript
复制
# tools/rag_tools.py
from langchain_core.tools import tool

@tool
def retrieve_knowledge(query: str) -> str:
    """检索内部知识库文档,返回最相关的文本片段"""
    results = hybrid_search(query, tenant_id="default", top_k=5)
    return "\n\n".join([r['text'] for r in results])

@tool
def calculate_expression(expression: str) -> float:
    """计算数学表达式,如 'SUM(100, 200)' 或 'AVG([1,2,3])'"""
    try:
        return eval(expression)  # 生产需使用 ast.literal_eval 或沙箱
    except:
        return 0.0

8.2 LangGraph 节点与状态流转

代码语言:javascript
复制
# graph/rag_agent.py
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI

# 使用本地 vLLM 接口
llm = ChatOpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY",
    model="deepseek-14b",
    temperature=0.1
)

class AgentState(TypedDict):
    messages: Annotated[list, add_messages]
    context: str
    iterations: int

def query_rewriter(state: AgentState):
    """节点1:改写用户问题,生成3个假设性问句(HyDE)"""
    messages = state['messages']
    last_question = messages[-1].content
    prompt = f"请将以下问题改写为3个不同视角的相似问句,用于检索:{last_question}"
    response = llm.invoke(prompt)
    return {"messages": [response], "iterations": state.get('iterations', 0) + 1}

def retriever_node(state: AgentState):
    """节点2:执行检索并注入上下文"""
    query = state['messages'][-1].content
    docs = hybrid_search(query, "default", top_k=5)
    context = "\n\n---\n\n".join([d['text'] for d in docs])
    return {"context": context}

def generator_node(state: AgentState):
    """节点3:基于上下文生成最终答案(带引用)"""
    context = state.get('context', '')
    user_question = state['messages'][0].content
    prompt = f"""
    你是一个企业知识库助手。请基于以下上下文回答用户问题。
    如果上下文不足以回答问题,请明确告知用户“知识库中未找到相关信息”。
    请按 [1][2] 格式标注引用来源。

    上下文:
    {context}

    用户问题:{user_question}
    回答:
    """
    response = llm.invoke(prompt)
    return {"messages": [response]}

# 构建图
graph = StateGraph(AgentState)
graph.add_node("rewrite", query_rewriter)
graph.add_node("retrieve", retriever_node)
graph.add_node("generate", generator_node)

graph.set_entry_point("rewrite")
graph.add_edge("rewrite", "retrieve")
graph.add_edge("retrieve", "generate")
graph.add_edge("generate", END)

app = graph.compile()

九、索引更新策略与 CDC(Change Data Capture)

知识库变更后,需要实时更新 Milvus 和 ES。我们使用 RabbitMQ / Redis Stream 异步解耦,避免阻塞主流程。

代码语言:javascript
复制
# cdc/update_engine.py
import redis
import json
from pymilvus import Collection

r = redis.Redis(host='localhost', port=6379, decode_responses=True)
milvus_collection = Collection("rag_knowledge")

def index_consumer():
    while True:
        _, message = r.blpop("knowledge_updates", timeout=5)
        if not message:
            continue
        data = json.loads(message)
        if data['action'] == 'insert':
            # 生成 embedding 并插入
            emb = embedder.encode(data['text'], normalize_embeddings=True).tolist()
            milvus_collection.insert([{
                "embedding": emb,
                "text": data['text'],
                "doc_name": data['doc_name'],
                "tenant_id": data['tenant_id'],
                "metadata": data['metadata']
            }])
            milvus_collection.flush()
        elif data['action'] == 'delete':
            # 按 ID 删除
            milvus_collection.delete(f"id in {data['ids']}")

十、性能调优压测(核心瓶颈突破)

10.1 Milvus 索引参数调优表

场景

索引类型

nlist

nprobe

召回率

延迟 (P99)

千万级、精度优先

HNSW

M=16, ef=64

-

> 98%

50ms

千万级、内存敏感

IVF_PQ

4096

16

~95%

15ms

亿级、生产默认

IVF_SQ8

8192

32

~97%

25ms

代码语言:javascript
复制
# 动态调整 nprobe (在搜索时)
search_params = {"metric_type": "IP", "params": {"nprobe": 32}}

10.2 显存优化策略(DeepSeek 大模型)

  • KV Cache 量化:vLLM 启动时添加 --kv-cache-dtype fp8,可将 KV Cache 显存占用降低 50%。
  • Chunked Prefill--enable-chunked-prefill 将长提示词拆块,防止 OOM。
  • 前缀缓存(Prefix Caching):系统提示词固定时,自动复用计算图,首 Token 延迟降低 80%。

10.3 检索侧优化

  • 预过滤:在向量检索前,用 ES 的 Term 过滤租户和日期,减少向量计算量。
  • 异步 Embedding:使用 asyncio + vLLM 的异步接口,在批量索引时可提升 3 倍吞吐。

十一、Docker Compose 一键部署全栈

我们将 vLLM (LLM)MilvusESRedisFastAPI (应用服务) 全容器化:

代码语言:javascript
复制
# docker-compose-full.yml
version: '3.8'
services:
  etcd: ...  # 同前
  minio: ...
  milvus:
    image: milvusdb/milvus:v2.4.0
    # ...
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"
    ports:
      - "9200:9200"
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  llm-server:
    build:
      context: .
      dockerfile: Dockerfile.vllm
    ports:
      - "8000:8000"
    volumes:
      - /models/deepseek-14b:/models
    environment:
      - CUDA_VISIBLE_DEVICES=0
    command: python -m vllm.entrypoints.openai.api_server --model /models --port 8000
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
  rag-api:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - milvus
      - elasticsearch
      - redis
      - llm-server
    environment:
      - LLM_BASE_URL=http://llm-server:8000/v1
      - MILVUS_HOST=milvus
      - ES_HOST=elasticsearch
      - REDIS_HOST=redis

FastAPI 应用(暴露企业接口)

代码语言:javascript
复制
# app/main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from graph.rag_agent import app as rag_app

api = FastAPI()

class QueryRequest(BaseModel):
    question: str
    tenant_id: str
    history: list[dict] = []

@api.post("/v1/rag/chat")
async def chat(req: QueryRequest):
    # 调用 LangGraph 获取结果
    result = rag_app.invoke({
        "messages": [{"role": "user", "content": req.question}],
        "context": "",
        "iterations": 0
    })
    return {"answer": result['messages'][-1].content}

十二、评估体系:RAGAS 自动化评测(替代人工盲测)

生产上线前,必须用 RAGAS 框架对检索和生成进行量化评分。

代码语言:javascript
复制
# evaluate.py
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy, context_recall
from ragas.llms import LangchainLLM
from datasets import Dataset
import pandas as pd

# 准备测试集 (question, answer, contexts)
test_data = {
    "question": ["什么是RAG?", "怎么部署DeepSeek?"],
    "answer": ["...", "..."],
    "contexts": [["doc1..."], ["doc2..."]]
}
dataset = Dataset.from_pandas(pd.DataFrame(test_data))

# 使用 DeepSeek 作为评估 Judge(自我纠偏)
evaluator_llm = LangchainLLM(llm=llm)
result = dataset.evaluate(
    metrics=[faithfulness, answer_relevancy, context_relevancy, context_recall],
    llm=evaluator_llm
)

print(result)  # 输出分数 0-1,>0.85 可上线


十三、总结:十大企业级落地铁律

序号

原则

具体措施

1

模型选型保守

首选 14B 量化版,70B 仅在 A100 集群使用

2

分块必做语义

拒绝长度硬切,使用 BGE-M3 密度聚类

3

检索必做混合

BM25 + Dense 缺一不可,否则财务号/型号必漏

4

重排序必加

BGE-Reranker 能将 Hit@5 提升 20% 以上

5

上下文必压缩

使用 LLMLingua 压缩至 30%,首 Token 延迟降低 50%

6

多租户隔离

Milvus Partition Key + ES Filter 双保险

7

异步索引

Redis Stream 解耦写入,避免检索抖动

8

监控必上

Prometheus + Grafana 监控 GPU、Milvus 延迟、索引队列积压

9

Prompt 防注入

限制 System Prompt 中的指令覆盖,添加“拒绝回答非知识库内容”

10

持续评测

每周运行 RAGAS 回归测试,指标下降时自动告警

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 基于RAG架构的DeepSeek大模型本地知识库构建实战(一站式企业级解决方案)
    • 一、RAG vs 微调:为什么企业知识库必须选 RAG?
    • 二、硬件选型与模型量化部署(生产级基准)
      • 2.1 硬件配置推荐
      • 2.2 基于 vLLM 的高并发部署(OpenAI 兼容接口)
      • 2.3 Ollama 轻量方案(非生产,仅开发验证)
    • 三、企业级 RAG 架构全景设计
    • 四、向量数据库生产环境搭建(Milvus 集群版)
      • 4.1 Docker Compose 部署 Milvus Standalone(开发)与 Cluster(生产)
    • 五、文档解析与智能分块(进阶:语义分块 + 父子递归)
      • 5.1 多格式解析器
      • 5.2 语义分块(基于 SentenceTransformer 的密度聚类)
    • 六、混合检索:BM25(Sparse) + Dense(BGE-M3)融合
      • 6.1 双路召回实现
    • 七、重排序(BGE-Reranker)与上下文压缩(LLMLingua)
      • 7.1 BGE-Reranker 精排
      • 7.2 上下文压缩(LLMLingua)
    • 八、LangGraph 构建 Agentic RAG(拒绝线性问答)
      • 8.1 定义工具(Tools)
      • 8.2 LangGraph 节点与状态流转
    • 九、索引更新策略与 CDC(Change Data Capture)
    • 十、性能调优压测(核心瓶颈突破)
      • 10.1 Milvus 索引参数调优表
      • 10.2 显存优化策略(DeepSeek 大模型)
      • 10.3 检索侧优化
    • 十一、Docker Compose 一键部署全栈
    • 十二、评估体系:RAGAS 自动化评测(替代人工盲测)
    • 十三、总结:十大企业级落地铁律
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档