ClareVoiceV1 / ARCHITECTURE.md
claudqunwang's picture
Add structured AI courseware APIs
2a4f012
# Clare AI + Weaviate 技术架构文档
## 📋 目录
1. [系统概述](#系统概述)
2. [架构图](#架构图)
3. [技术栈](#技术栈)
4. [核心组件](#核心组件)
5. [数据流](#数据流)
6. [部署架构](#部署架构)
7. [关键技术决策](#关键技术决策)
---
## 🎯 系统概述
**Clare AI** 是一个基于 RAG (Retrieval-Augmented Generation) 的智能教学助手,通过 **Weaviate Cloud** 向量数据库提供课程知识检索能力。
### 核心功能
- **多模式教学**:概念解释、苏格拉底式辅导、考试准备、作业助手、快速总结
- **知识检索**:从 151+ 个课程文档(PDF、DOCX、代码等)中检索相关内容
- **会话记忆**:跟踪学生弱项、认知状态、学习进度
- **多语言支持**:中英文双语对话
---
## 🏗️ 架构图
```
┌─────────────────────────────────────────────────────────────┐
│ Hugging Face Space │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ ClareVoice (Gradio App) │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ Frontend: Gradio UI │ │ │
│ │ │ - Chat Interface │ │ │
│ │ │ - File Upload │ │ │
│ │ │ - Session Management │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ Core Logic (clare_core.py) │ │ │
│ │ │ - LLM: GPT-4.1-mini (OpenAI) │ │ │
│ │ │ - Prompt Engineering │ │ │
│ │ │ - Session Memory │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ RAG Engine (rag_engine.py) │ │ │
│ │ │ - Local FAISS (上传文件) │ │ │
│ │ │ - PDF/DOCX Parsing │ │ │
│ │ └──────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ │ HTTPS + API Key │
│ ▼ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Weaviate Cloud (GCP) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Collection: GenAICourses │ │
│ │ - 151+ 文档块 (chunks) │ │
│ │ - Vector Embeddings (384-dim) │ │
│ │ - Metadata (source_file, section) │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Index Builder (本地/CI) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ build_weaviate_index.py │ │
│ │ - 读取 GENAI COURSES/ 目录 │ │
│ │ - Embedding: sentence-transformers/all-MiniLM-L6-v2 │ │
│ │ - 上传到 Weaviate Cloud │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## 🛠️ 技术栈
### 前端层
- **Gradio 6.0+**: Web UI 框架,支持实时对话、文件上传
- **Python 3.11**: 运行环境
### 后端层
- **OpenAI GPT-4.1-mini**: 主要 LLM,用于生成回答
- **LangChain**: LLM 编排框架
- **LlamaIndex**: 向量检索框架
### 向量数据库
- **Weaviate Cloud**: 托管向量数据库(GCP)
- Collection: `GenAICourses`
- Embedding Model: `sentence-transformers/all-MiniLM-L6-v2` (384维)
- 文档类型: PDF, DOCX, TXT, PY, IPYNB
### Embedding 模型
- **建索引**: `sentence-transformers/all-MiniLM-L6-v2` (免费,本地运行)
- **查询**: 与建索引使用相同模型(保证向量空间一致)
### 文档解析
- **unstructured.io**: PDF 解析(优先)
- **pypdf**: PDF 解析(降级方案)
- **python-docx**: DOCX 解析
---
## 🔧 核心组件
### 1. ClareVoice App (`app.py`)
**职责**: 主应用入口,处理用户交互
**关键功能**:
- Gradio UI 渲染
- 用户会话管理
- 调用 RAG 检索和 LLM 生成
- Weaviate 直连检索
**关键代码**:
```python
# Weaviate 检索(优先)
if USE_WEAVIATE_DIRECT:
course_chunks = _retrieve_from_weaviate(message)
# 本地 FAISS(上传文件)
rag_context_text = retrieve_relevant_chunks(message, rag_chunks)
```
### 2. RAG Engine (`rag_engine.py`)
**职责**: 本地文件向量化和检索
**功能**:
- 解析上传的 PDF/DOCX
- 构建 FAISS 索引(内存)
- 向量相似度检索
### 3. Clare Core (`clare_core.py`)
**职责**: LLM 调用和 Prompt 构建
**功能**:
- 构建多轮对话上下文
- 整合 RAG 检索结果
- 管理会话记忆(弱项、认知状态)
- 生成教学回答
### 4. Weaviate 检索 (`app.py` → `_retrieve_from_weaviate`)
**职责**: 从 Weaviate Cloud 检索课程知识
**流程**:
1. 加载 embedding 模型(缓存)
2. 连接 Weaviate Cloud
3. 将用户问题编码为向量
4. 向量相似度搜索(top_k=5)
5. 返回相关文档块
**关键特性**:
- **超时保护**: 45秒超时,避免阻塞
- **模型预热**: 启动时后台加载,避免首次查询慢
- **错误降级**: 失败时静默返回空,不影响主流程
---
## 📊 数据流
### 用户提问流程
```
1. 用户输入问题
2. 检测是否为学术查询 (is_academic_query)
├─ 是 → 触发 RAG 检索
│ │
│ ├─ Weaviate 检索 (优先)
│ │ └─ 返回课程文档块
│ │
│ └─ 本地 FAISS 检索 (上传文件)
│ └─ 返回文档块
└─ 否 → 跳过 RAG
3. 构建 Prompt
├─ System Prompt (Clare 身份)
├─ Session Memory (弱项、认知状态)
├─ RAG Context (检索到的文档)
└─ User Message
4. 调用 OpenAI API (GPT-4.1-mini)
5. 返回回答 + 更新会话历史
```
### 索引构建流程
```
1. 本地运行 build_weaviate_index.py
2. 读取 GENAI COURSES/ 目录
├─ 支持格式: .md, .pdf, .txt, .py, .ipynb, .docx
└─ 递归扫描所有子目录
3. 文档分块 (LlamaIndex SimpleDirectoryReader)
└─ 自动分块,保留元数据
4. Embedding 编码
└─ sentence-transformers/all-MiniLM-L6-v2
5. 上传到 Weaviate Cloud
├─ Collection: GenAICourses
├─ 向量 + 元数据 (source_file, section)
└─ 验证 object count
```
---
## 🚀 部署架构
### Hugging Face Space (ClareVoice)
**部署方式**: Docker Space
**Dockerfile 关键配置**:
```dockerfile
FROM python:3.11-slim
# 安装系统依赖 (libxcb for unstructured)
RUN apt-get update && apt-get install -y libxcb1 libxcb-xinerama0
# 强制升级 huggingface_hub>=1.3.0
RUN pip install --upgrade "huggingface_hub>=1.3.0,<2.0"
# 安装依赖
RUN pip install -r requirements.txt
```
**环境变量 (Secrets)**:
- `OPENAI_API_KEY`: OpenAI API 密钥
- `WEAVIATE_URL`: Weaviate Cloud REST 地址
- `WEAVIATE_API_KEY`: Weaviate API Key
- `WEAVIATE_COLLECTION`: 集合名(默认 `GenAICourses`
**启动流程**:
1. 加载环境变量
2. 后台预热 Weaviate embedding 模型
3. 启动 Gradio 服务(端口 7860)
### Weaviate Cloud
**托管**: Google Cloud Platform (GCP)
**配置**:
- Cluster URL: `https://riiqvgc7tuum6cgwhik9ra.c0.us-west3.gcp.weaviate.cloud`
- Authentication: API Key
- Collection Schema: 自动创建(LlamaIndex 管理)
**数据规模**:
- 文档数量: 151+ 文件
- 文档块数: ~917 objects
- 向量维度: 384 (all-MiniLM-L6-v2)
---
## 💡 关键技术决策
### 1. 为什么选择 Weaviate Cloud?
**优势**:
-**托管服务**: 无需自建数据库,降低运维成本
-**高性能**: 向量检索延迟 <100ms
-**可扩展**: 支持大规模文档库
-**API 简单**: RESTful API,易于集成
**对比其他方案**:
-**本地 FAISS**: 内存限制,无法持久化
-**Pinecone**: 成本较高
-**自建 Weaviate**: 需要服务器和运维
### 2. 为什么使用 sentence-transformers 而非 OpenAI Embeddings?
**原因**:
-**成本**: 免费,无 API 调用费用
-**一致性**: 建索引和查询使用同一模型,保证向量空间一致
-**离线能力**: 本地运行,不依赖外部 API
**权衡**:
- ⚠️ **性能**: OpenAI `text-embedding-3-small` (1536维) 可能更准确
- ⚠️ **延迟**: 首次加载模型需要 10-30 秒(已通过预热解决)
### 3. 为什么采用 Docker Space 而非 Gradio SDK?
**原因**:
-**依赖控制**: 可以强制升级特定包(如 `huggingface_hub`
-**系统库**: 可以安装 `libxcb` 等系统依赖
-**灵活性**: 完全控制构建过程
### 4. 双检索策略(Weaviate + FAISS)
**设计**:
- **Weaviate**: 课程知识库(151+ 文档,持久化)
- **FAISS**: 用户上传文件(临时,内存)
**优势**:
- ✅ 课程知识稳定可用
- ✅ 用户文件灵活处理
- ✅ 降级方案:Weaviate 失败时仍有 FAISS
---
## 📈 性能指标
### 检索性能
- **Weaviate 检索**: ~500-1000ms(含网络延迟)
- **FAISS 检索**: ~10-50ms(内存检索)
- **Embedding 编码**: ~100-300ms(首次需加载模型)
### LLM 响应
- **GPT-4.1-mini**: ~2-5秒(取决于回答长度)
### 系统资源
- **内存**: ~2-4GB(含 embedding 模型)
- **CPU**: 中等负载(embedding 计算)
---
## 🔒 安全与隐私
### API 密钥管理
- ✅ 使用 Hugging Face Secrets(加密存储)
- ✅ 不在代码中硬编码密钥
### 数据隐私
- ✅ 用户会话数据不持久化(仅内存)
- ✅ Weaviate 仅存储课程文档(公开内容)
- ✅ 用户上传文件仅用于当前会话
---
## 🐛 已知问题与解决方案
### 1. huggingface_hub 版本冲突
**问题**: HF Space 预装旧版 (0.36.2),`transformers` 需要 >=1.3.0
**解决**:
- Dockerfile 中强制升级
- App 启动时 monkey-patch `is_offline_mode`
### 2. Gradio 6.0 API 变更
**问题**: `Chatbot` 不再支持 `type="tuples"`,改为 `messages` 格式
**解决**: 添加格式转换函数 `_tuples_to_messages` / `_messages_to_tuples`
### 3. Embedding 模型首次加载慢
**问题**: 首次检索需要 10-30 秒加载模型
**解决**: 启动时后台预热(`_warmup_weaviate_embed`)
---
## 📝 总结
Clare AI 采用 **RAG + LLM** 架构,通过 **Weaviate Cloud** 提供稳定的课程知识检索能力。系统设计注重:
1. **可靠性**: 多重降级方案,确保服务可用
2. **性能**: 模型预热、超时保护、缓存机制
3. **可扩展**: 托管服务,易于扩展文档库
4. **成本**: 使用免费 embedding 模型,降低运营成本
---
**文档版本**: v1.0
**最后更新**: 2026-02-11
**维护者**: Clare AI Team