Files
XH-202626/XH-202626_原型系统源码与部署手册/01_原型系统源码/agents/tech_agent.py
T

148 lines
6.2 KiB
Python

# -*- coding: utf-8 -*-
"""
技术风控节点
审查维度:技术路线竞争态势、核心人员稳定性、专利布局、技术替代风险
"""
import json
from .base_agent import BaseAgent
TECH_SYSTEM_PROMPT = """你是一名资深科技行业分析师和技术风控专家。
你精通半导体、人工智能、新能源、生物医疗等前沿科技领域的技术演进趋势。
你的任务是基于提供的企业数据,从技术角度评估以下风险:
1. 技术路线颠覆风险:企业押注的技术路线是否面临被替代的风险
2. 核心人员流失风险:关键技术人员的稳定性和不可替代性
3. 专利/技术壁垒:技术护城河的深度和可持续性
4. 技术迭代压力:行业技术迭代速度对企业的冲击
请以技术专家的视角进行深度评估,输出JSON格式:
{
"agent": "技术风控节点",
"tech_disruption_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
"talent_loss_risk": {"score": 0-100, "level": "高/中/低", "detail": "..."},
"patent_moat": {"score": 0-100, "level": "强/中/弱", "detail": "..."},
"tech_iteration_pressure": {"score": 0-100, "level": "高/中/低", "detail": "..."},
"overall_tech_risk": {"score": 0-100, "level": "高/中/低"},
"key_findings": ["..."],
"recommendations": ["..."]
}"""
class TechAgent(BaseAgent):
"""技术风控节点"""
def __init__(self):
super().__init__(
name="技术风控节点",
system_prompt=TECH_SYSTEM_PROMPT,
role_icon="👨‍🔬",
)
def evaluate(self, company_data: dict) -> dict:
"""执行技术风险评估"""
prompt = self._build_prompt(company_data)
result = self.infer_json(prompt)
if result.get("parse_error"):
result = self._rule_based_evaluation(company_data)
result["agent"] = "技术风控节点"
result["icon"] = self.role_icon
return result
def _build_prompt(self, company_data: dict) -> str:
return f"""请对以下科创企业进行技术风险评估:
企业名称:{company_data.get('short_name', '未知')}
行业:{company_data.get('industry', '未知')}
领域:{company_data.get('sector', '未知')}
企业描述:{company_data.get('description', '')}
技术路线信息:
{json.dumps(company_data.get('tech_route', {}), ensure_ascii=False, indent=2)}
核心技术人员:
{json.dumps(company_data.get('core_tech_personnel', []), ensure_ascii=False, indent=2)}
财务中的研发指标:
- 研发费用: {company_data.get('financials', {}).get('rd_expense_2024', 0)}
- 研发营收比: {company_data.get('financials', {}).get('rd_revenue_ratio', 0)}
请输出严格的JSON评估结果。"""
def _rule_based_evaluation(self, company_data: dict) -> dict:
"""基于规则的技术风险评估"""
tech_route = company_data.get("tech_route", {})
personnel = company_data.get("core_tech_personnel", [])
financials = company_data.get("financials", {})
# 技术路线颠覆风险
competing_techs = tech_route.get("competing_techs", [])
disruption_score = min(20 + len(competing_techs) * 15, 90)
tech_moat = tech_route.get("tech_moat", "")
if "差距" in tech_moat or "受制" in tech_moat:
disruption_score = min(disruption_score + 20, 95)
disruption_detail = f"面临 {len(competing_techs)} 条竞争技术路线: {', '.join(competing_techs[:3])}"
# 核心人员流失风险
talent_score = 20
talent_detail = "核心团队稳定"
departed = [p for p in personnel if "离职" in p.get("status", "")]
high_importance = [p for p in personnel if p.get("importance") == "极高"]
if departed:
talent_score = 80
talent_detail = f"已有核心人员离职: {', '.join(p['name'] for p in departed)}"
elif len(high_importance) == 1:
talent_score = 55
talent_detail = f"高度依赖单一核心人员: {high_importance[0]['name']}"
elif len(personnel) <= 2:
talent_score = 45
talent_detail = "核心技术团队规模偏小"
# 专利壁垒
patent_count = tech_route.get("patent_count", 0)
if patent_count > 5000:
patent_score = 20
patent_detail = f"专利数量充足({patent_count}件),技术壁垒较强"
elif patent_count > 1000:
patent_score = 35
patent_detail = f"专利数量中等({patent_count}件)"
else:
patent_score = 60
patent_detail = f"专利数量偏少({patent_count}件),技术壁垒偏弱"
# 技术迭代压力(基于研发投入比)
rd_ratio = financials.get("rd_revenue_ratio", 0)
if rd_ratio > 0.3:
iter_score = 65
iter_detail = f"研发营收比极高({rd_ratio:.1%}),说明行业技术迭代压力大"
elif rd_ratio > 0.15:
iter_score = 45
iter_detail = f"研发投入较高({rd_ratio:.1%}),需持续技术投入"
else:
iter_score = 25
iter_detail = f"研发投入适中({rd_ratio:.1%})"
overall = int(disruption_score * 0.35 + talent_score * 0.25 +
patent_score * 0.15 + iter_score * 0.25)
return {
"tech_disruption_risk": {"score": disruption_score, "level": self._level(disruption_score), "detail": disruption_detail},
"talent_loss_risk": {"score": talent_score, "level": self._level(talent_score), "detail": talent_detail},
"patent_moat": {"score": patent_score, "level": "弱" if patent_score >= 50 else ("中" if patent_score >= 30 else "强"), "detail": patent_detail},
"tech_iteration_pressure": {"score": iter_score, "level": self._level(iter_score), "detail": iter_detail},
"overall_tech_risk": {"score": overall, "level": self._level(overall)},
"key_findings": [disruption_detail, talent_detail, patent_detail],
"recommendations": ["关注竞争技术路线发展", "加强核心人员留任激励"],
}
@staticmethod
def _level(score: int) -> str:
if score >= 70:
return "高"
elif score >= 40:
return "中"
return "低"