Files
group_fqcd_jr/docs/18-投顾Agent意图与资产配置设计.md

7.4 KiB

投顾 Agent 意图与资产配置设计

版本:v1.0 状态:实施中 修订日期:2026-09-10

1. 意图分类

advisor Agent 在公共 IntentClassifier 中声明并描述以下投顾意图。描述与意图白名单一同进入受路由模型的分类提示,模型输出仍必须是白名单内的 JSON Intent。

Intent Key 典型触发 当前路由
product_recommend 推荐、有什么适合、给客户推荐 已上线约束满足、图谱增强与多因子排序的只读分析,不创建交易
portfolio_analysis 持仓分析、集中、分布在哪些行业、风险预警 已上线 MySQL 权威持仓集中度、行业穿透和规则化预警;Neo4j 仅提供异步关系投影后的定性解释,不参与数值计算
asset_allocation 配置比例、怎么分配、资产建议 已上线只读配置比例分析
comparison 共同持仓、有什么不同、对比 已受控识别;多实体图谱查询和跨客户授权服务未上线,不生成对比报告

当模型分类服务不可用或尚未返回分类结果时,AdvisorAgent 仍按上述典型触发词做保守回退路由。交易、申购、赎回、下单和成交确认请求始终优先拒绝,不进入任何投顾分析路径。

2. 资产配置

资产配置是分析功能,不创建委托、不写入交易表、不执行场内基金模拟交易。工具链如下:

  1. generate_asset_allocation 读取当前有效的正式风险测评对应画像。
  2. 读取当前已确认的投资目标;未采集或未确认时只提示补齐流程。
  3. 以内部风险等级、投资期限、流动性要求和最大回撤为输入,输出现金管理类、债券类、权益类场内基金的目标比例。
  4. 短期限或日流动性需求提高现金管理比例;较低回撤上限限制权益比例。比例合计固定为 100%。

客户回复只展示资产类别和比例,不展示问卷答案、总分、C1-C5、风险画像、画像标签或评分规则。内部画像读取仅供受控 Agent 工具使用。

3. 产品推荐

recommend_products 按以下顺序执行,任何一步失败都不会进入下一步或生成交易指令:

  1. 从 fin_product 读取状态为“上市”、且位于系统开放交易时间窗内的场内产品。
  2. 使用当前有效正式测评的内部风险等级,对每个候选执行适当性硬过滤;未通过的产品不会参与排序。
  3. 通过固定的 Product -> Industry/Category 查询读取至多一跳 Neo4j 关系。Neo4j 不是产品、风险或交易状态的权威来源,连接失败时图谱分数为零,并在对客结果中明确降级。
  4. 按收益代理 30%、风险匹配 25%、期限匹配 15%、分散信号 15%、图谱信号 15% 排序,最多返回三个候选。当前基线没有权威的预期收益率字段,因此收益项暂保持中性,不会编造收益预测。
  5. 以受控模板生成理由,只说明产品已通过适当性过滤、与已确认期限相符及图谱可用性;不向客户或外部模型暴露问卷答案、C1-C5、资产规模或画像原文。

用户提供的理由模板中包含内部风险等级和资产规模,这两项不能直接用于对客生成文本。若后续要引入模型生成,必须先通过模型路由、脱敏输入契约和合规模板审核,且保留确定性模板作为降级路径。

4. 权限与发布配置

本期未修改数据库基线中的既有表或字段,也没有新增迁移。画像读取复用 fin_risk_assessment 与 profile_snapshots,投资目标复用既有的 advisor_investment_goal 兼容扩展。

启用资产配置前,超级管理员需要在权限中心受控配置并授予客户:

  • customer-profile:read:self
  • investment-goal:read:self
  • asset-allocation:generate:self
  • product-recommendation:read:self
  • suitability:read
  • portfolio-analysis:read:self

还需要在同一个已发布版本的 agent_tools 配置中登记:

{
  "namespace": "agent_tools",
  "config_key": "advisor:asset_allocation",
  "value_json": {"allowed_tools": ["generate_asset_allocation"]}
}

产品推荐还需要登记独立的工具白名单:

{
  "namespace": "agent_tools",
  "config_key": "advisor:product_recommend",
  "value_json": {"allowed_tools": ["recommend_products"]}
}

query_customer_profile 是内部只读工具,不作为客户可见接口,也不得单独回显其结果。

5. 持仓分析

analyze_portfolio 只读取权威的 fin_holding 和 fin_product,不创建、修改或取消委托。它使用新建的 advisor_product_industry_exposure 作为版本化参考数据,按以下规则输出:

  1. 按已估值持仓市值计算产品占比与产品 HHI。
  2. 将每个产品的市值按行业暴露权重穿透,输出主要行业及行业 HHI。
  3. 行业参考数据覆盖低于阈值时,不输出行业集中度结论;市值缺失时不将其按零处理,而是给出数据质量提示。
  4. 规则化预警包括单产品集中、单行业集中、当前持仓适当性待复核、产品状态关注、行业覆盖不足和数据异常。

advisor_product_industry_exposure 为唯一新增表,保留每个 product_id 在 as_of_date 的行业权重快照,引用未变更的 fin_product.id。迁移不修改、重命名、删除或复用基线中的任何表或字段。行业暴露的维护方必须提供可审计的 source,每一产品快照的行业权重总和不得超过 100%;异常快照不会参与行业穿透计算。

启用前需要在已发布配置中增加工具白名单:

{
  "namespace": "agent_tools",
  "config_key": "advisor:portfolio_analysis",
  "value_json": {"allowed_tools": ["analyze_portfolio"]}
}

预警阈值通过同一发布批次中的配置受控调整,所有值均为 1 至 100 的整数百分比:

{
  "namespace": "portfolio_analysis",
  "config_key": "thresholds",
  "value_json": {
    "single_product_concentration_pct": 30,
    "single_industry_concentration_pct": 40,
    "min_industry_coverage_pct": 80
  }
}

后续 Neo4j 投影只能异步同步经审核的 Product -> EXPOSED_TO_INDUSTRY -> Industry 参考关系及来源版本。fin_holding 的持仓市值、fin_product 的状态和风险等级始终以 MySQL 为准;图谱不可用时,持仓分析仍可返回产品层结论和明确的数据覆盖提示。

6. 图谱增强投影

持仓分析的数值结论始终由 MySQL 中的 fin_holding、fin_product 和 advisor_product_industry_exposure 计算。Neo4j 仅保存异步投影的最小关系快照: Customer -> HOLDS -> Product -> EXPOSED_TO_INDUSTRY -> Industry。

PortfolioGraphProjectionWorker 只能在持仓或行业暴露参考数据变更后异步触发;它不投影市值、成本、盈亏、产品名称或客户姓名、联系方式等身份资料。图谱查询只能由 RelationshipService 中的固定 Cypher 发起,不接收 Agent 或调用方传入的任意 Cypher。

图谱查询成功时,analyze_portfolio 仅补充“多只持仓产品关联同一行业”的定性关系证据,不参与 HHI、行业占比或预警阈值的计算。Neo4j 不可用、返回异常或投影尚未完成时,工具返回显式降级标记,MySQL 的持仓报告、数值和风险提示仍然可用。

当前 worker 已具备可被任务调度器或事件 outbox 调用的投影入口;接入运行环境时必须使用持久化事件、幂等键和失败重试,不能在用户同步请求中直接执行投影。