医疗诊所RAG聊天机器人

基于RAG技术的AI医疗诊所问答助手,整合LangChain、Pinecone和Groq LLM,提供精准的诊所FAQ检索与生成服务。

  • by h4r1yzz
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 h4r1yzz/mcp-rag

使用说明

AI医疗诊所助理-RAG聊天机器人

用于医疗诊所常见问题的全栈人工智能聊天机器人应用程序,由 检索增强生成(RAG) 使用LangChain、Pinecone和Groq LLM。

部署链接:(http://52.91.160.51:8080/)

两种部署选项:

  • 🚀 Flask应用程序 (生产)
  • 💻 Next.js+快速API (发展)

📋 目录


✨ 特性

核心RAG能力

  • 🤖 检索增强生成(RAG) -来自诊所常见问题知识库的准确答案
  • 🔍 语义搜索 -基于Google Generative AI嵌入的松果矢量数据库
  • 💬 流媒体响应 -使用Groq的Llama 3.3 70B进行实时LLM响应
  • 🛡️ 稳健的错误处理 -全面的异常处理和日志记录
  • ⚡ 优化性能 -单例服务、连接池和缓存

(Flask应用程序)或(Next.js+FastAPI)

  • 💬 多会话管理 -创建、切换和管理多个聊天对话
  • 📌 固定重要聊天 -固定常用对话以快速访问
  • 🔄 自动保存对话 -自动持久化到本地存储
  • 🎨 现代UI/UX -简洁、灵敏的设计,支持暗/亮主题
  • ⚡ 实时流媒体 -使用打字指示器实时流式传输人工智能响应
  • �🔍 搜索功能 -搜索对话历史记录

🎥 演示

Flask应用程序界面(生产)

Next.js+FastAPI接口(开发)

聊天界面功能

  • 首次加载时自动创建聊天
  • 实时流媒体响应
  • 侧边栏中的对话历史记录
  • 固定/取消固定对话
  • 暗/亮主题切换

关键能力

  • 回答诊所的具体问题(时间、定价、服务)
  • 从FAQ知识库中提供准确的信息
  • 根据上下文处理后续问题
  • 实时流式响应

🏗️ 建筑

生产(Flask应用程序)

┌─────────────────────────────┐
│      Flask Application      │
│  (UI + API on Port 8080)    │
│                             │
│  ┌──────────┐  ┌─────────┐ │
│  │Templates │  │   API   │ │
│  │  (HTML)  │  │Endpoints│ │
│  └──────────┘  └─────────┘ │
└──────────────┬──────────────┘
               │
    ┌──────────┴────┬──────────┬──────────┐
    ▼               ▼          ▼          ▼
┌────────┐      ┌─────┐    ┌──────┐  ┌──────┐
│Pinecone│      │Groq │    │Google│  │ FAQ  │
│Vector  │      │ LLM │    │Embed │  │ JSON │
│  DB    │      │     │    │      │  │      │
└────────┘      └─────┘    └──────┘  └──────┘

开发(Next.js+FastAPI-可选)

┌─────────────────┐
│   Next.js UI    │
│  (Port 3000)    │
└────────┬────────┘
         │ HTTP/SSE
         ▼
┌─────────────────┐
│  FastAPI Server │
│  (Port 8000)    │
└────────┬────────┘
         │
    ┌────┴────┬──────────┬──────────┐
    ▼         ▼          ▼          ▼
┌────────┐ ┌─────┐  ┌──────┐  ┌──────┐
│Pinecone│ │Groq │  │Google│  │ FAQ  │
│Vector  │ │ LLM │  │Embed │  │ JSON │
│  DB    │ │     │  │      │  │      │
└────────┘ └─────┘  └──────┘  └──────┘

RAG管道:

  1. 用户查询→ 使用Google Generative AI嵌入
  2. Pinecone矢量数据库中的语义搜索
  3. 检索到Top-K相关FAQ块
  4. 上下文+查询发送给Groq LLM(Llama 3.3 70B)
  5. 将响应流式传输回前端

🎯 架构决策:为什么选择Flask?

优先考虑快速交付和简单性

该项目最初是由 Next.js+快速API 架构,提供现代、解耦的前端后端设置。然而在评估了项目需求和部署目标之后, Flask被选为主要生产部署选项.

做出这一决定的主要原因

1.关注核心功能

  • 主要目标是快速有效地交付一个可用的RAG聊天机器人
  • Flask的单片架构允许更快的迭代和部署
  • 降低复杂性意味着将更多时间花在RAG质量、快速工程和用户体验上

2.简化部署和操作

  • 单容器部署 -一个Docker镜像,而不是协调多个服务
  • 降低基础设施的复杂性 -无需管理单独的前端/后端服务
  • 降低运营开销 -更容易监控、记录和调试
  • 更快的CI/CD管道 -单一构建和部署过程

3.适合项目规模

  • 对于医疗诊所常见问题聊天机器人,Flask的功能绰绰有余
  • 使用Jinja2模板的服务器端渲染提供了出色的性能
  • 无需复杂的客户端状态管理或路由

4.开发效率

  • Flask的简单性允许快速原型制作和功能开发
  • 更少的移动部件意味着更快的调试和迭代周期
  • 用于UI和API的单个代码库减少了上下文切换

Next.js+FastAPI:仍可开发

这 Next.js+快速API 安装程序作为 可选开发路径 但只能在本地运行:

  • 基于React的现代UI开发
  • 解耦的前端/后端架构
  • TypeScript和Tailwind CSS工作流程
  • 高级客户端功能

实用工程方法

这一决定反映了 实用工程哲学:

  • ✅ 船舶工作软件快速
  • ✅ 选择符合要求的最简单解决方案
  • ✅ 优化可维护性和操作简单性
  • ✅ 避免对假设的未来需求进行过度设计

基于Flask的架构提供了所有核心功能——RAG检索、流式响应、对话管理和干净的UI——同时保持了部署的简单性和易用性。


🛠️ 技术栈

生产堆栈(Flask应用程序)

  • 框架: Flask 3.0+(Python 3.11+)
  • UI: HTML5、CSS3、普通JavaScript
  • LLM Groq(火焰3.3 70b多功能)
  • 嵌入: 谷歌生成人工智能(模型/嵌入-001768维)
  • 矢量数据库: 松果(无服务器,us-east-1)
  • RAG框架: LangChain
  • 配置: Pydantic设置
  • 登录中: 洛古鲁
  • 部署: Docker、GitHub操作、AWS ECR/EC2

开发栈(Next.js+FastAPI-可选)

  • 后端框架: FastAPI(Python 3.11+)
  • 前端框架: Next.js 15.2(React 19)
  • 语言: TypeScript
  • 造型: 顺风CSS 4
  • 动画: 帧运动
  • 图标: Lucide反应
  • HTTP客户端: 获取具有SSE支持的API

📦 先决条件

在开始之前,请确保已安装以下内容:

所需软件

  • python 3.11或更高(下载)
  • Node.js: 18.0或更高(下载)
  • pnpm: 最新版本
  • Git: 用于克隆存储库

必需的API密钥

您需要注册以下服务(所有服务都有免费等级):

  1. 谷歌人工智能工作室 (用于嵌入)

    • 注册:https://makersuite.google.com/app/apikey
    • 从仪表板获取API密钥
  2. Groq (法学硕士)

    • 注册:https://console.groq.com/
    • 在仪表板中创建API键
  3. 松果 (用于矢量数据库)

    • 注册:https://www.pinecone.io/
    • 注意API密钥和环境
  4. 职员 (可选,用于身份验证)

    • 注册:https://clerk.com/
    • 创建新应用程序
    • 获取您的可发布密钥和密钥

🚀 安装

1.克隆存储库

git clone https://github.com/yourusername/mcp-rag-chatbot.git
cd mcp-rag

2.后端设置

# Navigate to server directory
cd server

# Create virtual environment
python -m venv venv

# Activate virtual environment
source venv/bin/activate

# using uv:
uv pip install -r requirements.txt

3.前端设置

# Navigate to frontend directory
cd client/mcp_rag

# Install dependencies using pnpm
pnpm install


⚙️ 配置

1.后端环境变量

创建一个 .env 文件在 server/ 目录:

cd server
cp .env.example .env

编辑 server/.env 使用API密钥:

# Required API Keys
GOOGLE_API_KEY=your_google_ai_studio_api_key_here
GROQ_API_KEY=your_groq_api_key_here
PINECONE_API_KEY=your_pinecone_api_key_here

# Pinecone Configuration
PINECONE_INDEX_NAME=clinic-faqs
PINECONE_ENV=us-east-1

# Optional: Model Configuration (defaults shown)
# EMBEDDING_MODEL=models/embedding-001
# EMBEDDING_DIMENSION=768
# LLM_MODEL=llama-3.3-70b-versatile
# CHUNK_SIZE=500
# CHUNK_OVERLAP=100

2.前端环境变量(可选)

如果使用Clerk身份验证,请创建 client/mcp_rag/.env.local:

NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key
CLERK_SECRET_KEY=your_clerk_secret_key

🏃 运行应用程序

选项1:Flask应用程序(推荐-简单快速)

需要单个终端:

cd server

# Activate virtual environment if not already activated
source venv/bin/activate  # macOS/Linux

# Start Flask application
python flask_app.py

预期产量:

 * Serving Flask app 'flask_app'
 * Debug mode: on
 * Running on http://0.0.0.0:3000

申请可在以下网址获得: http://localhost:3000


选项2:Next.js+FastAPI(完整开发设置)

需要两个终端窗口:

终端1:启动后端服务器

cd server

# Activate virtual environment if not already activated
source venv/bin/activate  # macOS/Linux

# Start FastAPI server
uvicorn main:app --reload

预期产量:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process
INFO:     Started server process
INFO:     Waiting for application startup.
INFO:     Application startup complete.

后端将在以下网址提供: http://localhost:8000

终端2:启动前端服务器

cd client/mcp_rag

# Start Next.js development server
pnpm dev

预期产量:

  ▲ Next.js 15.2.4
  - Local:        http://localhost:3000
  - Turbopack:    enabled

 ✓ Ready in 2.5s

前端将在以下网址提供: http://localhost:3000

特征:

  • ✅ 完整的Next.js开发经验
  • ✅ 多对话管理
  • ✅ 固定/取消固定对话
  • ✅ 搜索功能

Flask应用程序(生产)

注: 生产Docker部署使用端口8080(而开发使用端口3000)。


🚀 CI/CD部署

使用GitHub Actions自动部署到AWS EC2。

快速CI/CD设置

先决条件:

  • 具有ECR和EC2访问权限的AWS帐户
  • EC2实例配置为GitHub自托管运行器
  • 已配置GitHub存储库机密

工作流程:

  1. 将代码推送到 main 或 master 分支(或手动触发)
  2. GitHub Actions自动构建Flask Docker镜像
  3. 图片推送到亚马逊ECR
  4. 使用部署到EC2 docker run

访问已部署的应用程序:

http://YOUR_EC2_IP:8080

📁 项目结构

mcp-rag-chatbot/
├── server/                          # Backend
│   ├── flask_app.py                 # 🚀 Flask application (PRODUCTION)
│   ├── main.py                      # FastAPI application (development only)
│   ├── config.py                    # Centralized configuration (Pydantic)
│   ├── logger.py                    # Logging configuration
│   ├── prompts.py                   # LLM prompt templates
│   ├── requirements.txt             # Python dependencies
│   ├── .env.example                 # Environment variables template
│   │
│   ├── templates/                   # Flask HTML templates
│   │   └── index.html               # Chat interface UI
│   │
│   ├── static/                      # Flask static files
│   │   └── chat.js                  # Chat JavaScript
│   │
│   ├── data/
│   │   └── clinic_faqs.json         # FAQ knowledge base
│   │
│   ├── services/
│   │   ├── vectorstore_service.py   # Pinecone vector store
│   │   └── llm_service.py           # LLM service factory
│   │
│   ├── routes/                      # FastAPI routes (development only)
│   │   ├── ask_question.py          # POST /ask/ - RAG query endpoint
│   │   └── groq_stream.py           # POST /groq_stream/ - Streaming endpoint
│   │
│   ├── modules/
│   │   ├── faq_loader.py            # Load FAQs from JSON
│   │   ├── query_handlers.py        # Query processing logic
│   │   └── load_vectorstore.py      # Vector store initialization
│   │
│   ├── middlewares/                 # FastAPI middleware (development only)
│   │   └── exception_handlers.py    # Global exception handling
│   │
│   └── tests/
│       ├── test_rag_retrieval.py    # RAG system tests
│       └── test_results.json        # Test results
│
├── client/mcp_rag/                  # Frontend (Next.js - development only)
│   ├── app/
│   │   ├── layout.tsx               # Root layout with Clerk provider
│   │   ├── page.tsx                 # Home page
│   │   └── globals.css              # Global styles
│   │
│   ├── components/
│   │   ├── AIAssistantUI.jsx        # Main chat interface
│   │   ├── Sidebar.jsx              # Conversation sidebar
│   │   ├── ChatPane.jsx             # Chat message display
│   │   ├── Composer.jsx             # Message input component
│   │   ├── Message.jsx              # Individual message component
│   │   ├── ConversationRow.jsx      # Sidebar conversation item
│   │   ├── Header.jsx               # Chat header
│   │   ├── SearchModal.jsx          # Search conversations
│   │   ├── SettingsPopover.jsx      # Settings menu
│   │   └── ThemeToggle.jsx          # Dark/light theme toggle
│   │
│   ├── lib/
│   │   └── api.ts                   # API client functions
│   │
│   ├── package.json                 # Node.js dependencies
│   └── next.config.ts               # Next.js configuration
│
├── .github/
│   └── workflows/
│       └── deploy.yml               # GitHub Actions CI/CD workflow
│
├── Dockerfile                       # Docker configuration for Flask app
├── .gitignore                       # Git ignore rules
└── README.md                        # This file

关键文件:

  • 🚀 server/flask_app.py -生产Flask应用程序(已部署)
  • 📄 server/templates/index.html -聊天UI模板
  • 📜 server/static/chat.js -客户端聊天逻辑
  • 🐳 Dockerfile -Flask应用程序的单个容器
  • ⚙️ .github/workflows/deploy.yml -CI/CD管道

🔌 API 文档

基本URL

Flask应用程序(生产):

Local: http://localhost:3000
Production: http://YOUR_EC2_IP:8080

FastAPI(开发):

http://localhost:8000

端点

Flask应用程序端点

得到/ -聊天界面

  • 返回HTML聊天界面
  • 通过浏览器访问

GET/健康 -健康检查

curl http://localhost:3000/health

POST/groq_stream -流媒体聊天

curl -X POST "http://localhost:3000/groq_stream" \
  -F "question=Tell me about your services" \
  -F "thread_id=my-conversation"
  • 返回:服务器发送事件(SSE)流
  • 参数:
    • question (必填):用户提问
    • thread_id (可选):上下文的对话线程ID

FastAPI端点(仅限开发)

POST/ask -RAG查询

curl -X POST "http://localhost:8000/ask" \
  -F "question=What are your hours?"
  • 返回:带响应和源的JSON

POST/groq_stream -流媒体聊天

curl -X POST "http://localhost:8000/groq_stream" \
  -F "question=Tell me about your services" \
  -F "thread_id=my-conversation"
  • 返回:服务器发送事件(SSE)流

📚 知识库

FAQ结构

知识库存储在 server/data/clinic_faqs.json 具有以下结构:

{
  "faqs": [
    {
      "id": "faq_001",
      "question": "What are your operating hours?",
      "answer": "Our clinic is open Monday through Friday...",
      "category": "General Information",
      "tags": ["hours", "schedule", "availability"]
    }
  ]
}

当前常见问题类别

  • 一般信息 -时间、地点、联系方式
  • 预约 -预订、预约、日程安排
  • 账单和付款 -付款方式、融资
  • 设施 -停车场、无障碍设施
  • 治疗 -激光脱毛、肉毒杆菌毒素等。
  • 安全和证书 -认证、安全
  • 咨询 -免费咨询、评估
  • 初次访问 -准备,带什么
  • 政策 -取消、重新安排

嵌入策略

每个常见问题解答都作为一个完整的单元嵌入:

Question: {question}
Answer: {answer}
Category: {category}

这确保了:

  • 每个块中的完整上下文
  • 检索精度高
  • 用户查询的相关答案

🐛 故障排除

常见问题

1.“找不到模块”错误

问题: 未安装Python依赖项

解决方案:

cd server
uv pip install -r requirements.txt

2.“找不到GOOGLE_API_KEY”

问题: 未设置环境变量

解决方案:

# Check if .env file exists
ls server/.env

# If not, create it from template
cp server/.env.example server/.env

# Edit with your API keys
nano server/.env

4.前端无法连接到后端

问题: CORS或后端未运行

解决方案:

# Check backend is running on port 8000
curl http://localhost:8000

# Check CORS settings in server/config.py
# Ensure http://localhost:3000 is in CORS_ORIGINS

5.“超出速率限制”错误

问题: 达到API利率限制

解决方案:

  • 请等待几分钟,然后重试
  • 在相应的仪表板中检查您的API配额
  • 考虑升级到付费级别以获得更高的限额

6.对话没有持续

问题: 本地存储不工作

解决方案:

  • 检查浏览器控制台是否有错误
  • 清除浏览器缓存并重新加载
  • 确保在浏览器设置中启用了localStorage