From e234d6668730d61b2c8db9cc5ed2a5b618fa1f3b Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 6 Oct 2025 15:43:20 +0800 Subject: [PATCH] update --- .../department_base@1.0.0.json | 30 ++ .../department_base@1.2.0.json | 2 +- .../liquidity_dept@1.0.0.json | 27 ++ .../liquidity_dept@1.1.0.json | 2 +- .../prompt_templates/macro_dept@1.0.0.json | 27 ++ .../prompt_templates/macro_dept@1.1.0.json | 2 +- .../prompt_templates/momentum_dept@1.0.0.json | 27 ++ .../prompt_templates/momentum_dept@1.1.0.json | 2 +- .../prompt_templates/news_dept@1.0.0.json | 27 ++ .../prompt_templates/news_dept@1.1.0.json | 2 +- .../prompt_templates/risk_dept@1.0.0.json | 27 ++ .../prompt_templates/risk_dept@1.1.0.json | 2 +- .../prompt_templates/value_dept@1.0.0.json | 27 ++ app/llm/templates.py | 358 +++++------------- tests/test_llm_templates.py | 1 - 15 files changed, 285 insertions(+), 278 deletions(-) create mode 100644 app/data/prompt_templates/department_base@1.0.0.json create mode 100644 app/data/prompt_templates/liquidity_dept@1.0.0.json create mode 100644 app/data/prompt_templates/macro_dept@1.0.0.json create mode 100644 app/data/prompt_templates/momentum_dept@1.0.0.json create mode 100644 app/data/prompt_templates/news_dept@1.0.0.json create mode 100644 app/data/prompt_templates/risk_dept@1.0.0.json create mode 100644 app/data/prompt_templates/value_dept@1.0.0.json diff --git a/app/data/prompt_templates/department_base@1.0.0.json b/app/data/prompt_templates/department_base@1.0.0.json new file mode 100644 index 0000000..ce2be4b --- /dev/null +++ b/app/data/prompt_templates/department_base@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/department_base@1.2.0.json b/app/data/prompt_templates/department_base@1.2.0.json index 26b0d51..e89bb7f 100644 --- a/app/data/prompt_templates/department_base@1.2.0.json +++ b/app/data/prompt_templates/department_base@1.2.0.json @@ -26,6 +26,6 @@ "label": "structured_v2", "notes": "增加信号与风险的结构化字段。" }, - "activate": true + "activate": false } } \ No newline at end of file diff --git a/app/data/prompt_templates/liquidity_dept@1.0.0.json b/app/data/prompt_templates/liquidity_dept@1.0.0.json new file mode 100644 index 0000000..0efc8bc --- /dev/null +++ b/app/data/prompt_templates/liquidity_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/liquidity_dept@1.1.0.json b/app/data/prompt_templates/liquidity_dept@1.1.0.json index b22fd1d..b9558e1 100644 --- a/app/data/prompt_templates/liquidity_dept@1.1.0.json +++ b/app/data/prompt_templates/liquidity_dept@1.1.0.json @@ -2,7 +2,7 @@ "liquidity_dept": { "name": "流动性评估部门模板", "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": [ "ts_code", "trade_date", diff --git a/app/data/prompt_templates/macro_dept@1.0.0.json b/app/data/prompt_templates/macro_dept@1.0.0.json new file mode 100644 index 0000000..3fd2854 --- /dev/null +++ b/app/data/prompt_templates/macro_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/macro_dept@1.1.0.json b/app/data/prompt_templates/macro_dept@1.1.0.json index 490483e..10c3cda 100644 --- a/app/data/prompt_templates/macro_dept@1.1.0.json +++ b/app/data/prompt_templates/macro_dept@1.1.0.json @@ -2,7 +2,7 @@ "macro_dept": { "name": "宏观研究部门模板", "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": [ "ts_code", "trade_date", diff --git a/app/data/prompt_templates/momentum_dept@1.0.0.json b/app/data/prompt_templates/momentum_dept@1.0.0.json new file mode 100644 index 0000000..a01c650 --- /dev/null +++ b/app/data/prompt_templates/momentum_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/momentum_dept@1.1.0.json b/app/data/prompt_templates/momentum_dept@1.1.0.json index b10368d..52780b5 100644 --- a/app/data/prompt_templates/momentum_dept@1.1.0.json +++ b/app/data/prompt_templates/momentum_dept@1.1.0.json @@ -2,7 +2,7 @@ "momentum_dept": { "name": "动量研究部门模板", "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": [ "ts_code", "trade_date", diff --git a/app/data/prompt_templates/news_dept@1.0.0.json b/app/data/prompt_templates/news_dept@1.0.0.json new file mode 100644 index 0000000..31d2af3 --- /dev/null +++ b/app/data/prompt_templates/news_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/news_dept@1.1.0.json b/app/data/prompt_templates/news_dept@1.1.0.json index ff7f2e2..cc736ad 100644 --- a/app/data/prompt_templates/news_dept@1.1.0.json +++ b/app/data/prompt_templates/news_dept@1.1.0.json @@ -2,7 +2,7 @@ "news_dept": { "name": "新闻情绪部门模板", "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": [ "ts_code", "trade_date", diff --git a/app/data/prompt_templates/risk_dept@1.0.0.json b/app/data/prompt_templates/risk_dept@1.0.0.json new file mode 100644 index 0000000..312f667 --- /dev/null +++ b/app/data/prompt_templates/risk_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/data/prompt_templates/risk_dept@1.1.0.json b/app/data/prompt_templates/risk_dept@1.1.0.json index 0880c06..d536486 100644 --- a/app/data/prompt_templates/risk_dept@1.1.0.json +++ b/app/data/prompt_templates/risk_dept@1.1.0.json @@ -2,7 +2,7 @@ "risk_dept": { "name": "风险控制部门模板", "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": [ "ts_code", "trade_date", diff --git a/app/data/prompt_templates/value_dept@1.0.0.json b/app/data/prompt_templates/value_dept@1.0.0.json new file mode 100644 index 0000000..0da84c0 --- /dev/null +++ b/app/data/prompt_templates/value_dept@1.0.0.json @@ -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 + } +} \ No newline at end of file diff --git a/app/llm/templates.py b/app/llm/templates.py index a86e969..2891303 100644 --- a/app/llm/templates.py +++ b/app/llm/templates.py @@ -249,46 +249,27 @@ class TemplateRegistry: register_default_templates() -# Default template definitions -DEFAULT_TEMPLATES = { +DEFAULT_TEMPLATES: Dict[str, Dict[str, Any]] = {} + +_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": { - "name": "部门基础模板", - "description": "所有部门通用的审慎分析提示词骨架", - "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` 中明确。 -""", + "name": "部门基础模板(Fallback)", + "description": "提示模板目录缺失时加载的简易版本。", + "template": _FALLBACK_TEMPLATE, "variables": [ "title", "ts_code", @@ -306,40 +287,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "base", - }, + "metadata": {"source": "inline_fallback"}, }, "momentum_dept": { - "name": "动量研究部门模板", - "description": "围绕价格与量能动量的决策提示", - "template": """ -部门:动量研究部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 专注价格动量、成交量共振与技术指标背离。 -- 保持纪律,识别趋势延续与反转风险。 - -【研究重点】 -1. 多时间窗口动量是否同向? -2. 成交量是否验证价格走势? -3. 是否出现过热或背离信号? - -【数据边界】 -- 可用字段: -{data_scope} -- 动量特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请沿用【部门基础模板】的分析步骤与输出要求,重点量化趋势动能和量价配合度。 -""", + "name": "动量研究部门模板(Fallback)", + "description": "用于缺省情况下的动量提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -354,40 +307,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "momentum", - }, + "metadata": {"source": "inline_fallback"}, }, "value_dept": { - "name": "价值评估部门模板", - "description": "衡量估值与盈利质量的提示词", - "template": """ -部门:价值评估部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 关注估值分位、盈利质量与安全边际。 -- 从中期配置角度评价当前价格的性价比。 - -【研究重点】 -1. 历史及同业视角的估值位置。 -2. 盈利与分红的可持续性。 -3. 潜在的估值修复催化或压制因素。 - -【数据边界】 -- 可用字段: -{data_scope} -- 估值与质量特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请按照【部门基础模板】的分析步骤输出结论,并明确估值安全边际来源。 -""", + "name": "价值评估部门模板(Fallback)", + "description": "用于缺省情况下的价值提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -402,40 +327,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "value", - }, + "metadata": {"source": "inline_fallback"}, }, "news_dept": { - "name": "新闻情绪部门模板", - "description": "针对舆情热度与事件影响的提示词", - "template": """ -部门:新闻情绪部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 监控舆情热度、事件驱动与短期情绪。 -- 评估新闻对价格波动的正负面影响。 - -【研究重点】 -1. 新闻情绪是否集中且持续? -2. 主题与行情是否匹配? -3. 情绪驱动的风险敞口。 - -【数据边界】 -- 可用字段: -{data_scope} -- 舆情特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请遵循【部门基础模板】的分析步骤,突出情绪驱动的力度与时效性。 -""", + "name": "新闻情绪部门模板(Fallback)", + "description": "用于缺省情况下的新闻提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -450,40 +347,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "news", - }, + "metadata": {"source": "inline_fallback"}, }, "liquidity_dept": { - "name": "流动性评估部门模板", - "description": "衡量成交活跃度与执行成本的提示词", - "template": """ -部门:流动性评估部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 评估成交活跃度、交易成本与可执行性。 -- 提醒潜在的流动性风险与仓位限制。 - -【研究重点】 -1. 当前成交量与历史均值的对比。 -2. 价量限制(涨跌停、停牌等)对执行的影响。 -3. 预估滑点与转手难度。 - -【数据边界】 -- 可用字段: -{data_scope} -- 流动性特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请遵循【部门基础模板】的分析步骤,重点描述执行可行性与仓位建议。 -""", + "name": "流动性评估部门模板(Fallback)", + "description": "用于缺省情况下的流动性提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -498,40 +367,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "liquidity", - }, + "metadata": {"source": "inline_fallback"}, }, "macro_dept": { - "name": "宏观研究部门模板", - "description": "宏观与行业景气度分析提示词", - "template": """ -部门:宏观研究部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 追踪宏观周期、行业景气与相对强弱。 -- 评估宏观事件对该标的的方向性影响。 - -【研究重点】 -1. 行业相对大盘的表现与热点程度。 -2. 宏观/政策事件对行业或标的的指引。 -3. 需警惕的宏观风险与流动性环境。 - -【数据边界】 -- 可用字段: -{data_scope} -- 宏观特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请执行【部门基础模板】的分析步骤,并输出宏观驱动的信号与风险。 -""", + "name": "宏观研究部门模板(Fallback)", + "description": "用于缺省情况下的宏观提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -546,40 +387,12 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "macro", - }, + "metadata": {"source": "inline_fallback"}, }, "risk_dept": { - "name": "风险控制部门模板", - "description": "识别极端风险与限制条件的提示词", - "template": """ -部门:风险控制部门 -股票代码:{ts_code} -交易日:{trade_date} - -【角色定位】 -- 防范停牌、涨跌停、仓位与合规限制。 -- 必要时对高风险决策行使否决权。 - -【研究重点】 -1. 交易限制或异常波动情况。 -2. 仓位、集中度或风险指标是否触顶。 -3. 潜在的黑天鹅或执行障碍。 - -【数据边界】 -- 可用字段: -{data_scope} -- 风险特征: -{features} -- 市场背景: -{market_snapshot} -- 追加数据: -{supplements} - -请按照【部门基础模板】的分析步骤,必要时明确阻止交易的理由。 -""", + "name": "风险控制部门模板(Fallback)", + "description": "用于缺省情况下的风险提示。", + "template": _FALLBACK_TEMPLATE, "variables": [ "ts_code", "trade_date", @@ -594,56 +407,21 @@ DEFAULT_TEMPLATES = { "features", "market_snapshot", ], - "metadata": { - "category": "department", - "preset": "risk", - }, + "metadata": {"source": "inline_fallback"}, }, } - -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" -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.""" directory_path = Path(directory) 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")): try: 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: TemplateRegistry.load_from_json(json.dumps(enriched_payload, ensure_ascii=False)) + loaded += len(enriched_payload) except Exception as exc: # noqa: BLE001 logging.warning( "注册提示模板配置 %s 失败:%s", file_path, 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() -load_external_template_configs() diff --git a/tests/test_llm_templates.py b/tests/test_llm_templates.py index b314349..dfdeb0f 100644 --- a/tests/test_llm_templates.py +++ b/tests/test_llm_templates.py @@ -155,7 +155,6 @@ def test_template_registry(): def test_default_templates(): """Test default template registration.""" TemplateRegistry.clear(reload_defaults=True) - from app.llm.templates import DEFAULT_TEMPLATES # Verify default templates are loaded assert len(TemplateRegistry.list()) > 0