Files
agent_jrxml/ROADMAP.md
T
panda 43a0542a11 feat: layered precise generation for A4 report images
3-phase pipeline to solve LLM prompt overflow from too many OCR elements:
Phase 1 (generate_skeleton): compressed layout schema → skeleton JRXML
Phase 2 (refine_layout): sampled coordinates → pixel-level position tuning
Phase 3 (map_fields): OCR field names → replace $F{field_N} placeholders

Only triggered when layout_schema.total_rows > 0 on initial_generation intent.
Text requests and all other intents are unaffected (zero behavior change).
2026-05-21 08:34:32 +08:00

9.4 KiB
Raw Blame History

改进路线图

阶段一:代码质量(低风险,快速交付)

1. Prompt 拆分 ✓

  • 创建 prompts/ 目录
  • 7 个 prompt 各拆为独立 .md 文件
  • nodes.py 改为从文件加载
  • 支持热重载(文件变更无需重启)

2. 修复无效代码 ✓

  • backend/llm.pyget_num_tokens() 修复为正确 API
  • backend/embeddings.py — 修复 docstring 函数名不一致
  • backend/llm.py — 统一 LLM 接口基类 _BaseLLM

阶段二:用户体验(核心改造)

3. 流式输出 + 节点平铺 ✓

  • backend/llm.py — LLM 工厂支持 stream() 统一接口
  • agent/nodes.py — generate/modify/correct 节点使用流式 + get_stream_writer()
  • app.py — 使用 stream_mode=["updates", "custom"] 捕获流式事件
  • 节点状态平铺(处理过程 expander 逐节点展示)
  • 流式完成后节点自动折叠
  • 完成后单独展示「总结卡片」

4. 错误自增长知识库 ✓

  • backend/error_kb.py — ErrorKB 类(ChromaDB 持久化)
  • 错误指纹去重(标准化 + MD5
  • correct_jrxml — 保存修正前状态到 last_error_case
  • validate — 修正成功时自动记录(仅新错误,自动去重)
  • retrieve — 搜索错误知识库,注入历史修正案例
  • 记录内容:错误 + 修正前后 JRXML + prompt + 工具链 + 模型

5. 文件上传支持 ✓

  • backend/file_parser.py — 统一解析接口
    • 图片 → PIL 元信息 + PaddleOCR(可选安装后自动识别)
    • PDF → pdfplumber / PyMuPDF 文本提取
    • DOCX → python-docx 文本提取
    • 纯文本 (.txt/.csv/.json/.xml) → 直接读取
  • can_use_vision() — 根据模型名判断是否支持原生多模态
  • app.py — 侧边栏文件上传组件(多文件,可移除)
  • 上传文本自动注入下一条消息前缀

6. A4 图片模板识别 ✓

  • backend/layout_analyzer.py — 完整布局分析模块
  • A4 比例判定:exact(±3%) / close(±8%) / not_a4 三档
  • PaddleOCR 布局分析:逐元素提取坐标(x,y,w,h)、字号、文本
  • 行分组:Y 轴容差自动聚类
  • 结构化输出:图片模板共 X 行,第 1 行有 Y 个元素,其中元素 a 长...高...字体...内容是...
  • 检测门槛:≥2 个 OCR 元素 + A4 比例 → 标记为模板
  • app.py — 上传图片/PDF 时自动触发布局分析,替换为布局描述

7. 会话历史 JRXML 下载 ✓

  • agent/state.py — 新增 jrxml_versions 字段
  • agent/nodes.pyfinalize 节点追加版本记录
  • app.py — 侧边栏"历史版本"折叠区,每版本独立下载按钮

8. 预览功能修复 ✓

  • 根因:preview_report 路由到 save_sessionvalidate 触发不必要的验证修正循环
  • 修复:route_after_save — 预览/导出意图跳过验证直接 finalize

阶段三:细节修复

9. Ctrl+C 修复 ✓

  • app.py — 注入 JS 拦截裸 c 键,保留 Ctrl+C 复制行为

阶段四:可观测性

10. 结构化日志系统 ✓

  • backend/logger.py — 集中日志配置模块
    • JSON 格式化(每行一条记录,便于 jq/pandas 分析)
    • 请求级 trace_idcontextvars 自动传播,一次用户请求贯穿全链路)
    • 独立 LLM 日志文件 logs/llm.log(记录完整 prompt 和 response
    • 时区:UTC+8(中国时区)
    • 日志轮转(单文件 10MB,保留 5 备份)
  • backend/llm.py_LLMLoggingWrapper 包装所有 LLM 后端
    • 记录每次 invoke/stream 的请求 prompt、响应内容、耗时、模型、调用来源
    • 异常时也记录完整 prompt
  • agent/nodes.py@log_node 装饰器覆盖 17 个节点
    • 入口/出口/异常三个阶段的日志
    • 自动记录 state 关键字段摘要(session_id、intent、status、jrxml_length 等)
    • 每个节点耗时(duration_ms
  • agent/graph.py@_log_route 装饰器覆盖 8 个路由函数
    • 记录每次路由决策(来源 → 目标)
  • app.py — 用户交互日志
    • 收到用户输入(含上传文件信息)
    • 代理执行开始/完成(含最终 intent、status、jrxml_length
    • 异常时记录错误详情
    • 会话新建/切换/删除操作日志
  • backend/session.py — 会话创建/删除日志
  • backend/validation.py — 验证完成/连接失败日志
  • .env.example — 新增 LOG_DIRLOG_LEVEL 配置项
  • .gitignore — 新增 logs/ 忽略规则

执行顺序建议

1. Prompt 拆分 ──► 2. 无效代码修复
                        │
                        ▼
              3. 流式输出 + 节点平铺
                        │
          ┌─────────────┼─────────────┐
          ▼             ▼             ▼
    4. 错误自增长   5. 文件上传   7. 下载历史
          │             │
          ▼             ▼
    6. A4 模板识别  8. 预览修复
                        │
                        ▼
                 9. Ctrl+C 修复
                        │
                        ▼
               10. 结构化日志系统

阶段五:OCR 与智能上传 (v3/v4) ✓

11. OCR 单据字段精确提取 ✓

  • backend/ocr_extractor.py — 4 策略优先级提取 (exact_match → kv_pair → regex → table_match)
  • PaddleOCR 首次识别后将原始结果(含所有文本元素 + bbox坐标)持久化
  • _format_ocr_context() — OCR 结果格式化为 LLM prompt 注入
  • process_input 节点在上传图片时自动触发 OCR 字段提取
  • OCR 结果持久化到会话文件

12. 多模态聊天输入 ✓

  • app.pyst.chat_input 替换为 st_multimodal_chatinput
  • 支持 Ctrl+V 粘贴文件 + 拖拽 + 文件按钮
  • _process_uploaded_file() — 提取共享文件处理逻辑(消除 ~70 行重复代码)
  • 剪贴板文件 base64 解码 + MIME type → 扩展名推断

13. 多格式文件支持 ✓

  • backend/file_parser.py — 新增 XLSX (openpyxl)、XLS (xlrd)、DOC (olefile)
  • 侧边栏上传器类型列表中新增 xlsx/xls/doc
  • 单元测试: tests/test_file_parser_formats.py (4 tests)

14. 批注检测 ✓

  • backend/annotation_detector.py — 圈选 + 箭头 + OCR 关联
  • 圆圈检测: 红色通道增强 → HoughCircles
  • 箭头检测: Canny → HoughLinesP → 线段聚类 → 端点方向判定
  • format_annotation_context() — 批注结果格式化为中文提示
  • process_input 节点在 OCR 提取后自动运行批注检测
  • annotation_result 字段持久化到 AgentState + 会话文件
  • 单元测试: tests/test_annotation_detector.py (7 tests)

15. OCR 上下文 LLM 注入 ✓

  • prompts/modification.md — 新增 {ocr_context} 占位符
  • modify_jrxml + generate 节点注入 OCR 上下文
  • OCR 上下文包含: 结构化字段、全部文本元素(含坐标)、批注检测结果

阶段六:分层精确生成 (v5) ✓

16. 布局 Schema 提取 ✓

  • backend/layout_analyzer.py — 新增 extract_layout_schema() 函数(+107 行)
  • X 坐标聚类列检测(avg_width * 0.5 阈值)
  • 区域分类:标题/表头/数据/表尾(启发式算法)
  • schema_text 紧凑中文描述(列定义 + 区域 + 宽度分类)
  • 空行/单行/双行边界情况处理
  • 单元测试: tests/test_layered_generation.py::TestExtractLayoutSchema (9 tests)

17. 3 阶段生成管线 ✓

  • Phase 1: generate_skeleton — 压缩布局 schema → 骨架 JRXML ($F{field_N} 占位)
  • Phase 2: refine_layout — 采样坐标(表头+首行数据+末行)→ 像素级位置精调
  • Phase 3: map_fields — OCR 字段名 → 替换占位符为真实字段名
  • 中间阶段跳过验证(仅最终 mapped 结果进入 validate 循环)
  • 流式输出支持(每阶段逐字生成)
  • 单元测试: tests/test_layered_generation.py::TestIntegration (4 tests)

18. 路由与状态 ✓

  • agent/graph.py — 新增 route_after_retrieve() 条件路由
  • layout_schema.total_rows > 0 → 3 阶段,否则 → 原有 1-shot
  • agent/state.py — 新增 layout_schema: dictocr_elements: list
  • 会话持久化支持(save_session_node / load_session_node
  • 文本请求和其他意图零行为变更
  • 单元测试: tests/test_layered_generation.py::TestRouting (4 tests)

19. Prompt 模板 ✓

  • prompts/skeleton_generation.md — 骨架生成 prompt
  • prompts/refine_layout.md — 布局精调 prompt
  • prompts/field_mapping.md — 字段映射 prompt
  • prompts/loader.py — 注册 3 个新模板(热重载)

20. UI 集成 ✓

  • app.py — 上传 A4 图片时自动调用 extract_layout_schema()
  • 新增节点标签:🏗 生成骨架 / 📐 精调布局 / 🏷 映射字段
  • 3 个新节点的详情渲染

阶段一立即可做,无外部依赖。阶段二是主要工作量。阶段三是收尾。阶段四是可观测性基础。阶段五是 OCR 智能增强和用户体验改进。阶段六解决 A4 报表图片 OCR 元素过多(数百个)导致 LLM prompt 超长的问题。