本地文档问答工具

一个基于Python的MCP代理,允许用户与本地Word和Excel文档进行问答,所有处理均在本地完成,确保数据隐私。

  • by ItsMistahJi
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 ItsMistahJi/local_RAG_mcp

使用说明

本地_RAG_mcp

这是我尝试创建一个本地RAG mcp服务器来与本地.docx、.xlsx文件聊天。

与Ollama&MCP的本地文件问答

该项目提供了一个基于Python的MCP代理,允许您使用Ollama进行本地语言模型推理,与本地Word(.docx)和Excel(.xlsx)文档聊天,确保您的私人数据保留在您的计算机上。

它使用LangChain社区组件进行文档加载、文本分割、嵌入和向量存储(ChromaDB),以及 mcp-sdk 将此功能作为一组工具公开。

特征:

  • 私人和本地: 所有的处理、嵌入和语言模型推理都是通过Ollama在本地进行的。没有数据离开你的机器。
  • 支持的文档类型: 目前支持Microsoft Word(.docx)和Excel(.xlsx)文件。(可轻松扩展为PDF、.txt等格式)
  • 简单索引: 一个专用的MCP工具,用于扫描指定目录、处理文档并构建可搜索的矢量索引。
  • 自然语言问答: 用自然语言询问有关文档内容的问题。
  • MCP集成: 通过MCP工具公开功能,可用于 MCP检查员 或 mcp-cli.

原理

  1. 文档加载: 代理扫描指定的本地文件夹以查找支持的文档。
  2. 文本分块: 文档内容被拆分为更小、可管理的块。
  3. 嵌入: 使用局部Ollama嵌入模型将每个块转换为数值表示(嵌入)(例如。, nomic-embed-text).
  4. 矢量存储: 这些嵌入及其相应的文本块存储在本地ChromaDB矢量存储中。
  5. 查询(RAG-检索增强生成):
    • 当你问一个问题时,它也会被嵌入。
    • 系统在向量存储中搜索嵌入与问题嵌入最相似的文档块。
    • 这些相关块(上下文)与您的原始问题组合成提示。
    • 该提示被发送到本地Ollama聊天模型(例如。, llama3)以生成答案。

先决条件

  1. python Python 3.9+
  2. 没有 : 你需要Ollama安装并运行。
    • 安装: ollama.com
    • 确保奥利玛为模特提供服务。您可以通过运行来测试这一点 ollama list 在你的终端。
  3. 所需Olama型号:
    • 拉动嵌入模型: ollama pull nomic-embed-text
    • 拉取聊天模式: ollama pull llama3

安装

  1. 克隆存储库(或下载脚本):

    # If you create a Git repository:
    # git clone https://github.com/ItsMistahJi/local_RAG_mcp
    # cd local_RAG_mcp
    
  2. 创建虚拟环境(推荐):

    python -m venv venv
    source venv/bin/activate  # On Windows: venv\Scripts\activate
    
  3. 安装Python依赖项:

    pip install -r requirements.txt
    

设置和使用

  1. 准备您的文件:

    • 创建一个名为的文件夹 docs_simple 与位于同一目录中 server.py 脚本(或配置 DOC_DIR 在脚本中)。
    • 放置您的 .docx 和 .xlsx 将文件放入此 docs_simple 文件夹。
  2. 运行MCP代理脚本: 打开终端,导航到项目目录,然后运行:

    python server.py
    

    脚本将启动,尝试连接到Ollama,然后等待MCP客户端连接(如MCP Inspector)。您将在此终端中看到日志输出。

  3. 使用MCP检查器进行交互(推荐):

    • 下载并安装 MCP检查员.
    • 打开MCP检查器。
    • 配置代理:
      • 如果未自动检测到代理,则可能需要手动添加它。
      • 转到“文件”>“首选项”>“代理”(或类似部分)。
      • 单击“添加”或“+”图标。
      • 姓名: 给它一个描述性的名称(例如,“我的本地RAG代理”)。
      • 命令: 输入完整命令以运行脚本: python /full/path/to/your/server.py.
      • 运输: 选择 stdio.
      • 保存配置。
    • 连接和使用:
      • 回到主MCP检查器窗口,在列表中找到您配置的代理。
      • 点击“连接”或其旁边的播放图标。MCP检查器将运行您的脚本。
      • 连接后,您将看到可用的工具:
        • initialize_and_index:请先运行此工具。这不需要争论。它将处理以下文件 docs_simple 并在中创建本地矢量数据库 chroma_db_simple。检查代理的终端日志以了解进度。
        • ask_question:索引完成后,使用此工具。这需要一个论点:
          {
            "question": "Your question about the documents here"
          }
          
          代理将检索相关信息并生成答案。
  4. 使用互动 mcp-cli (备选方案): 确保你的Python脚本(server.py)是 不 已经在运行。 mcp-cli 将为每个命令启动它。

    • 列出可用工具(可选检查):

      mcp tool list CompanyDocumentQA-Ollama --command "python server.py" --transport stdio
      
    • 索引文件:

      mcp tool call CompanyDocumentQA-Ollama initialize_and_index --command "python server.py" --transport stdio
      

      (等待此操作完成。您将在终端中看到日志。)

    • 问一个问题:

      mcp tool call CompanyDocumentQA-Ollama ask_question '{"question": "What is the company policy on annual leave?"}' --command "python server.py" --transport stdio
      

脚本概述(server.py)

  • 配置: 文档目录、ChromaDB路径、Ollama模型等的顶部常量。
  • 辅助功能: 要加载和拆分文档,请初始化Ollama组件。
  • initialize_and_index (MCP工具):
    • 负载 .docx 和 .xlsx 文件夹。
    • 将它们分割成块。
    • 使用Ollama生成嵌入。
    • 将块和嵌入存储在持久ChromaDB中。
  • ask_question (MCP工具):
    • 回答用户问题。
    • 嵌入问题。
    • 从ChromaDB检索相关文档块。
    • 构造一个包含问题和上下文的提示。
    • 从Ollama LLM那里得到答案。
  • 主模块: 设置日志记录,初始化Ollama组件,并在上启动MCP代理服务器 stdio.

定制和未来增强功能

  • 更多文档类型: 添加PDF加载程序(PyPDFLoader),文本文件(TextLoader)等等,in load_documents_from_directory记住安装必要的软件包(例如。, pypdf, unstructured).
  • 不同型号: 改变 EMBEDDING_MODEL_NAME 和 LLM_MODEL_NAME 使用其他Ollama型号。确保它们在本地被拉动。
  • 分块策略: 试验 chunk_size 和 chunk_overlap 在……里面 RecursiveCharacterTextSplitter 为了获得更好的结果。
  • 检索器选项: 修改 search_kwargs={"k": 3} 在……里面 ask_question 以检索更多/更少的块。如果需要,探索其他检索模式。
  • 快速工程: 在中优化提示模板 ask_question 以获得更好的LLM响应。
  • 错误处理: 加强错误处理和用户反馈。
  • Web UI(例如Streamlit/Gradio): 将MCP代理或其核心逻辑封装在一个简单的web UI中,以便非技术用户更容易访问,可能是通过让UI调用MCP代理工具。

故障排除

  • “找不到Ollama”/连接错误:
    • 确保Ollama正在运行(ollama serve 或Ollama桌面应用程序)。
    • 验证 OLLAMA_BASE_URL 脚本中的内容与Ollama设置相匹配(默认值为 http://localhost:11434).
    • 确保模型(nomic-embed-text, llama3)被拉动: ollama list.
  • “找不到文档”/“矢量存储为空”:
    • 仔细检查 DOC_DIR 脚本中的路径,并确保它指向正确的文件夹。
    • 确保您的文档文件位于该文件夹中,并且具有支持的扩展名(.docx、.xlsx)。
    • 跑吧 initialize_and_index 工具。在索引过程中检查终端日志是否有错误。
  • mcp-cli 问题:
    • 确保 mcp-cli 安装正确(pip install "mcp-cli[cli]").
    • 使用完整 --command "python /path/to/script.py" 和 --transport stdio 旗帜。
  • MCP检查员看不到代理:
    • 确保您在MCP检查器首选项中正确配置了代理,并使用Python脚本的完整路径 stdio 运输。
    • 确保MCP检查器尝试启动脚本时,脚本尚未运行。