MCP RAGAnything
建筑
Clients
(REST / MCP / Claude)
|
+-------------+-------------+
| FastAPI App |
+-------------+-------------+
|
+---------------+---------------+
| |
Application Layer MCP Servers (FastMCP)
+------------------------------+ |
| api/ | +---+--------+ +--+-----------+ +--+-------------+
| indexing_routes.py | | RAGAnything | | RAGAnything | | RAGAnything |
| query_routes.py | | Query | | Files | | Classical |
| file_routes.py | | /rag/mcp | | /files/mcp | | /classical/mcp|
| health_routes.py | +---+--------+ +--+-----------+ +--+-------------+
| classical_indexing_routes | | | |
| classical_query_routes | | | classical_index_file
| use_cases/ | | | classical_index_folder
| IndexFileUseCase | | | classical_query
| IndexFolderUseCase |
| QueryUseCase |
| ClassicalIndexFileUseCase |
| ClassicalIndexFolderUseCase |
| ClassicalQueryUseCase |
| ListFilesUseCase |
| ListFoldersUseCase |
| ReadFileUseCase |
| requests/ responses/ |
+------------------------------+
| | |
v v v
Domain Layer (ports)
+----------------------------------------------------------+
| RAGEnginePort StoragePort BM25EnginePort |
| DocumentReaderPort VectorStorePort LLMPort |
+----------------------------------------------------------+
| | | | |
v v v v v
Infrastructure Layer (adapters)
+----------------------------------------------------------+
| LightRAGAdapter MinioAdapter |
| (RAGAnything/ (minio-py) |
| KreuzbergParser) |
| |
| PostgresBM25Adapter RRFCombiner |
| (pg_textsearch) (hybrid+ fusion) |
| |
| KreuzbergAdapter LangchainPgvectorAdapter |
| (kreuzberg - 91 formats) (langchain-postgres PGVector) |
| |
| LangchainOpenAIAdapter |
| (langchain-openai ChatOpenAI) |
+----------------------------------------------------------+
| | | | |
v v v v v
PostgreSQL MinIO Kreuzberg OpenAI-compatible
(pgvector + (object (document (LLM API)
Apache AGE storage) extraction)
pg_textsearch)先决条件
- Python 3.13+
- Docker和Docker Compose
- 一 开放路由 API密钥(或任何与OpenAI兼容的提供程序)
- 这
soludev-compose-apps/bricks/用于生产部署的堆栈(提供PostgreSQL、MinIO和此服务)
快速开始
生产从共享的组合堆栈运行 soludev-compose-apps/bricks/The docker-compose.yml 此存储库仅用于本地开发。
本地开发
# 1. Install dependencies
uv sync
# 2. Start PostgreSQL and MinIO (docker-compose.yml provides Postgres;
# MinIO must be available separately or added to the compose file)
docker compose up -d postgres
# 3. Configure environment
cp .env.example .env
# Edit .env: set OPEN_ROUTER_API_KEY and adjust MINIO_HOST / POSTGRES_HOST
# 4. Run the server
uv run python src/main.pyAPI可在 http://localhost:8000.Swagger用户界面位于 http://localhost:8000/docs.
生产(soludev编写应用程序)
cd soludev-compose-apps/bricks/
docker compose up -d这将启动所有砖服务,包括 raganything-api, postgres,以及 minio.
API 参考
基础路径: /api/v1
健康
# Health check
curl http://localhost:8000/api/v1/health答复:
{"message": "RAG Anything API is running"}索引
两个索引端点都接受JSON正文并在后台运行处理。文件从MinIO下载,而不是直接上传。
索引单个文件
下载由标识的文件 file_name 从配置的MinIO存储桶中,然后将其索引到RAG知识图中 working_dir.
curl -X POST http://localhost:8000/api/v1/file/index \
-H "Content-Type: application/json" \
-d '{
"file_name": "project-alpha/report.pdf",
"working_dir": "project-alpha"
}'答复(202 Accepted):
{"status": "accepted", "message": "File indexing started in background"}| 字段 | 类型 | 必填 | 描述 |
|---|---|---|---|
file_name | string | yes | MinIO存储桶中的对象路径 |
working_dir | string | yes | RAG工作区目录(项目隔离) |
为文件夹建立索引
列出下的所有对象 working_dir 在MinIO中添加前缀,下载它们,然后对整个文件夹进行索引。
curl -X POST http://localhost:8000/api/v1/folder/index \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"recursive": true,
"file_extensions": [".pdf", ".docx", ".txt"]
}'答复(202 Accepted):
{"status": "accepted", "message": "Folder indexing started in background"}| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
working_dir | string | yes | -- | RAG工作区目录,也用作MinIO前缀 |
recursive | boolean | 否 | true | 递归处理子目录 |
file_extensions | list\[string\] | 否 | null (所有文件) | 按扩展名筛选,例如。 [".pdf", ".docx", ".txt"] |
支持的文档格式
该服务通过RAGAnything解析器自动检测和处理以下文档格式:
| 格式 | 扩展名 | 注释 |
|---|---|---|
.pdf | 包括OCR支持(通过Tesseract提供英语+法语) | |
| 微软Word | .docx | |
| 微软PowerPoint | .pptx | |
| 微软Excel | .xlsx | |
| HTML | .html, .htm | |
| 纯文本 | .txt, .text, .md | 支持UTF-8、UTF-16、ASCII;通过ReportLab转换为PDF |
| Quarto Markdown | .qmd | Quarto文件 |
| R Markdown | .Rmd, .rmd | R Markdown文件 |
| 图片 | .png, .jpg, .jpeg, .gif, .webp, .bmp, .tiff, .tif | 视觉模型处理(如果启用) |
注: 文件格式检测是自动的。无需配置即可指定文档类型。该服务将在索引时处理任何支持的格式。安装时,所有文档和图像格式都支持开箱即用 raganything[all].
文件浏览和读取
直接从MinIO浏览和读取文件,而无需将其编入RAG知识库。由...驱动 克罗伊茨贝格 用于文档文本提取(91种文件格式)。
列出文件
# List all files in the bucket
curl http://localhost:8000/api/v1/files/list
# List files under a specific prefix
curl "http://localhost:8000/api/v1/files/list?prefix=documents/&recursive=true"答复(200 OK):
[
{"object_name": "documents/report.pdf", "size": 1024, "last_modified": "2026-01-01 00:00:00+00:00"},
{"object_name": "documents/notes.txt", "size": 512, "last_modified": "2026-01-02 00:00:00+00:00"}
]| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prefix | 字符串 | "" | MinIO前缀用于筛选文件 |
recursive | 布尔值 | true | 列出子目录中的文件 |
上传文件
将文件直接上传到MinIO存储桶。文件存储在 {prefix}{filename}。此端点确实 不 索引文件--使用 POST /file/index 上传后将端点添加到RAG知识库中。
允许的文件类型: .pdf, .txt, .docx, .xlsx, .pptx, .md, .csv, .png, .jpg, .jpeg, .gif, .webp, .svg, .bmp, .html, .xml, .json, .rtf, .odt, .ods 最大文件大小: 50 MB
curl -X POST http://localhost:8000/api/v1/files/upload \
-F "file=@report.pdf" \
-F "prefix=documents/"答复(201 Created):
{"object_name": "documents/report.pdf", "size": 2048, "message": "File uploaded successfully"}| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
file | file | yes | -- | 要上传的文件(多部分表单) |
prefix | string | 否 | "" | MinIO前缀(文件夹路径)。必须是相对路径 |
错误响应:
| 状态 | 条件 |
|---|---|
413 | 文件超过50 MB限制 |
422 | 前缀无效(路径遍历/绝对)、不允许的文件类型或缺少文件 |
读取文件
从MinIO下载文件,使用Kreuzberg提取其文本内容,并返回结果。支持91种文件格式,包括PDF、Office文档、图像和HTML。
curl -X POST http://localhost:8000/api/v1/files/read \
-H "Content-Type: application/json" \
-d '{"file_path": "documents/report.pdf"}'答复(200 OK):
{
"content": "Extracted text from the document...",
"metadata": {"format_type": "pdf", "mime_type": "application/pdf"},
"tables": [{"markdown": "| Header | Value |\n|---|---|\n| A | 1 |"}]
}| 字段 | 类型 | 描述 |
|---|---|---|
file_path | 字符串 | 必修的。 MinIO存储桶中的文件路径(相对,无 .. 或绝对路径) |
错误响应:
| 状态 | 条件 |
|---|---|
404 | 在MinIO中找不到文件 |
422 | 不支持的文件格式或无效路径(路径遍历、绝对路径) |
查询
查询索引知识库。RAG引擎针对给定的 working_dir 在执行查询之前。
curl -X POST http://localhost:8000/api/v1/query \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"query": "What are the main findings of the report?",
"mode": "naive",
"top_k": 10
}'答复(200 OK):
{
"status": "success",
"message": "",
"data": {
"entities": [],
"relationships": [],
"chunks": [
{
"reference_id": "...",
"content": "...",
"file_path": "...",
"chunk_id": "..."
}
],
"references": []
},
"metadata": {
"query_mode": "naive",
"keywords": null,
"processing_info": null
}
}| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
working_dir | string | yes | -- | 此项目的RAG工作区目录 |
query | string | yes | -- | 搜索查询 |
mode | string | 否 | "naive" | 搜索模式: naive, local, global, hybrid, hybrid+, mix, bm25, bypass |
BM25查询模式
返回按PostgreSQL全文搜索排序的结果,使用 pg_textsearch每个区块均包含一个 score BM25相关性得分的字段。
curl -X POST http://localhost:8000/api/v1/query \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"query": "quarterly revenue growth",
"mode": "bm25",
"top_k": 10
}'答复(200 OK):
{
"status": "success",
"message": "",
"data": {
"entities": [],
"relationships": [],
"chunks": [
{
"chunk_id": "abc123",
"content": "Quarterly revenue grew 12% year-over-year...",
"file_path": "reports/financials-q4.pdf",
"score": 3.456,
"metadata": {}
}
],
"references": []
},
"metadata": {
"query_mode": "bm25",
"total_results": 10
}
}混合+查询模式
并行运行BM25和向量搜索,然后使用交互秩融合(RRF)合并结果。每个区块包括 bm25_rank, vector_rank,以及 combined_score 领域。
curl -X POST http://localhost:8000/api/v1/query \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"query": "quarterly revenue growth",
"mode": "hybrid+",
"top_k": 10
}'答复(200 OK):
{
"status": "success",
"message": "",
"data": {
"entities": [],
"relationships": [],
"chunks": [
{
"chunk_id": "abc123",
"content": "Quarterly revenue grew 12% year-over-year...",
"file_path": "reports/financials-q4.pdf",
"score": 0.0328,
"bm25_rank": 1,
"vector_rank": 3,
"combined_score": 0.0328,
"metadata": {}
}
],
"references": []
},
"metadata": {
"query_mode": "hybrid+",
"total_results": 10,
"rrf_k": 60
}
}这 combined_score 是以下各项的总和 bm25_score 和 vector_score,每个计算如下 1 / (k + rank)。结果按以下方式排序 combined_score 下降。出现在两个结果集中的块的综合得分将高于仅出现在一个中的块。
______________________________________________________________________
经典RAG管道
基于图的LightRAG旁边的第二个检索路径。经典RAG使用一个简单的块→ 嵌入→ 使用两种质量增强技术检索流: 多查询生成 和 法学硕士作为裁判相关性评分。它将块存储在专用的PGVector表中(每个表一个 working_dir)并且不构建知识图。
运作原理
- 索引 --从MinIO下载一个文件,通过Kreuzberg提取文本(使用分块),每个块都嵌入并存储在PGVector表中。
- 查询 --LLM生成用户查询的N个备选短语(多查询),对每个变体进行相似性搜索,结果由
chunk_id,然后法学硕士评委以0-10的评分标准对每个块的相关性进行评分。低于相关性阈值的块被丢弃;其余的按分数排序返回。
经典索引
两个经典的索引端点都接受JSON正文并在后台运行处理。
索引单个文件(经典)
从MinIO下载文件,使用Kreuzberg分块提取文本,并将分块嵌入到范围为的PGVector表中 working_dir.
curl -X POST http://localhost:8000/api/v1/classical/file/index \
-H "Content-Type: application/json" \
-d '{
"file_name": "project-alpha/report.pdf",
"working_dir": "project-alpha",
"chunk_size": 1000,
"chunk_overlap": 200
}'答复(202 Accepted):
{"status": "accepted", "message": "File indexing started in background"}| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
file_name | string | yes | -- | MinIO bucket中的对象路径 |
working_dir | string | yes | -- | RAG工作区目录(项目隔离) |
chunk_size | 整数 | 否 | 1000 | 每个块的最大字符数(100-10000) |
chunk_overlap | 整数 | 否 | 200 | 块之间的重叠字符(0-2000) |
索引文件夹(经典)
列出下的所有对象 working_dir 在MinIO中添加前缀,下载它们,并将每个文件索引到PGVector表中。
curl -X POST http://localhost:8000/api/v1/classical/folder/index \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"recursive": true,
"file_extensions": [".pdf", ".docx", ".txt"],
"chunk_size": 1000,
"chunk_overlap": 200
}'答复(202 Accepted):
{"status": "accepted", "message": "Folder indexing started in background"}| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
working_dir | string | yes | -- | RAG工作区目录,也用作MinIO前缀 |
recursive | boolean | 否 | true | 递归处理子目录 |
file_extensions | list\[string\] | 否 | null (所有文件) | 按扩展名筛选,例如。 [".pdf", ".docx", ".txt"] |
chunk_size | 整数 | 否 | 1000 | 每个块的最大字符数(100-10000) |
chunk_overlap | 整数 | 否 | 200 | 块之间的重叠字符(0-2000) |
经典查询
查询经典的RAG管道。支持两种模式: 向量 (默认)和 混合 (通过互易秩融合的BM25+向量)。
矢量模式(默认)
LLM生成查询变体,对每个变体运行向量相似性搜索,对结果进行重复数据消除,然后用LLM判断对其进行评分和过滤。
curl -X POST http://localhost:8000/api/v1/classical/query \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"query": "What are the main findings of the report?",
"top_k": 10,
"num_variations": 3,
"relevance_threshold": 5.0,
"mode": "vector"
}'混合模式
并行运行BM25全文搜索和多查询向量搜索,使用交互排名融合(RRF)合并结果,然后用LLM判断进行评分。块包括 bm25_score, vector_score,以及 combined_score 领域。
curl -X POST http://localhost:8000/api/v1/classical/query \
-H "Content-Type: application/json" \
-d '{
"working_dir": "project-alpha",
"query": "What are the main findings of the report?",
"mode": "hybrid"
}'答复(200 OK):
{
"status": "success",
"message": "",
"queries": [
"What are the main findings of the report?",
"What key results does the report present?",
"Summarize the primary conclusions from the report"
],
"chunks": [
{
"chunk_id": "a1b2c3d4-...",
"content": "The primary finding indicates that...",
"file_path": "project-alpha/report.pdf",
"relevance_score": 8.5,
"metadata": {"chunk_index": 0},
"bm25_score": 0.0164,
"vector_score": 0.0164,
"combined_score": 0.0328
}
],
"mode": "hybrid"
}如果BM25不可用(BM25_ENABLED=false 或者缺少pg_textsearch扩展),混合模式将回退到向量模式并记录警告。
| 字段 | 类型 | 必填 | 默认 | 描述 |
|---|---|---|---|---|
working_dir | string | yes | -- | 此项目的RAG工作区目录 |
query | string | yes | -- | 搜索查询 |
top_k | 整数 | 否 | 10 | 每个查询变量检索的最大块数(1-100) |
num_variations | 整数 | 否 | 3 | LLM生成的查询变体数量(1-10) |
relevance_threshold | float | 否 | 5.0 | 最低LLM评判分数(0-10),包括一个块 |
mode | string | 否 | "vector" | 查询方式: vector (仅矢量)或 hybrid (BM25+矢量RRF) |
LightRAG与经典RAG
| Aspect | LightRAG(基于图形) | 经典RAG |
|---|---|---|
| 存储 | Apache AGE知识图+pgvector | 仅pgvector表 |
| 索引 | 构建实体/关系图 | 仅限块+嵌入 |
| 查询模式 | naive, local, global, hybrid, hybrid+, mix, bm25, bypass | vector (多查询+LLM判断), hybrid (BM25+矢量RRF) |
| 项目隔离 | 共享图 working_dir | 单独的PG表 working_dir |
| 最适合 | 复杂推理、关系遍历 | 简单的文档问答、更简单的设置 |
______________________________________________________________________
MCP服务器
该服务公开 三台MCP服务器,全部使用流式HTTP传输:
RAGAnythingQuery-- /rag/mcp
用于搜索索引知识库的以查询为中心的工具。
工具: query_knowledge_base
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
working_dir | string | 必需 | 此项目的RAG工作区目录 |
query | string | 必填 | 搜索查询 |
mode | 字符串 | "hybrid" | 搜索模式: naive, local, global, hybrid, hybrid+, mix, bm25, bypass |
top_k | 整数 | 5 | 要检索的块数 |
工具: query_knowledge_base_multimodal
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
working_dir | string | 必需 | 此项目的RAG工作区目录 |
query | string | 必填 | 搜索查询 |
multimodal_content | list | 必填 | 多模式内容项列表 |
mode | 字符串 | "hybrid" | 搜索模式 |
top_k | 整数 | 5 | 要检索的块数 |
RAGAnythingFiles-- /files/mcp
文件浏览工具,用于列出和读取MinIO存储中的文件。
工具: list_files
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
prefix | 字符串 | "" | MinIO前缀用于筛选文件 |
recursive | 布尔值 | true | 列出子目录中的文件 |
工具: read_file
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
file_path | string | required | MinIO bucket中的文件路径(例如。 documents/report.pdf) |
从MinIO下载文件,使用Kreuzberg提取其文本内容,并返回提取的文本以及元数据和任何检测到的表。
RAGAnythings经典-- /classical/mcp
用于在没有知识图的情况下进行索引和查询的经典RAG工具。
工具: classical_index_file
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
file_name | string | 必需 | MinIO bucket中的对象路径 |
working_dir | string | 必需 | RAG工作区目录(项目隔离) |
chunk_size | 整数 | 1000 | 每个块的最大字符数(100-10000) |
chunk_overlap | 整数 | 200 | 块之间的重叠字符(0-2000) |
工具: classical_index_folder
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
working_dir | string | required | RAG工作区目录,也用作MinIO前缀 |
recursive | 布尔值 | true | 递归处理子目录 |
file_extensions | list\[字符串\] | null (所有文件) | 按扩展名筛选,例如。 [".pdf", ".docx"] |
chunk_size | 整数 | 1000 | 每个块的最大字符数(100-10000) |
chunk_overlap | 整数 | 200 | 块之间的重叠字符(0-2000) |
工具: classical_query
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
working_dir | string | 必需 | 此项目的RAG工作区目录 |
query | string | 必填 | 搜索查询 |
top_k | 整数 | 10 | 每个查询变量检索的最大块数 |
num_variations | 整数 | 3 | LLM生成的查询变体数量(1-10) |
relevance_threshold | 浮子 | 5.0 | 最低LLM评判分数(0-10),包括一个块 |
mode | 字符串 | "vector" | 查询方式: vector (仅矢量)或 hybrid (BM25+矢量RRF) |
运输
所有MCP服务器都使用 可流式传输HTTP 运输独家。将MCP客户端连接到装载路径:
http://localhost:8000/rag/mcp # RAGAnythingQuery
http://localhost:8000/files/mcp # RAGAnythingFiles
http://localhost:8000/classical/mcp # RAGAnythingClassical配置
所有配置都是通过环境变量进行的,通过Pydantic Settings加载。看 .env.example 以获取完整的参考。
应用程序(AppConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
HOST | 0.0.0.0 | 服务器绑定地址 |
PORT | 8000 | 服务器端口 |
ALLOWED_ORIGINS | ["*"] | CORS允许的来源 |
OUTPUT_DIR | system temp | 下载文件的临时目录 |
UVICORN_LOG_LEVEL | critical | Uvicorn测井水位 |
数据库(DatabaseConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
POSTGRES_USER | raganything | PostgreSQL用户 |
POSTGRES_PASSWORD | raganything | PostgreSQL密码 |
POSTGRES_DATABASE | raganything | PostgreSQL数据库名称 |
POSTGRES_HOST | localhost | PostgreSQL主机 |
POSTGRES_PORT | 5432 | PostgreSQL端口 |
LLMLLMConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
OPEN_ROUTER_API_KEY | -- | 必修的。 OpenRouter API密钥 |
OPEN_ROUTER_API_URL | https://openrouter.ai/api/v1 | OpenRouter基本URL |
BASE_URL | -- | 覆盖基本URL(优先于 OPEN_ROUTER_API_URL) |
CHAT_MODEL | openai/gpt-4o-mini | 聊天完成模型 |
EMBEDDING_MODEL | text-embedding-3-small | 嵌入模型 |
EMBEDDING_DIM | 1536 | 嵌入向量维度 |
MAX_TOKEN_SIZE | 8192 | 嵌入的最大令牌大小 |
VISION_MODEL | openai/gpt-4o | 图像处理的视觉模型 |
抹布(RAGConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
RAG_STORAGE_TYPE | postgres | 存储后端: postgres 或 local |
DOCUMENT_PARSER | kreuzberg | LightRAG管道的文档解析器: kreuzberg (通过OpenRouter的VLM OCR), mineru,或 paddleocr |
COSINE_THRESHOLD | 0.2 | 向量搜索的相似性阈值(0.0-1.0) |
MAX_CONCURRENT_FILES | 1 | 并发文件处理限制 |
MAX_WORKERS | 3 | 文件夹处理工人 |
ENABLE_IMAGE_PROCESSING | true | 在索引过程中处理图像 |
ENABLE_TABLE_PROCESSING | true | 索引期间处理表 |
ENABLE_EQUATION_PROCESSING | true | 索引过程中的过程方程 |
BM25(BM25Config)
| 变量 | 默认值 | 描述 |
|---|---|---|
BM25_ENABLED | true | 启用BM25全文搜索 |
BM25_TEXT_CONFIG | english | PostgreSQL文本搜索配置 |
BM25_RRF_K | 60 | 混合搜索的RRF常数K(必须大于等于1) |
当 BM25_ENABLED 是 false 或者pg_textsearch扩展不可用, hybrid+ 模式回退到 naive (仅矢量)和 bm25 模式返回错误。
经典RAG(ClassicalRAGConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
CLASSICAL_CHUNK_SIZE | 1000 | 每个块的最大字符数(Kreuzberg ChunkingConfig) |
CLASSICAL_CHUNK_OVERLAP | 200 | 块之间的字符重叠 |
CLASSICAL_NUM_QUERY_VARIATIONS | 3 | LLM生成的多查询变体数量(1-10) |
CLASSICAL_RELEVANCE_THRESHOLD | 5.0 | 结果中包含的块的最低LLM评判分数(0-10) |
CLASSICAL_TABLE_PREFIX | classical_rag_ | PGVectorStore表名的前缀。全名: {prefix}{sha256(working_dir)[:16]} |
CLASSICAL_LLM_TEMPERATURE | 0.0 | LLM调用温度(多查询生成+法官评分) |
CLASSICAL_RRF_K | 60 | 混合BM25+矢量搜索的RRF常数K(必须大于等于1) |
经典的RAG适配器共享相同的 OPEN_ROUTER_API_KEY, OPEN_ROUTER_API_URL/BASE_URL, CHAT_MODEL, EMBEDDING_MODEL,以及 EMBEDDING_DIM LLM配置中的设置。如果初始化失败(例如缺少API密钥),则经典端点返回 503 Service Unavailable 存在描述性错误。
MinIO(MinioConfig)
| 变量 | 默认值 | 描述 |
|---|---|---|
MINIO_HOST | localhost:9000 | MinIO端点(主机:端口) |
MINIO_ACCESS | minioadmin | MinIO访问密钥 |
MINIO_SECRET | minioadmin | MinIO密钥 |
MINIO_BUCKET | raganything | 默认存储桶名称 |
MINIO_SECURE | false | MinIO使用HTTPS |
查询模式
| 模式 | 描述 |
|---|---|
naive | 仅矢量搜索——快速,推荐默认 |
local | 使用知识图进行以实体为中心的搜索 |
global | 在知识图谱中以关系为中心的搜索 |
hybrid | 结合本地+全球战略 |
hybrid+ | 使用互易秩融合(RRF)的并行BM25+矢量搜索。两全其美 |
mix | 知识图+矢量块组合 |
bm25 | 仅限BM25全文搜索。PostgreSQL pg_textsearch |
bypass | 无需检索即可直接进行LLM查询 |
发展
uv sync # Install all dependencies (including dev)
uv run python src/main.py # Run the server locally
uv run pytest # Run tests with coverage
uv run ruff check src/ # Lint
uv run ruff format src/ # Format
uv run mypy src/ # Type checkingDocker(本地)
docker compose up -d # Start Postgres + API
docker compose logs -f raganything-api # Follow API logs
docker compose down -v # Stop and remove volumes数据库迁移
Alembic迁移在启动时通过以下方式自动运行 db_lifespan 上下文管理器 main.py。在中跟踪迁移状态 raganything_alembic_version 表,与 composable-agents Alembic表避免冲突。
初始迁移(001_add_bm25_support)创建 chunks 桌子与a tsvector 用于全文搜索的列、GIN和BM25索引以及自动更新触发器。
生产要求
PostgreSQL服务器必须具有 pg_textsearch 扩展已安装并加载。在生产中,这需要:
- Dockerfile.db 构建一个自定义的PostgreSQL镜像,用于编译
pg_textsearch来源(连同pgvector和Apache AGE).
- docker-compose.yml 必须配置
shared_preload_libraries=pg_textsearch为了bricks-db服务。本地开发人员docker-compose.yml默认情况下,此存储库中包含此内容。
- Alembic移民
001_add_bm25_support将失败,如果pg_textsearch不可用。确保数据库映像是从以下内容构建的Dockerfile.db并且共享库被预加载。
项目结构
src/
main.py -- FastAPI app, triple MCP mounts, entry point
config.py -- Pydantic Settings config classes
dependencies.py -- Dependency injection wiring
domain/
entities/
indexing_result.py -- FileIndexingResult, FolderIndexingResult
ports/
rag_engine.py -- RAGEnginePort (abstract)
storage_port.py -- StoragePort (abstract) + FileInfo
bm25_engine.py -- BM25EnginePort (abstract)
document_reader_port.py -- DocumentReaderPort (abstract) + DocumentContent
vector_store_port.py -- VectorStorePort (abstract) + SearchResult
llm_port.py -- LLMPort (abstract)
application/
api/
health_routes.py -- GET /health
indexing_routes.py -- POST /file/index, /folder/index
query_routes.py -- POST /query
file_routes.py -- GET /files/list, GET /files/folders, POST /files/read
classical_indexing_routes.py -- POST /classical/file/index, /classical/folder/index
classical_query_routes.py -- POST /classical/query
mcp_query_tools.py -- MCP tools: query_knowledge_base, query_knowledge_base_multimodal
mcp_file_tools.py -- MCP tools: list_files, read_file
mcp_classical_tools.py -- MCP tools: classical_index_file, classical_index_folder, classical_query
requests/
indexing_request.py -- IndexFileRequest, IndexFolderRequest
classical_indexing_request.py -- ClassicalIndexFileRequest, ClassicalIndexFolderRequest
classical_query_request.py -- ClassicalQueryRequest
query_request.py -- QueryRequest, MultimodalQueryRequest
file_request.py -- ListFilesRequest, ReadFileRequest
responses/
query_response.py -- QueryResponse, QueryDataResponse
classical_query_response.py -- ClassicalQueryResponse, ClassicalChunkResponse
file_response.py -- FileInfoResponse, FileContentResponse
use_cases/
index_file_use_case.py -- Downloads from MinIO, indexes single file (LightRAG)
index_folder_use_case.py -- Downloads from MinIO, indexes folder (LightRAG)
query_use_case.py -- Query with bm25/hybrid+ support
classical_index_file_use_case.py -- Classical: download → Kreuzberg chunk → PGVector
classical_index_folder_use_case.py -- Classical: folder batch index
classical_query_use_case.py -- Classical: multi-query + LLM judge + hybrid BM25
_classical_helpers.py -- validate_path, build_documents_from_extraction
list_files_use_case.py -- Lists files with metadata from MinIO
list_folders_use_case.py -- Lists folder prefixes from MinIO
read_file_use_case.py -- Reads file from MinIO, extracts content via Kreuzberg
upload_file_use_case.py -- Uploads file to MinIO storage
infrastructure/
rag/
lightrag_adapter.py -- LightRAGAdapter (RAGAnything/LightRAG)
kreuzberg_raganything_parser.py -- KreuzbergRAGAnythingParser (kreuzberg, custom parser for RAGAnything)
storage/
minio_adapter.py -- MinioAdapter (minio-py client)
document_reader/
kreuzberg_adapter.py -- KreuzbergAdapter (kreuzberg, 91 formats)
bm25/
pg_textsearch_adapter.py -- PostgresBM25Adapter (pg_textsearch, LightRAG tables)
classical_bm25_adapter.py -- ClassicalBM25Adapter (pg_textsearch, classical_rag_* tables)
hybrid/
rrf_combiner.py -- RRFCombiner (Reciprocal Rank Fusion)
vector_store/
langchain_pgvector_adapter.py -- LangchainPgvectorAdapter (langchain-postgres PGVectorStore)
llm/
langchain_openai_adapter.py -- LangchainOpenAIAdapter (langchain-openai ChatOpenAI)
alembic/
env.py -- Alembic migration environment (async)
versions/
001_add_bm25_support.py -- BM25 table, indexes, triggers许可证
麻省理工学院
