Rust Local Rag

Rust Local Rag

🚀 Rust本地RAG

一个高性能的本地RAG(检索增强生成)系统,用Rust构建,通过模型上下文协议(MCP)与Claude Desktop集成。可直接在Claude对话中搜索和分析PDF文档,无需将数据发送到外部服务。

🚀 快速开始

1. 前提条件

# 安装Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装Ollama
brew install ollama

# 安装Poppler(用于PDF解析)
brew install poppler

# 启动Ollama并安装嵌入模型
make setup-ollama

2. 构建和安装

git clone 
cd rust-local-rag
make install

3. 配置Claude Desktop

将以下内容添加到 ~/Library/Application Support/Claude/claude_desktop_config.json

{
"mcpServers": {
"rust-local-rag": {
"command": "/Users/yourusername/.cargo/bin/rust-local-rag",
"env": {
"DATA_DIR": "/Users/yourusername/Documents/data",
"DOCUMENTS_DIR": "/Users/yourusername/Documents/rag",
"LOG_DIR": "/tmp/rust-local-rag",
"LOG_LEVEL": "info",
"LOG_MAX_MB": "10"
}
}
}
}

4. 添加文档并使用

# 将PDF文件添加到文档目录
cp your-files.pdf ~/Documents/rag/

# 重启Claude Desktop
# 现在可以向Claude提问:“Search my documents for information about X”

✨ 主要特性

  • 🔍 语义文档搜索:使用Ollama嵌入进行基于向量的相似性搜索,可配置结果数量(top-k),并为搜索结果提供相关性评分。
  • 📁 文档管理:通过poppler自动提取PDF文本,对文档进行分块以优化嵌入生成,实时提供文档列表和统计信息。
  • 🔒 隐私优先设计:所有处理都在本地进行,无需对文档内容进行外部API调用,本地存储嵌入以实现快速检索。
  • ⚡ 高性能:利用Rust的内存安全性和高性能,使用异步/等待进行非阻塞操作,实现高效的向量存储和检索。

📦 安装指南

前提条件

# 安装Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 安装Ollama
brew install ollama

# 安装Poppler(用于PDF解析)
brew install poppler

# 启动Ollama并安装嵌入模型
make setup-ollama

构建和安装

git clone 
cd rust-local-rag
make install

📚 详细文档

设置指南

提供完整的安装和配置说明。

使用指南

介绍Claude Desktop的集成和使用示例。

🔧 技术细节

🏗️ 什么是MCP?

模型上下文协议(MCP) 是一种标准,允许像Claude这样的AI助手与外部工具和数据源进行交互。借助MCP,Claude不再局限于其训练数据,而是能够:

  • 调用外部工具和函数
  • 访问实时数据源
  • 与本地应用程序集成
  • 在交互过程中保持上下文

🦀 本项目如何使用Rust MCP SDK

本实现利用了 rmcp 包——MCP的官方Rust SDK,创建了一个向Claude Desktop公开RAG功能的服务器。

MCP架构

┌─────────────────┐    MCP协议     ┌──────────────────┐
│                 │    (stdin/stdout)   │                  │
│  Claude Desktop │ ◄─────────────────► │   Rust RAG       │
│                 │                     │   MCP Server     │
└─────────────────┘                     └──────────────────┘
│
▼
┌──────────────────┐
│  本地RAG栈       │
│                  │
│  • PDF解析器     │
│  • Ollama        │
│  • 向量存储      │
│  • 搜索引擎      │
└──────────────────┘

关键MCP组件

1. 服务器处理程序实现
#[tool(tool_box)]
impl ServerHandler for RagMcpServer {
fn get_info(&self) -> ServerInfo {
// 向Claude提供服务器元数据
}
}
2. 工具定义

使用 rmcp 宏将RAG功能作为MCP工具公开:

#[tool(description = "Search through uploaded documents using semantic similarity")]
async fn search_documents(&self, query: String, top_k: Option<usize>) -> Result

#[tool(description = "List all uploaded documents")]
async fn list_documents(&self) -> Result

#[tool(description = "Get RAG system statistics")]
async fn get_stats(&self) -> Result
3. 传输层
// 使用stdin/stdout传输进行Claude Desktop集成
let service = server.serve(stdio()).await?;

🏛️ 架构

技术栈

  • 🦀 Rust:作为核心应用程序语言,确保性能和安全性。
  • 📡 rmcp:官方Rust MCP SDK,用于Claude集成。
  • 🤖 Ollama:用于本地嵌入生成(nomic-embed-text)。
  • 📄 Poppler:用于PDF文本提取。
  • 🗃️ 自定义向量存储:内存中的向量数据库,实现快速搜索。

数据流

  1. 文档摄取:PDF → 文本提取 → 分块
  2. 嵌入生成:文本块 → Ollama → 向量嵌入
  3. 索引:嵌入 → 本地向量存储
  4. 搜索:查询 → 嵌入 → 相似性搜索 → 结果
  5. MCP集成:结果 → 通过MCP协议发送到Claude Desktop

🛠️ MCP集成细节

为什么选择MCP而非HTTP API?

方面 MCP方法 HTTP API方法
集成 原生支持Claude Desktop 需要自定义客户端
安全性 进程隔离,无需网络 需要网络暴露
性能 直接的stdin/stdout IPC 存在网络开销
用户体验 无缝的工具集成 需要手动管理API

公开的MCP工具

  1. search_documents
    • 目的:对文档集合进行语义搜索。
    • 输入:查询字符串,可选的结果数量。
    • 输出:带有相似性评分的排名搜索结果。
  2. list_documents
    • 目的:文档库存管理。
    • 输入:无。
    • 输出:所有已索引文档的列表。
  3. get_stats
    • 目的:系统监控和调试。
    • 输入:无。
    • 输出:嵌入数量、内存使用情况、性能指标。

🤝 贡献

欢迎贡献代码!本项目展示了实用的MCP服务器实现模式,可用于其他用例。

开发

# 在开发模式下运行
make run

# 检查格式
cargo fmt --check

# 运行代码检查器
cargo clippy

📄 许可证

本项目采用MIT许可证,请参阅 LICENSE 文件以获取详细信息。

🙏 致谢

  • 模型上下文协议 提供了规范。
  • rmcp 提供了出色的Rust MCP SDK。
  • Ollama 用于本地嵌入生成。
  • Claude Desktop 提供了MCP集成支持。

用Rust精心打造 | 由MCP提供支持 | 注重隐私的RAG

  • 0 关注
  • 0 收藏,8 浏览
  • system 提出于 2025-09-19 21:06

相似服务问题