TradingAgents-CN 报告详情页布局优化:关键指标前置的"结论先行"实践解析
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
导读
本文围绕 TradingAgents-CN 前端的一次具体变更展开——报告详情页面将关键指标模块调整到执行摘要之前,实现"结论先行、详情在后"的信息架构。文章完整还原该变更的背景、调整前后的模块顺序、视觉结构、测试验证步骤与后续优化方向,并结合仓库源码(ReportDetail.vue、reports.py、analysis.py 数据模型)剖析关键指标数据的来源、展示逻辑与归一化处理,帮助你理解多智能体分析报告在前端呈现层的设计思路与落地方式。
变更背景:为什么要把关键指标提前
在 TradingAgents-CN 中,每份个股分析报告由市场、基本面、新闻、情绪、技术等多位智能体协同生成,最终聚合为一份包含投资建议、置信度评分、风险等级、执行摘要与各模块详细内容的完整报告。调整前的页面顺序是"报告头部 → 风险提示 → 执行摘要 → 关键指标 → 分析报告",即用户需要先读完一段文字摘要,才能看到最关心的结论性指标。
本次变更的核心动机有三点:
- 用户体验优化:投资建议、置信度评分、风险等级是用户最关心的核心信息,理应优先展示;
- 信息层次:先展示结论性指标,再展示详细的执行摘要,符合"总-分"的信息架构;
- 快速决策:用户可以更快地看到关键指标,做出初步判断,而不必先滚动过整段摘要文字。
从数据模型看,这些"关键指标"字段正是多智能体决策的最终产物。AnalysisResult 模型定义了recommendation(投资建议)、confidence_score(置信度评分)、risk_level(风险等级)与key_points(关键要点)四个字段,它们由分析任务执行完成后的决策结果直接写入:
result = AnalysisResult( analysis_id=str(uuid.uuid4()), summary=decision.get("summary", ""), recommendation=decision.get("recommendation", ""), confidence_score=decision.get("confidence_score", 0.0), risk_level=decision.get("risk_level", "中等"), key_points=decision.get("key_points", []), ... )也就是说,关键指标是整条分析链路产出的"精华浓缩",把它放在页面最显眼的位置,本质上是在强调这份报告最值得用户第一眼看到的内容。
变更内容:模块顺序的前后对比
调整前的顺序
- 报告头部(标题、元数据、操作按钮)
- 风险提示
- 执行摘要← 原来在这里
- 关键指标← 原来在这里
- 分析报告(各模块详细内容)
调整后的顺序
- 报告头部(标题、元数据、操作按钮)
- 风险提示
- 关键指标← 移到这里(优先展示)
- 投资建议
- 置信度评分(圆形进度条)
- 风险等级(星级显示)
- 关键要点
- 执行摘要← 移到这里
- 分析报告(各模块详细内容)
修改的文件
变更仅涉及一个文件:frontend/src/views/Reports/ReportDetail.vue,通过将关键指标卡片(metrics-card)的模板位置移到执行摘要卡片(summary-card)之前实现。从当前源码看,ReportDetail.vue 的模板顺序已经是:风险提示(risk-disclaimer)→ 关键指标(metrics-card)→ 执行摘要(summary-card,v-if="report.summary"条件渲染)→ 分析报告(modules-card),与调整后的目标顺序完全一致。
该页面通过 router/index.ts 注册在/reports/:id路由下,加载时调用后端GET /api/reports/{report_id}/detail接口获取报告详情数据(见 reports.py),接口返回的recommendation、confidence_score、risk_level、key_points字段正是关键指标卡片的数据来源。
视觉效果:调整后的页面结构
调整完成后,报告详情页从上到下的结构如下:
┌─────────────────────────────────────────┐ │ 📄 000001 分析报告 │ │ [标签] [时间] [分析师] │ │ [应用到交易] [下载报告] [返回] │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ ⚠️ 风险提示 │ │ 本报告依据真实交易数据使用AI分析生成... │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ 📊 关键指标 │ ← 优先展示 │ ┌─────────┬─────────┬─────────┐ │ │ │投资建议 │置信度评分│风险等级 │ │ │ │ 买入 │ 85分 │ ⭐⭐⭐ │ │ │ │ │ 高信心 │ 中等风险│ │ │ └─────────┴─────────┴─────────┘ │ │ ✓ 关键要点1 │ │ ✓ 关键要点2 │ │ ✓ 关键要点3 │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ ℹ️ 执行摘要 │ │ 基于事实纠错、逻辑重构、风险评估... │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ 📁 分析报告 │ │ [市场分析] [基本面分析] [投资计划] ... │ └─────────────────────────────────────────┘关键指标的源码级实现
三列指标布局
关键指标卡片内部使用el-row三列等宽布局(el-col :span="8"),分别展示分析参考(投资建议)、风险评估(风险等级)、模型置信度三项,每项都带有el-tooltip悬浮提示,明确标注"仅供参考""实际风险可能更高""不代表实际投资成功率"等边界说明,避免用户将 AI 分析结果误读为确定性结论。
置信度评分:0-1 小数与 0-100 百分制的归一化
后端confidence_score可能以 0-1 的小数形式返回,也可能已经是 0-100 的整数,前端通过normalizeConfidenceScore统一归一化后再渲染圆形进度条:
const normalizeConfidenceScore = (score: number) => { // 如果已经是 0-100 的范围,直接返回 if (score > 1) { return Math.round(score) } // 如果是 0-1 的小数,转换为百分制 return Math.round(score * 100) }进度条颜色与文案标签随分数区间动态变化(见 ReportDetail.vue):
| 分数区间 | 颜色 | 标签 |
|---|---|---|
| ≥ 80 | 绿色#67C23A | 较高 |
| 60–79 | 蓝色#409EFF | 中上 |
| 40–59 | 橙色#E6A23C | 中等 |
| < 40 | 红色#F56C6C | 较低 |
风险等级:星级与颜色双通道编码
风险等级使用 5 颗星显示,getRiskStars将中文风险等级映射为星级数量,getRiskColor同步映射颜色,兼顾直观性与色觉友好:
const getRiskStars = (riskLevel: string) => { const riskMap: Record<string, number> = { '低': 1, '中低': 2, '中等': 3, '中高': 4, '高': 5 } return riskMap[riskLevel] || 3 // 未知等级默认3星(中等) }| 风险等级 | 星级 | 颜色 |
|---|---|---|
| 低 | ⭐ | 绿色#67C23A |
| 中低 | ⭐⭐ | 浅绿色#95D475 |
| 中等 | ⭐⭐⭐ | 橙色#E6A23C |
| 中高 | ⭐⭐⭐⭐ | 红色#F56C6C |
| 高 | ⭐⭐⭐⭐⭐ | 红色#F56C6C |
当后端未返回risk_level时,前端默认按"中等"处理;星星点亮带有starPulse脉冲动画,增加视觉反馈。
关键要点:决策摘要的自动兜底
关键要点列表(key_points)并非总是由智能体直接产出。analysis.py 路由 中存在一层兜底逻辑:当key_points缺失时,会从决策对象中提取"操作建议 / 目标价 / 置信度",并从investment_plan、final_trade_decision等报告模块截取要点片段,最多保留 5 条。这保证了关键指标卡片即使面对旧数据或字段缺失的报告,也能呈现有价值的结论信息。
变更优势
1. 信息优先级更清晰
- 用户打开报告后,首先看到的是关键指标;
- 可以快速了解投资建议、置信度和风险等级;
- 无需滚动即可看到核心信息。
2. 决策效率更高
- 用户可以根据关键指标快速做出初步判断;
- 如果指标不符合预期,可以直接返回;
- 如果指标符合预期,再深入阅读执行摘要和详细报告。
3. 视觉层次更合理
- 关键指标卡片有丰富的视觉元素(圆形进度条、星级显示);
- 放在前面可以吸引用户注意力;
- 执行摘要是文字内容,放在后面更适合深度阅读。
4. 符合用户习惯
- 大多数分析报告都是"结论在前,详情在后";
- 符合"总-分"的信息架构;
- 用户可以自主选择阅读深度。
影响范围
前端
- 仅调整了模块顺序,没有修改功能逻辑;
- 所有功能保持不变(下载、应用到交易、模块 Tab 切换等均不受影响);
- 样式保持不变(卡片样式、动画、响应式布局均复用原有 SCSS)。
后端
- 无影响:
GET /api/reports/{report_id}/detail接口返回字段不变,reports.py 中recommendation / confidence_score / risk_level / key_points的序列化逻辑无需任何改动。
用户体验
- 提升了信息获取效率;
- 优化了决策流程;
- 改善了视觉层次。
测试验证
测试步骤
访问报告详情页面:
http://127.0.0.1:3000/reports/:id其中
:id为报告 ID,路由注册见 router/index.ts;该页面需要登录后通过认证(请求携带Authorization: Bearer <token>,见 ReportDetail.vue)。验证模块顺序:
- 报告头部(标题、元数据、操作按钮)
- 风险提示
- 关键指标(第一个内容卡片)
- 执行摘要(第二个内容卡片)
- 分析报告(第三个内容卡片,内含各模块 Tab)
验证功能:
- 所有功能正常工作(下载 Markdown/Word/PDF/JSON、应用到模拟交易、返回列表);
- 样式显示正确(圆形进度条、星级、风险颜色、关键要点列表);
- 交互效果正常(Tab 切换、Tooltip、进度条动画)。
预期效果
- 打开报告后,首先看到关键指标卡片;
- 关键指标卡片包含投资建议、置信度评分、风险等级、关键要点;
- 向下滚动可以看到执行摘要;
- 继续滚动可以看到详细的分析报告。
数据层面的验证要点
由于关键指标直接来自后端字段,建议同时验证三种数据场景:报告包含完整字段(confidence_score为 0-1 小数)、字段为 0-100 整数、字段缺失(此时前端分别归一化显示、原样显示、按"中等"风险/0 分兜底),以确认布局调整后各分支渲染均正常。
后续优化建议
可折叠模块
- 允许用户折叠/展开各个模块;
- 记住用户的折叠偏好。
固定关键指标
- 考虑将关键指标固定在页面顶部;
- 滚动时始终可见。
快速导航
- 添加页面内导航;
- 快速跳转到各个模块。
个性化布局
- 允许用户自定义模块顺序;
- 保存用户的布局偏好。
总结
变更
将关键指标模块移到执行摘要上面。
原因
- 优化信息层次,提升用户体验;
- 关键指标是用户最关心的核心信息。
效果
- 信息优先级更清晰;
- 决策效率更高;
- 视觉层次更合理;
- 符合用户习惯。
影响
- 仅调整顺序,功能不变;
- 无需后端修改;
- 提升用户体验。
现在用户打开报告后,可以立即看到关键指标,快速了解投资建议、置信度和风险等级。对于希望继续深入研究的读者,建议结合 ReportDetail.vue、reports.py 与 AnalysisResult 模型 阅读,即可完整串联"多智能体决策 → 字段落库 → 接口序列化 → 前端指标卡渲染"的整条链路。
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考