# 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