30 分钟利用 MCP 和 Claude 构建高性能本地 RAG 系统

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

检索增强生成 (RAG) 通常被认为是一个复杂的工程项目,涉及向量数据库、嵌入 API 和复杂的文本分块策略。然而,对于大多数开发者和企业而言,如果只是想让 AI 助手搜索本地文档、代码库或个人笔记,传统的云端 RAG 架构往往显得过于臃肿。随着 Model Context Protocol (MCP) 的出现,构建 本地 RAG 与 MCP 系统变得前所未有的简单。

MCP 允许像 Claude 这样的高级语言模型直接访问您本地的工具和数据源,而无需将敏感数据上传到云端。通过这种方式,您可以构建一个既安全又高效的知识库系统。为了确保在调用这些模型时获得最稳定的连接和极速响应,开发者通常选择 n1n.ai 提供的 API 聚合服务,以实现生产级的稳定性。

为什么选择本地 RAG 与 MCP?

本地 RAG 与 MCP 的核心优势在于“数据主权”。您的所有文档都保留在本地机器上,AI 仅通过 MCP 接口进行按需检索。这不仅保护了隐私,还消除了昂贵的云端向量数据库成本。对于处理私有代码或商业机密的场景,这是唯一的安全选择。

系统架构深度解析

一个典型的 本地 RAG 与 MCP 系统包含以下环节:

  1. 用户层:提出问题(例如:“如何配置数据库连接?”)。
  2. 模型层:Claude 识别出需要访问本地数据,并调用预定义的 MCP 工具。
  3. 协议层 (MCP Server):接收指令并执行本地 Python 脚本。
  4. 数据层:脚本在本地文件系统中搜索相关内容。
  5. 生成层:Claude 获取检索到的片段,生成包含引用来源的回答。

环境准备

在开始之前,请确保您的开发环境满足以下要求:

  • Python 3.10 或更高版本。
  • 安装了 Gantz CLI(用于管理 MCP 服务器)。
  • 拥有稳定的 LLM API 访问权限。推荐使用 n1n.ai,它整合了全球顶尖模型,支持高并发调用。
  • 准备一个包含 Markdown、TXT 或 PDF 文件的本地文件夹。

第一阶段:实现基础关键词检索

对于中小型文档集(少于 1000 个文件),基于关键词的“Grep 式”搜索往往比复杂的语义搜索更精准、更快速。

核心脚本:search_docs.py

该脚本负责在指定目录中递归搜索关键词,并提取上下文片段。

import os, sys
from pathlib import Path

# 设置本地文档根目录
DOCS_DIR = os.environ.get('DOCS_DIR', './docs')

def search_local_files(query, max_results=5):
    results = []
    query_lower = query.lower()
    # 遍历文件系统
    for path in Path(DOCS_DIR).rglob('*'):
        if path.is_file() and path.suffix in ['.md', '.txt', '.py']:
            try:
                content = path.read_text(encoding='utf-8')
                if query_lower in content.lower():
                    lines = content.split('\n')
                    for i, line in enumerate(lines):
                        if query_lower in line.lower():
                            # 获取前后各 5 行的上下文
                            start = max(0, i - 5)
                            end = min(len(lines), i + 6)
                            results.append({
                                'file': str(path.relative_to(DOCS_DIR)),
                                'snippet': '\n'.join(lines[start:end])
                            })
                            if len(results) >= max_results: return results
            except Exception: continue
    return results

第二阶段:配置 MCP 桥接器

通过 Gantz 配置文件,我们将上述 Python 脚本暴露给 AI 助手。这是 本地 RAG 与 MCP 能够协同工作的关键。

name: my-local-rag
description: '搜索并读取本地知识库'
tools:
  - name: search_docs
    description: '在本地文档中搜索特定信息'
    parameters:
      - name: query
        type: string
        required: true
    script:
      command: python3
      args: ['./scripts/search_docs.py', '{{query}}']
      working_dir: '/home/user/rag-system'
    environment:
      DOCS_DIR: '/home/user/my-notes'

第三阶段:进阶语义搜索(向量 RAG)

当用户提出的问题比较模糊(例如:“如何优化性能?”)时,简单的关键词匹配可能失效。此时我们需要引入向量嵌入(Embeddings)。

我们可以使用 sentence-transformers 库在本地生成向量,并利用 faiss 进行高速检索。这种方案完全不依赖外部 API,是 本地 RAG 与 MCP 的终极形态。

向量索引逻辑:index_docs.py

from sentence_transformers import SentenceTransformer
import faiss, pickle, numpy as np

# 初始化本地模型
model = SentenceTransformer('all-MiniLM-L6-v2')

# 对文档进行分块并编码
doc_chunks = ["块1...", "块2..."]
embeddings = model.encode(doc_chunks)

# 构建 FAISS 索引
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(embeddings).astype('float32'))

# 将索引持久化到本地
faiss.write_index(index, "docs.index")

通过 n1n.ai 驱动模型响应

有了本地工具后,我们需要一个强大的大脑来调用它们。使用 n1n.ai 的 API,您可以轻松集成 Claude 3.5 Sonnet,利用其超强的逻辑推理能力来分析本地检索到的数据。

import anthropic

# 使用 n1n.ai 提供的 API 密钥和端点
client = anthropic.Anthropic(api_key="N1N_API_KEY", base_url="https://api.n1n.ai/v1")

# 发起带 MCP 工具的请求
response = client.beta.messages.create(
    model="claude-3-5-sonnet",
    max_tokens=1024,
    tools=[{"type": "mcp_toolset", "mcp_server_name": "my-local-rag"}],
    messages=[{"role": "user", "content": "根据我的笔记,总结一下项目的部署流程。"}]
)

方案对比:关键词 vs. 向量检索

维度关键词搜索 (Grep)语义搜索 (Vector)
适用场景查找特定 ID、函数名、错误代码查找概念、主题、相似案例
资源消耗极低中(需要内存存储索引)
实时性即时(无需预处理)需定期重新构建索引
本地 RAG 与 MCP 建议推荐用于代码库推荐用于长篇文档/笔记

专家建议 (Pro Tips)

  1. 增量更新:为了提升 本地 RAG 与 MCP 的体验,建议使用 Python 的 watchdog 库监控文件夹。每当有新文件保存时,自动触发索引更新,确保 AI 总是拥有最新的信息。
  2. 多模态扩展:MCP 不仅限于文本。您可以编写脚本调用 pdfplumber 处理 PDF 报表,甚至调用 OpenCV 让 AI 描述本地图片内容。
  3. 隐私隔离:在配置 gantz.yaml 时,严格限制 working_dir。不要给 MCP 脚本赋予删除或修改文件的权限,以确保系统安全性。

总结

通过 本地 RAG 与 MCP,您可以在不牺牲隐私的前提下,将 AI 的能力深度集成到您的本地工作流中。无论是个人知识管理还是企业内部文档查询,这套方案都展现了极高的性价比。配合 n1n.ai 提供的稳定 API 服务,您可以构建出响应迅速、知识渊博的专属 AI 助手。

立即在 n1n.ai 获取免费 API 密钥。