使用说明
MCP服务器——代理RAG系统
一个全栈应用程序,允许用户上传文档,与从这些文档中检索相关信息的AI代理聊天,并管理数据类别。
它的作用
| 特性 | 描述 |
|---|---|
| 上传文件 | 上传 .txt 文档并将其分配到一个类别(cars 或 addresses) |
| 聊天 | 提问——AI代理使用GPT-4.1从您上传的文档和答案中检索相关块 |
| 删除类别 | 删除存储在特定命名空间/类别下的所有矢量数据 |
架构概述
┌──────────────────────────────────────────────────┐
│ Frontend (React 19 + Vite) │
│ │
│ ┌────────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Upload │ │ Chat │ │ Remove │ │
│ │ File │ │ Page │ │ Category │ │
│ └────────────┘ └──────────┘ └───────────────┘ │
└───────────────────────┬──────────────────────────┘
│ HTTP / REST
▼
┌──────────────────────────────────────────────────┐
│ FastAPI Backend (port 8000) │
│ │
│ POST /api/v1/upload │
│ DELETE /api/v1/delete-namespace │
│ POST /api/v1/agent-response │
│ │
│ ┌────────────────────────────────────────────┐ │
│ │ LangGraph Agent (GPT-4.1 via OpenAI) │ │
│ │ • Loads conversation history (Postgres) │ │
│ │ • Connects to MCP Server for tools │ │
│ │ • ContentFilter middleware (security) │ │
│ └────────────────────┬───────────────────────┘ │
└───────────────────────┼──────────────────────────┘
┌─────────────┼────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌──────────┐ ┌──────────────┐
│ MCP Server │ │Postgres │ │ Celery │
│ (port 9000)│ │(memory) │ │ Worker │
│ │ │ │ │ │
│ Tools: │ │ Thread │ │ Async file │
│ • namespaces│ │ checkpoint│ │ processing │
│ • search_ │ │ storage │ │ & embedding │
│ cars │ └──────────┘ └──────┬───────┘
│ • search_ │ │
│ addresses │ ┌──────────────┘
└──────┬──────┘ ▼
│ ┌──────────┐
│ │ Redis │
│ │ (broker) │
│ └──────────┘
▼
┌─────────────┐
│ Pinecone │
│ (vectors) │
│ │
│ Embedding: │
│ llama-text- │
│ embed-v2 │
└─────────────┘
技术栈
后端
| 层 | 技术 |
|---|---|
| API框架 | FastAPI |
| AI代理 | LangChain+LangGraph |
| LLM | OpenAI GPT-4.1 |
| 矢量存储 | 松果(llama-text-embed-v2 嵌入、余弦相似度) |
| 对话记忆 | LangGraph Postgres检查点 |
| 异步任务 | Celery+Redis |
| MCP服务器 | FastMCP(端口9000) |
| 数据库 | PostgreSQL 17 |
| 消息代理 | Redis 7 |
前端
| 层 | 技术 |
|---|---|
| 框架 | React 19 |
| 路由 | React Router 7 |
| 造型 | 顺风CSS 4 |
| 构建工具 | Vite |
| 语言 | TypeScript |
数据流--聊天查询
- 用户从聊天页面发送问题
- 前端
POST /api/v1/agent-response?question=...&thread_id=default - 后端从以下位置加载对话历史记录 PostgreSQL (由
thread_id) - LangGraph代理 使用GPT-4.1初始化并连接到 MCP服务器
- 客服电话
retrive_all_name_spaces()发现可用类别 - 代理人决定问题涉及的类别(汽车或地址)
- 客服电话
search_cars_vectors()或search_addresses_vectors()→ 松果 返回前3个语义匹配项 - GPT-4.1使用检索到的上下文生成最终答案
- 对话状态已保存回 PostgreSQL
{ "answer": "..." }返回到前端
数据流——文件上传
- 用户在上传页面中选择文件和类别
- 前端
POST /api/v1/upload?category=cars随着multipart/form-data - FastAPI排队 芹菜任务 (通过Redis代理)
- Celery worker处理文件:
- 将文本拆分为约200个字符块
- 将每个块嵌入 松果
llama-text-embed-v2 - 在匹配的命名空间下存储向量(
cars或addresses)
- 返回成功响应
项目结构
mcp_server/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app + CORS + router
│ │ ├── routes.py # 3 API endpoints
│ │ ├── agent_logic.py # LangGraph agent, upload logic, namespace removal
│ │ ├── mcp_server.py # FastMCP server with 3 tools
│ │ ├── celery_tasks.py # Async Celery tasks for file processing
│ │ ├── pinecone_client.py # Pinecone connection + embedding
│ │ ├── schemas.py # Pydantic request/response models
│ │ ├── middleware.py # ContentFilterMiddleware
│ │ ├── logger.py # Coloured logging
│ │ └── aws_secretes.py # AWS Secrets Manager integration
│ ├── docker-compose.yml # PostgreSQL + Redis + FastAPI + Celery + MCP
│ ├── Dockerfile
│ └── pyproject.toml
├── frontend/
│ ├── src/
│ │ ├── App.tsx # BrowserRouter + route definitions
│ │ ├── pages/
│ │ │ ├── UploadFilePage.tsx
│ │ │ ├── ChatPage.tsx
│ │ │ └── RemoveCategoryPage.tsx
│ │ └── components/
│ │ ├── Nav.tsx # Hamburger sidebar navigation
│ │ ├── Layout.tsx
│ │ └── UploadFile.tsx
│ ├── .env # VITE_SERVER_URL=http://localhost:8000
│ └── vite.config.ts
└── README.md
运行应用程序
后端
cd backend
docker compose up --build
这将启动5项服务:
fastapi-端口8000上的API服务器mcp_server--端口9000上的MCP工具服务器celery_worker--异步任务处理器postgres--端口5432上的PostgreSQL 17redis--端口6379上的Redis 7
前端
cd frontend
npm install
npm run dev
应用程序运行 http://localhost:5173.
环境变量
后端 (通过Docker或 .env):
| 变量 | 描述 |
|---|---|
OPENAI_API_KEY |
OpenAI API密钥 |
PINECONE_API_KEY |
松果API键 |
POSTGRES_USER |
PostgreSQL用户名 |
POSTGRES_PASSWORD |
PostgreSQL密码 |
POSTGRES_HOST |
PostgreSQL主机 |
POSTGRES_PORT |
PostgreSQL端口 |
POSTGRES_DB |
PostgreSQL数据库名称 |
前端 (.env):
| 变量 | 描述 |
|---|---|
VITE_SERVER_URL |
后端基本URL(默认值: http://localhost:8000) |
API 参考
POST /api/v1/upload
上传一个文件并将其嵌入到矢量存储中。
| 参数 | 类型 | 位置 | 描述 |
|---|---|---|---|
user_file |
file | 表单数据 | 要上传的文件 |
category |
cars |
addresses |
query |
答复: { "success": "..." }
POST /api/v1/agent-response
向AI代理发送问题。
| 参数 | 类型 | 位置 | 描述 |
|---|---|---|---|
question |
string(最多100个) | query | 用户的问题 |
thread_id |
string | query | 内存的会话ID(默认值: "default") |
答复: { "answer": "..." }
DELETE /api/v1/delete-namespace
删除某个类别下存储的所有向量。
| 参数 | 类型 | 位置 | 描述 |
|---|---|---|---|
category |
string(最多50个) | query | 要删除的命名空间 |
答复: { "response": "..." }