Skip to main content
Glama
wuliuke
by wuliuke
README.md
# DocAgent-MCP

面向本地文档的 **Agentic-RAG** 与 **MCP 工具化**问答系统

## 项目简介

基于 FastAPI、GLM-4-Flash、TF-IDF 构建的本地文档智能问答系统,支持多轮对话、意图识别、查询改写、工具路由和 MCP Server 封装。

## 核心功能

- 📄 **文档上传解析** - 支持 PDF 和 Word 文档
- 🔍 **中文检索** - jieba 分词 + TF-IDF 向量检索
- 🤖 **LLM 问答** - 智谱 GLM-4-Flash 生成答案
- 📚 **引用溯源** - 返回答案对应的文档来源
- 💬 **多轮对话** - 支持连续追问,上下文记忆
- 🎯 **意图识别** - 自动判断问题类型(新问题/追问/摘要/对比/计算/闲聊)
- ✏️ **查询改写** - 追问时自动将"它"等指代词改写为完整问题
- 🛠️ **工具路由** - 根据意图自动选择问答/摘要/计算工具
- 🔧 **Tool Registry** - 统一工具注册、调用和返回格式
- 🌐 **MCP Server** - 通过 Model Context Protocol 暴露本地文档能力

## 系统架构

```
┌─────────────────────────────────────────────────────────────┐
│                     HTML 前端 (index.html)                  │
└──────────────────────────┬──────────────────────────────────┘
                           │ HTTP
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                     FastAPI 后端 (端口 8000)                 │
│  ┌─────────────┐  ┌──────────────┐  ┌──────────────────┐   │
│  │ Conversation │  │ Intent Router │  │   Tool Router    │   │
│  │  Manager    │  │ + Query       │  │   → Tool Registry│   │
│  └─────────────┘  │  Rewriter     │  └──────────────────┘   │
└───────────────────┴───────────────┴─────────────────────────┘
                           │
          ┌────────────────┼────────────────┐
          ▼                ▼                ▼
   ┌────────────┐   ┌────────────┐   ┌────────────┐
   │Document QA │   │  Summary   │   │ Calculator │
   │   Tool     │   │   Tool     │   │    Tool    │
   └─────┬──────┘   └─────┬──────┘   └────────────┘
         │                │
         ▼                ▼
   ┌─────────────────────────────────────┐
   │        RAG Service                  │
   │  ┌──────────┐    ┌──────────────┐   │
   │  │ TF-IDF   │───▶│  Retriever   │   │
   │  │ VectorDB │    └──────────────┘   │
   │  └──────────┘           │           │
   │                         ▼           │
   │                  ┌──────────────┐   │
   │                  │  GLM-4-Flash │   │
   │                  └──────────────┘   │
   └─────────────────────────────────────┘
                           │
                           ▼
   ┌─────────────────────────────────────┐
   │     MCP Server (stdio 模式)          │
   │  list_documents / search_document   │
   │  ask_document / summarize_document  │
   └─────────────────────────────────────┘
```

## 快速开始

### 1. 克隆项目

```bash
git clone <your-repo-url>
cd docagent-mcp
```

### 2. 创建虚拟环境并安装依赖

```bash
conda create -n docagent python=3.10
conda activate docagent
pip install -r requirements.txt
```

### 3. 配置 API Key

```bash
# 方式1:环境变量
export ZHIPU_API_KEY="your-api-key"

# 方式2:直接修改 backend/config.py
ZHIPU_API_KEY = "your-api-key"
```

### 4. 启动 FastAPI 后端

```bash
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000
```

### 5. 打开前端

直接双击打开 `frontend/index.html`,或启动 HTTP 服务器:

```bash
cd frontend
python -m http.server 8080
# 访问 http://localhost:8080
```

### 6. (可选) 启动 MCP Server

```bash
python -m backend.mcp_server.server
```

## API 接口

### 上传文档
```bash
curl -X POST "http://localhost:8000/api/upload" \
  -F "file=@/path/to/document.pdf"
```

### 问答
```bash
curl -X POST "http://localhost:8000/api/chat" \
  -H "Content-Type: application/json" \
  -d '{"question": "博士学位申请需要满足哪些条件?", "top_k": 4}'
```

### 列出工具
```bash
curl "http://localhost:8000/api/tools"
```

### 获取执行轨迹
```bash
curl "http://localhost:8000/api/conversations/{id}/trace"
```

## 意图识别示例

| 问题 | 识别意图 | 调用工具 |
|------|----------|----------|
| "博士学位申请需要满足哪些条件?" | NEW_QUESTION | document_qa |
| "它的学制是几年?" | FOLLOW_UP | document_qa (查询改写后) |
| "总结一下这篇文章" | SUMMARY | document_summary |
| "它和硕士有什么区别?" | COMPARE | document_qa |
| "1+1 等于多少?" | CALCULATION | calculator |
| "你好" | CHITCHAT | direct_answer |

## 项目结构

```
docagent-mcp/
├── backend/
│   ├── main.py                    # FastAPI 入口
│   ├── config.py                  # 配置
│   ├── agent/
│   │   ├── base_tool.py           # 工具基类
│   │   ├── tool_result.py         # 统一返回格式
│   │   ├── tool_registry.py       # 工具注册中心
│   │   ├── conversation_manager.py# 多轮对话管理
│   │   ├── intent_router.py       # 意图识别
│   │   ├── query_rewriter.py      # 查询改写
│   │   ├── tool_router.py         # 工具路由
│   │   └── tools/
│   │       ├── document_qa_tool.py
│   │       ├── document_summary_tool.py
│   │       └── calculator_tool.py
│   ├── rag/
│   │   ├── loader.py              # 文档加载
│   │   ├── splitter.py            # 文本分块
│   │   ├── vectorstore.py         # TF-IDF 向量库
│   │   ├── retriever.py           # 检索器
│   │   └── generator.py           # LLM 生成器
│   ├── api/
│   │   ├── chat.py                # 问答 API
│   │   ├── upload.py              # 上传 API
│   │   └── documents.py           # 文档 API
│   └── mcp_server/
│       ├── server.py              # MCP Server
│       ├── mcp_tools.py           # MCP 工具定义
│       ├── adapters.py            # 格式转换
│       └── README_MCP.md          # MCP 使用说明
├── frontend/
│   └── index.html                 # HTML 前端
├── data/
│   ├── uploads/                   # 上传文件 (不上传)
│   └── tfidf/                     # TF-IDF 持久化 (不上传)
├── requirements.txt
└── README.md
```

## 技术栈

- **后端框架**: FastAPI + Uvicorn
- **中文分词**: jieba
- **向量检索**: TF-IDF (numpy/sklearn)
- **LLM**: 智谱 GLM-4-Flash
- **协议**: Model Context Protocol (MCP)
- **前端**: HTML + JavaScript (无框架)

## 简历描述

```
DocAgent-MCP:面向本地文档的 Agentic-RAG 与 MCP 工具化问答系统

- 基于 FastAPI、GLM-4-Flash、jieba、TF-IDF 构建本地文档 RAG 系统,
  支持 PDF/Word 解析、中文检索、持久化存储、引用溯源和基于检索增强的问答生成。

- 设计多轮对话管理、意图识别和查询改写模块,支持新问题、追问、摘要、对比、
  计算和闲聊等 6 类意图,并根据上下文动态选择检索策略。

- 抽象 Tool Registry 工具注册中心,统一封装文档问答、文档摘要和计算器工具,
  设计 ToolResult 标准返回格式,实现工具调用轨迹可视化。

- 基于 MCP Server 将本地文档检索、问答和摘要能力暴露为标准工具接口,
  支持外部 Agent 通过统一协议调用本地知识库能力。
```

## License

MIT License