💻 源码
from typing import Any

EXTRACT_FIELDS = [
    "主体机构",
    "时间周期",
    "金额数值",
    "财务指标",
    "业务事件",
    "风险因素",
    "行业板块",
]

EXTRACT_FIELD_DESC = {
    "主体机构": "公司、银行、基金、监管机构等分析对象",
    "时间周期": "报告期、公告日期、统计时段(如 2025 年一季度、上半年)",
    "金额数值": "金额、规模、市值等数值,保留原文单位",
    "财务指标": "营收、净利润、同比、毛利率、ROE、估值等量化指标",
    "业务事件": "并购、分红、业绩预告、产销变化、政策影响等业务动作",
    "风险因素": "风险点、不利因素、不确定性描述",
    "行业板块": "行业名称或细分赛道(如 新能源汽车、光伏)",
}

LEGACY_FIELD_MAP = {
    "companies": "主体机构",
    "dates": "时间周期",
    "amounts": "金额数值",
    "financial_metrics": "财务指标",
    "events": "业务事件",
    "risks": "风险因素",
    "industries": "行业板块",
}


def build_extract_template() -> dict[str, list[Any]]:
    return {field: [] for field in EXTRACT_FIELDS}


def format_extract_field_lines() -> str:
    return "\n".join(
        f"{field}:{EXTRACT_FIELD_DESC[field]}" for field in EXTRACT_FIELDS
    )


def normalize_extract_result(result: Any) -> dict[str, list[Any]]:
    if not isinstance(result, dict):
        raise ValueError("抽取结果必须是 JSON 对象")

    mapped: dict[str, Any] = {}
    for key, value in result.items():
        normalized_key = LEGACY_FIELD_MAP.get(key, key)
        if normalized_key in EXTRACT_FIELDS:
            mapped[normalized_key] = value

    normalized: dict[str, list[Any]] = {}
    for field in EXTRACT_FIELDS:
        value = mapped.get(field, [])
        if value is None:
            value = []
        if not isinstance(value, list):
            raise ValueError(f"{field} 必须是数组")
        normalized[field] = value
    return normalized