LightRAG API Server的Docker部署

LightRAG API Server的Docker部署

0. LightRAG是什么?

LightRAG 是一个轻量级的检索增强生成(Retrieval-Augmented Generation, RAG)框架,旨在高效结合信息检索与生成式模型(如大语言模型),以提升文本生成任务的质量和准确性。以下是其核心特点和应用场景:

0.1 核心特点
  1. 轻量化设计

    • 优化计算和存储资源,适合资源受限场景(如边缘设备或中小型企业)。
    • 可能采用高效的向量检索库(如FAISS或Annoy)或压缩模型来减少内存占用。
  2. 检索与生成结合

    • 检索阶段:从外部知识库(如文档、数据库)中检索与输入问题相关的上下文。
    • 生成阶段:将检索到的上下文输入生成模型(如GPT、LLaMA),生成更准确的回答。
  3. 模块化架构

    • 支持灵活配置检索器(如BM25、稠密检索器)和生成模型,适配不同任务需求。
  4. 性能优化

    • 可能通过缓存检索结果、批处理请求或蒸馏模型来加速推理。
0.2 应用场景
  • 问答系统:提供基于事实的精准回答,减少模型幻觉。
  • 客服机器人:动态检索产品文档生成响应。
  • 内容创作:辅助生成基于检索数据的报告或摘要。
0.3 与经典RAG的区别
  • 效率:更注重低延迟和资源消耗,适合实时或端侧部署。
  • 易用性:可能提供简化API或预置流程,降低实现门槛。

1. 下载源码

git clone https://github.com/HKUDS/LightRAG.git

2. 修改requirements.txt

官网的依赖里面少了几个依赖,不知道后面会不会修复,可以作为一个检查项

# 增加以下依赖项
python-docx
pycryptodome

3. 修改Dockerfile(支持国内源)

官方的Dockerfile里面的安装扩展依赖没有支持国内的源,下载非常缓慢

# Build stage
FROM python:3.11-slim AS builder

WORKDIR /app

# 清空原有源
RUN echo "" > /etc/apt/sources.list && \
    rm -f /etc/apt/sources.list.d/*  # 删除额外源文件

# 添加阿里云源
RUN echo "deb https://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian-security bookworm-security main contrib non-free" >> /etc/apt/sources.list

# Install Rust and required build dependencies
RUN apt-get update && apt-get install -y \
    curl \
    build-essential \
    pkg-config \
    && rm -rf /var/lib/apt/lists/* \
    && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
    && . $HOME/.cargo/env

# Copy only requirements files first to leverage Docker cache
COPY requirements.txt .
COPY lightrag/api/requirements.txt ./lightrag/api/

# Install dependencies
ENV PATH="/root/.cargo/bin:${PATH}"
RUN pip install --user --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install --user --no-cache-dir -r lightrag/api/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

# Final stage
FROM python:3.11-slim

WORKDIR /app

# Copy only necessary files from builder
COPY --from=builder /root/.local /root/.local
COPY ./lightrag ./lightrag
COPY setup.py .

RUN pip install .
# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH

# Create necessary directories
RUN mkdir -p /app/data/rag_storage /app/data/inputs

# Docker data directories
ENV WORKING_DIR=/app/data/rag_storage
ENV INPUT_DIR=/app/data/inputs

# Expose the default port
EXPOSE 9621

# Set entrypoint
ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"]

4. 修改docker-compose文件

增加pgvector服务,用来存储pgvector

services:
  pgvector:
    image: pgvector/pgvector:pg16
    profiles:
      - pgvector
    restart: always
    environment:
      PGUSER: ${PGVECTOR_PGUSER:-postgres}
      # The password for the default postgres user.
      POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-lightrag123456}
      # The name of the default postgres database.
      POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-lightrag}
      # postgres data directory
      PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata}
      # pg_bigm module for full text search
      PG_BIGM: ${PGVECTOR_PG_BIGM:-false}
      PG_BIGM_VERSION: ${PGVECTOR_PG_BIGM_VERSION:-1.2-20240606}
    volumes:
      - ./volumes/pgvector/data:/var/lib/postgresql/data
      - ./pgvector/docker-entrypoint.sh:/docker-entrypoint.sh
    entrypoint: [ '/docker-entrypoint.sh' ]
    networks:
      - lightrag-net
    healthcheck:
      test: [ 'CMD', 'pg_isready' ]
      interval: 1s
      timeout: 3s
      retries: 30

  lightrag:
    image: lightrag:latest
    ports:
      - "${PORT:-9621}:9621"
    volumes:
      - ./data/rag_storage:/app/data/rag_storage
      - ./data/inputs:/app/data/inputs
      - ./config.ini:/app/config.ini
      - ./.env:/app/.env
    env_file:
      - .env
    networks:
      - lightrag-net
    restart: unless-stopped

networks:
  lightrag-net:    

注意:pgvector的docker-entrypoint.sh文件如下,主要是安装vector的扩展

  • docker-entrypoint.sh
#!/bin/bash

PG_MAJOR=16

if [ "${PG_BIGM}" = "true" ]; then
  # install pg_bigm
  apt-get update
  apt-get install -y curl make gcc postgresql-server-dev-${PG_MAJOR}

  curl -LO https://github.com/pgbigm/pg_bigm/archive/refs/tags/v${PG_BIGM_VERSION}.tar.gz
  tar xf v${PG_BIGM_VERSION}.tar.gz
  cd pg_bigm-${PG_BIGM_VERSION} || exit 1
  make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config
  make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config install

  cd - || exit 1
  rm -rf v${PG_BIGM_VERSION}.tar.gz pg_bigm-${PG_BIGM_VERSION}

  # enable pg_bigm
  sed -i -e 's/^#\s*shared_preload_libraries.*/shared_preload_libraries = '\''pg_bigm'\''/' /var/lib/postgresql/data/pgdata/postgresql.conf
fi

# Run the original entrypoint script
exec /usr/local/bin/docker-entrypoint.sh postgres

5. 修改.env文件

首先执行cp env.example .env复制env文件

### This is sample file of .env

### Server Configuration
# HOST=0.0.0.0
# PORT=9621
# WORKERS=1
# NAMESPACE_PREFIX=lightrag  # separating data from difference Lightrag instances
# MAX_GRAPH_NODES=1000       # Max nodes return from grap retrieval
# CORS_ORIGINS=http://localhost:3000,http://localhost:8080

### Optional SSL Configuration
# SSL=true
# SSL_CERTFILE=/path/to/cert.pem
# SSL_KEYFILE=/path/to/key.pem

### Directory Configuration
# WORKING_DIR=<absolute_path_for_working_dir>
# INPUT_DIR=<absolute_path_for_doc_input_dir>

### Ollama Emulating Model Tag
# OLLAMA_EMULATING_MODEL_TAG=latest

### Logging level
# LOG_LEVEL=INFO
# VERBOSE=False
# LOG_DIR=/path/to/log/directory  # Log file directory path, defaults to current working directory
# LOG_MAX_BYTES=10485760          # Log file max size in bytes, defaults to 10MB
# LOG_BACKUP_COUNT=5              # Number of backup files to keep, defaults to 5

### Settings for RAG query
# HISTORY_TURNS=3
# COSINE_THRESHOLD=0.2
# TOP_K=60
# MAX_TOKEN_TEXT_CHUNK=4000
# MAX_TOKEN_RELATION_DESC=4000
# MAX_TOKEN_ENTITY_DESC=4000

### Settings for document indexing
ENABLE_LLM_CACHE_FOR_EXTRACT=true    # Enable LLM cache for entity extraction
SUMMARY_LANGUAGE=Chinese
# CHUNK_SIZE=1200
# CHUNK_OVERLAP_SIZE=100
# MAX_TOKEN_SUMMARY=500                # Max tokens for entity or relations summary
# MAX_PARALLEL_INSERT=2                # Number of parallel processing documents in one patch

# EMBEDDING_BATCH_NUM=32               # num of chunks send to Embedding in one request
# EMBEDDING_FUNC_MAX_ASYNC=16          # Max concurrency requests for Embedding
# MAX_EMBED_TOKENS=8192

### LLM Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal)
TIMEOUT=150                            # Time out in seconds for LLM, None for infinite timeout
TEMPERATURE=0.5
MAX_ASYNC=4                            # Max concurrency requests of LLM
MAX_TOKENS=32768                       # Max tokens send to LLM (less than context size of the model)

#LLM_BINDING=ollama
#LLM_MODEL=mistral-nemo:latest
#LLM_BINDING_API_KEY=AAAAC3NzaC1lZDI1NTE5AAAAIMQGe4YM+6r7Q3Aw7I8PiAmfR+UZZ1DLa+j0YLYl2SPl
### Ollama example
#LLM_BINDING_HOST=http://192.168.86.109:11434
### OpenAI alike example
LLM_BINDING=openai
LLM_MODEL=deepseek-chat
LLM_BINDING_HOST=https://api.deepseek.com
LLM_BINDING_API_KEY=替换成你自己的api-key
### lollms example
# LLM_BINDING=lollms
# LLM_MODEL=mistral-nemo:latest
# LLM_BINDING_HOST=http://localhost:9600
# LLM_BINDING_API_KEY=your_api_key

### Embedding Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal)
EMBEDDING_MODEL=bge-m3:latest
EMBEDDING_DIM=1024
# EMBEDDING_BINDING_API_KEY=your_api_key
### ollama example
EMBEDDING_BINDING=ollama
EMBEDDING_BINDING_HOST=http://192.168.86.109:11434
### OpenAI alike example
# EMBEDDING_BINDING=openai
# LLM_BINDING_HOST=https://api.openai.com/v1
### Lollms example
# EMBEDDING_BINDING=lollms
# EMBEDDING_BINDING_HOST=http://localhost:9600

### Optional for Azure (LLM_BINDING_HOST, LLM_BINDING_API_KEY take priority)
# AZURE_OPENAI_API_VERSION=2024-08-01-preview
# AZURE_OPENAI_DEPLOYMENT=gpt-4o
# AZURE_OPENAI_API_KEY=your_api_key
# AZURE_OPENAI_ENDPOINT=https://myendpoint.openai.azure.com

# AZURE_EMBEDDING_DEPLOYMENT=text-embedding-3-large
# AZURE_EMBEDDING_API_VERSION=2023-05-15

### Data storage selection
LIGHTRAG_KV_STORAGE=PGKVStorage
LIGHTRAG_VECTOR_STORAGE=PGVectorStorage
# LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage
# LIGHTRAG_GRAPH_STORAGE=PGGraphStorage
LIGHTRAG_GRAPH_STORAGE=NetworkXStorage
LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage

### Oracle Database Configuration
ORACLE_DSN=localhost:1521/XEPDB1
ORACLE_USER=your_username
ORACLE_PASSWORD='your_password'
ORACLE_CONFIG_DIR=/path/to/oracle/config
#ORACLE_WALLET_LOCATION=/path/to/wallet  # optional
#ORACLE_WALLET_PASSWORD='your_password'  # optional
#ORACLE_WORKSPACE=default  # separating all data from difference Lightrag instances(deprecated, use NAMESPACE_PREFIX in future)

### TiDB Configuration
TIDB_HOST=localhost
TIDB_PORT=4000
TIDB_USER=your_username
TIDB_PASSWORD='your_password'
TIDB_DATABASE=your_database
#TIDB_WORKSPACE=default  # separating all data from difference Lightrag instances(deprecated, use NAMESPACE_PREFIX in future)

### PostgreSQL Configuration
POSTGRES_HOST=pgvector
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD='lightrag123456'
POSTGRES_DATABASE=lightrag
#POSTGRES_WORKSPACE=default  # separating all data from difference Lightrag instances(deprecated, use NAMESPACE_PREFIX in future)

### Independent AGM Configuration(not for AMG embedded in PostreSQL)
AGE_POSTGRES_DB=
AGE_POSTGRES_USER=
AGE_POSTGRES_PASSWORD=
AGE_POSTGRES_HOST=
# AGE_POSTGRES_PORT=8529

# AGE Graph Name(apply to PostgreSQL and independent AGM)
# AGE_GRAPH_NAME=lightrag  # deprecated, use NAME_SPACE_PREFIX instead

### Neo4j Configuration
NEO4J_URI=neo4j+s://xxxxxxxx.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD='your_password'

### MongoDB Configuration
MONGO_URI=mongodb://root:root@localhost:27017/
MONGO_DATABASE=LightRAG
MONGODB_GRAPH=false # deprecated (keep for backward compatibility)

### Milvus Configuration
MILVUS_URI=http://localhost:19530
MILVUS_DB_NAME=lightrag
# MILVUS_USER=root
# MILVUS_PASSWORD=your_password
# MILVUS_TOKEN=your_token

### Qdrant
QDRANT_URL=http://localhost:6333
# QDRANT_API_KEY=your-api-key

### Redis
REDIS_URI=redis://localhost:6379

### For JWT Auth
AUTH_ACCOUNTS='admin:admin123,user1:pass456'     # username:password,username:password
TOKEN_SECRET=Your-Key-For-LightRAG-API-Server    # JWT key
TOKEN_EXPIRE_HOURS=4                             # expire duration

### API-Key to access LightRAG Server API
# LIGHTRAG_API_KEY=your-secure-api-key-here
# WHITELIST_PATHS=/health,/api/*

6. 配置Embedding模型

建议使用ollama的bge-m3:latest这个Embedding模型,只有1.2G,ollama使用cpu也可以轻松支持

可以使用主机部署,也可以使用docker部署,具体可以查看官方文档

也可以使用别的Embedding模型的API

7. 配置LLM模型

如果有GPU版本的ollama,应该也是可以轻松胜任,使用官方推荐的mistral-nemo:latest模型

我这直接使用deepseek的deepseek-chat模型了,可以根据个人情况

注意:CPU版本的ollama是支撑不了mistral-nemo:latest模型的!

8. 构建lightrag镜像

docker build -t lightrag:latest .

9. docker-compose部署

docker-compose -f docker-compose.yml --profile pgvector  up -d
  • --profile pgvector 表示使用pgvector作为数据库,如果使用默认的可以不用这个指令

10. 验证服务

  • 登录http:IP:9621

  • 默认密码:admin/admin123 这个在.env文件中可以自主修改

11 Q&A

1. 如果遇到数据库表创建失败,报错:vector type缺失,则需要创建一些PG的EXTENSION
# 首先登录进入pgsql数据库
psql -U postgres -d pgsql
# 查看扩展
\dx
# 确认没有vector后创建扩展
CREATE EXTENSION vector;
# 然后再查看
\dx

最后

如果还有其他的问题可以视具体遇到的问题再逐一解决。

GOOD LUCK!

posted on 2025-03-31 10:42  JentZhang  阅读(1914)  评论(0)    收藏  举报