RAG环境搭建:Docker容器平台最佳实践

云信安装大师
90
AI 质量分
10 5 月, 2025
3 分钟阅读
0 阅读

RAG环境搭建:Docker容器平台最佳实践

引言

RAG(Retrieval-Augmented Generation)是一种结合检索和生成能力的AI技术,在问答系统、知识库应用等领域广受欢迎。本文将详细介绍如何在Docker容器环境中搭建RAG系统,让你快速拥有一个可运行的开发环境。

准备工作

在开始之前,请确保你的系统已安装以下组件:

  • Docker Engine 20.10.0或更高版本
  • Docker Compose 2.0.0或更高版本
  • 至少16GB内存(RAG组件较吃资源)
  • 50GB可用磁盘空间

检查Docker是否安装成功:

代码片段
docker --version
docker-compose --version

基础架构设计

我们的RAG系统将包含以下核心组件:

  1. 向量数据库:用于存储和检索文档向量(使用Weaviate)
  2. 文本嵌入模型:将文本转换为向量(使用Sentence Transformers)
  3. 大语言模型:生成最终答案(使用LLaMA 2)
  4. API服务层:协调各组件工作(FastAPI)

详细搭建步骤

1. 创建项目目录结构

代码片段
mkdir rag-docker && cd rag-docker
mkdir -p {data,models,src}

2. 编写Docker Compose文件

创建docker-compose.yml文件:

代码片段
version: '3.8'

services:
  weaviate:
    image: semitechnologies/weaviate:1.22.4
    ports:
      - "8080:8080"
    environment:
      QUERY_DEFAULTS_LIMIT: 25
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers'
      ENABLE_MODULES: 'text2vec-transformers'
      TRANSFORMERS_INFERENCE_API: 'http://transformers:8080'
    volumes:
      - ./data/weaviate:/var/lib/weaviate

  transformers:
    image: semitechnologies/transformers-inference:sentence-transformers-multi-qa-mpnet-base-dot-v1
    environment:
      ENABLE_CUDA: '1' # 如果有NVIDIA GPU可以启用CUDA加速
    ports:
      - "8081:8080"

  llm-api:
    build: ./llm-service
    ports:
      - "8000:8000"
    depends_on:
      - weaviate
    environment:
      WEAVIATE_URL: "http://weaviate:8080"

volumes:
  weaviate_data:

3. LLM服务配置

创建llm-service/Dockerfile:

代码片段
FROM python:3.9-slim

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "app.main:app"]

创建llm-service/requirements.txt:

代码片段
fastapi==0.95.2
uvicorn==0.22.0
gunicorn==20.1.0
weaviate-client==3.22.1
sentence-transformers==2.2.2
transformers==4.31.0
torch==2.0.1

创建llm-service/app/main.py:

代码片段
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import weaviate

app = FastAPI()

# Weaviate客户端初始化
client = weaviate.Client(
    url="http://weaviate:8080",
)

class QueryRequest(BaseModel):
    question: str

@app.post("/query")
async def query_rag(request: QueryRequest):
    try:
        # Step 1: 将问题转换为向量 (实际应用中应该调用transformers服务)
        # Step 2: Weaviate中检索相关文档 (简化版)
        results = (
            client.query.get("Document", ["title", "content"])
            .with_near_text({"concepts": [request.question]})
            .with_limit(3)
            .do()
        )

        # Step3:构建LLM提示词 (简化版)
        context = "\n".join([item["content"] for item in results["data"]["Get"]["Document"]])
        prompt = f"""基于以下上下文回答问题:
{context}

问题:{request.question}
答案:"""

        # Step4:调用LLM生成答案 (这里简化处理)
        answer = f"这是一个示例回答。实际应用中应该调用LLM模型。问题:{request.question}"

        return {"answer": answer, "context": context}

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

4. 启动服务

代码片段
docker-compose up -d --build

等待所有容器启动完成(首次启动可能需要下载镜像,耗时较长)。

5. 验证服务运行状态

检查各容器状态:

代码片段
docker-compose ps

测试Weaviate是否正常工作:

代码片段
curl http://localhost:8080/v1/schema | jq .

测试LLM API是否正常工作:

代码片段
curl -X POST http://localhost:8000/query \
-H "Content-Type: application/json" \
-d '{"question":"什么是RAG技术?"}'

RAG工作流程详解

我们的Docker化RAG系统工作流程如下:

1️⃣ 文档预处理
– PDF/Word等文档 → 文本提取 → chunk分割 → embedding转换 → Weaviate存储

2️⃣ 查询处理
– 用户提问 → embedding转换 → Weaviate相似度检索 → top-k相关文档获取 → LLM生成答案

3️⃣ 结果返回
– LLM生成的答案 + source文档引用 → API响应返回给用户

性能优化建议

GPU加速配置(如有NVIDIA显卡)

修改docker-compose.yml中的transformers服务:

代码片段
transformers:
   ...
   deploy:
     resources:
       reservations:
         devices:
           - driver: nvidia 
             count: all 
             capabilities: [gpu]
   runtime: nvidia 

Weaviate索引优化

通过Weaviate的schema API创建优化的索引结构:

代码片段
curl http://localhost:8080/v1/schema -X POST -H "Content-Type: application/json" -d '{
   "classes": [{
     "class": "Document",
     "vectorizer": "text2vec-transformers",
     "properties": [{
       "name": "title",
       "dataType": ["text"]
     },{
       "name": "content",
       "dataType": ["text"]
     }],
     "vectorIndexConfig": {
       "distance": "dot" 
     }
   }]
}'

FAQ常见问题解决

内存不足导致容器崩溃
– Weaviate默认配置可能需要调整,添加环境变量:

代码片段
environment:
   DEFAULT_VECTORIZER_MODULE_CACHE_SIZE_MB=2048 

中文支持不佳
– transformers服务更换为中文专用模型:

代码片段
image: semitechnologies/transformers-inference:sentence-transformers-paraphrase-multilingual-MiniLM-L12-v2 

数据持久化问题
– Weaviate数据目录应确保正确挂载,定期备份volume数据

总结

通过本文的Docker Compose方案,我们实现了:

✅ RAG核心组件的容器化部署
✅ Weaviate向量数据库的高效检索
✅ LLM服务的API封装
✅ GPU加速支持

后续可以进一步扩展:

• Web前端界面开发
• PDF解析器集成
• LLM模型微调支持

完整代码已托管在GitHub:[示例仓库链接]

希望这篇指南能帮助你快速搭建自己的RAG开发环境!如有任何问题,欢迎在评论区讨论。

原创 高质量