
一、产品定位
StockMind 是一个 AI 驱动的股票分析辅助工具。
一句话概括:它帮你读新闻、看财报、结合一些主流知识经验、也可以结合你自己的炒股经验,给出可解释的买卖建议。
它做三件事:
信息聚合:自动检索新闻、财报、行情数据
经验执行:按用户设定的规则自动分析
可解释输出:每个结论都附带推理过程
它不是自动交易机器人,不保证赚钱,不替你做决策,只关注分析过程。
二、整体架构
系统分为五层,从上到下依次是:
┌─────────────────────────────────────────────┐│ 客户端层 ││ Web端 / 移动端 / REST API │├─────────────────────────────────────────────┤│ 接入层 ││ API网关 / 认证鉴权 / 限流熔断 │├─────────────────────────────────────────────┤│ Agent层(核心) ││ 主Agent + 子Agent + ReAct推理 │├─────────────────────────────────────────────┤│ 能力层 ││ 工具系统 / 记忆系统 / 中间件 │├─────────────────────────────────────────────┤│ 基础设施层 ││ 工作区 / 会话 / 文件系统抽象 │└─────────────────────────────────────────────┘
三、技术栈
| AgentScope Java | ||
为什么选 AgentScope?
AgentScope 是阿里开源的多智能体框架,天然支持:
ReAct 推理模式(思考-行动-观察循环)
自主工具调用
多智能体协作
工作区(Workspace)机制
会话状态持久化
长期记忆管理
感兴趣可以看一下前面文章关于AgentScope的内容。
四、模块划分
4.1 模块总览
4.2 核心模块详解
M4:主Agent(HarnessAgent)
这是系统的执行大脑,基于 AgentScope 的 HarnessAgent 构建。
HarnessAgent stockAgent = HarnessAgent.builder().name("stock-analysis-agent").model("dashscope:deepseek-v4-pro").workspace(Paths.get("/agentscope/workspace")).memory(Mem0MemorySpec.builder().backend("redis").build()).build();
工作区结构:
workspace/├── AGENTS.md ← Agent人格与行为约定├── MEMORY.md ← 长期记忆(用户偏好)├── knowledge/ ← 领域知识├── skills/ ← 可复用技能└── subagents/ ← 子Agent声明
M6:工具系统(@Tool)
所有分析能力通过 @Tool 注解暴露给 Agent:
search_news | |
get_financial | |
get_quote | |
get_kline | |
calc_rsi | |
calc_macd | |
match_experience |
M7:中间件(Middleware)
AgentScope 提供5个钩子位置,用于插入横切逻辑:
onAgent | ||
onReasoning | ||
onActing | ||
onModelCall | ||
onSystemPrompt |
M8:记忆系统(Mem0Memory)
双层记忆架构:
每轮对话结束后,系统自动提炼新事实写入 MEMORY.md,后台进程周期性合并为长期记忆。
五、关键流程
5.1 单股分析流程
用户请求分析000001↓API网关接收 → 认证鉴权 → 注入RuntimeContext(userId, sessionId)↓主Agent根据sessionId恢复工作区状态↓ReAct循环(自主执行):├── Thought: 需要先检索新闻├── Action: 调用 search_news 工具├── Observation: 返回5条新闻,情绪偏多├── Thought: 需要看技术指标├── Action: 调用 calc_rsi 工具├── Observation: RSI=45,中性├── Thought: 信息足够,可以给出结论└── Action: 输出最终分析报告↓自动写入记忆(沉淀新事实)↓保存会话状态到Redis↓返回分析结果
5.2 多租户隔离机制
系统通过 RuntimeContext 实现多租户隔离:
RuntimeContext ctx = RuntimeContext.builder().sessionId("user-123-session-456").userId("user-123").build();
数据隔离策略:
六、缓存策略
analysis:{stock}:{hour} | |||
retrieval:{stock}:{date} | |||
quote:{stock} | |||
session:{userId}:{sessionId} |
共享缓存的核心目的:减少大模型调用次数,控制成本。
七、部署架构
┌─────────────┐│ Nginx LB │└──────┬──────┘│┌────────────┼────────────┐▼ ▼ ▼┌──────────┐ ┌──────────┐ ┌──────────┐│ Pod 1 │ │ Pod 2 │ │ Pod 3 ││ StockMind│ │ StockMind│ │ StockMind│└────┬─────┘ └────┬─────┘ └────┬─────┘│ │ │└────────────┼────────────┘▼┌───────────────────────┐│ Redis Cluster ││ (Session + Cache) │└───────────┬───────────┘│┌───────────┴───────────┐▼ ▼┌───────────┐ ┌───────────┐│ MySQL │ │ minio ││ Master │ │ Bucket │└───────────┘ └───────────┘
八、模块依赖关系
接入层 (M1-M3)↓Agent层 (M4-M5)↓能力层 (M6-M8)↓基础设施层 (M9-M11)↓存储层 (M12)
依赖规则:
上层可依赖下层,下层不可依赖上层
同层模块之间不互相依赖
业务模块不直接操作数据库
所有状态变更通过中间件记录
九、核心设计原则
| 决策-执行分离 | |
| 缓存优先 | |
| 状态显式化 | |
| 多租户隔离 | |
| 可观测性 |
目标是:先让Agent跑起来,再让Agent跑得漂亮。
夜雨聆风