FinBuddy 意图引擎重构

· FinBuddy

今日进展

  1. 意图引擎从 6 层继承链重构为组合模式:每个解析器独立,通过管道串联
  2. 回测引擎升级:新增参数优化、多品种支持
  3. Swarm 子代理优化:DAG 拓扑排序 + 并行执行
  4. 数据源适配器重构:统一接口,支持 akshare/baostock/tushare/easyquotation
  5. 清理废弃代码,文档中文化

关键代码/伪代码

意图引擎:继承链 → 组合模式

# 重构前:6 层继承链,调试要跳 6 个文件
# RuleParser → LLMParser → ModeAware → ExpertAware → SkillAware → Engine
# 问题:改一层影响所有子类,加功能只能继续继承

# 重构后:组合模式,每个解析器独立,管道串联
CLASS UnifiedIntentEngine:
    """组合模式:解析器管道"""

    DEF __init__(self):
        # 每个解析器独立,可单独测试和替换
        self.parsers = [
            RuleParser(),          # 第1道:规则快速匹配
            SkillAwareParser(),    # 第2道:技能匹配
            ExpertAwareParser(),   # 第3道:专家匹配
            ModeAwareParser(),     # 第4道:模式感知
            LLMParser(),           # 第5道:LLM 语义兜底
        ]

    ASYNC DEF parse(self, query) -> IntentResult:
        # 管道执行:依次通过每个解析器
        # 任何一个解析器返回高置信度结果就停止
        FOR parser IN self.parsers:
            result = AWAIT parser.parse(query)
            IF result.confidence > 0.85:
                RETURN result
        # 所有解析器都低置信度,返回 LLM 结果
        RETURN result

Swarm DAG 编排

# Swarm 引擎:按 DAG 依赖关系编排子 Agent
# 无依赖的并行执行,有依赖的串行执行

CLASS SwarmEngine:
    """DAG 编排引擎"""

    ASYNC DEF execute(self, dag: DAG) -> SwarmResult:
        # 1. 拓扑排序:确定执行顺序
        sorted_nodes = topological_sort(dag)

        # 2. 按层级并行执行
        FOR level IN group_by_level(sorted_nodes):
            # 同一层级的节点无依赖,可并行
            tasks = [self._run_node(node) FOR node IN level]
            results = AWAIT asyncio.gather(*tasks)

            # 3. 将本层结果注入下层依赖
            FOR result IN results:
                dag.inject_result(result)

        RETURN dag.collect_results()

遇到的问题

  • 继承链重构为组合模式后,解析器之间的数据传递需要显式传参,不能靠 self 属性,代码量增加了约 20%
  • DAG 拓扑排序遇到循环依赖时会死循环,需要加环检测
  • 数据源适配器统一接口后,各数据源的字段命名不一致(如 akshare 用"日期",tushare 用"trade_date"),需要做字段映射

明日计划

  • 完善字段映射层
  • 新增自选股系统