返回 RAG 工程实战目录

环境搭建与开发准备

建立可验证、可重建的开发环境

生命周期 · 阶段四 开发实现(前置) | 上游:系统设计(03)| 下游:入库流水线(05)、模块编码(07)

一、部署架构总览

最小可用的 RAG 私有化部署包含四类服务:

flowchart TB APP["应用层 RAGFlow / Dify / 自研 LangChain 服务"] APP --> B["模型服务 Ollama / vLLM / Embedding"] APP --> C["向量库 Milvus / Qdrant"] APP --> D["中间件 MySQL / Redis / MinIO / ES"] style APP fill:#e8f4ff,stroke:#4a9eff style B fill:#fff0f5,stroke:#e06fa8 style C fill:#f0fff4,stroke:#4abf60 style D fill:#fff8e1,stroke:#d4a017

二、基础环境准备

# 系统要求(单机验证环境)
# Linux 发行版、内存和 CPU 按组件官方要求及目标数据量选择;以下配置仅为示例
# 已安装 Docker 与 Docker Compose

docker --version          # ≥ 20.10
docker compose version    # ≥ v2.0

三、向量数据库部署(以 Milvus 为例)

# 下载官方 standalone 编排文件
wget https://github.com/milvus-io/milvus/releases/download/v2.4.x/milvus-standalone-docker-compose.yml -O docker-compose.yml

docker compose up -d

# 验证
docker compose ps        # milvus-standalone 状态应为 healthy

轻量替代(Qdrant,单容器即可):

docker run -d -p 6333:6333 -v qdrant_data:/qdrant/storage qdrant/qdrant
curl http://localhost:6333/collections   # 返回 JSON 即成功

四、模型服务部署

1. LLM(Ollama 本地部署)

# 安装 Ollama 后拉取模型
ollama pull qwen2.5:7b          # 生成模型
ollama serve                    # 默认端口 11434

curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "你好",
  "stream": false
}'

生产高并发场景用 vLLM(需 GPU):

pip install vllm
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B-Instruct --port 8000

2. Embedding 模型

# 方案 A:sentence-transformers 进程内加载(中小规模)
pip install sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
vectors = model.encode(["不良资产处置流程", "债权转让"], normalize_embeddings=True)
print(vectors.shape)   # (2, 1024)
# 方案 B:TEI(Text Embeddings Inference)独立服务(大规模,GPU 加速)
docker run -d -p 8080:80 ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-zh-v1.5

3. OCR(PaddleOCR)

pip install paddlepaddle paddleocr
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr("test_scan.pdf", cls=True)
for page in result:
    for line in page:
        print(line[1][0])   # 识别文本

五、应用层部署

方式 A:RAGFlow(开源一体化知识库示例)

git clone https://github.com/infiniflow/ragflow.git
cd ragflow/docker
docker compose -f docker-compose-CN.yml up -d
# 访问 http://localhost 即可使用 Web 界面配置知识库

方式 B:自研链路(LangChain 最小示例)

# pip install langchain langchain-community qdrant-client sentence-transformers

from langchain_community.document_loaders import PyMuPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain_community.llms import Ollama

# 1. 解析
docs = PyMuPDFLoader("操作手册.pdf").load()

# 2. 切片
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 3. 向量化 + 索引
embeddings = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
vs = Qdrant.from_documents(chunks, embeddings, url="http://localhost:6333",
                           collection_name="kb_demo")

# 4. 检索 + 生成
qa_chain = vs.as_retriever(search_kwargs={"k": 5})
llm = Ollama(model="qwen2.5:7b")
context = "\n".join(d.page_content for d in qa_chain.invoke("抵押物处置流程是什么?"))
answer = llm.invoke(f"仅根据以下资料回答问题,无法回答请说不知道。\n资料:\n{context}\n\n问题:抵押物处置流程是什么?")
print(answer)

六、环境验证清单(Checklist)

#验证项方法通过标准
1向量库可用curl 健康检查接口返回正常状态码
2LLM 服务可用发送一条测试 prompt返回连贯中文回答
3Embedding 可用编码两条相似/无关文本相似文本余弦相似度显著更高
4OCR 可用识别一张测试扫描件关键字段识别正确
5全链路打通上传 1 份测试文档并提问能返回带依据的回答
6端口与防火墙应用服务器互相 telnet全部连通
7GPU 利用(如有)nvidia-smi驱动正常、推理时占用上升

七、配置管理要点

  • 所有模型名、API 地址、向量库连接串配置化(env / 配置中心),不硬编码
  • 区分 dev / test / prod 三套环境,test 环境数据与生产隔离
  • 模型文件、向量库数据目录挂载持久卷,避免容器重建丢数据
  • 关键服务配置健康检查与开机自启

本篇交付与下一步

本篇命令是环境验证样例。执行前应锁定组件版本并核对对应版本的官方安装文档;只有健康检查、持久化目录、模型调用和重启恢复都通过,环境才算就绪。下一步进入 05-文档预处理与入库流水线