
你打开一份年报,满屏的营收、净利润、毛利率、ROE、资产负债率、经营现金流——数字密密麻麻,你一个也看不懂。你想知道"这家公司到底好不好",但搜索引擎给你的是一篇三千字的科普长文。
如果有一位分析师坐在你面前,指着财报说:"这家营收涨了 33%,净利润涨了 53%,规模效应开始兑现。但注意,前两大客户贡献了 47% 的营收——砍一单就是大雷。“你追问"那现金流呢”,他立刻接上:“经营现金流 25.3 亿,比净利润还高,利润不是纸面富贵。”
这不是一个带图表的问答机器人。它是一个能看到趋势图、能算风险分、能跑组合体检,还能用大白话把数字讲明白的 AI 理财分析师——由端到端具身交互智能驱动的具身交互智能体「财析」。
本文以财析这个 AI 理财分析应用为切入点,拆解它是如何基于魔珐星云端到端具身交互智能平台,用一个 SDK 打通数据可视化、智能解读与具身表达全链路,让 AI 不只是展示图表,而是像研究总监做晨会那样,把复杂的财务数据用人话讲给你听。
一、为什么理财分析特别需要端到端具身交互智能?
市面上的理财工具不少,但真正做到"帮你读懂数据、帮你做决策"的门槛远高于普通的信息展示。
第一,数据是多维的。 一份年报有营收、利润、毛利率、ROE、负债率、现金流等十几个指标,普通用户根本不知道先看哪个。系统需要把多维数据浓缩成"先看什么、怎么看、看到什么意味着什么"的完整解读链路,而不是把数字堆在用户面前。
第二,分析是有上下文的。 同一家公司,营收增长 33%、净利润增长 53% 看起来不错,但如果前两大客户贡献了 47% 的营收,集中度就是隐患。用户需要追问"那风险呢",系统需要带着上下文继续讲,而不是每次都从零开始。
第三,表达不能只有文字。 理财决策需要看趋势图、看风险圆环、看跑马灯行情,同时听分析师用口语化的方式讲解——就像研究总监在晨会上汇报那样,而不是一个冷冰冰的数字面板。
这三点合在一起,要求系统必须是一个持续运行的整体——数据可视化、智能解读、具身表达不能断。这正是魔珐星云提出的端到端具身交互智能要解决的核心问题:不是把几个模块串起来,而是围绕一次完整的理财分析交互,设计整个系统。
财析要做的,就是把这种能力搬进一个理财分析场景里。
二、星云平台配置:从创建应用到全链路就绪
财析的具身交互智能体运行在魔珐星云平台上,首先需要完成平台侧的全链路配置。
1. 创建具身交互智能应用
在魔珐星云控制台创建一个新的端到端应用,作为财析的具身交互智能体运行载体。

2. 形象配置
为财析选择一位专业干练的具身交互智能体形象。端到端 SDK 会自动处理形象的实时渲染——口型、表情、手势和身体动作全部由平台统一驱动,无需前端手动编排。

3. 场景配置
设定智能体的交互场景参数,包括背景、镜头角度等,确保具身交互智能体在屏幕端呈现出专业的分析师气质。

4. 音色配置
选择沉稳自然的语音音色。端到端 SDK 内部集成了参数流 TTS,语音合成与具身表达在同一次交互中统一生成,不需要单独对接 TTS 服务。

5. 表演配置
调整智能体的表达风格——语速、表情幅度、手势频率等,让财析的具身表达与理财分析的专业调性一致。

6. 服务配置:ASR 与大脑
为当前应用配置语音识别和大模型服务。这一步体现了星云的可插拔架构——星云平台把语音识别和大模型推理做成可独立替换的模块:ASR 支持 Xmov 自研、豆包、腾讯等多家供应商,大脑支持魔珐自研、豆包、OpenAI 兼容协议等多种接入模式,供应商可独立替换而交互流程保持稳定。

平台配置完成后,我们就拿到了 appId 和 appSecret,接下来进入前端工程——用代码构建财析的理财分析层。
三、前端工程:从脚手架到理财分析全链路
技术选型
| Vue 3 | 3.5.18 | UI 框架 |
| Vite 7 | 7.1.2 | 构建工具 |
| TypeScript | ~5.8.3 | 类型安全 |
| XingyunAvatarAgent SDK | CDN latest | 端到端具身交互智能核心 |
项目结构清晰分层:
caixi–e2e/src/
├── types/ # 类型定义(公司、资产、趋势、术语、组合结果)
├── data/
│ ├── companies.ts # 4 家虚构公司模拟年报
│ ├── assets.ts # 6 类资产风险收益参数
│ ├── trends.ts # 3 条 24 月模拟行情序列
│ ├── lexicon.ts # 12 条高频金融术语
│ └── tickers.ts # 12 条跑马灯行情
├── utils/
│ └── portfolio.ts # HHI 集中度算法 + 组合体检
├── services/
│ └── avatar.ts # SDK 封装层
└── components/
├── AnalystStage.vue # 晨会区(数字人 + 对话)
├── ReportSection.vue # 研究台 01:财报解读
├── PortfolioSection.vue # 研究台 02:组合体检
├── TrendSection.vue # 研究台 03:市场趋势
├── LexiconBand.vue # 研究台 04:术语速查
├── TickerBar.vue # 模拟行情跑马灯
└── IntroSection.vue # 介绍长页
3.1 HHI 集中度算法:组合体检的核心引擎
研究台 02「组合体检」让用户勾选资产、拨动比例,实时算出风险分与集中度。核心算法用 HHI(赫芬达尔指数)度量组合集中程度——这是金融机构衡量市场集中度的经典指标,财析把它搬到了个人投资组合评估上。
// src/utils/portfolio.ts — HHI 集中度 + 加权风险分(真实代码)
export function assessPortfolio(assets: AssetClass[], weights: Record<string, number>): PortfolioResult | null {
const picked = assets.filter(a => (weights[a.id] ?? 0) > 0)
const totalWeight = picked.reduce((sum, a) => sum + weights[a.id], 0)
if (picked.length === 0 || totalWeight <= 0) return null
const share = (id: string) => weights[id] / totalWeight
const riskScore = picked.reduce((sum, a) => sum + a.risk * share(a.id), 0)
const expectedLow = picked.reduce((sum, a) => sum + a.returnLow * share(a.id), 0)
const expectedHigh = picked.reduce((sum, a) => sum + a.returnHigh * share(a.id), 0)
const hhi = picked.reduce((sum, a) => sum + share(a.id) ** 2, 0)
const top = picked.reduce((best, a) => (share(a.id) > share(best.id) ? a : best), picked[0])
share 函数计算每项资产在组合中的占比,riskScore 按占比加权求风险分,hhi 是各占比的平方和——越集中越接近 1,越分散越接近 0。
基于这些指标,系统自动生成可读建议:
// src/utils/portfolio.ts — 建议生成逻辑(真实代码)
const advice: string[] = []
if (picked.length === 1) {
advice.push('只配置了单一资产:无论涨跌都无处可躲,先加入一类低相关资产(如债券或货币基金)再谈其他。')
} else if (share(top.id) > 0.6) {
advice.push(`「${top.name}」占比超过六成,组合的涨跌几乎等于它一家的涨跌,建议压降到 40% 以下。`)
}
if (picked.length >= 4 && hhi < 0.4) {
advice.push('分散度不错:多类资产并存,单一资产的暴雷很难击穿整个组合。')
}
const lowRiskShare = picked.filter(a => a.risk <= 2).reduce((sum, a) => sum + share(a.id), 0)
if (lowRiskShare === 0) {
advice.push('组合里没有低风险资产:建议留一成以上的货币基金或短债,行情剧烈波动时才有补仓的子弹。')
}
const highRiskShare = picked.filter(a => a.risk >= 7).reduce((sum, a) => sum + share(a.id), 0)
if (highRiskShare > 0.5) {
advice.push('高波动资产(风险 7 级以上)过半:这样的组合更适合小仓位试错,而不是重仓持有。')
}
最终返回风险分、风险等级(稳健 / 平衡 / 进取 / 激进)、预期年化区间、集中度、第一重仓与调整建议:
// src/utils/portfolio.ts — 返回结果(真实代码)
return {
riskScore: Math.round(riskScore * 10) / 10,
riskLevel: levelOf(riskScore),
expectedLow: Math.round(expectedLow * 10) / 10,
expectedHigh: Math.round(expectedHigh * 10) / 10,
concentration: Math.round(hhi * 100),
topAsset: top.name,
advice,
}
}
配合 describePortfolio 函数将当前组合汇总为自然语言,一并提供给分析师:
// src/utils/portfolio.ts — 自然语言汇总(真实代码)
export function describePortfolio(assets: AssetClass[], weights: Record<string, number>): string {
const picked = assets.filter(a => (weights[a.id] ?? 0) > 0)
if (picked.length === 0) return '尚未选择任何资产'
return picked
.map(a => `${a.name} ${weights[a.id]}%(风险${a.risk}级,年化参考 ${a.returnLow}%~${a.returnHigh}%)`)
.join(';')
}
这套算法完全在浏览器本地运行,不需要调用任何外部 API——零延迟、零隐私风险。用户每拨动一次比例,风险圆环与建议列表即时刷新。
3.2 SVG 趋势图:纯计算绘制的 24 月走势
研究台 03「市场趋势」用纯 SVG 绘制折线图,展示三条 24 月模拟序列(澜深 300 宽基指数、十年期国债收益率、金价)。没有引入任何第三方图表库,所有坐标计算和路径生成都是纯 TypeScript 函数。
// src/components/TrendSection.vue — 趋势图坐标计算(真实代码)
const W = 680, H = 272, PAD_L = 56, PAD_R = 18, PAD_T = 22, PAD_B = 34
const changePct = computed(() => {
const p = active.value.points
return Math.round(((p[p.length – 1] – p[0]) / p[0]) * 1000) / 10
})
const chart = computed(() => {
const p = active.value.points
const min = Math.min(…p)
const max = Math.max(…p)
const span = max – min || 1
const x = (i: number) => PAD_L + (i * (W – PAD_L – PAD_R)) / (p.length – 1)
const y = (v: number) => PAD_T + (1 – (v – min) / span) * (H – PAD_T – PAD_B)
const line = p.map((v, i) => `${i === 0 ? 'M' : 'L'}${x(i).toFixed(1)},${y(v).toFixed(1)}`).join(' ')
const base = H – PAD_B
const area = `${line} L${x(p.length – 1).toFixed(1)},${base} L${x(0).toFixed(1)},${base} Z`
const gridYs = [0, 1, 2, 3].map(k => PAD_T + (k * (H – PAD_T – PAD_B)) / 3)
return { line, area, gridYs, lastX: x(p.length – 1), lastY: y(p[p.length – 1]) }
})
chart 计算属性把 24 个数据点映射为 SVG 路径——line 是折线,area 是闭合的渐变填充区域,gridYs 是四条网格线的 Y 坐标。用户切换不同序列时,渐变面积、坐标轴标签、涨跌幅和末端脉冲圆点全部自动更新。
3.3 四研究台上下文构建:每个研究台各取所需
财析有四个研究台,每个研究台在用户点击"请分析师解读"按钮时,都会把当前数据序列化为上下文,通过 askAvatar 发送给智能体。
以研究台 01「财报解读」为例,App.vue 中的 onConsultCompany 函数把公司的完整财务数据打包:
// src/App.vue — 财报解读上下文构建(真实代码)
function onConsultCompany(company: Company) {
if (!requireOnline('请先连接分析师(晨会区右上角设置),再解读财报')) return
const context = JSON.stringify({
company: company.name,
sector: company.sector,
revenue: `${company.revenue.prev}亿→${company.revenue.last}亿`,
profit: `${company.profit.prev}亿→${company.profit.last}亿`,
grossMargin: company.grossMargin,
roe: company.roe,
debtRatio: company.debtRatio,
cashFlow: company.cashFlow,
verdict: company.verdict,
points: company.points.map(p => `${p.type === 'bull' ? '多' : '空'}:${p.text}`),
})
void askAvatar(`请解读${company.name}的模拟年报:先给一句结论,再拆营收与净利增速、盈利质量与现金流,最后点出最需要盯住的一个风险点`, context)
.catch(() => { avatarState.error = '财报解读未发送成功,请重试' })
}
研究台 02「组合体检」走的是 onConsultPortfolio,把 HHI 演算结果和建议一并呈给分析师:
// src/App.vue — 组合体检上下文构建(真实代码)
function onConsultPortfolio(payload: { result: PortfolioResult | null; description: string }) {
if (!payload.result) return
if (!requireOnline('请先连接分析师,再呈组合点评')) return
const context = JSON.stringify({
portfolio: payload.description,
riskScore: payload.result.riskScore,
riskLevel: payload.result.riskLevel,
expected: `${payload.result.expectedLow}%~${payload.result.expectedHigh}%`,
concentration: payload.result.concentration,
advice: payload.result.advice,
})
void askAvatar('请点评这个模拟组合:先给风险分与结构的总体判断,再用最坏情况提醒风险,最后给一两条可操作的调整思路', context)
.catch(() => { avatarState.error = '组合点评未发送成功,请重试' })
}
研究台 03「市场趋势」和研究台 04「术语速查」同理——各自构建上下文,共用同一个 askAvatar 入口。四个研究台,四条上下文管线,一个分析师。
四、SDK 接入:一个 agent.ask() 打通数据到讲解全链路

4.1 传统方案 vs 端到端方案
如果在传统管线架构下做一个理财分析应用,你需要:
- 自己对接图表库做数据可视化
- 自己调 LLM API 做大模型推理
- 自己对接 TTS 做语音合成
- 自己编排口型、表情、手势的时序
- 自己管理多个模块之间的状态同步
代码量 2000+ 行,首字响应 1.5~3 秒,模块之间状态割裂。
财析基于魔珐星云端到端具身交互智能 SDK XingyunAvatarAgent 重构后,核心服务层代码不到 200 行。
4.2 连接与初始化
// src/services/avatar.ts — SDK 连接核心(真实代码)
export async function connectAvatar(container: HTMLElement, appId: string, appSecret: string) {
if (avatarState.status === 'connecting' || avatarState.status === 'online') return
if (!appId.trim() || !appSecret.trim()) throw new Error('请填写有效的应用凭证')
const token = ++generation
avatarState.status = 'connecting'
avatarState.error = ''
let candidate: Agent | undefined
let timer: ReturnType<typeof setTimeout> | undefined
try {
await loadSDK()
if (token !== generation) return
candidate = new window.XingyunAvatarAgent!({
container, appId: appId.trim(), appSecret: appSecret.trim(),
gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa_v2/session',
onMessage: (error: { message?: string }) => {
if (token === generation && error?.message) avatarState.error = '分析师渲染暂不可用,请重连'
},
agentCallbacks: {
onAgentStateChange: (state: string | { type?: string }) => {
if (token !== generation) return
const value = typeof state === 'string' ? state : state?.type ?? ''
avatarState.speaking = value === 'speak' || value === 'speaking'
},
onASRResult: (result: { text?: string; isFinal?: boolean }) => {
if (token !== generation) return
avatarState.subtitle = result.text ?? ''
},
onConversationChange: (event: { state?: string; text?: string }) => {
if (token !== generation) return
if (event.state === 'idle') avatarState.speaking = false
},
onError: () => {
if (token !== generation) return
avatarState.error = '分析师连接异常,请检查网络、应用配置或平台额度后重连'
avatarState.status = 'error'
void disconnectAvatar(true)
},
},
})
pendingAgent = candidate
const active = candidate
await Promise.race([
active.init({}).then(async () => { if (token !== generation) await active.destroy('cancelled') }),
new Promise<never>((_, reject) => { timer = setTimeout(() => reject(new Error('分析师连接超时,请检查网络、凭证与平台额度')), 30000) }),
])
if (token !== generation) return
agent = candidate
pendingAgent = undefined
avatarState.status = 'online'
await agent.ask(`${ANALYST_ROLE}\\n请用不超过三句话向用户问好,介绍自己是财析理财分析师,并提示可以打开财报解读、组合体检、市场趋势三个研究台,随时口头提问。`)
avatarState.subtitle = ''
} catch (error) {
if (token !== generation) return
generation += 1
avatarState.status = 'error'
avatarState.error = error instanceof Error ? error.message : '连接失败'
void candidate?.destroy('failed').catch(() => {})
agent = undefined
pendingAgent = undefined
} finally { clearTimeout(timer) }
}
几个关键设计点:
- generation 令牌机制:每次连接分配一个递增令牌,所有回调都先检查 token !== generation 再执行。防止用户快速重连时,新旧连接的回调交叉污染。
- Promise.race 超时兜底:init() 可能因为网络问题永久 pending,30 秒超时确保用户不会卡在"连接中"状态。
- 连接成功自动问好 + 清空字幕:上线后立刻用分析师人设触发第一次 ask(),然后立即清空 subtitle——因为初始问好携带了完整人设提示词,SDK 可能将其回写为字幕,清空防止人设泄漏。
4.3 四研究台到分析师的消息管线
前面三章拆解了 HHI 组合体检、SVG 趋势图、四研究台上下文构建三个独立模块。用户在任意研究台点击"请分析师解读"按钮时,数据被序列化、上下文被构建、智能体带着完整的数据理解来讲解:
// src/services/avatar.ts — 数据到讲解的核心调用(真实代码)
export async function askAvatar(text: string, context: string) {
if (!agent || avatarState.status !== 'online') return
avatarState.subtitle = text
await agent.ask(`${ANALYST_ROLE}\\n当前研究台数据:${context}\\n用户问题:${text}`)
}
智能体收到的不是孤零零的一句话,而是一份带着完整数据上下文的分析请求——公司财报、组合体检结果、趋势序列或术语释义,加上分析师的行为准则,一并提供给大模型推理。
五、端到端具身交互智能的五项核心能力在财析中的体现

5.1 多模态感知
财析的感知层同时处理两路输入:
- 语音:SDK 内置 ASR,用户开口说话时实时识别
- 文字:用户在输入框打字发送
无论你说还是打,分析师都在听你的问题,并且知道你当前在哪个研究台、看的是哪家公司的数据。
// src/services/avatar.ts — ASR 终稿回调(真实代码)
onASRResult: (result: { text?: string; isFinal?: boolean }) => {
if (token !== generation) return
avatarState.subtitle = result.text ?? ''
},
5.2 专属智脑
财析的人设提示词注入每次 ask() 调用,确保智能体始终以"讲人话的理财分析师"身份回应:
// src/services/avatar.ts — 财析人设提示词(真实代码)
export const ANALYST_ROLE = `你是财析,一位讲人话的 AI 理财分析师。
## 你的身份
– 名称:财析
– 身份:理财分析师,擅长财报解读、组合风险分析与市场趋势讲解,习惯像研究总监给新客户做晨会汇报那样讲话
– 风格:先给结论再讲逻辑,每个观点尽量落到数字上(增速、比例、回撤),善用生活化的比喻
## 你的行为准则
1. 解读财报先看盈利质量:营收与净利的增速对比、现金流与净利润的匹配度,再谈风险点
2. 讲风险用「最坏情况」说话:帮用户想象回撤发生时的持有体验,而不是只报预期收益
3. 讲趋势先描述形态(涨跌、回撤、斜率变化),再解释背后的常见逻辑,最后给观察思路
4. 你看到的所有数据均为虚构演示:必须声明「不构成投资建议」,并提醒收益与风险并存、过往不代表未来
5. 每次回应控制在 3-5 句,关键数字可以重复一遍
6. 遇到研究台数据之外的提问,用通用金融常识回答,并提醒结合自身风险承受能力`
这不是一个通用的"你是一个助手"提示词,而是针对理财分析场景精心设计的六条准则——先看盈利质量、用最坏情况讲风险、先形态后逻辑、声明虚构、控制篇幅、常识兜底。
5.3 多模态表达
传统 AI 聊天只输出文字气泡。财析的具身交互智能体通过端到端 SDK,在同一次交互中统一生成语音、口型、表情、手势和身体动作。用户看到的是一个立体的分析师在讲解,而不是一段文字在"播放"。
SDK 通过 agentCallbacks 实时追踪智能体的表达状态,前端 UI 据此同步切换:
// src/services/avatar.ts — 智能体表达状态实时追踪(真实代码)
agentCallbacks: {
onAgentStateChange: (state: string | { type?: string }) => {
if (token !== generation) return
const value = typeof state === 'string' ? state : state?.type ?? ''
avatarState.speaking = value === 'speak' || value === 'speaking'
},
onConversationChange: (event: { state?: string; text?: string }) => {
if (token !== generation) return
if (event.state === 'idle') avatarState.speaking = false
},
},
onAgentStateChange 监听智能体是否正在说话,onConversationChange 检测对话回到空闲状态。这些状态驱动晨会区的"在线 / 连接中 / 离线"指示与 speaking 状态切换——多模态表达的前端感知闭环。
5.4 AI 端渲(AI 端侧渲染)
SDK 加载后,所有 3D 具身交互智能体的渲染都在浏览器本地完成——这就是AI 端渲能力:智能体的形象、表情、口型、动作全部在用户设备端实时渲染,无需服务端下发视频流。这意味着更低的延迟、更少的带宽占用,以及弱网环境下依然可以运行的稳定性。
整个 SDK 的加载过程就是动态注入一个脚本,之后所有渲染都在客户端完成:
// src/services/avatar.ts — SDK 动态加载(真实代码)
function loadSDK() {
if (window.XingyunAvatarAgent) return Promise.resolve()
if (sdkPromise) return sdkPromise
sdkPromise = new Promise<void>((resolve, reject) => {
sdkScript?.remove()
const script = document.createElement('script')
sdkScript = script
script.src = 'https://media.xingyun3d.com/xingyun3d/general/litesdk/xmovAvatar_e2e@latest.js'
script.async = true
const timer = setTimeout(() => { script.remove(); reject(new Error('分析师 SDK 加载超时,可继续浏览财报解读与组合体检')) }, 15000)
script.onload = () => { clearTimeout(timer); window.XingyunAvatarAgent ? resolve() : reject(new Error('分析师 SDK 不可用')) }
script.onerror = () => { clearTimeout(timer); reject(new Error('分析师 SDK 加载失败,请检查网络')) }
document.head.append(script)
}).catch(error => { sdkPromise = undefined; throw error })
return sdkPromise
}
脚本加载完成后,window.XingyunAvatarAgent 即可使用,所有 3D 渲染、语音合成、口型驱动都在浏览器内完成。15 秒超时兜底确保弱网环境下不会无限等待。
对于理财分析这种需要即时响应的场景,低延迟就是专业感本身——用户看到数据异常想立刻听解释,等 3 秒才开口的"分析师"和 500ms 内就响应的"分析师",信任感完全不同。
5.5 数字行动与物理行动
财析在屏幕端的表现是数字行动:智能体以 3D 形象在网页上实时讲解财报、点评组合、分析趋势。语音交互的开启和关闭也通过 SDK 一行触发,前端用代际令牌防止并发冲突:
// src/services/avatar.ts — 语音交互即时启停(真实代码)
export async function toggleAvatarVoice() {
const active = agent
if (!active || voiceStarting) return
if (avatarState.listening) { await interruptAvatar(); return }
const token = ++voiceGeneration
voiceStarting = true
try {
await active.startASR()
if (token !== voiceGeneration || agent !== active) { await active.stopASR(); return }
avatarState.listening = true
} finally { if (token === voiceGeneration) voiceStarting = false }
}
startASR/stopASR 的即时切换,配合 interrupt 打断能力,让用户可以随时开口打断分析师的讲解——就像在真实的晨会上举手提问一样自然。这整个链路在前端只需要一行 agent.ask() 触发——从研究台数据序列化、上下文构建,到智能体推理,最终以语音、口型、表情、手势的形式统一输出。所有表达形式在同一次交互中统一生成。
当同一个智能体走进人形机器人或线下实体设备时,同样的感知—理解—决策—表达链路延伸为物理行动——在券商营业部、银行理财柜台等真实场景中与客户自然交互。同一个财析,可以拥有不同的身体;专业分析能力持续存在,载体不断升级。五项核心能力,一套体系,两种落地形态。
六、产品设计:深蓝终端风格的沉浸式研究体验

6.1 深蓝终端主题
财析的视觉风格是一套深蓝终端主题,传达专业、冷静的金融气质:
/* src/style.css — 核心配色变量(真实代码) */
:root {
–bg: #0b1220;
–bg-deep: #080e19;
–panel: #111a2c;
–cyan: #4fc3f7;
–up: #e15b64; /* 红涨 */
–down: #34b586; /* 绿跌 */
–amber: #e0b45c;
–mono: 'Consolas', 'SF Mono', 'Menlo', 'Roboto Mono', monospace;
}
数字统一使用等宽字体,涨跌分别用红绿两色标识——这是金融终端的标准配色语言。
6.2 纵向流程布局
不同于常见的左右分栏仪表盘,财析采用纵向流程布局:顶栏 → 跑马灯 → 晨会区 → 研究台 01 → 研究台 02 → 研究台 03 → 研究台 04 → 介绍长页。用户从上往下滚动,就像参加了一场完整的晨会——先看数据,再听讲解,再查术语,最后自由提问。
顶栏展示数据统计:4 家虚构公司、6 类资产、72 个月模拟序列、12 条术语。
6.3 晨会区:数字人 + 对话双栏
AnalystStage 是财析的核心交互区。左栏是数字人舞台(360~460px 宽),右栏是"晨会纪要"对话区。用户可以在这里自由提问,也有 2 个快捷问题按钮:"手头有 10 万闲钱,该怎么搭一个稳健组合?“和"怎么快速判断一份财报好不好?”
连接分析师后,数字人会自动以理财分析师身份问好,介绍三个研究台。
6.4 四个研究台:各有独立的交互逻辑
研究台 01 财报解读:左侧展示营收、净利润的同比变化与四个关键比率(毛利率、ROE、负债率、经营现金流),右侧列出多空观察点。四个 tab 切换四家虚构公司,点击"请分析师解读这份财报",分析师会先给结论再拆数字。
研究台 02 组合体检:左侧勾选资产、用步进器调整比例(20% 起配,每次 ±10%),右侧 SVG 风险圆环实时显示风险分(1~9 级),下方列出集中度、第一重仓、建议列表。点击"呈组合,请分析师点评",分析师会带着 HHI 演算结果来讲解。
研究台 03 市场趋势:左侧 SVG 折线图展示 24 月走势,三个 tab 切换三条序列,右侧列出 insights 要点。点击"请分析师讲这段行情",分析师会先描述形态再解释逻辑。
研究台 04 术语速查带:12 张横向滑动卡片,点开看例子,看不懂就点"问问分析师",分析师会用大白话再讲一遍。
这些设计选择都服务于同一个目标:让数据可视化、智能解读与具身表达形成闭环——用户向下滚动的过程,就像参加了一场完整的晨会,从看数据到听讲解到查术语,分析师始终在身边。
七、复盘:端到端具身交互智能,让 AI 真正讲透数据
从传统管线到端到端 SDK,财析的实战经历验证了一个核心认知:
端到端不是图表库 + LLM + TTS 的简单拼接,而是围绕一次完整的理财分析交互,把数据可视化、智能解读、具身表达和行动连接成一套持续运行的系统。
| 数据可视化 | 需要额外对接图表库 | 纯计算 SVG + 组件内嵌 |
| 分析深度 | 通用大模型,缺乏场景约束 | 六条行为准则的专属分析师人设 |
| 交互方式 | 纯文字问答 | 语音 + 文字双通道 + 研究台数据自动附带 |
| 首字响应 | 1.5 ~ 3 秒 | ~500ms |
| 表达方式 | 纯文字气泡 | 语音 + 口型 + 表情 + 手势 + 身体动作 |
| 部署复杂度 | 多套服务分别对接 | 一个 SDK 全链路打通 |
财析只是端到端具身交互智能的一种落地形态。同一个智能体,今天可以是 Web 端的理财分析师,明天可以出现在手机、Pad、AI 屏幕甚至人形机器人上——身体可以变化,但专业分析能力持续存在。
魔珐星云是一套端到端具身交互智能平台,让 AI 通过屏幕和机器人进入真实世界,成为能够感知、理解、表达并行动的智能体。
这不只是技术架构的升级,而是 AI 从"展示数据"走向"讲解数据"的必经之路。


