文档检索增强生成服务

一个基于模型上下文协议(MCP)和检索增强生成(RAG)的服务,用于回答关于虚构SuperNova文档的问题,适用于开发者工具中的上下文文档搜索。

  • by shabib87
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 shabib87/supernova-mcp-rag

使用说明

SuperNova MCP RAG Monorepo

一个展示模型上下文协议(MCP)服务器和检索增强生成(RAG)的monorepo,用于回答有关虚构SuperNova文档的问题。

  • 文档是虚构的产品文档。它是一组包含AI生成内容的HTML文件。
  • 文档被处理成块并存储在矢量数据库中。
  • 该服务器使用Node.js构建,并使用免费的HuggingFace嵌入进行语义搜索。

随附博客文章: 构建MCP RAG服务器:通过上下文文档搜索增强开发人员工具

架构概述

flowchart TD
    User[User Question in Cursor] -->|MCP Protocol| MCPServer[MCP RAG Server]
    MCPServer -->|Triggers| RAG[RAG Pipeline]
    RAG -->|Loads & Chunks| Docs[SuperNova HTML Docs]
    RAG -->|Embeds| Embeddings[HuggingFace Embeddings]
    Embeddings -->|Stores| VectorStore[In-Memory Vector Store]
    MCPServer -->|Semantic Search| VectorStore
    VectorStore -->|Relevant Chunks| MCPServer
    MCPServer -->|Answer| User

Monorepo结构

  • mcp-rag-server/ --带RAG管道的MCP服务器(Node.js、TypeScript)
  • monorepo-sample-package/ --示例包(用于monorepo演示)
  • docs/ --SuperNovaStorybook Mobile Swift的虚拟HTML文档

快速开始

先决条件

  • Node.js 18+
  • Yarn(用于工作空间支持)

再进行

yarn install

环境设置

创建一个 .env 文件在 mcp-rag-server/:

HUGGINGFACE_API_KEY=your_huggingface_token_here

构建并运行MCP RAG服务器

#install
yarn install
#list workspace

yarn workspaces info

# Build
yarn workspace mcp-rag-server build

# Start
yarn workspace mcp-rag-server start
  • 对于开发(热重新加载):
    yarn dev
    

注意:服务器可能需要一段时间来准备向量存储。您可以在日志中看到进度。

运作原理

  • MCP协议: 暴露工具(search_docs)用于文档的语义搜索。
  • RAG管道:
    • 加载并解析 docs/SuperNovaStorybook-Mobile-Swift/*.html,即该目录中的所有HTML文件。
    • 将文本分割成块
    • 使用HuggingFace推理API嵌入块
    • 存储在内存向量存储(LangChain)中
    • 通过语义相似度搜索回答查询

使用游标

  1. 打开的游标
  2. 在设置中添加新的MCP服务器→ MCP:
    • 类型:MCP(标准)
    • 命令: node (从 mcp-rag-server)
    • 论据: /absolute-path-to/supernova-mcp-rag/mcp-rag-server/dist/index.js
    • 确保 .env 是用您的HuggingFace API密钥设置的
  3. 在Cursor聊天中询问有关SuperNova文档的问题

mcp.json示例

{
  "mcpServers": {
    "mcp-rag-server": {
      "command": "node",
      "args": [
        "/absolute-path-to/supernova-mcp-rag/mcp-rag-server/dist/index.js"
      ],
      "disabled": false,
      "autoApprove": []
    }
  }
}

使用MCP检查器和简单浏览器进行调试

这 MCP检查员 是一个交互式开发工具,旨在帮助您实时测试和调试MCP服务器。

如何使用MCP检查器

  1. 在本地启动MCP服务器。

  2. 从monorepo的根目录使用服务器运行Inspector:

npx @modelcontextprotocol/inspector node mcp-rag-server/dist/index.js
  1. 打开检查器Web UI:

检查器将打印一个URL,例如: http://127.0.0.1:6274/

  1. 在VS Code Simple Browser或任何web浏览器中打开此URL:
  • 在光标/VS代码中,打开命令面板(Ctrl+Shift+P 或 Cmd+Shift+P),类型 Simple Browser: Show,并输入URL。
  • 或者,在Chrome、Firefox或任何浏览器中打开URL。
  1. 与您的MCP服务器交互:
  • 发送测试查询。
  • 检查工具调用和响应。
  • 实时调试和验证MCP服务器的行为。

为什么要使用简单浏览器?

  • 某些浏览器(如Safari)可能会因仅HTTPS模式而阻止HTTP请求。
  • VS Code的简单浏览器避免了这些限制,便于本地开发。

在将MCP检查器与Cursor等客户端完全集成之前,将其与Simple Browser一起使用是调试和验证MCP服务器的一种强大方法。


故障排除

  • 确保您的HuggingFace API密钥有效且不受费率限制
  • 如果服务器无法启动,请检查 .env 和日志
  • 对于依赖性问题,请使用 yarn install 从根开始

性能考虑因素和限制

当前的实施方式是如何运作的

  • 文档文件夹(和子文件夹)中的所有HTML文件都是递归发现和处理的。
  • 解析每个HTML文件,提取其文本,然后将其拆分为重叠的块进行语义搜索。
  • 每个区块的嵌入都是使用拥抱面部推断API生成的。
  • 所有嵌入都存储在内存中的向量存储中,以便在查询过程中快速检索。

性能选择

  • 内存矢量存储: 适用于中小型文档集,无外部依赖,但由于内存限制,不适合非常大的语料库。
  • 动态嵌入: 在服务器启动时为所有块生成嵌入。这使得初始启动速度变慢,但确保了所有内容都是可搜索的。
  • 顺序处理: 为了简单和可靠,文件和嵌入被一个接一个地处理。

局限性

  • 启动时间: 随着文档集的增长,服务器将需要更长的时间来启动,因为在提供查询之前,必须处理和嵌入所有文件。
  • 拥抱面API速率限制: 嵌入许多区块可以快速达到自由层API费率限制(请参阅拥抱面API定价和限制)。如果超出配额,您可能会遇到延迟或错误。
  • 内存使用情况: 内存中的向量存储不适合大型文档集或生产规模的部署。
  • 无持久索引: 每次服务器重启时,矢量存储都会从头开始重建;没有缓存或持久索引。
  • 单线程处理: 当前所有处理都是按顺序进行的。对于大量文件,并行或批处理可以提高性能,但需要小心处理API限制和错误情况。

拥抱脸API使用和限制

  • 拥抱面部推理API有一个有请求限制的免费层(例如,注册用户每小时300个请求)。
  • 看 API定价和费率限制 和 支持的型号 了解详情。
  • 如果超出配额,您可能会收到429个错误,或者必须等待配额重置。

可能的改进

  • 批量或并行嵌入: 在支持的情况下,批处理嵌入请求或并行处理文件可以加快初始化速度。
  • 持久或外部矢量数据库: 对于大规模或生产使用,考虑使用langchain的向量存储接口将嵌入存储在持久向量数据库中,如Pinecone、Weaviate或Qdrant。
  • 预处理步骤: 将嵌入和索引过程移至单独的构建步骤,以避免服务器启动时间过长。
  • 流初始化: 在向量存储的部分准备就绪后立即提供查询,而不是等待所有文件都被处理。
  • 您还可以利用langchain的api来拥有自己的llm管道。这样,您就可以使用任何您想要的llm,并可以控制响应温度、最大令牌等。

许可证

此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。