代理RAG系统

一个全栈应用程序,允许用户上传文档,与AI代理聊天以检索相关信息,并管理数据类别。

  • by briceanu
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 briceanu/fastapi-mcp-server

使用说明

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

数据流--聊天查询

  1. 用户从聊天页面发送问题
  2. 前端 POST /api/v1/agent-response?question=...&thread_id=default
  3. 后端从以下位置加载对话历史记录 PostgreSQL (由 thread_id)
  4. LangGraph代理 使用GPT-4.1初始化并连接到 MCP服务器
  5. 客服电话 retrive_all_name_spaces() 发现可用类别
  6. 代理人决定问题涉及的类别(汽车或地址)
  7. 客服电话 search_cars_vectors() 或 search_addresses_vectors() → 松果 返回前3个语义匹配项
  8. GPT-4.1使用检索到的上下文生成最终答案
  9. 对话状态已保存回 PostgreSQL
  10. { "answer": "..." } 返回到前端

数据流——文件上传

  1. 用户在上传页面中选择文件和类别
  2. 前端 POST /api/v1/upload?category=cars 随着 multipart/form-data
  3. FastAPI排队 芹菜任务 (通过Redis代理)
  4. Celery worker处理文件:
    • 将文本拆分为约200个字符块
    • 将每个块嵌入 松果 llama-text-embed-v2
    • 在匹配的命名空间下存储向量(cars 或 addresses)
  5. 返回成功响应

项目结构

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 17
  • redis --端口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": "..." }