This commit is contained in:
sam 2025-10-06 15:43:20 +08:00
parent cf199aa4be
commit e234d66687
15 changed files with 285 additions and 278 deletions

View File

@ -0,0 +1,30 @@
{
"department_base": {
"name": "部门基础模板",
"description": "所有部门通用的审慎分析提示词骨架",
"template": "\n部门{title}\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 角色说明:{description}\n- 行动守则:{instruction}\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 核心特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n【分析步骤】\n1. 判断信息是否充分,如不充分,请说明缺口并优先调用工具 `fetch_data`(仅限 `daily`、`daily_basic`)。\n2. 梳理 2-3 个关键支撑信号与潜在风险,确保基于提供的数据。\n3. 结合量化证据与限制条件,给出操作建议和信心来源,避免主观臆测。\n\n【输出要求】\n仅返回一个 JSON 对象,不要添加额外文本:\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 0-1 之间的小数,\n \"summary\": \"一句话结论\",\n \"signals\": [\"关键支撑要点\", \"...\"],\n \"risks\": [\"关键风险要点\", \"...\"]\n}}\n如需说明未完成的数据请求请在 `risks` 或 `signals` 中明确。\n",
"variables": [
"title",
"ts_code",
"trade_date",
"description",
"instruction",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "base"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -26,6 +26,6 @@
"label": "structured_v2", "label": "structured_v2",
"notes": "增加信号与风险的结构化字段。" "notes": "增加信号与风险的结构化字段。"
}, },
"activate": true "activate": false
} }
} }

View File

@ -0,0 +1,27 @@
{
"liquidity_dept": {
"name": "流动性评估部门模板",
"description": "衡量成交活跃度与执行成本的提示词",
"template": "\n部门流动性评估部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 评估成交活跃度、交易成本与可执行性。\n- 提醒潜在的流动性风险与仓位限制。\n\n【研究重点】\n1. 当前成交量与历史均值的对比。\n2. 价量限制(涨跌停、停牌等)对执行的影响。\n3. 预估滑点与转手难度。\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 流动性特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请遵循【部门基础模板】的分析步骤重点描述执行可行性与仓位建议。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "liquidity"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -2,7 +2,7 @@
"liquidity_dept": { "liquidity_dept": {
"name": "流动性评估部门模板", "name": "流动性评估部门模板",
"description": "执行容量评估版", "description": "执行容量评估版",
"template": "部门:流动性评估部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【流动性结构】\n- 成交分布:\n{features}\n- 市场深度:\n{market_snapshot}\n- 额外观察:\n{supplements}\n\n【评估流程】\n1. 计算日内成交额、换手率与买卖盘差给出执行难度评级easy/normal/hard。\n2. 检查是否存在交易限制(涨跌停、停牌、集合竞价等)。\n3. 给出建议单笔容量与滑点预估范围。\n\n【输出格式】\n仅输出 JSON\n{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {\n \"metric\": \"关键指标\",\n \"value\": \"指标值\",\n \"execution_grade\": \"easy|normal|hard\"\n }\n ],\n \"risks\": [\n {\n \"threat\": \"执行风险\",\n \"monitor\": \"监控指标\",\n \"capacity_limit\": \"建议仓位上限\"\n }\n ]\n}\n如需额外数据请在 `risks` 中说明缺口字段。", "template": "部门:流动性评估部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【流动性结构】\n- 数据范围:\n{data_scope}\n- 成交分布:\n{features}\n- 市场深度:\n{market_snapshot}\n- 额外观察:\n{supplements}\n\n【评估流程】\n1. 计算日内成交额、换手率与买卖盘差给出执行难度评级easy/normal/hard。\n2. 检查是否存在交易限制(涨跌停、停牌、集合竞价等)。\n3. 给出建议单笔容量与滑点预估范围。\n\n【输出格式】\n仅输出 JSON\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {{\n \"metric\": \"关键指标\",\n \"value\": \"指标值\",\n \"execution_grade\": \"easy|normal|hard\"\n }}\n ],\n \"risks\": [\n {{\n \"threat\": \"执行风险\",\n \"monitor\": \"监控指标\",\n \"capacity_limit\": \"建议仓位上限\"\n }}\n ]\n}}\n如需额外数据请在 `risks` 中说明缺口字段。",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",

View File

@ -0,0 +1,27 @@
{
"macro_dept": {
"name": "宏观研究部门模板",
"description": "宏观与行业景气度分析提示词",
"template": "\n部门宏观研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 追踪宏观周期、行业景气与相对强弱。\n- 评估宏观事件对该标的的方向性影响。\n\n【研究重点】\n1. 行业相对大盘的表现与热点程度。\n2. 宏观/政策事件对行业或标的的指引。\n3. 需警惕的宏观风险与流动性环境。\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 宏观特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请执行【部门基础模板】的分析步骤并输出宏观驱动的信号与风险。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "macro"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -2,7 +2,7 @@
"macro_dept": { "macro_dept": {
"name": "宏观研究部门模板", "name": "宏观研究部门模板",
"description": "宏观驱动结构化版", "description": "宏观驱动结构化版",
"template": "部门:宏观研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【宏观信号板】\n- 宏观指标:\n{features}\n- 行业位置:\n{market_snapshot}\n- 补充材料:\n{supplements}\n\n【分析步骤】\n1. 将宏观指标划分为“增长、价格、流动性”三类,每类给出当前阶段(扩张/收缩/拐点)。\n2. 判断行业与指数的相对强弱,给出驱动因子和持续性判断。\n3. 列出未来 1-2 个重要事件或数据公布,并评估对策略的潜在冲击方向。\n\n【输出格式】\n仅输出 JSON\n{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {\n \"driver\": \"宏观驱动项\",\n \"stage\": \"expansion|contraction|turning\",\n \"evidence\": \"对应指标\"\n }\n ],\n \"risks\": [\n {\n \"event\": \"未来事件\",\n \"date\": \"预期日期\",\n \"scenario\": \"正面|负面|不确定\"\n }\n ]\n}\n若存在数据缺口请在 `risks` 中补充并说明所需指标。", "template": "部门:宏观研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【宏观信号板】\n- 数据范围:\n{data_scope}\n- 宏观指标:\n{features}\n- 行业位置:\n{market_snapshot}\n- 补充材料:\n{supplements}\n\n【分析步骤】\n1. 将宏观指标划分为“增长、价格、流动性”三类,每类给出当前阶段(扩张/收缩/拐点)。\n2. 判断行业与指数的相对强弱,给出驱动因子和持续性判断。\n3. 列出未来 1-2 个重要事件或数据公布,并评估对策略的潜在冲击方向。\n\n【输出格式】\n仅输出 JSON\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {{\n \"driver\": \"宏观驱动项\",\n \"stage\": \"expansion|contraction|turning\",\n \"evidence\": \"对应指标\"\n }}\n ],\n \"risks\": [\n {{\n \"event\": \"未来事件\",\n \"date\": \"预期日期\",\n \"scenario\": \"正面|负面|不确定\"\n }}\n ]\n}}\n若存在数据缺口请在 `risks` 中补充并说明所需指标。",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",

View File

@ -0,0 +1,27 @@
{
"momentum_dept": {
"name": "动量研究部门模板",
"description": "围绕价格与量能动量的决策提示",
"template": "\n部门动量研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 专注价格动量、成交量共振与技术指标背离。\n- 保持纪律,识别趋势延续与反转风险。\n\n【研究重点】\n1. 多时间窗口动量是否同向?\n2. 成交量是否验证价格走势?\n3. 是否出现过热或背离信号?\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 动量特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请沿用【部门基础模板】的分析步骤与输出要求重点量化趋势动能和量价配合度。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "momentum"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -2,7 +2,7 @@
"momentum_dept": { "momentum_dept": {
"name": "动量研究部门模板", "name": "动量研究部门模板",
"description": "多层级动量评估版本", "description": "多层级动量评估版本",
"template": "部门:动量研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 追踪价格与成交量动量的共振与切换。\n- 识别趋势衰减与阶段性反转信号。\n\n【分层动量视角】\n1. 超短线1-3 日)动量:\n{features}\n2. 短线5-10 日)趋势斜率:\n{market_snapshot}\n3. 中线20+ 日)位置与乖离:\n{data_scope}\n\n【执行指引】\n- 对每个时间层给出强度评级strong/weak/neutral。\n- 若评级存在冲突,需在 `risks` 说明优先采信的层级。\n- 必须评估量价背离与成交密集区。\n\n【输出要求】\n仅输出 JSON\n{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\"层级+观察\", \"...\"],\n \"risks\": [\"层级+风险\", \"...\"]\n}\n若需进一步数据请在 `risks` 中注明具体字段。", "template": "部门:动量研究部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 追踪价格与成交量动量的共振与切换。\n- 识别趋势衰减与阶段性反转信号。\n\n【分层动量视角】\n1. 超短线1-3 日)动量:\n{features}\n2. 短线5-10 日)趋势斜率:\n{market_snapshot}\n3. 中线20+ 日)位置与乖离:\n{data_scope}\n\n【执行指引】\n- 对每个时间层给出强度评级strong/weak/neutral。\n- 若评级存在冲突,需在 `risks` 说明优先采信的层级。\n- 必须评估量价背离与成交密集区。\n\n【追加数据】\n{supplements}\n\n【输出要求】\n仅输出 JSON\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\"层级+观察\", \"...\"],\n \"risks\": [\"层级+风险\", \"...\"]\n}}\n若需进一步数据请在 `risks` 中注明具体字段。",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",

View File

@ -0,0 +1,27 @@
{
"news_dept": {
"name": "新闻情绪部门模板",
"description": "针对舆情热度与事件影响的提示词",
"template": "\n部门新闻情绪部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 监控舆情热度、事件驱动与短期情绪。\n- 评估新闻对价格波动的正负面影响。\n\n【研究重点】\n1. 新闻情绪是否集中且持续?\n2. 主题与行情是否匹配?\n3. 情绪驱动的风险敞口。\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 舆情特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请遵循【部门基础模板】的分析步骤突出情绪驱动的力度与时效性。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "news"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -2,7 +2,7 @@
"news_dept": { "news_dept": {
"name": "新闻情绪部门模板", "name": "新闻情绪部门模板",
"description": "情绪脉冲量化版", "description": "情绪脉冲量化版",
"template": "部门:新闻情绪部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【情绪脉冲拆解】\n- 舆情亮点:\n{features}\n- 市场反馈:\n{market_snapshot}\n- 数据补充:\n{supplements}\n\n【分析步骤】\n1. 将新闻分为“正面/负面/中性”并评估强度0-1。\n2. 识别是否存在事件驱动催化,给出时间窗口与触发条件。\n3. 检查情绪与价格表现是否一致,如不一致需给出交易策略提示。\n\n【输出格式】\n仅输出 JSON\n{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {\n \"headline\": \"事件/主题\",\n \"sentiment\": \"positive|negative|neutral\",\n \"intensity\": 小数,\n \"impact_window\": \"时间窗口\"\n }\n ],\n \"risks\": [\n {\n \"threat\": \"潜在风险\",\n \"monitor\": \"监控指标\",\n \"mitigation\": \"对冲或等待条件\"\n }\n ]\n}\n如需更多数据请在 `risks` 中新增条目并说明来源。", "template": "部门:新闻情绪部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【情绪脉冲拆解】\n- 舆情亮点:\n{features}\n- 市场反馈:\n{market_snapshot}\n- 数据补充:\n{supplements}\n- 数据范围:\n{data_scope}\n\n【分析步骤】\n1. 将新闻分为“正面/负面/中性”并评估强度0-1。\n2. 识别是否存在事件驱动催化,给出时间窗口与触发条件。\n3. 检查情绪与价格表现是否一致,如不一致需给出交易策略提示。\n\n【输出格式】\n仅输出 JSON\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {{\n \"headline\": \"事件/主题\",\n \"sentiment\": \"positive|negative|neutral\",\n \"intensity\": 小数,\n \"impact_window\": \"时间窗口\"\n }}\n ],\n \"risks\": [\n {{\n \"threat\": \"潜在风险\",\n \"monitor\": \"监控指标\",\n \"mitigation\": \"对冲或等待条件\"\n }}\n ]\n}}\n如需更多数据请在 `risks` 中新增条目并说明来源。",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",

View File

@ -0,0 +1,27 @@
{
"risk_dept": {
"name": "风险控制部门模板",
"description": "识别极端风险与限制条件的提示词",
"template": "\n部门风险控制部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 防范停牌、涨跌停、仓位与合规限制。\n- 必要时对高风险决策行使否决权。\n\n【研究重点】\n1. 交易限制或异常波动情况。\n2. 仓位、集中度或风险指标是否触顶。\n3. 潜在的黑天鹅或执行障碍。\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 风险特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请按照【部门基础模板】的分析步骤必要时明确阻止交易的理由。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "risk"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -2,7 +2,7 @@
"risk_dept": { "risk_dept": {
"name": "风险控制部门模板", "name": "风险控制部门模板",
"description": "风险矩阵强化版", "description": "风险矩阵强化版",
"template": "部门:风险控制部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【风险总览】\n- 风险指标:\n{features}\n- 市场约束:\n{market_snapshot}\n- 其他观察:\n{supplements}\n\n【动作指引】\n1. 按“市场风险、流动性风险、合规风险”逐项给出评级low/medium/high。\n2. 如存在硬性限制(停牌、禁买名单等),需在 `signals` 中明确阻断原因。\n3. 给出减仓或对冲建议,注明建议比例与触发条件。\n\n【输出格式】\n仅输出 JSON\n{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {\n \"category\": \"风险类别\",\n \"level\": \"low|medium|high\",\n \"detail\": \"情况说明\"\n }\n ],\n \"risks\": [\n {\n \"threat\": \"潜在事件\",\n \"trigger\": \"触发阈值\",\n \"hedge\": \"建议对冲措施\"\n }\n ]\n}\n若需停止交易请在 `signals` 中输出 `category` 为 `block_trade` 的条目。", "template": "部门:风险控制部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【风险总览】\n- 数据范围:\n{data_scope}\n- 风险指标:\n{features}\n- 市场约束:\n{market_snapshot}\n- 其他观察:\n{supplements}\n\n【动作指引】\n1. 按“市场风险、流动性风险、合规风险”逐项给出评级low/medium/high。\n2. 如存在硬性限制(停牌、禁买名单等),需在 `signals` 中明确阻断原因。\n3. 给出减仓或对冲建议,注明建议比例与触发条件。\n\n【输出格式】\n仅输出 JSON\n{{\n \"action\": \"BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD\",\n \"confidence\": 小数,\n \"summary\": \"一句话\",\n \"signals\": [\n {{\n \"category\": \"风险类别\",\n \"level\": \"low|medium|high\",\n \"detail\": \"情况说明\"\n }}\n ],\n \"risks\": [\n {{\n \"threat\": \"潜在事件\",\n \"trigger\": \"触发阈值\",\n \"hedge\": \"建议对冲措施\"\n }}\n ]\n}}\n若需停止交易请在 `signals` 中输出 `category` 为 `block_trade` 的条目。",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",

View File

@ -0,0 +1,27 @@
{
"value_dept": {
"name": "价值评估部门模板",
"description": "衡量估值与盈利质量的提示词",
"template": "\n部门价值评估部门\n股票代码{ts_code}\n交易日{trade_date}\n\n【角色定位】\n- 关注估值分位、盈利质量与安全边际。\n- 从中期配置角度评价当前价格的性价比。\n\n【研究重点】\n1. 历史及同业视角的估值位置。\n2. 盈利与分红的可持续性。\n3. 潜在的估值修复催化或压制因素。\n\n【数据边界】\n- 可用字段:\n{data_scope}\n- 估值与质量特征:\n{features}\n- 市场背景:\n{market_snapshot}\n- 追加数据:\n{supplements}\n\n请按照【部门基础模板】的分析步骤输出结论并明确估值安全边际来源。\n",
"variables": [
"ts_code",
"trade_date",
"data_scope",
"features",
"market_snapshot",
"supplements"
],
"required_context": [
"ts_code",
"trade_date",
"features",
"market_snapshot"
],
"metadata": {
"category": "department",
"preset": "value"
},
"version": "1.0.0",
"activate": true
}
}

View File

@ -249,46 +249,27 @@ class TemplateRegistry:
register_default_templates() register_default_templates()
# Default template definitions DEFAULT_TEMPLATES: Dict[str, Dict[str, Any]] = {}
DEFAULT_TEMPLATES = {
_FALLBACK_TEMPLATE = (
"部门:{title}\n"
"股票代码:{ts_code}\n"
"交易日:{trade_date}\n\n"
"【职责与说明】\n"
"- 描述:{description}\n"
"- 指令:{instruction}\n\n"
"【数据概览】\n"
"- 数据范围:{data_scope}\n"
"- 核心特征:{features}\n"
"- 市场背景:{market_snapshot}\n"
"- 追加数据:{supplements}\n"
)
_INLINE_FALLBACK_TEMPLATES: Dict[str, Dict[str, Any]] = {
"department_base": { "department_base": {
"name": "部门基础模板", "name": "部门基础模板Fallback",
"description": "所有部门通用的审慎分析提示词骨架", "description": "提示模板目录缺失时加载的简易版本。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门{title}
股票代码{ts_code}
交易日{trade_date}
角色定位
- 角色说明{description}
- 行动守则{instruction}
数据边界
- 可用字段
{data_scope}
- 核心特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
分析步骤
1. 判断信息是否充分如不充分请说明缺口并优先调用工具 `fetch_data`仅限 `daily``daily_basic`
2. 梳理 2-3 个关键支撑信号与潜在风险确保基于提供的数据
3. 结合量化证据与限制条件给出操作建议和信心来源避免主观臆测
输出要求
仅返回一个 JSON 对象不要添加额外文本
{{
"action": "BUY|BUY_S|BUY_M|BUY_L|SELL|HOLD",
"confidence": 0-1 之间的小数
"summary": "一句话结论",
"signals": ["关键支撑要点", "..."],
"risks": ["关键风险要点", "..."]
}}
如需说明未完成的数据请求请在 `risks` `signals` 中明确
""",
"variables": [ "variables": [
"title", "title",
"ts_code", "ts_code",
@ -306,40 +287,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "base",
},
}, },
"momentum_dept": { "momentum_dept": {
"name": "动量研究部门模板", "name": "动量研究部门模板Fallback",
"description": "围绕价格与量能动量的决策提示", "description": "用于缺省情况下的动量提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门动量研究部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 专注价格动量成交量共振与技术指标背离
- 保持纪律识别趋势延续与反转风险
研究重点
1. 多时间窗口动量是否同向
2. 成交量是否验证价格走势
3. 是否出现过热或背离信号
数据边界
- 可用字段
{data_scope}
- 动量特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请沿用部门基础模板的分析步骤与输出要求重点量化趋势动能和量价配合度
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -354,40 +307,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "momentum",
},
}, },
"value_dept": { "value_dept": {
"name": "价值评估部门模板", "name": "价值评估部门模板Fallback",
"description": "衡量估值与盈利质量的提示词", "description": "用于缺省情况下的价值提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门价值评估部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 关注估值分位盈利质量与安全边际
- 从中期配置角度评价当前价格的性价比
研究重点
1. 历史及同业视角的估值位置
2. 盈利与分红的可持续性
3. 潜在的估值修复催化或压制因素
数据边界
- 可用字段
{data_scope}
- 估值与质量特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请按照部门基础模板的分析步骤输出结论并明确估值安全边际来源
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -402,40 +327,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "value",
},
}, },
"news_dept": { "news_dept": {
"name": "新闻情绪部门模板", "name": "新闻情绪部门模板Fallback",
"description": "针对舆情热度与事件影响的提示词", "description": "用于缺省情况下的新闻提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门新闻情绪部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 监控舆情热度事件驱动与短期情绪
- 评估新闻对价格波动的正负面影响
研究重点
1. 新闻情绪是否集中且持续
2. 主题与行情是否匹配
3. 情绪驱动的风险敞口
数据边界
- 可用字段
{data_scope}
- 舆情特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请遵循部门基础模板的分析步骤突出情绪驱动的力度与时效性
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -450,40 +347,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "news",
},
}, },
"liquidity_dept": { "liquidity_dept": {
"name": "流动性评估部门模板", "name": "流动性评估部门模板Fallback",
"description": "衡量成交活跃度与执行成本的提示词", "description": "用于缺省情况下的流动性提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门流动性评估部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 评估成交活跃度交易成本与可执行性
- 提醒潜在的流动性风险与仓位限制
研究重点
1. 当前成交量与历史均值的对比
2. 价量限制涨跌停停牌等对执行的影响
3. 预估滑点与转手难度
数据边界
- 可用字段
{data_scope}
- 流动性特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请遵循部门基础模板的分析步骤重点描述执行可行性与仓位建议
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -498,40 +367,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "liquidity",
},
}, },
"macro_dept": { "macro_dept": {
"name": "宏观研究部门模板", "name": "宏观研究部门模板Fallback",
"description": "宏观与行业景气度分析提示词", "description": "用于缺省情况下的宏观提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门宏观研究部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 追踪宏观周期行业景气与相对强弱
- 评估宏观事件对该标的的方向性影响
研究重点
1. 行业相对大盘的表现与热点程度
2. 宏观/政策事件对行业或标的的指引
3. 需警惕的宏观风险与流动性环境
数据边界
- 可用字段
{data_scope}
- 宏观特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请执行部门基础模板的分析步骤并输出宏观驱动的信号与风险
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -546,40 +387,12 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "macro",
},
}, },
"risk_dept": { "risk_dept": {
"name": "风险控制部门模板", "name": "风险控制部门模板Fallback",
"description": "识别极端风险与限制条件的提示词", "description": "用于缺省情况下的风险提示。",
"template": """ "template": _FALLBACK_TEMPLATE,
部门风险控制部门
股票代码{ts_code}
交易日{trade_date}
角色定位
- 防范停牌涨跌停仓位与合规限制
- 必要时对高风险决策行使否决权
研究重点
1. 交易限制或异常波动情况
2. 仓位集中度或风险指标是否触顶
3. 潜在的黑天鹅或执行障碍
数据边界
- 可用字段
{data_scope}
- 风险特征
{features}
- 市场背景
{market_snapshot}
- 追加数据
{supplements}
请按照部门基础模板的分析步骤必要时明确阻止交易的理由
""",
"variables": [ "variables": [
"ts_code", "ts_code",
"trade_date", "trade_date",
@ -594,56 +407,21 @@ DEFAULT_TEMPLATES = {
"features", "features",
"market_snapshot", "market_snapshot",
], ],
"metadata": { "metadata": {"source": "inline_fallback"},
"category": "department",
"preset": "risk",
},
}, },
} }
def register_default_templates() -> None:
"""Register all default templates from DEFAULT_TEMPLATES."""
for template_id, cfg in DEFAULT_TEMPLATES.items():
template_config = {
"id": template_id,
"name": cfg.get("name", template_id),
"description": cfg.get("description", ""),
"template": cfg.get("template", ""),
"variables": cfg.get("variables", []),
"max_length": cfg.get("max_length", 4000),
"required_context": cfg.get("required_context", []),
"validation_rules": cfg.get("validation_rules", [])
}
try:
template = PromptTemplate(**template_config)
version_label = str(
cfg.get("version") or TemplateRegistry._default_version_label
)
metadata_raw = cfg.get("metadata")
metadata = dict(metadata_raw) if isinstance(metadata_raw, dict) else {}
metadata.setdefault("source", "defaults")
TemplateRegistry.register(
template,
version=version_label,
metadata=metadata,
activate=cfg.get("activate", True),
)
except ValueError as e:
logging.warning(f"Failed to register template {template_id}: {e}")
# Auto-register default templates on module import
EXTERNAL_TEMPLATE_DIR = Path(__file__).resolve().parents[1] / "data" / "prompt_templates" EXTERNAL_TEMPLATE_DIR = Path(__file__).resolve().parents[1] / "data" / "prompt_templates"
def load_external_template_configs(directory: Path | str = EXTERNAL_TEMPLATE_DIR) -> None: def load_external_template_configs(directory: Path | str = EXTERNAL_TEMPLATE_DIR) -> int:
"""Load additional template versions from JSON files in the given directory.""" """Load additional template versions from JSON files in the given directory."""
directory_path = Path(directory) directory_path = Path(directory)
if not directory_path.exists() or not directory_path.is_dir(): if not directory_path.exists() or not directory_path.is_dir():
return return 0
loaded = 0
for file_path in sorted(directory_path.glob("*.json")): for file_path in sorted(directory_path.glob("*.json")):
try: try:
raw_data = file_path.read_text(encoding="utf-8") raw_data = file_path.read_text(encoding="utf-8")
@ -680,13 +458,51 @@ def load_external_template_configs(directory: Path | str = EXTERNAL_TEMPLATE_DIR
try: try:
TemplateRegistry.load_from_json(json.dumps(enriched_payload, ensure_ascii=False)) TemplateRegistry.load_from_json(json.dumps(enriched_payload, ensure_ascii=False))
loaded += len(enriched_payload)
except Exception as exc: # noqa: BLE001 except Exception as exc: # noqa: BLE001
logging.warning( logging.warning(
"注册提示模板配置 %s 失败:%s", "注册提示模板配置 %s 失败:%s",
file_path, file_path,
exc, exc,
) )
return loaded
def _register_inline_fallbacks() -> None:
"""Register minimal inline templates when file-based templates are unavailable."""
for template_id, cfg in _INLINE_FALLBACK_TEMPLATES.items():
try:
template = PromptTemplate(
id=template_id,
name=cfg.get("name", template_id),
description=cfg.get("description", ""),
template=cfg.get("template", ""),
variables=cfg.get("variables", []),
max_length=cfg.get("max_length", 4000),
required_context=cfg.get("required_context", []),
validation_rules=cfg.get("validation_rules", []),
)
TemplateRegistry.register(
template,
version="0.0.1",
metadata=cfg.get("metadata"),
activate=True,
)
except ValueError as exc: # noqa: BLE001
logging.warning("Fallback template %s 注册失败:%s", template_id, exc)
def register_default_templates() -> None:
"""Load templates from configuration files, falling back to inline defaults if needed."""
loaded = load_external_template_configs()
if loaded == 0:
logging.warning(
"未在 %s 中找到提示模板配置,使用内置 fallback。",
EXTERNAL_TEMPLATE_DIR,
)
_register_inline_fallbacks()
register_default_templates() register_default_templates()
load_external_template_configs()

View File

@ -155,7 +155,6 @@ def test_template_registry():
def test_default_templates(): def test_default_templates():
"""Test default template registration.""" """Test default template registration."""
TemplateRegistry.clear(reload_defaults=True) TemplateRegistry.clear(reload_defaults=True)
from app.llm.templates import DEFAULT_TEMPLATES
# Verify default templates are loaded # Verify default templates are loaded
assert len(TemplateRegistry.list()) > 0 assert len(TemplateRegistry.list()) > 0