fix: map_fields empty-retry + correction prompt field_N guidance
- map_fields: retry with simplified prompt on empty LLM response - correction.md: add explicit guidance for undeclared field_N errors (add <field> declarations + try OCR name replacement) - MAX_RETRY=5 now effective (was overridden by .env:3)
This commit is contained in:
+13
-1
@@ -754,8 +754,20 @@ def map_fields(state: AgentState) -> Dict:
|
|||||||
)
|
)
|
||||||
prev_jrxml = state.get("current_jrxml", "")
|
prev_jrxml = state.get("current_jrxml", "")
|
||||||
full_text = _generate_with_continuation(llm, prompt, writer, "map_fields")
|
full_text = _generate_with_continuation(llm, prompt, writer, "map_fields")
|
||||||
|
# 空响应重试:有时 LLM 第一轮不输出,换个方式再试一次
|
||||||
if not full_text.strip():
|
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"
|
||||||
|
"同时更新 <field name=\"...\"> 声明和所有 $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
|
return state
|
||||||
jrxml = _extract_jrxml(full_text)
|
jrxml = _extract_jrxml(full_text)
|
||||||
if len(jrxml.strip()) < 200:
|
if len(jrxml.strip()) < 200:
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
- JRXML 必须与 JasperReports 7.0.6 兼容。
|
- JRXML 必须与 JasperReports 7.0.6 兼容。
|
||||||
- 解决下面列出的特定错误。
|
- 解决下面列出的特定错误。
|
||||||
- 如果当前 JRXML 内容为空或过短(<200 字符),请根据下方提供的 OCR 识别数据和布局 schema 重新生成完整的 JRXML,而非输出一个占位桩。
|
- 如果当前 JRXML 内容为空或过短(<200 字符),请根据下方提供的 OCR 识别数据和布局 schema 重新生成完整的 JRXML,而非输出一个占位桩。
|
||||||
|
- 如果错误是"字段 'field_N' 未在 <field> 部分声明",**必须**为每个缺失的 field_N 添加 `<field name="field_N" class="java.lang.String"/>` 声明。这些是占位字段,不可删除。同时确保所有 $F{field_N} 引用都有对应的 <field> 声明。
|
||||||
|
- 如果错误是"字段 'field_N' 未在 <field> 部分声明"且有 OCR 字段数据,尝试将 $F{field_N} 替换为 OCR 中对应的真实字段名(如 $F{invoice_code}),同时更新 <field> 声明和所有引用。
|
||||||
|
|
||||||
当前 JRXML(带错误):
|
当前 JRXML(带错误):
|
||||||
{current_jrxml}
|
{current_jrxml}
|
||||||
|
|||||||
Reference in New Issue
Block a user