Modular RAG MCP Server
Enables GitHub Copilot in VS Code to interact with the knowledge base through MCP tools, allowing it to search documents and retrieve summaries.
Supports Ollama as a provider for LLM and embedding models, enabling local inference and customizable model choices within the RAG pipeline.
Supports OpenAI as a provider for LLM and embedding models (e.g., GPT-4, text-embedding-3-small) for generating responses and embeddings in the RAG system.
Provides a Streamlit-based dashboard for managing the RAG system, including data ingestion, query testing, trace visualization, and evaluation panels.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Modular RAG MCP ServerQuery the knowledge hub for RAG architecture overview."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BYE-RAG
企业级 RAG 系统 + MCP 协议集成 | Production-Ready
基于 混合检索(Dense + Sparse) + RRF 融合 + MCP 协议 + 完整评估体系的生产级 RAG 解决方案。
✨ 核心亮点
🔍 混合检索: Dense (语义) + Sparse (BM25) + RRF 融合
🛠️ MCP 集成: 6 个工具函数,原生支持 Claude Desktop
📊 可视化面板: Streamlit Dashboard,6 个管理页面
🎯 评估系统: Ragas 集成,Golden Test Set,回归测试
🔄 链路追踪: Ingestion + Query 全流程可观测
🔌 可插拔架构: 支持多种 LLM、Embedding、向量库
Related MCP server: Modular RAG MCP Server
📋 目录
🚀 快速开始
1. 克隆项目
git clone https://github.com/your-org/BYE-RAG.git
cd BYE-RAG2. 安装依赖
# 创建虚拟环境(推荐)
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows
# 安装基础依赖
pip install -r requirements.txt3. 配置 API Key
编辑 config/settings.yaml:
llm:
provider: dashscope
api_key: YOUR_DASHSCOPE_API_KEY # 替换为你的 API Key
model: qwen-max
embedding:
provider: dashscope
api_key: YOUR_DASHSCOPE_API_KEY # 替换为你的 API Key
model: text-embedding-v3
milvus:
uri: ./data/db/milvus.db # 本地文件模式,无需额外安装
collection_name: rag_collection4. 启动 Dashboard(推荐)
python scripts/run_dashboard.py访问 http://localhost:8501,开始使用可视化界面:
📥 上传和摄取文档
🔍 实时查询测试
📊 查看追踪数据
📝 运行评估
5. 或使用命令行
摄取文档
# 摄取单个文件
python scripts/ingest.py data/documents/report.pdf
# 摄取整个目录
python scripts/ingest.py data/documents/查询
# 基础查询
python scripts/query.py "什么是机器学习?"
# 混合检索 + 重排序
python scripts/query.py "ML 是什么?" --rerank --top-k 10📦 依赖说明
必需依赖
依赖 | 版本 | 用途 |
Python | ≥3.10 | 运行环境 |
pymilvus | ≥2.3.0 | 向量数据库客户端 |
dashscope | latest | 通义千问 API |
langchain | ≥0.1.0 | 文本分块和工具 |
streamlit | ≥1.30.0 | Dashboard 框架 |
pandas | latest | 数据处理 |
可选依赖
依赖 | 用途 | 安装命令 |
ragas | RAG 评估系统 |
|
plotly | Dashboard 图表 |
|
rank_bm25 | BM25 稀疏编码 | 已包含在 requirements.txt |
文档加载器依赖
依赖 | 支持格式 | 安装命令 |
PyMuPDF | 已包含 | |
python-magic | 文件类型检测 | 已包含 |
安装所有依赖
# 基础 + 可选
pip install -r requirements.txt
pip install ragas plotly
# 仅安装必需依赖
pip install pymilvus dashscope langchain streamlit pandas PyMuPDF rank_bm25⚙️ 配置指南
完整配置示例
config/settings.yaml:
# LLM 配置
llm:
provider: dashscope # dashscope / openai / azure / ollama
api_key: YOUR_API_KEY
model: qwen-max
temperature: 0.7
max_tokens: 2000
# Embedding 配置
embedding:
provider: dashscope
api_key: YOUR_API_KEY
model: text-embedding-v3
dimension: 2048 # 向量维度
# Milvus 向量库配置
milvus:
# 本地文件模式(推荐用于开发)
uri: ./data/db/milvus.db
# 或远程服务器模式
# uri: http://localhost:19530
# token: YOUR_TOKEN # 可选
collection_name: rag_collection
metric_type: COSINE # COSINE / L2 / IP
# BM25 稀疏编码配置
sparse_encoder:
encoder_type: bm25
k1: 1.5
b: 0.75
# 混合检索配置
hybrid_search:
rrf_k: 60 # RRF 融合参数
alpha: 0.5 # Dense vs Sparse 权重
# 重排序配置
reranker:
enabled: true
model: cross-encoder/ms-marco-MiniLM-L-6-v2
top_n: 5
# 评估配置
evaluation:
ragas_enabled: true
threshold: 0.05 # 回归测试阈值(5%)环境变量配置
也可以通过环境变量配置(优先级高于 YAML):
# LLM
export LLM_PROVIDER=dashscope
export LLM_API_KEY=your_key
export LLM_MODEL=qwen-max
# Embedding
export EMBEDDING_PROVIDER=dashscope
export EMBEDDING_API_KEY=your_key
export EMBEDDING_MODEL=text-embedding-v3
# Milvus
export MILVUS_URI=./data/db/milvus.db
export MILVUS_COLLECTION=rag_collection多提供商支持
使用 OpenAI
llm:
provider: openai
api_key: YOUR_OPENAI_API_KEY
model: gpt-4
embedding:
provider: openai
api_key: YOUR_OPENAI_API_KEY
model: text-embedding-3-large使用 Ollama(本地)
llm:
provider: ollama
base_url: http://localhost:11434
model: llama2
embedding:
provider: ollama
base_url: http://localhost:11434
model: nomic-embed-text📖 使用方法
Dashboard 使用(推荐)
1. 系统总览
查看系统状态
快速统计信息
配置概览
2. 数据浏览器
浏览已摄取的文档
查看数据块内容
快速搜索
3. Ingestion 管理
上传文档(支持 PDF, MD, TXT)
批量摄取
查看摄取进度
配置 Transform 选项
4. Query 追踪
输入查询测试
查看检索结果
分析性能指标
实时追踪数据
5. Ingestion 追踪
查看摄取历史
分析耗时趋势
步骤详情
6. 评估面板
加载 Golden Test Set
运行 Ragas 评估
查看评估历史
回归测试
命令行使用
数据摄取
# 基础摄取
python scripts/ingest.py document.pdf
# 带选项
python scripts/ingest.py documents/ \
--batch-size 50 \
--enable-transform \
--enable-trace
# 查看帮助
python scripts/ingest.py --help查询
# 基础查询
python scripts/query.py "查询文本"
# 混合检索
python scripts/query.py "查询文本" \
--top-k 10 \
--rerank \
--enable-trace
# 查看帮助
python scripts/query.py --helpMCP Server
# 启动 MCP Server
python scripts/run_mcp_server.py
# 配置到 Claude Desktop
# 编辑 claude_desktop_config.json:
{
"mcpServers": {
"rag-system": {
"command": "python",
"args": ["D:\\path\\to\\scripts\\run_mcp_server.py"],
"cwd": "D:\\path\\to\\RAG-MCP-SERVER"
}
}
}Python API 使用
数据摄取
from src.libs.loader import ComponentLoader
from src.ingestion.pipeline import IngestionPipeline
from src.config.settings import Settings
# 初始化
config = Settings()
loader = ComponentLoader(config)
llm = loader.get_llm()
embedding = loader.get_embedding()
vector_store = loader.get_vector_store()
# 创建 Pipeline
pipeline = IngestionPipeline(
llm=llm,
embedding=embedding,
vector_store=vector_store,
enable_transform=True,
enable_trace=True
)
# 摄取文档
result = pipeline.process_file("document.pdf")
print(f"摄取完成: {result['chunks_count']} 个数据块")混合检索
from src.retrieval.hybrid_search import HybridSearch
from src.retrieval.query_processor import QueryProcessor
# 初始化
processor = QueryProcessor(llm, embedding, sparse_encoder)
hybrid_search = HybridSearch(
dense_retriever=dense_retriever,
sparse_retriever=sparse_retriever,
enable_trace=True
)
# 处理查询
query_result = processor.process("机器学习的应用")
# 混合检索
results = hybrid_search.search(
dense_vector=query_result["dense_vector"],
sparse_vector=query_result["sparse_vector"],
top_k=10,
rrf_k=60
)
# 结果
for doc in results:
print(f"分数: {doc['score']:.3f}")
print(f"内容: {doc['text'][:100]}...")评估
from src.evaluation import EvalRunner, CompositeEvaluator, RagasEvaluator
# 初始化
ragas_eval = RagasEvaluator(llm=llm, embedding=embedding)
composite = CompositeEvaluator(ragas_evaluator=ragas_eval)
runner = EvalRunner(composite_evaluator=composite)
# 加载测试集
runner.load_test_set("data/test/golden_test_set.json")
# 运行评估
results = runner.run_evaluation(
include_retrieval=True,
include_generation=True
)
# 查看结果
summary = results["summary"]
print(f"检索 F1: {summary['retrieval']['avg_f1']:.3f}")
print(f"生成 Faithfulness: {summary['generation']['avg_faithfulness']:.3f}")📊 系统架构
┌─────────────────────────────────────────┐
│ Claude Desktop (MCP Client) │
└─────────────────┬───────────────────────┘
│ MCP Protocol
┌───────▼────────┐
│ MCP Server │ 6 个工具函数
│ (Tools API) │
└───────┬────────┘
│
┌─────────────┴──────────────┐
│ │
┌───▼────────┐ ┌────────▼────┐
│ Ingestion │ │ Retrieval │
│ Pipeline │ │ Pipeline │
│ │ │ │
│ Load │ │ Query │
│ Split │ │ Dense │
│ Transform │ │ Sparse │
│ Encode │ │ RRF Fusion │
│ Upsert │ │ Rerank │
└────┬───────┘ └─────┬───────┘
│ │
│ ┌──────────────┐ │
└────► TraceContext ◄────┘
│ (链路追踪) │
└──────┬───────┘
│
┌───────────▼────────────┐
│ Milvus Vector Store │
│ Dense + Sparse Index │
└────────────────────────┘🔥 核心特性
1. 混合检索 (Hybrid Search)
为什么需要混合检索?
Dense 检索擅长理解语义,但对关键词不敏感
Sparse 检索擅长精确匹配,但不理解语义
混合检索结合两者优势,提供更好的检索效果
工作原理:
用户查询
↓
QueryProcessor (查询改写)
↓
┌────────────┬────────────┐
│ Dense │ Sparse │
│ Retriever │ Retriever │
│ (Embedding)│ (BM25) │
└─────┬──────┴──────┬─────┘
│ │
└──────┬──────┘
↓
RRF Fusion (融合)
↓
Reranker (重排序)
↓
最终结果2. MCP Server
6 个工具函数:
工具 | 功能 | 参数 |
| 摄取文档 | file_path, enable_transform |
| 混合检索查询 | query_text, top_k, enable_rerank |
| 列出文档 | - |
| 知识库查询 | collection_name, query |
| 向量库统计 | - |
| 文档摘要 | doc_id |
Claude Desktop 集成:
配置
claude_desktop_config.json重启 Claude Desktop
在对话中直接调用工具
示例:
用户: 请帮我摄取 report.pdf 文档
Claude: [自动调用 ingest_document 工具]
用户: 查询"机器学习的应用"
Claude: [自动调用 query 工具并返回结果]3. Transform 层
可选的数据增强处理:
Transform | 功能 | 何时使用 |
ChunkRefiner | 优化分块边界 | 提升分块质量 |
MetadataEnricher | 丰富元数据 | 需要更多上下文 |
ImageCaptioner | 图片描述生成 | 处理包含图片的文档 |
启用方式:
pipeline = IngestionPipeline(
llm=llm,
embedding=embedding,
vector_store=vector_store,
enable_transform=True # 启用 Transform
)4. 链路追踪
自动追踪:
每个操作步骤
耗时统计(ms)
错误信息
中间结果
查看追踪:
from src.trace.trace_context import get_trace_recorder
recorder = get_trace_recorder()
# 获取所有追踪
traces = recorder.get_traces()
# 按类型过滤
query_traces = recorder.get_traces(trace_type="query")
ingestion_traces = recorder.get_traces(trace_type="ingestion")
# 查看详情
for trace in query_traces:
print(f"查询: {trace['query']}")
print(f"耗时: {trace['duration_ms']} ms")
print(f"步骤: {len(trace['steps'])}")5. 评估系统
Ragas 评估指标:
Faithfulness: 答案忠实于上下文
Answer Relevancy: 答案与问题相关性
Context Precision: 上下文精确度
Context Recall: 上下文召回率
Golden Test Set:
预定义的测试查询集合
用于回归测试
跟踪性能变化
使用示例:
# 创建测试集模板
runner.create_test_set_template("data/test/template.json")
# 加载测试集
runner.load_test_set("data/test/golden_test_set.json")
# 运行评估
results = runner.run_evaluation()
# 保存结果
runner.save_results("data/eval_results/eval_20260703.json")🧪 测试指南
运行测试
# 所有单元测试
pytest tests/unit/ -v
# 特定模块
pytest tests/unit/evaluation/ -v
pytest tests/unit/retrieval/ -v
# E2E 测试
python tests/e2e/test_mcp_client.py
python tests/e2e/test_dashboard.py
python tests/e2e/test_e2e_acceptance.py
# 测试覆盖率
pytest --cov=src tests/unit/验证脚本
# 完整功能验证
python scripts/test_all.py
# 接口一致性检查
python scripts/check_interface_consistency.py❓ 常见问题
Q1: 如何切换到 OpenAI?
编辑 config/settings.yaml:
llm:
provider: openai
api_key: YOUR_OPENAI_KEY
model: gpt-4
embedding:
provider: openai
api_key: YOUR_OPENAI_KEY
model: text-embedding-3-largeQ2: 本地运行需要什么?
必需:
Python 3.10+
2GB 磁盘空间(向量数据库)
4GB RAM
可选:
GPU(加速 Embedding,非必需)
Q3: 如何使用远程 Milvus?
milvus:
uri: http://your-milvus-server:19530
token: YOUR_TOKEN # 如果需要
collection_name: rag_collectionQ4: Dashboard 启动失败?
检查:
是否安装 streamlit:
pip install streamlit端口是否被占用:
lsof -i :8501查看错误日志
Q5: API Key 配置不生效?
检查优先级:
环境变量(最高)
config/settings.yaml
默认值
确保环境变量名称正确:
export LLM_API_KEY=your_key
export EMBEDDING_API_KEY=your_keyQ6: 如何清理数据?
# 清理向量数据库
rm -rf data/db/
# 清理追踪数据
# 在 Dashboard 系统设置页面点击"清理追踪数据"Q7: 性能优化建议?
摄取优化:
增大 batch_size:
--batch-size 100禁用 Transform(如不需要):
enable_transform=False
查询优化:
减少 top_k:
--top-k 5禁用重排序(如不需要): 不使用
--rerank
Q8: 如何添加自定义 LLM?
# src/libs/llm/your_provider.py
from .base import BaseLLM
class YourLLM(BaseLLM):
def generate(self, prompt: str, **kwargs) -> str:
# 实现生成逻辑
pass然后在 ComponentLoader 中注册。
🛠️ 开发指南
项目结构
RAG-MCP-SERVER/
├── src/
│ ├── config/ # 配置管理
│ ├── libs/ # 可插拔组件
│ ├── ingestion/ # 数据摄取
│ ├── retrieval/ # 检索系统
│ ├── mcp_server/ # MCP Server
│ ├── trace/ # 链路追踪
│ ├── dashboard/ # Dashboard
│ └── evaluation/ # 评估系统
├── scripts/ # 脚本
├── tests/ # 测试
├── config/ # 配置文件
├── data/ # 数据目录
└── README.md添加新的 LLM 提供商
# src/libs/llm/your_provider.py
from .base import BaseLLM
class YourLLM(BaseLLM):
def __init__(self, config):
self.api_key = config.get("your_provider.api_key")
self.model = config.get("your_provider.model")
def generate(self, prompt: str, **kwargs) -> str:
# 实现生成逻辑
response = your_api_call(prompt, **kwargs)
return response.text添加新的向量库
# src/libs/vector_store/your_store.py
from .base import BaseVectorStore
class YourVectorStore(BaseVectorStore):
def upsert(self, ids, texts, vectors, metadatas):
# 实现上传逻辑
pass
def search(self, vector, top_k, filters=None):
# 实现检索逻辑
pass代码风格
遵循 PEP 8
类名:PascalCase
函数名:snake_case
使用类型注解
添加 docstring
📄 许可证
MIT License
🤝 贡献
欢迎 PR 和 Issue!
贡献指南
Fork 项目
创建特性分支 (
git checkout -b feature/AmazingFeature)提交更改 (
git commit -m 'Add some AmazingFeature')推送到分支 (
git push origin feature/AmazingFeature)开启 Pull Request
📧 联系
项目问题请提交 GitHub Issue
技术讨论欢迎在 Discussions 中交流
🙏 致谢
感谢以下开源项目:
⭐ 如果这个项目对你有帮助,请给个 Star!
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Bye-666/BYE-RAG'
If you have feedback or need assistance with the MCP directory API, please join our Discord server