136 lines
5.6 KiB
Python
136 lines
5.6 KiB
Python
from __future__ import annotations
|
||
|
||
from services.prompt_template_service import render_prompt
|
||
from prompts.report_generation.prompt_defaults import (
|
||
DEFAULT_SECTION_PROMPT_FALLBACK,
|
||
DEFAULT_SELECTED_EXAMPLE_FALLBACK,
|
||
)
|
||
|
||
|
||
def chapter_generation_system_prompt() -> str:
|
||
return render_prompt("report_generation/chapter_generation_system.md")
|
||
|
||
|
||
def repair_missing_tables_system_prompt() -> str:
|
||
return render_prompt("report_generation/repair_missing_tables_system.md")
|
||
|
||
|
||
def table_format_repair_system_prompt() -> str:
|
||
return render_prompt("report_generation/table_format_repair_system.md")
|
||
|
||
|
||
def _build_prior_sibling_sections_prompt_block(prior_sibling_sections_text: str) -> str:
|
||
body = str(prior_sibling_sections_text or "").strip()
|
||
if not body:
|
||
return ""
|
||
return (
|
||
"【同章前序小节正文(时间与金额须保持一致)】\n"
|
||
f"{body}\n\n"
|
||
"【同章一致性约束】\n"
|
||
"1. 竣工时间、开工/中交/投产/验收等关键里程碑日期,以及建设投资、总投资、营业收入、利润等各类金额数字,"
|
||
"须与本章前序小节已写明的口径完全一致(年月日表述可适度简化,但不得出现另一套矛盾日期或金额);\n"
|
||
"2. 若【证据包】或【字段级已抽取结果】中某日期/金额与前序小节矛盾,以前序小节为准写入本节,"
|
||
"不得在正文中另写一套矛盾数值;\n"
|
||
"3. 前序小节为「待补充」的字段,本节仍写「待补充」,不得自行编造;\n"
|
||
"4. 可补充本节新增信息,但不得改写或否定前序小节已确立的时间与金额。"
|
||
)
|
||
|
||
|
||
def _build_prior_chapters_prompt_block(prior_chapters_text: str) -> str:
|
||
body = str(prior_chapters_text or "").strip()
|
||
if not body:
|
||
return ""
|
||
return (
|
||
"【前序章节正文(第1~6章,本章须据此总结)】\n"
|
||
f"{body}\n\n"
|
||
"【前序章节使用约束】\n"
|
||
"1. 第7章各节是对第1~6章已生成正文的归纳、提炼与升华,不得与前面章节结论矛盾;\n"
|
||
"2. 可概括前文要点,禁止大段照搬;数据与结论须与前文一致;\n"
|
||
"3. 若前序章节某处为「待补充」,本节对应表述也应为「待补充」,不得编造;\n"
|
||
"4. 须由要素管理直出的表格(如表7-1)仍按【章节输出结构约束】执行,不受本条限制。"
|
||
)
|
||
|
||
|
||
def _build_section_reference_block(section_reference: str) -> str:
|
||
body = str(section_reference or "").strip()
|
||
if not body:
|
||
return ""
|
||
return (
|
||
"【本章参考范文(本节写作蓝本:结构与行文风格须高度贴合;禁止复用数据、禁止照抄)】\n"
|
||
f"{body}\n\n"
|
||
"【参考范文使用约束】\n"
|
||
"1. 以范文为写作蓝本:段落数量与顺序、每段主题、论述逻辑、句式笔法与篇幅颗粒度均须与范文高度一致,做到逐段对应、同一笔法;\n"
|
||
"2. 严禁复用范文中的项目名称、时间、金额、指标值等任何事实数据,须全部替换为当前项目证据包的真实值;\n"
|
||
"3. 范文中的表格结构(表头、列顺序、行项)须沿用,但表内数据必须替换为当前项目证据包的值;\n"
|
||
"4. 禁止逐字照抄:不得出现与范文连续相同超过 15 字的文字,须改写措辞做到“形似而文不同”;\n"
|
||
"5. 若范文与证据包存在矛盾,以证据包为准。"
|
||
)
|
||
|
||
|
||
def build_report_chapter_prompt(
|
||
*,
|
||
section_title: str,
|
||
section_prompt: str,
|
||
required_tables_text: str,
|
||
structured_tables_text: str,
|
||
canonical_fields_text: str,
|
||
selected_example: str,
|
||
heading_rule: str,
|
||
section_contract: str,
|
||
evidence_json: str,
|
||
prior_sibling_sections_text: str = "",
|
||
prior_chapters_text: str = "",
|
||
section_reference: str = "",
|
||
) -> str:
|
||
return render_prompt(
|
||
"report_generation/chapter_generation_user_ref_aligned.md",
|
||
section_title=section_title,
|
||
section_prompt=section_prompt or DEFAULT_SECTION_PROMPT_FALLBACK,
|
||
required_tables_text=required_tables_text or "无",
|
||
structured_tables_text=structured_tables_text,
|
||
canonical_fields_text=canonical_fields_text,
|
||
selected_example=selected_example or DEFAULT_SELECTED_EXAMPLE_FALLBACK,
|
||
heading_rule=heading_rule,
|
||
section_contract=section_contract,
|
||
evidence_json=evidence_json,
|
||
prior_sibling_sections_block=_build_prior_sibling_sections_prompt_block(
|
||
prior_sibling_sections_text
|
||
),
|
||
prior_chapters_block=_build_prior_chapters_prompt_block(prior_chapters_text),
|
||
section_reference_block=_build_section_reference_block(section_reference),
|
||
)
|
||
|
||
|
||
def build_repair_missing_tables_prompt(
|
||
*,
|
||
section_title: str,
|
||
original_prompt: str,
|
||
content: str,
|
||
missing_tables: list[str],
|
||
evidence_json: str,
|
||
) -> str:
|
||
return render_prompt(
|
||
"report_generation/repair_missing_tables_user.md",
|
||
section_title=section_title,
|
||
missing_tables=", ".join(missing_tables),
|
||
content=content,
|
||
original_prompt=original_prompt[:8000],
|
||
evidence_json=evidence_json[:12000],
|
||
)
|
||
|
||
|
||
def build_table_format_repair_prompt(
|
||
*,
|
||
section_title: str,
|
||
table_specs_json: str,
|
||
content: str,
|
||
evidence_json: str,
|
||
) -> str:
|
||
return render_prompt(
|
||
"report_generation/table_format_repair_user.md",
|
||
section_title=section_title,
|
||
table_specs_json=table_specs_json,
|
||
content=content,
|
||
evidence_json=evidence_json[:12000],
|
||
)
|