Files

177 lines
6.6 KiB
Python

# -*- coding: utf-8 -*-
"""
综合裁决节点
汇总法务/技术/财务三方意见,消解冲突,输出最终综合评级
"""
import json
from .base_agent import BaseAgent
JUDGE_SYSTEM_PROMPT = """你是一名资深的风险管理委员会主席,负责汇总法务、技术、财务三方专家的研判意见。
你的任务是:
1. 审阅三方专家的评估报告
2. 识别各方意见的冲突点
3. 基于优先级原则消解冲突(合规风险 > 技术风险 > 财务风险)
4. 输出 0-100 的综合风险评分
5. 给出最终核保建议
核保决策标准:
- 综合风险 ≥ 80分:建议【拒绝承保】
- 60 ≤ 综合风险 < 80分:建议【附条件承保】(高免赔额/限额)
- 40 ≤ 综合风险 < 60分:建议【标准承保】(标准费率上浮)
- 综合风险 < 40分:建议【优先承保】(可享费率优惠)
请输出JSON格式:
{
"comprehensive_score": 0-100,
"risk_level": "极高/高/中/低",
"underwriting_decision": "拒绝承保/附条件承保/标准承保/优先承保",
"six_dimension_scores": {
"tech_disruption": 0-100,
"talent_loss": 0-100,
"algo_compliance": 0-100,
"geopolitical": 0-100,
"rd_capitalization": 0-100,
"concentration": 0-100
},
"conflict_resolution": "...",
"key_risks": ["..."],
"underwriting_conditions": ["..."],
"summary": "..."
}"""
class JudgeAgent(BaseAgent):
"""综合裁决节点"""
def __init__(self):
super().__init__(
name="综合裁决节点",
system_prompt=JUDGE_SYSTEM_PROMPT,
role_icon="⚖️",
)
def evaluate(self, company_data: dict, law_result: dict,
tech_result: dict, finance_result: dict) -> dict:
"""汇总三方意见,输出综合裁决"""
prompt = self._build_prompt(company_data, law_result, tech_result, finance_result)
result = self.infer_json(prompt)
if result.get("parse_error"):
result = self._rule_based_evaluation(company_data, law_result, tech_result, finance_result)
result["agent"] = "综合裁决节点"
result["icon"] = self.role_icon
return result
def _build_prompt(self, company_data: dict, law_result: dict,
tech_result: dict, finance_result: dict) -> str:
return f"""请对以下科创企业的三方评估结果进行综合裁决:
企业名称:{company_data.get('short_name', '未知')}
行业:{company_data.get('industry', '未知')}
=== 👩‍⚖️ 法务风控节点评估 ===
{json.dumps(law_result, ensure_ascii=False, indent=2)}
=== 👨‍🔬 技术风控节点评估 ===
{json.dumps(tech_result, ensure_ascii=False, indent=2)}
=== 👔 财务风控节点评估 ===
{json.dumps(finance_result, ensure_ascii=False, indent=2)}
请消解可能存在的判定冲突,输出综合裁决JSON。"""
def _rule_based_evaluation(self, company_data: dict, law_result: dict,
tech_result: dict, finance_result: dict) -> dict:
"""规则引擎综合裁决"""
# 提取各维度得分
def safe_score(result: dict, key: str) -> int:
item = result.get(key, {})
if isinstance(item, dict):
return item.get("score", 50)
return 50
# 六维评分
scores = {
"tech_disruption": safe_score(tech_result, "tech_disruption_risk"),
"talent_loss": safe_score(tech_result, "talent_loss_risk"),
"algo_compliance": safe_score(law_result, "algo_compliance_risk"),
"geopolitical": safe_score(law_result, "geopolitical_risk"),
"rd_capitalization": safe_score(finance_result, "rd_capitalization_risk"),
"concentration": safe_score(finance_result, "concentration_risk"),
}
# 加权综合得分
weights = {
"tech_disruption": 0.20,
"talent_loss": 0.15,
"algo_compliance": 0.15,
"geopolitical": 0.20,
"rd_capitalization": 0.15,
"concentration": 0.15,
}
comprehensive_score = int(
sum(scores[k] * weights[k] for k in scores)
)
# 裁决
if comprehensive_score >= 80:
decision = "拒绝承保"
risk_level = "极高"
elif comprehensive_score >= 60:
decision = "附条件承保"
risk_level = "高"
elif comprehensive_score >= 40:
decision = "标准承保"
risk_level = "中"
else:
decision = "优先承保"
risk_level = "低"
# 收集关键风险
key_risks = []
for dim, score in sorted(scores.items(), key=lambda x: x[1], reverse=True):
if score >= 60:
dim_names = {
"tech_disruption": "技术路线颠覆",
"talent_loss": "核心人员流失",
"algo_compliance": "算法/数据合规",
"geopolitical": "地缘政治/出口管制",
"rd_capitalization": "研发资本化操纵",
"concentration": "客户/供应商集中",
}
key_risks.append(f"{dim_names.get(dim, dim)}风险({score}分)")
# 核保条件
conditions = []
if scores["geopolitical"] >= 70:
conditions.append("要求提供出口管制合规声明及供应链替代方案")
if scores["rd_capitalization"] >= 60:
conditions.append("要求额外提供研发资本化会计政策说明及审计意见")
if scores["concentration"] >= 60:
conditions.append("要求提供客户分散化计划或前五大客户信用报告")
if scores["talent_loss"] >= 60:
conditions.append("要求核心技术人员签署竞业协议且公司有留任激励计划")
company_name = company_data.get("short_name", "该企业")
summary = (
f"{company_name}综合风险评分{comprehensive_score}分(风险等级:{risk_level})。"
f"核保建议:【{decision}】。"
f"主要风险集中在{'、'.join(key_risks[:3]) if key_risks else '无突出风险'}。"
)
return {
"comprehensive_score": comprehensive_score,
"risk_level": risk_level,
"underwriting_decision": decision,
"six_dimension_scores": scores,
"conflict_resolution": "基于优先级原则(合规>技术>财务)进行加权裁决",
"key_risks": key_risks,
"underwriting_conditions": conditions,
"summary": summary,
}