Files
agent_jrxml/ROADMAP.md
T
panda 7c1aa7d934 docs: update architecture docs for Vue 3 + FastAPI separation, add one-click start.bat
- CLAUDE.md: remove duplicate architecture section, fix MAX_RETRY 5→3
- README.md: update architecture diagram to 3-tier, add start.bat instructions
- ROADMAP.md: add 阶段六 layered generation v5 (items 16-20)
- start.bat: one-click startup with auto port-kill and path-with-spaces fix
- package-lock.json: updated from npm install
2026-05-21 22:10:22 +08:00

203 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 改进路线图
## 阶段一:代码质量(低风险,快速交付)
### 1. Prompt 拆分 ✓
- [x] 创建 `prompts/` 目录
- [x] 7 个 prompt 各拆为独立 `.md` 文件
- [x] `nodes.py` 改为从文件加载
- [x] 支持热重载(文件变更无需重启)
### 2. 修复无效代码 ✓
- [x] `backend/llm.py``get_num_tokens()` 修复为正确 API
- [x] `backend/embeddings.py` — 修复 docstring 函数名不一致
- [x] `backend/llm.py` — 统一 LLM 接口基类 `_BaseLLM`
---
## 阶段二:用户体验(核心改造)
### 3. 流式输出 + 节点平铺 ✓
- [x] `backend/llm.py` — LLM 工厂支持 `stream()` 统一接口
- [x] `agent/nodes.py` — generate/modify/correct 节点使用流式 + `get_stream_writer()`
- [x] `app.py` — 使用 `stream_mode=["updates", "custom"]` 捕获流式事件
- [x] 节点状态平铺(处理过程 expander 逐节点展示)
- [x] 流式完成后节点自动折叠
- [x] 完成后单独展示「总结卡片」
### 4. 错误自增长知识库 ✓
- [x] `backend/error_kb.py` — ErrorKB 类(ChromaDB 持久化)
- [x] 错误指纹去重(标准化 + MD5
- [x] `correct_jrxml` — 保存修正前状态到 `last_error_case`
- [x] `validate` — 修正成功时自动记录(仅新错误,自动去重)
- [x] `retrieve` — 搜索错误知识库,注入历史修正案例
- [x] 记录内容:错误 + 修正前后 JRXML + prompt + 工具链 + 模型
### 5. 文件上传支持 ✓
- [x] `backend/file_parser.py` — 统一解析接口
- [x] 图片 → PIL 元信息 + PaddleOCR(可选安装后自动识别)
- [x] PDF → pdfplumber / PyMuPDF 文本提取
- [x] DOCX → python-docx 文本提取
- [x] 纯文本 (.txt/.csv/.json/.xml) → 直接读取
- [x] `can_use_vision()` — 根据模型名判断是否支持原生多模态
- [x] `app.py` — 侧边栏文件上传组件(多文件,可移除)
- [x] 上传文本自动注入下一条消息前缀
### 6. A4 图片模板识别 ✓
- [x] `backend/layout_analyzer.py` — 完整布局分析模块
- [x] A4 比例判定:exact(±3%) / close(±8%) / not_a4 三档
- [x] PaddleOCR 布局分析:逐元素提取坐标(x,y,w,h)、字号、文本
- [x] 行分组:Y 轴容差自动聚类
- [x] 结构化输出:`图片模板共 X 行,第 1 行有 Y 个元素,其中元素 a 长...高...字体...内容是...`
- [x] 检测门槛:≥2 个 OCR 元素 + A4 比例 → 标记为模板
- [x] `app.py` — 上传图片/PDF 时自动触发布局分析,替换为布局描述
### 7. 会话历史 JRXML 下载 ✓
- [x] `agent/state.py` — 新增 `jrxml_versions` 字段
- [x] `agent/nodes.py``finalize` 节点追加版本记录
- [x] `app.py` — 侧边栏"历史版本"折叠区,每版本独立下载按钮
### 8. 预览功能修复 ✓
- [x] 根因:`preview_report` 路由到 `save_session``validate` 触发不必要的验证修正循环
- [x] 修复:`route_after_save` — 预览/导出意图跳过验证直接 `finalize`
---
## 阶段三:细节修复
### 9. Ctrl+C 修复 ✓
- [x] `app.py` — 注入 JS 拦截裸 `c` 键,保留 Ctrl+C 复制行为
---
## 阶段四:可观测性
### 10. 结构化日志系统 ✓
- [x] `backend/logger.py` — 集中日志配置模块
- [x] JSON 格式化(每行一条记录,便于 jq/pandas 分析)
- [x] 请求级 trace_idcontextvars 自动传播,一次用户请求贯穿全链路)
- [x] 独立 LLM 日志文件 `logs/llm.log`(记录完整 prompt 和 response
- [x] 时区:UTC+8(中国时区)
- [x] 日志轮转(单文件 10MB,保留 5 备份)
- [x] `backend/llm.py``_LLMLoggingWrapper` 包装所有 LLM 后端
- [x] 记录每次 invoke/stream 的请求 prompt、响应内容、耗时、模型、调用来源
- [x] 异常时也记录完整 prompt
- [x] `agent/nodes.py``@log_node` 装饰器覆盖 18 个节点
- [x] 入口/出口/异常三个阶段的日志
- [x] 自动记录 state 关键字段摘要(session_id、intent、status、jrxml_length 等)
- [x] 每个节点耗时(duration_ms
- [x] `agent/graph.py``@_log_route` 装饰器覆盖 9 个路由函数
- [x] 记录每次路由决策(来源 → 目标)
- [x] `app.py` — 用户交互日志
- [x] 收到用户输入(含上传文件信息)
- [x] 代理执行开始/完成(含最终 intent、status、jrxml_length
- [x] 异常时记录错误详情
- [x] 会话新建/切换/删除操作日志
- [x] `backend/session.py` — 会话创建/删除日志
- [x] `backend/validation.py` — 验证完成/连接失败日志
- [x] `.env.example` — 新增 `LOG_DIR``LOG_LEVEL` 配置项
- [x] `.gitignore` — 新增 `logs/` 忽略规则
---
## 执行顺序建议
```
1. Prompt 拆分 ──► 2. 无效代码修复
3. 流式输出 + 节点平铺
┌─────────────┼─────────────┐
▼ ▼ ▼
4. 错误自增长 5. 文件上传 7. 下载历史
│ │
▼ ▼
6. A4 模板识别 8. 预览修复
9. Ctrl+C 修复
10. 结构化日志系统
```
---
## 阶段五:OCR 与智能上传 (v3/v4) ✓
### 11. OCR 单据字段精确提取 ✓
- [x] `backend/ocr_extractor.py` — 4 策略优先级提取 (exact_match → kv_pair → regex → table_match)
- [x] PaddleOCR 首次识别后将原始结果(含所有文本元素 + bbox坐标)持久化
- [x] `_format_ocr_context()` — OCR 结果格式化为 LLM prompt 注入
- [x] `process_input` 节点在上传图片时自动触发 OCR 字段提取
- [x] OCR 结果持久化到会话文件
### 12. 多模态聊天输入 ✓
- [x] `app.py``st.chat_input` 替换为 `st_multimodal_chatinput`
- [x] 支持 Ctrl+V 粘贴文件 + 拖拽 + 文件按钮
- [x] `_process_uploaded_file()` — 提取共享文件处理逻辑(消除 ~70 行重复代码)
- [x] 剪贴板文件 base64 解码 + MIME type → 扩展名推断
### 13. 多格式文件支持 ✓
- [x] `backend/file_parser.py` — 新增 XLSX (openpyxl)、XLS (xlrd)、DOC (olefile)
- [x] 侧边栏上传器类型列表中新增 xlsx/xls/doc
- [x] 单元测试: `tests/test_file_parser_formats.py` (4 tests)
### 14. 批注检测 ✓
- [x] `backend/annotation_detector.py` — 圈选 + 箭头 + OCR 关联
- [x] 圆圈检测: 红色通道增强 → HoughCircles
- [x] 箭头检测: Canny → HoughLinesP → 线段聚类 → 端点方向判定
- [x] `format_annotation_context()` — 批注结果格式化为中文提示
- [x] `process_input` 节点在 OCR 提取后自动运行批注检测
- [x] `annotation_result` 字段持久化到 AgentState + 会话文件
- [x] 单元测试: `tests/test_annotation_detector.py` (7 tests)
### 15. OCR 上下文 LLM 注入 ✓
- [x] `prompts/modification.md` — 新增 `{ocr_context}` 占位符
- [x] `modify_jrxml` + `generate` 节点注入 OCR 上下文
- [x] OCR 上下文包含: 结构化字段、全部文本元素(含坐标)、批注检测结果
---
## 阶段六:分层精确生成 (v5) ✓
### 16. 布局 Schema 提取 ✓
- [x] `backend/layout_analyzer.py` — 新增 `extract_layout_schema()` 函数(+107 行)
- [x] X 坐标聚类列检测(avg_width * 0.5 阈值)
- [x] 区域分类:标题/表头/数据/表尾(启发式算法)
- [x] `schema_text` 紧凑中文描述(列定义 + 区域 + 宽度分类)
- [x] 空行/单行/双行边界情况处理
- [x] 单元测试: `tests/test_layered_generation.py::TestExtractLayoutSchema` (9 tests)
### 17. 3 阶段生成管线 ✓
- [x] Phase 1: `generate_skeleton` — 压缩布局 schema → 骨架 JRXML (`$F{field_N}` 占位)
- [x] Phase 2: `refine_layout` — 采样坐标(表头+首行数据+末行)→ 像素级位置精调
- [x] Phase 3: `map_fields` — OCR 字段名 → 替换占位符为真实字段名
- [x] 中间阶段跳过验证(仅最终 mapped 结果进入 validate 循环)
- [x] 流式输出支持(每阶段逐字生成)
- [x] 单元测试: `tests/test_layered_generation.py::TestIntegration` (4 tests)
### 18. 路由与状态 ✓
- [x] `agent/graph.py` — 新增 `route_after_retrieve()` 条件路由
- [x] `layout_schema.total_rows > 0` → 3 阶段,否则 → 原有 1-shot
- [x] `agent/state.py` — 新增 `layout_schema: dict``ocr_elements: list`
- [x] 会话持久化支持(`save_session_node` / `load_session_node`
- [x] 文本请求和其他意图零行为变更
- [x] 单元测试: `tests/test_layered_generation.py::TestRouting` (4 tests)
### 19. Prompt 模板 ✓
- [x] `prompts/skeleton_generation.md` — 骨架生成 prompt
- [x] `prompts/refine_layout.md` — 布局精调 prompt
- [x] `prompts/field_mapping.md` — 字段映射 prompt
- [x] `prompts/loader.py` — 注册 3 个新模板(热重载)
### 20. UI 集成 ✓
- [x] `app.py` — 上传 A4 图片时自动调用 `extract_layout_schema()`
- [x] 新增节点标签:`🏗 生成骨架` / `📐 精调布局` / `🏷 映射字段`
- [x] 3 个新节点的详情渲染
---
阶段一立即可做,无外部依赖。阶段二是主要工作量。阶段三是收尾。阶段四是可观测性基础。阶段五是 OCR 智能增强和用户体验改进。阶段六解决 A4 报表图片 OCR 元素过多(数百个)导致 LLM prompt 超长的问题。