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

- 姓名
- 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 系统包含以下环节:
- 用户层:提出问题(例如:“如何配置数据库连接?”)。
- 模型层:Claude 识别出需要访问本地数据,并调用预定义的 MCP 工具。
- 协议层 (MCP Server):接收指令并执行本地 Python 脚本。
- 数据层:脚本在本地文件系统中搜索相关内容。
- 生成层: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)
- 增量更新:为了提升 本地 RAG 与 MCP 的体验,建议使用 Python 的
watchdog库监控文件夹。每当有新文件保存时,自动触发索引更新,确保 AI 总是拥有最新的信息。 - 多模态扩展:MCP 不仅限于文本。您可以编写脚本调用
pdfplumber处理 PDF 报表,甚至调用OpenCV让 AI 描述本地图片内容。 - 隐私隔离:在配置
gantz.yaml时,严格限制working_dir。不要给 MCP 脚本赋予删除或修改文件的权限,以确保系统安全性。
总结
通过 本地 RAG 与 MCP,您可以在不牺牲隐私的前提下,将 AI 的能力深度集成到您的本地工作流中。无论是个人知识管理还是企业内部文档查询,这套方案都展现了极高的性价比。配合 n1n.ai 提供的稳定 API 服务,您可以构建出响应迅速、知识渊博的专属 AI 助手。
立即在 n1n.ai 获取免费 API 密钥。