diff --git a/agent/nodes.py b/agent/nodes.py index caa2612..78cd343 100644 --- a/agent/nodes.py +++ b/agent/nodes.py @@ -754,8 +754,20 @@ def map_fields(state: AgentState) -> Dict: ) prev_jrxml = state.get("current_jrxml", "") full_text = _generate_with_continuation(llm, prompt, writer, "map_fields") + # 空响应重试:有时 LLM 第一轮不输出,换个方式再试一次 if not full_text.strip(): - _node_log.error("map_fields LLM 返回空响应,保留占位字段版本") + _node_log.warning("map_fields 第一轮返回空响应,尝试简化 prompt 重试") + retry_prompt = ( + "请将以下 JRXML 中的占位字段名 $F{field_1}, $F{field_2}, ... 替换为 OCR 提取的真实字段名。\n" + "规则:根据列顺序映射——$F{field_1} 对应第1列,$F{field_2} 对应第2列,以此类推。\n" + "同时更新 声明和所有 $F{...} 引用。\n" + "只输出完整 JRXML,不要解释。\n\n" + f"OCR 字段:\n{fields_text}\n\n" + f"JRXML:\n{prev_jrxml}" + ) + full_text = _generate_with_continuation(llm, retry_prompt, writer, "map_fields") + if not full_text.strip(): + _node_log.error("map_fields LLM 重试后仍返回空响应,保留占位字段版本") return state jrxml = _extract_jrxml(full_text) if len(jrxml.strip()) < 200: diff --git a/prompts/correction.md b/prompts/correction.md index 8234f6a..a9d150f 100644 --- a/prompts/correction.md +++ b/prompts/correction.md @@ -5,6 +5,8 @@ - JRXML 必须与 JasperReports 7.0.6 兼容。 - 解决下面列出的特定错误。 - 如果当前 JRXML 内容为空或过短(<200 字符),请根据下方提供的 OCR 识别数据和布局 schema 重新生成完整的 JRXML,而非输出一个占位桩。 +- 如果错误是"字段 'field_N' 未在 部分声明",**必须**为每个缺失的 field_N 添加 `` 声明。这些是占位字段,不可删除。同时确保所有 $F{field_N} 引用都有对应的 声明。 +- 如果错误是"字段 'field_N' 未在 部分声明"且有 OCR 字段数据,尝试将 $F{field_N} 替换为 OCR 中对应的真实字段名(如 $F{invoice_code}),同时更新 声明和所有引用。 当前 JRXML(带错误): {current_jrxml}