FinBuddy 意图引擎重构
· FinBuddy
今日进展
- 意图引擎从 6 层继承链重构为组合模式:每个解析器独立,通过管道串联
- 回测引擎升级:新增参数优化、多品种支持
- Swarm 子代理优化:DAG 拓扑排序 + 并行执行
- 数据源适配器重构:统一接口,支持 akshare/baostock/tushare/easyquotation
- 清理废弃代码,文档中文化
关键代码/伪代码
意图引擎:继承链 → 组合模式
# 重构前: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"),需要做字段映射
明日计划
- 完善字段映射层
- 新增自选股系统