本项目是一个基于Python的服务器,专为文档处理和检索增强生成(RAG)而设计。它提供了一个简单的Web界面和JSON API,用于上传文档、将文档处理成块、生成嵌入向量,并将其存储在DuckDB数据库中,以便进行高效的相似性搜索。
整个应用程序使用Docker进行容器化,并使用uv进行快速、优化的依赖管理。此外,它还包含一个mcp-rag-service,用于与MCP(机器理解平台)集成。
/api/search、/api/stats和/health端点,便于进行程序化集成。.txt、.md、.pdf以及多种编程语言的源文件(如.py、.js、.java等)。CodeSplitter,对文本使用RecursiveCharacterTextSplitter)。sentence-transformers/paraphrase-multilingual-mpnet-base-v2(主要,768维)或sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2(备用,384维)。uv实现超快速的依赖安装。mcp-rag-service,用于演示与外部系统的集成。sentence-transformers、llama-index、langchainuvgit clone
cd
uv进行了优化。您可以选择标准构建(包含支持GPU的库)或仅CPU构建。标准构建(适用于支持GPU的环境):
docker build -t rag-duckdb-server .
仅CPU构建(推荐用于本地开发或仅使用CPU的服务器): 此构建通过使用仅CPU版本的PyTorch,速度更快,且生成的镜像体积更小。
docker build --build-arg USE_CPU_ONLY=true -t rag-duckdb-server-cpu .
uploads和data目录映射到容器中。这样,即使容器被移除,您上传的文件和数据库也会保留。对于标准构建:
docker run -p 8000:8000 \
-v "$(pwd)/uploads:/app/uploads" \
-v "$(pwd)/data:/app/data" \
--name rag-server \
rag-duckdb-server
对于仅CPU构建:
docker run -p 8000:8000 \
-v "$(pwd)/uploads:/app/uploads" \
-v "$(pwd)/data:/app/data" \
--name rag-server-cpu \
rag-duckdb-server-cpu
Windows用户注意:在PowerShell中使用${pwd}代替$(pwd)。
http://localhost:8000。data/rag.duckdb数据库中。uploads文件夹中删除已处理的文件。/api/*端点以编程方式与服务器进行交互。在使用API进行搜索时,可以通过调整参数来实现更高级的搜索功能,例如:
# 示例:进行语义搜索,返回前10个结果,并启用结果重排和查询扩展
curl -X POST "http://localhost:8000/api/search" -H "Content-Type: application/json" -d '{"query": "your_search_query", "top_k": 10, "search_type": "semantic", "use_reranker": true, "expand_query": true}'
服务器支持多种文件类型:
.txt - 纯文本文件.md - Markdown文件.pdf - PDF文档.py - Python.js、.ts、.jsx、.tsx - JavaScript/TypeScript.java - Java.c、.cpp、.cc、.cxx - C/C++.cs - C#.go - Go.rs - Rust.php - PHP.rb - Ruby.scala - Scala.swift - Swift.html、.htm - HTML.css、.scss、.sass - CSS及其预处理器.sh、.bash、.zsh、.fish - shell脚本.json - JSON.yaml、.yml - YAML.xml - XML.sql - SQL.ini、.toml - 配置文件注意:处理过程中,具有不受支持扩展名的文件将自动跳过。
GET / - 主Web界面POST /upload-files/ - 上传单个文件POST /upload-directory/ - 上传带有扩展名过滤的目录POST /process-files/ - 处理上传的文件POST /search/ - 搜索界面POST /delete-file/ - 删除上传的文件POST /api/search - 程序化搜索端点GET /api/stats - 获取集合统计信息GET /health - 健康检查端点query(必需):搜索查询字符串top_k(可选,默认值:5):返回的结果数量(1 - 50)search_type(可选,默认值:"hybrid"):"hybrid"、"semantic"或"keyword"use_reranker(可选,默认值:true):启用/禁用结果重排expand_query(可选,默认值:false):启用/禁用查询扩展项目中包含一个单独的MCP(机器理解平台)集成服务,位于mcp-rag-service/目录中。此服务提供以下功能:
mcp-rag-service/examples/目录中包含实际示例:
upload_example.py - 演示文件上传功能search_example.py - 展示带有相似性阈值的语义搜索analysis_example.py - 全面的向量分析示例要运行这些示例,请执行以下操作:
cd mcp-rag-service/examples
python upload_example.py
python search_example.py
python analysis_example.py
.
├── app/
│ ├── main.py # FastAPI应用程序、路由和API端点
│ └── services.py # 业务逻辑(文件处理、分块、嵌入、数据库)
├── mcp-rag-service/ # MCP集成服务
│ ├── src/
│ │ ├── rag_client.py # RAG服务器客户端
│ │ ├── rag_mcp_server.py # MCP服务器实现
│ │ ├── vector_operations.py # 高级向量分析
│ │ └── utils.py # 实用函数
│ ├── examples/ # 实际示例
│ └── pyproject.toml
├── templates/
│ └── index.html # 用于UI的Jinja2模板
├── uploads/ # 文件上传目录(作为卷挂载)
├── data/ # DuckDB数据库目录(作为卷挂载)
├── .dockerignore # 指定Docker构建上下文中要忽略的文件
├── .gitignore # 指定Git要忽略的文件
├── Dockerfile # 使用uv和多阶段构建的Docker构建说明
├── requirements-base.txt # 基础Python依赖项
├── requirements-cpu.txt # 仅CPU的ML依赖项
├── requirements-ml.txt # 完整的ML依赖项(用于GPU)
└── README.md # 本文件
app/services.py中作为常量定义。CHUNK_SIZE和CHUNK_OVERLAP环境变量调整分块大小和重叠。默认值分别为700和100。app/services.py中配置。Hybrid(语义 + 关键字)、仅Semantic或仅Keyword(BM25)搜索。GraphRAG(基于图的检索增强生成)计划作为一项重大改进,将提供以下功能:
此功能目前处于规划阶段,将作为一个单独的模块实现,可选择启用。
docker build --build-arg USE_CPU_ONLY=true -t rag-duckdb-server-cpu .
内存问题:对于大型文档集合,可以考虑以下方法:
模型加载问题:如果主模型加载失败,系统将自动切换到较小的模型。
数据库问题:DuckDB数据库在首次运行时会自动创建。如果遇到数据库错误,可以删除data/目录以重新开始。
使用健康检查端点监控服务状态:
curl http://localhost:8000/health
此命令将返回服务状态、模型加载状态和数据库连接信息。
本项目采用MIT许可证 - 详情请参阅LICENSE文件。
⚠️ 重要提示
非常大的文件在处理过程中可能会导致内存问题,且当前实现仅适用于单用户场景。不支持二进制文件(如图像、视频等),虽然嵌入模型是多语言的,但分块策略针对英语和常见编程语言进行了优化。
💡 使用建议
在处理大型文档集合时,建议使用仅CPU构建以减少内存占用,并分批处理文件。在使用API进行搜索时,可以根据实际需求调整搜索参数,以获得更准确的结果。