使用说明
LlamaIndex RAG MCP服务器
具有OpenAI/Gemini嵌入、混合搜索(语义+BM25)、Cohere-reranking、HyDE查询增强和MCP服务器集成的本地RAG系统。
特性
- 增量更新:仅根据mtime/大小跟踪处理新/修改的文件
- 混合搜索:基于RRF融合的语义(向量)+关键字(BM25)检索
- 自适应模式选择:自动检测类似代码的查询并切换到混合搜索
- HyDE查询增强:假设性文档嵌入,以更好地进行概念匹配
- 两阶段检索:灵活的top_k(1-50)+可选的Cohere v3.5重新评级
- 智能项目路由:多项目隔离,自动查询路由到最佳项目
- 多个嵌入提供程序:OpenAI或谷歌双子座
- 模型:OpenAI
text-embedding-3-large或双子座text-embedding-004+科恩rerank-v3.5 - MCP集成:适用于标准MCP客户端(Claude Desktop、Chatwise、Cherry Studio等)
- 35+文件格式:通过LlamaIndex阅读器读取代码(16个文本)、文档(16个字符)、图像(3个字符)
- 本地存储:每个项目ChromaDB矢量数据库
storage/{project}/ - 可选Vue.js用户界面:MCP实时监控
/运行api_server.py时 - 线程安全:所有管理器都使用带锁的单例模式;元数据的跨平台文件锁定
安装
git clone https://github.com/hrayleung/ly_rag_mcp.git
cd ly_rag_mcp
conda create -n deep-learning python=3.10
conda activate deep-learning
# Core dependencies
pip install llama-index llama-index-embeddings-openai llama-index-vector-stores-chroma
pip install llama-index-postprocessor-cohere-rerank chromadb fastmcp
# Gemini support (optional)
pip install google-genai
# New features (Hybrid Search & Web Crawling)
pip install rank-bm25 llama-index-retrievers-bm25 firecrawl-py
快速开始
1.设置API密钥
选项A:OpenAI嵌入(默认)
export EMBEDDING_PROVIDER=openai
export EMBEDDING_MODEL=text-embedding-3-large
export OPENAI_API_KEY='your-openai-api-key'
export COHERE_API_KEY='your-cohere-api-key' # Optional: For Reranking
export FIRECRAWL_API_KEY='your-firecrawl-key' # Optional: For Web Crawling
选项B:双子座嵌入
export EMBEDDING_PROVIDER=gemini
export EMBEDDING_MODEL=text-embedding-004
export GEMINI_API_KEY='your-gemini-api-key'
export COHERE_API_KEY='your-cohere-api-key' # Optional: For Reranking
export FIRECRAWL_API_KEY='your-firecrawl-key' # Optional: For Web Crawling
2.索引文件
# Incremental update (default - only processes new/modified files)
python build_index.py /path/to/your/documents
# Force full rebuild
python build_index.py /path/to/your/documents --rebuild
3.配置MCP客户端
添加到MCP客户端配置中:
选项A:OpenAI嵌入
{
"mcpServers": {
"llamaindex-rag": {
"command": "/path/to/conda/envs/deep-learning/bin/python",
"args": ["/path/to/ly_rag_mcp/mcp_server.py"],
"cwd": "/path/to/ly_rag_mcp",
"env": {
"EMBEDDING_PROVIDER": "openai",
"EMBEDDING_MODEL": "text-embedding-3-large",
"OPENAI_API_KEY": "your-openai-key",
"COHERE_API_KEY": "your-cohere-key",
"FIRECRAWL_API_KEY": "your-firecrawl-key"
}
}
}
}
选项B:双子座嵌入
{
"mcpServers": {
"llamaindex-rag": {
"command": "/path/to/conda/envs/deep-learning/bin/python",
"args": ["/path/to/ly_rag_mcp/mcp_server.py"],
"cwd": "/path/to/ly_rag_mcp",
"env": {
"EMBEDDING_PROVIDER": "gemini",
"EMBEDDING_MODEL": "text-embedding-004",
"GEMINI_API_KEY": "your-gemini-key",
"COHERE_API_KEY": "your-cohere-key",
"FIRECRAWL_API_KEY": "your-firecrawl-key"
}
}
}
}
配置位置:
- 克劳德代码:
~/Library/Application Support/Claude/claude_desktop_config.json - Chatwise/樱桃工作室:应用程序设置
4.查询
重新启动MCP客户端并提问:
What are these documents about?
Use query_rag to search for "parallel computing"
Show me the index statistics
支持的文件格式
| 类别 | 格式 |
|---|---|
| 代码(16个扩展名) | .py, .js, .ts, .jsx, .tsx, .java, .cpp, .c, .go, .rs, .sh, .sql, .yaml, .toml, .vue, .html, .css |
| 文件(16个扩展名) | .txt, .pdf, .docx, .md, .json, .xml, .csv, .ipynb, .epub, .doc, .ppt, .pptx, .pptm, .xls, .xlsx, .rtf |
| 图片(3个扩展名) | .jpg, .jpeg, .png |
文件大小限制:每个文件100MB
默认情况下排除: node_modules, __pycache__, .git、venv、构建输出和IDE文件。
MCP工具
查询工具
query_rag(question, top_k=6, search_mode='semantic', use_rerank=True, use_hyde=False, return_metadata=False, project=None)search_mode:“语义”(向量)、“混合”(BM25+带RRF的向量)或“关键字”(仅BM25)。自动检测混合动力的代码模式。use_hyde:启用假设文档嵌入-生成合成答案,以便更好地检索概念查询top_k:结果数量(1-50)return_metadata:当为True时,返回带源、分数、元数据的结构化JSON;否则返回格式化文本project:显式项目名称,或通过智能路由自动路由
摄入工具
index_documents(path, project=None)-从目录中索引文档(支持所有格式)add_text(text, metadata=None, project=None)-将原始文本添加到索引inspect_directory(path)-在索引之前分析文件夹内容(显示文件类型、计数)crawl_website(url, max_pages=10, project=None)-通过Firecrawl抓取网站
项目确认: 摄入工具需要 project 争论。如果省略,则返回 {"action_required": "select_project", ...} 并提出建议。
管理工具
manage_project(action, project=None, keywords=None, description=None)- 行动:
list,create,switch,update,analyze,choose
- 行动:
get_stats(stat_type='index')-系统统计list_documents(project=None, limit=100)-列出索引文档clear_index(project=None, confirm=False)-破坏性:明确项目指标
HTTP API服务器(可选)
跑 python api_server.py 对于遥测端点和Vue UI:
GET /api/mcp/tools-工具元数据(名称、类型、描述)GET /api/mcp/requests-最近的请求示例(状态、路由、延迟、工具、用户)GET /api/mcp/logs-服务器日志环缓冲区GET /api/mcp/stats-系统指标(正常运行时间、RPM、错误、索引统计数据)GET /api/mcp/health-正常运行时间状态的健康检查GET /-Vue UI前端(使用npm run build在frontend/)
看 README_UI.md 查看详细的前端文档。
调试
python debug_rag.py-全面的诊断(环境、存储、索引质量、性能)python verify_setup.py-快速设置验证- 集
RAG_LOG_LEVEL=DEBUG查看详细日志
建筑
回收管道
Query → Search Mode Detection (Adaptive)
↓
(Optional) HyDE Query Augmentation (if weak results)
↓
Parallel: Vector Search + BM25 Keyword Search
↓
RRF (Reciprocal Rank Fusion) Merge
↓
(Optional) Cohere Reranking
↓
Results (top_k)
数据摄取管道
Documents → DocumentLoader (20+ formats)
↓
DocumentProcessor (UTF-8 sanitize + context injection)
↓
DocumentChunker (AST for code, sentence for docs)
↓
IndexManager → LlamaIndex Storage
↓
Persist: ChromaDB + JSON manifests
多项目隔离
storage/
└── {project_name}/
├── chroma_db/ # ChromaDB vector collection
├── project_metadata.json # Project config, keywords
├── ingest_manifest.json # File change tracking
├── indexed_files.json # mtime/size tracking
├── docstore.json # LlamaIndex document store
├── index_store.json # LlamaIndex index metadata
└── graph_store.json # LlamaIndex graph store
搜索策略
自适应模式选择
当查询包含以下内容时,自动切换到混合搜索:
- 3位以上数字令牌(例如“HTTP_200”)
- 大写模式:
[A-Z_]{2,} - 代码字符:
{}();=<>*/+- - 路径式令牌:
/,\ - 带有3+个尾随字符的令牌中的点(例如。,
module.function) -
30%大写或>40%数字
HyDE(假想文档嵌入)
- 触发:结果≤1或最高分数≤0.1或所有分数<0.2
- 过程:使用OpenAI GPT-3.5生成合成答案,将其嵌入,并使用该嵌入进行搜索
- 超时:30秒
- 重试:2,指数回退(0.5秒→ 1s)
可选Vue.js用户界面
- 美学:使用Inter和JetBrains Mono字体的最小深色工业风格。
- 机制:自动投票
api_server.py每3秒使用Promise.all用于并行数据提取。 - 特性:实时请求监控、延迟跟踪、终端式日志查看器。
- 跑:
python api_server.py并参观http://localhost:8000.
重新排名(Cohere v3.5)
- 检索:2x
top_k候选人(最少10人) - 跳绳:当分数增量>0.05或结果太少(<3)时
- 利益:特定领域查询的准确率提高了15-40%
项目管理
独立工作区
manage_project(action="create", project="backend")manage_project(action="switch", project="backend")- 使用索引后端文件
index_documents(path, project="backend") - 切换到“前端”以保持上下文干净
- 自动布线:提及项目名称的查询会自动路由到该工作区
项目元数据和智能路由
- 呼叫
list_projects()查看每个工作区的详细信息(显示名称、关键字、默认路径、上次索引的时间戳) - 在为新仓库建立索引之前,请运行
inspect_directory(<path>)对于文件分析,然后创建/更新项目 - 使用
manage_project(action="update", project="frontend", keywords=["nextjs","api"], description="Customer portal")添加提示 - 对于路由决策:
manage_project(action="choose", question="<user request>")显示得分的候选人 - 摄入工具自动更新
default_paths并维护last_indexed_at时间戳
关键词学习
成功的查询会通过以下方式自动更新项目关键字 MetadataManager.learn_from_query()随着时间的推移,随着系统学习查询项目关联,路由会得到改善。
重新排名策略
多轮搜索(推荐)
不要在单个查询中请求多个结果,而是使用迭代细化:
示例1:开始专注,必要时扩展
1. Use iterative_search("Python async patterns", initial_top_k=3)
2. Review the 3 most relevant results
3. If more context needed: query_rag("Python async patterns", similarity_top_k=10)
4. Or refine: query_rag("asyncio event loop internals", similarity_top_k=5)
示例2:渐进式深化
1. query_rag("machine learning", similarity_top_k=5) - understand scope
2. query_rag("neural network backpropagation", similarity_top_k=5) - focus on specific topic
3. query_rag("gradient descent optimization", similarity_top_k=3) - deep dive
好处:
- 更高的准确性:专注于最相关的结果
- 令牌效率:只检索您需要的东西
- 课程修正:根据实际发现进行改进
- 更少的噪音:避免用相关性较弱的文档稀释上下文
两阶段检索
- 向量搜索:检索2名候选人(例如,前10名中有20名候选人,最低10名)
- 重新排序:Cohere v3.5按语义相关性重新排序
动态调整基于 top_k:
top_k=3→ 检索10→ 再银行→ 返回3top_k=10→ 检索20→ 再银行→ 返回10top_k=15→ 检索30→ 再银行→ 返回15
启用:添加 COHERE_API_KEY 环境
禁用:设置 use_rerank=False 在查询中
测试
该项目使用pytest,目标覆盖率≥70%。
运行测试
# Full suite with coverage
pytest tests/ --cov=rag --cov-report=term -v
# Single file
pytest tests/test_query_tools.py --cov-report=term -v
# Single test
pytest tests/test_query_tools.py::test_specific_function --cov-report=term -v
测试文件
| 测试文件 | 已测试模块 | 注释 |
|---|---|---|
test_query_tools.py |
rag.tools.query |
查询工具集成测试 |
test_query_tools_small.py |
rag.tools.query |
快速单元测试(模拟) |
test_ingest_tools.py |
rag.tools.ingest |
摄入整合测试 |
test_ingest_tools_small.py |
rag.tools.ingest |
快速单元测试(模拟) |
test_admin_tools_small.py |
rag.tools.admin |
管理工具单元测试 |
test_index_manager.py |
rag.storage.index |
指数管理器测试 |
test_index_manager_small.py |
rag.storage.index |
快速单元测试(模拟) |
test_metadata.py |
rag.project.metadata |
元数据测试 |
test_metadata_small.py |
rag.project.metadata |
快速单元测试(模拟) |
test_hyde.py |
rag.retrieval.hyde |
HyDE测试 |
test_hyde_timeout.py |
rag.retrieval.hyde |
HyDE超时测试 |
test_bm25_cache_invalidation.py |
rag.retrieval.bm25 |
BM25缓存测试 |
test_search_validation.py |
rag.retrieval.search |
搜索验证测试 |
test_reranker_decision.py |
rag.retrieval.reranker |
重新排序决策逻辑 |
test_project_manager_choose_project.py |
rag.project.manager |
项目路由测试 |
test_project_discovery_validation.py |
rag.project.manager |
项目发现测试 |
test_index_validation.py |
rag.storage.index |
指数验证测试 |
test_api_server.py |
api_server |
API终点测试 |
总计: 18个测试文件
测试模式
- 集成测试 (
test_*.py):使用模拟/补丁进行完整模块测试 - 快速单元测试 (
test_*_small.py):CI速度的轻量级模拟测试 - 模仿策略:
DummyMCP/FakeMCP班级,SimpleNamespace嘲笑,unittest.mock.patch - 螺纹安全测试:用于并发操作的多线程测试
- 向后兼容性测试:加载旧JSON格式,缺少字段
配置
嵌入模型
通过MCP配置中的环境变量设置:
OpenAI模型:
"env": {
"EMBEDDING_PROVIDER": "openai",
"EMBEDDING_MODEL": "text-embedding-3-large" // or "text-embedding-3-small"
}
Gemini型号:
"env": {
"EMBEDDING_PROVIDER": "gemini",
"EMBEDDING_MODEL": "text-embedding-004" // or "embedding-001"
}
注: 使用一个嵌入模型创建的索引与另一个不兼容。如果切换模型,请使用以下命令重建索引 --rebuild.
重新排列模型
集 COHERE_API_KEY 环境变量。默认型号: rerank-v3.5 (用于 rag/retrieval/reranker.py).
配置参数(RAG设置)
| 类别 | 参数 | 默认值 | 说明 |
|---|---|---|---|
| 组块 | chunk_size |
1024 |
文本块大小 |
chunk_overlap |
200 |
块之间的重叠 | |
code_chunk_lines |
40 |
每个代码块的行数 | |
code_chunk_overlap |
15 |
代码的重叠行 | |
code_max_chars |
1500 |
每个代码块的最大字符数 | |
| 检索 | min_top_k |
1 |
最低结果 |
max_top_k |
50 |
最大结果 | |
default_top_k |
6 |
默认结果 | |
rerank_candidate_multiplier |
2 |
重新排名候选人的倍数 | |
min_rerank_candidates |
10 |
重新排名的最低候选人 | |
| 阈值 | low_score_threshold |
0.2 |
低相关性阈值 |
rerank_delta_threshold |
0.05 |
最低分数增量 | |
rerank_min_results |
3 |
重新排名的最小结果 | |
hyde_trigger_min_results |
1 |
如果结果较少,则触发HyDE | |
hyde_trigger_score |
0.1 |
如果最高分数低于此值,则触发HyDE | |
hyde_timeout |
30.0 |
HyDE查询生成超时(秒) | |
hyde_max_retries |
2 |
最大HyDE重试次数 | |
hyde_initial_backoff |
0.5 |
HyDE重试的初始回退 | |
| API服务器 | request_buffer_size |
200 |
最近的请求缓冲区 |
log_buffer_size |
400 |
日志缓冲区大小 | |
| 锁定 | lock_retry_attempts |
3 |
文件锁定重试尝试 |
lock_retry_delay |
0.1 |
重试之间的延迟(秒) | |
| 文件约束 | max_file_size_mb |
100 |
最大文件大小(MB) |
max_query_length |
10000 |
最大查询字符长度 | |
| 项目默认值 | default_project |
"rag_collection" |
默认项目名称 |
storage_path |
"./storage" |
根存储目录 |
支持的文件扩展名
代码(16个扩展名): .py, .js, .ts, .jsx, .tsx, .java, .cpp, .c, .go, .rs, .sh, .sql, .yaml, .toml, .vue, .html, .css
文件(16个扩展名): .txt, .pdf, .docx, .md, .json, .xml, .csv, .ipynb, .epub, .doc, .ppt, .pptx, .pptm, .xls, .xlsx, .rtf
图片(3个扩展名): .jpg, .jpeg, .png
默认排除项: node_modules, __pycache__, .git, .svn, .hg, venv, env, .venv, .env, build, dist, target, out, .idea, .vscode, .vs, *.pyc, *.pyo, *.so, *.dylib, *.dll, .DS_Store, Thumbs.db
项目结构
ly_rag_mcp/
├── mcp_server.py # FastMCP server entry point (MCP stdio)
├── api_server.py # Optional HTTP API + Vue UI
├── build_index.py # CLI index builder (incremental)
├── verify_setup.py # Setup verification
├── debug_rag.py # Debug & profiling tool
├── rag/ # Core package (modular architecture)
│ ├── __init__.py # Lazy exports
│ ├── config.py # RAGSettings, logging, constants
│ ├── models.py # Data models (SearchMode, ProjectMetadata, etc.)
│ ├── embeddings.py # Embedding factory (OpenAI/Gemini)
│ ├── storage/ # Storage layer
│ │ ├── chroma.py # ChromaDB client manager (singleton)
│ │ └── index.py # LlamaIndex storage manager (singleton)
│ ├── retrieval/ # Retrieval layer
│ │ ├── search.py # Unified search engine (hybrid/semantic/keyword)
│ │ ├── reranker.py # Cohere reranking manager
│ │ ├── bm25.py # BM25 keyword search manager
│ │ └── hyde.py # HyDE query augmentation
│ ├── ingestion/ # Ingestion layer
│ │ ├── loader.py # Multi-format document loading
│ │ ├── processor.py # Text cleaning, context injection
│ │ └── chunker.py # Smart chunking (AST for code, sentence for docs)
│ ├── project/ # Multi-project isolation
│ │ ├── manager.py # Project lifecycle, smart routing/selection
│ │ └── metadata.py # Project metadata storage (atomic writes)
│ └── tools/ # MCP tool definitions
│ ├── __init__.py # Tool registration facade
│ ├── query.py # Search & retrieval tools
│ ├── ingest.py # Document ingestion tools
│ └── admin.py # Admin & management tools
├── tests/ # Test suite (pytest)
├── frontend/ # Optional Vue 3 + Vite UI
│ ├── src/
│ │ ├── components/ # Vue components
│ │ ├── composables/ # API & polling composables
│ │ └── views/ # Page views
│ ├── index.html
│ ├── package.json
│ └── vite.config.ts
├── .env.example # Environment template
│
└── storage/ # Generated indexes (git-ignored)
└── {project}/ # Per-project isolation
├── chroma_db/ # ChromaDB vector database
├── project_metadata.json # Project config
├── ingest_manifest.json # Ingestion tracking
├── indexed_files.json # File change tracking
├── docstore.json # LlamaIndex document store
├── index_store.json # LlamaIndex index metadata
└── graph_store.json # LlamaIndex graph store
架构优势
- 模块化:每个模块都有一个单独的职责(每个文件约200-300行)
- 可测试的:18个测试文件的干净界面,目标覆盖率≥70%
- 线程安全:所有管理者都使用单例模式
threading.Lock()或RLock() - 原子写入:元数据使用临时文件+fsync+跨平台文件锁
- 可扩展:易于添加新的检索器、分块器或工具
管理器单例(延迟初始化,线程安全)
| 管理器 | 模块 | 关键方法 |
|---|---|---|
get_index_manager() |
rag.storage.index |
get_index(), insert_nodes(), persist(), reset(), switch_project(), validate_index() |
get_project_manager() |
rag.project.manager |
discover_projects(), create_project(), switch_project(), list_projects(), choose_project(), set_project_metadata() |
get_chroma_manager() |
rag.storage.chroma |
ChromaDB连接和采集管理 |
get_reranker_manager() |
rag.retrieval.reranker |
使用缓存进行Cohere-reranking |
get_bm25_manager() |
rag.retrieval.bm25 |
BM25关键字搜索,缓存无效 |
get_metadata_manager() |
rag.project.metadata |
具有原子写入的项目元数据 |
get_search_engine() |
rag.retrieval.search |
具有自适应模式选择的统一搜索 |
数据模型(rag/models.py)
枚举:
SearchMode:SEMANTIC,HYBRID,KEYWORDChangeType:NEW,MODIFIED,REMOVEDContentType:CODE,DOCUMENT,MIXED
数据类:
FileMetadata:path,mtime_ns,sizeProjectMetadata:name,display_name,description,keywords[],default_paths[],last_indexed,created_at,updated_atRetrievalResult:text,score,metadata,node_id,previewSearchResult:results[],query,search_mode,reranked,used_hyde,generated_query,project,totalIngestResult:success,message,documents_processed,chunks_created,skipped_unsupported,skipped_oversize,skipped_other,errorCacheStats:索引、重新分级、色度、bm25的性能指标
故障排除
快速诊断
# Run the comprehensive debug tool first!
python debug_rag.py
# This will check:
# - Environment variables (API keys)
# - Storage integrity
# - Index quality
# - Performance metrics
# - Edge cases
MCP服务器未连接
- 验证MCP配置中的Python路径
- 在中检查API密钥
env章节 - 确保
cwd指向项目目录 - 重新启动MCP客户端
- 检查日志
RAG_LOG_LEVEL=DEBUG在MCP配置中
未检索到文档
# Check if index has documents
python -c "from mcp_server import get_index_stats; print(get_index_stats())"
# If document_count is 0:
python build_index.py /path/to/your/documents
性能缓慢
# Profile retrieval performance
python debug_rag.py --profile
# Check cache efficiency
python -c "from mcp_server import get_cache_stats; print(get_cache_stats())"
# If cache hit rate < 90% after multiple queries:
# - Check MCP client logs for server restarts
# - Server should stay running between queries
相关性差
- 尝试
iterative_search()而不是query_rag()为了更好地改进 - 检查结果中的相关性得分(匹配良好时应大于0.7)
- 使用多轮搜索:从3个结果开始,根据结果进行优化
- 增加
similarity_top_k获得更多候选人
添加新文档
# Just re-run the same command - it will only process new/modified files
python build_index.py /path/to/your/documents
# Force full rebuild if needed
python build_index.py /path/to/your/documents --rebuild
增量更新检测到:
- 添加到目录中的新文件
- 已修改的文件(基于修改时间和文件大小)
- 自动跳过未更改的文件
何时使用 --rebuild:
- 更改嵌入模型
- 损坏的索引
- 想要从索引中删除已删除的文件
调试日志记录
添加到MCP配置中:
"env": {
"OPENAI_API_KEY": "...",
"COHERE_API_KEY": "...",
"RAG_LOG_LEVEL": "DEBUG"
}
这将记录:
- 查询验证和参数
- 缓存命中/未命中
- 检索和重新排序详细信息
- 性能计时
- 完整的错误堆栈跟踪
技术细节
模型
| 组件 | 型号 |
|---|---|
| 嵌入 | text-embedding-3-large |
| 重新排名 | rerank-v3.5 |
| 矢量存储 | ChromaDB |
| LLM | MCP客户模型 |
设计理念
服务器仅检索文档并对其进行排名。MCP客户端的LLM生成答案,提供:
- 灵活使用任何LLM
- 降低运营成本
- 更好的上下文可见性
许可证
MIT许可证
