diff --git a/WeeklyReports/Hackathon_10th/xiaozhejiya/[WeeklyReports]2026.2.23~2026.3.8.md b/WeeklyReports/Hackathon_10th/xiaozhejiya/[WeeklyReports]2026.2.23~2026.3.8.md new file mode 100644 index 00000000..9a9fe5d8 --- /dev/null +++ b/WeeklyReports/Hackathon_10th/xiaozhejiya/[WeeklyReports]2026.2.23~2026.3.8.md @@ -0,0 +1,134 @@ +## 姓名 + +李溯寒 + +## 实习项目 + +PaddleOCR + ERNIE × Open-Source Ecosystem + +## 本周工作 + +### 数据库驱动科目与标签一致性 + +- **删除 `detect_subject` 硬编码关键词匹配**(`db/crud.py`): + - 原先通过 6 个关键词集合(约 50 个关键词)推断科目,无法覆盖新科目 + - 改由编排智能体在 OCR 分析阶段直接识别科目,`save_questions` 时传入 +- **新增 `get_existing_subjects()` 和 `get_existing_tag_names()`**(`db/crud.py`): + - 从数据库查询已有科目和知识点标签,支持按科目过滤标签 +- **Workflow 注入数据库上下文**(`src/workflow.py`): + - `split_questions_node` 启动时加载已有科目和标签,构建 `db_context` 文本注入到发给编排智能体的用户消息中 + - 编排智能体收到"历史数据参考"后,优先复用已有科目名称和标签,保证跨会话一致性 + +### OCR 双层重试机制 + +- **OCR 中间件加入 3 次指数退避重试**(`error_correction_agent/middleware/ocr_middleware.py`): + - `before_agent` 钩子中新增重试逻辑,延迟 15s / 30s / 60s,全部失败后注入 `retry_ocr` 使用提示 +- **新增 `retry_ocr` 工具**(`error_correction_agent/tools/question_tools.py`): + - 供编排智能体在中间件重试全部失败后手动调用,创建 `PaddleOCRClient` 执行异步 OCR,返回简化后的数据 JSON + - 形成"中间件自动重试 → 智能体手动重试"两层容错 + +### 分割并行化与重试增强 + +- **分割题目改为并行处理**(`src/workflow.py`): + - 原流程由编排智能体串行调用 `split_batch`,改为 workflow 层直接构建 2 页一批、1 页重叠的批次列表 + - 使用 `ThreadPoolExecutor` + `as_completed` 并行调用各批次,结果按批次序号排序后合并 + - 新增 `_build_overlapping_batches()`、`_run_ocr_and_simplify()`、`_load_db_context()`、`_identify_subject()` 等辅助函数 +- **`split_batch` / `correct_batch` 加入 3 次重试,每次创建全新 agent 实例**(`error_correction_agent/tools/question_tools.py`): + - 避免上一次失败的消息历史污染新请求(解决 DeepSeek API 400 "insufficient tool messages" 错误) +- **知识点标签按科目过滤**(`src/workflow.py`): + - 调用 `get_existing_tag_names(db, subject=subject)` 按科目过滤,避免跨科目标签混入 + +### 多模型供应商支持 + +- **`_init_model` 支持 provider 参数**(`error_correction_agent/agent.py`): + - 支持 `"deepseek"` 和 `"ernie"` 两个供应商,ernie 通过 OpenAI 兼容接口连接百度 AIStudio +- **全链路透传 `model_provider`**(`src/workflow.py`、`error_correction_agent/tools/question_tools.py`、`web_app.py`): + - 前端选择 → 请求体传 → `WorkflowState` 存 → 工具透传 → `_init_model` 按字符串判断走哪个分支 +- **前端模型选择器**(`frontend/src/App.vue`): + - 使用 HeadlessUI Listbox 替代原生 `