TradingAgents-CN 模型推荐功能优化:从强制验证警告到友好推荐提示的完整实现解析
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
导读
本文档解析 TradingAgents-CN(基于多智能体 LLM 的中文金融交易框架)中"模型推荐功能优化"的完整改造:将原先强制校验用户所选模型并弹警告的方案,重构为以信息提示形式给出模型推荐建议、由用户自主决策的交互模式。读者将掌握该功能的前端组件实现(checkModelSuitability/applyRecommendedModels)、后端推荐与验证 API(/api/model-capabilities/recommend)、五级分析深度与模型能力等级映射关系,以及一键应用推荐配置的完整调用链,可直接用于理解或复现该项目中"分析深度 × 模型推荐"的核心机制。
📋 功能概述与优化目标
在单股分析页面中,用户需要为"快速分析"与"深度决策"分别选择 LLM 模型,而不同的分析深度(1~5 级)对模型能力有不同要求。旧版交互会在用户所选模型不满足要求时,强制弹出黄色警告框并阻断操作;本次优化将其改为信息型推荐提示,核心目标如下:
- ❌移除:强制模型验证和警告提示;
- ✅改为:友好的推荐说明和建议;
- ✅保留:一键应用推荐配置功能。
即:系统不再"替用户做决定",而是告诉用户"推荐什么、为什么推荐",把最终选择权交还给用户。
🧩 前端实现详解(SingleAnalysis.vue)
推荐提示的渲染载体
推荐提示使用 Element Plus 的el-alert组件渲染,位于模型选择区域下方(frontend/src/views/Analysis/SingleAnalysis.vue):
<el-alert v-if="modelRecommendation" :title="modelRecommendation.title" :type="modelRecommendation.type" :closable="false" > <template #default> <div style="display: flex; justify-content: space-between; align-items: flex-start; gap: 12px;"> <div style="font-size: 13px; line-height: 1.8; flex: 1; white-space: pre-line;"> {{ modelRecommendation.message }} </div> <el-button v-if="modelRecommendation.quickModel && modelRecommendation.deepModel" type="primary" size="small" @click="applyRecommendedModels" > 应用推荐 </el-button> </div> </template> </el-alert>推荐提示的状态对象定义如下(SingleAnalysis.vue):
const modelRecommendation = ref<{ title: string message: string type: 'success' | 'warning' | 'info' | 'error' quickModel?: string deepModel?: string } | null>(null)修改前:验证模型并显示警告
旧逻辑先调用validateModels校验当前所选模型对是否满足分析深度要求,若校验不通过则显示warning类型的警告框,语气强制性、带有"不达标"的负面表达:
// 旧逻辑:验证模型是否合适 const validateRes = await validateModels(...) if (!validateRes.data.valid) { // 显示警告:模型不合适 modelRecommendation.value = { title: '⚠️ 模型选择建议', type: 'warning', ... } }修改后:直接显示推荐说明
新逻辑不再校验用户当前选择,而是调用后端推荐接口获取"针对当前分析深度的最优模型对",无论用户选了什么模型,都展示一份正向的推荐说明,类型固定为info(蓝色信息框):
// 新逻辑:直接显示推荐说明 const recommendRes = await recommendModels(depthName) modelRecommendation.value = { title: '💡 模型推荐', type: 'info', // 改为信息提示,不是警告 message: '快速浏览,获取基本信息\n\n推荐模型配置:...', ... }checkModelSuitability 完整流程
实际实现的checkModelSuitability()函数(SingleAnalysis.vue)包含三条分支:
- 推荐成功:将
researchDepth(1~5)映射为中文深度名(快速/基础/标准/深度/全面),调用recommendModels(depthName);成功后将推荐模型名映射为显示名(model_display_name),拼接深度用途说明、推荐配置与推荐理由后写入提示框,同时保留quickModel/deepModel供一键应用使用:
const depthNames: Record<number, string> = { 1: '快速', 2: '基础', 3: '标准', 4: '深度', 5: '全面' } const depthName = depthNames[analysisForm.researchDepth] || '标准' const recommendRes = await recommendModels(depthName) const responseData = recommendRes?.data?.data ... const message = `${depthDescriptions[analysisForm.researchDepth] || '标准分析'}\n\n推荐模型配置:\n• 快速模型:${quickDisplayName}\n• 深度模型:${deepDisplayName}\n\n${reason}` modelRecommendation.value = { title: '💡 模型推荐', message, type: 'info', quickModel, deepModel }- 推荐接口返回空数据:回退到内置的
generalDescriptions通用说明(见下文"降级说明")。 - 接口异常(catch):同样回退到
generalDescriptions通用说明,保证任何情况下用户都能看到有意义的推荐文案。
触发时机有三处(SingleAnalysis.vue):页面onMounted初始化、analysisForm.researchDepth变化(watch 监听)、快速/深度模型选择变化(watch 监听),即用户切换分析深度或模型时,推荐提示会即时刷新。
applyRecommendedModels 一键应用
const applyRecommendedModels = () => { if (modelRecommendation.value?.quickModel && modelRecommendation.value?.deepModel) { modelSettings.value.quickAnalysisModel = modelRecommendation.value.quickModel modelSettings.value.deepAnalysisModel = modelRecommendation.value.deepModel // 清除推荐提示 modelRecommendation.value = null ElMessage.success('已应用推荐的模型配置') } }点击"应用推荐"后,推荐模型对直接写入modelSettings.quickAnalysisModel/modelSettings.deepAnalysisModel,提示框随即消失并弹出成功消息。值得注意的是,由于模型选择变化会被 watch 监听并重新触发checkModelSuitability(),应用后推荐提示会再次出现,这在设计上是"持续给出建议、永不强制"的体现。
前端 API 封装
前端通过 frontend/src/api/modelCapabilities.ts 统一封装模型能力相关接口,其中推荐与验证接口定义如下:
export function recommendModels(researchDepth: string) { return request({ url: '/api/model-capabilities/recommend', method: 'post', data: { research_depth: researchDepth } }) } export function validateModels(quickModel: string, deepModel: string, researchDepth: string) { return request({ url: '/api/model-capabilities/validate', method: 'post', data: { quick_model: quickModel, deep_model: deepModel, research_depth: researchDepth } }) }对应 TypeScript 类型ModelRecommendationResponse包含quick_model、deep_model、quick_model_info、deep_model_info与reason五个字段;ModelValidationResponse则保留valid、warnings、recommendations字段(旧验证逻辑的残留,后端接口仍可用)。
⚙️ 后端实现详解(model_capabilities.py)
推荐接口 /api/model-capabilities/recommend
后端路由位于 app/routers/model_capabilities.py。核心流程为:
- 通过
get_model_capability_service()获取服务单例; - 调用
capability_service.recommend_models_for_depth(request.research_depth)得到(quick_model, deep_model)推荐对; - 调用
get_model_config()获取两个模型的完整能力信息; - 按能力等级生成推荐理由并返回
ok(response_data, "模型推荐成功")。
本次优化中,推荐理由的格式发生了关键变化:
# 修改前 reason = ( f"{request.research_depth}分析推荐:\n" f"快速模型 {quick_model}(等级{quick_info['capability_level']})适合数据收集," f"深度模型 {deep_model}(等级{deep_info['capability_level']})适合推理决策。\n" f"{depth_req['description']}" ) # 修改后 reason = ( f"• 快速模型:{quick_level_desc},注重速度和成本,适合数据收集\n" f"• 深度模型:{deep_level_desc},注重质量和推理,适合分析决策" )新格式用项目符号罗列"能力等级描述 + 用途定位",不再夹杂模型名与等级数字,文案更简洁、更贴近"建议"的语气。其中能力等级描述映射与文档/常量保持一致:
capability_desc = { 1: "基础级", 2: "标准级", 3: "高级", 4: "专业级", 5: "旗舰级" }服务层推荐算法
推荐逻辑核心在 app/services/model_capability_service.py 的recommend_models_for_depth(),可分四步:
- 读取启用模型:从
unified_config.get_llm_configs()中过滤enabled的模型; - 候选筛选:
- 快速模型候选需满足:角色为
quick_analysis或both、能力等级 ≥quick_model_min、且支持tool_calling特性(数据收集必需); - 深度模型候选需满足:角色为
deep_analysis或both、能力等级 ≥deep_model_min;
- 快速模型候选需满足:角色为
- 性价比排序:快速模型候选按"能力等级降序 + 成本升序"排序,深度模型候选按"能力等级降序 + 质量降序"排序;
- 兜底:若无候选,回退到系统默认模型(
unified_config.get_quick_analysis_model()/get_deep_analysis_model(),再兜底为qwen-turbo/qwen-plus)。
另外,服务还支持聚合渠道模型映射(_parse_aggregator_model_name与_get_model_capability_with_mapping,见 model_capability_service.py):对于形如openai/gpt-4、anthropic/claude-3-sonnet的聚合渠道(302.AI、OpenRouter、One API 等)模型名,会拆出provider/model并映射到原厂模型的能力配置,从而复用同一套能力分级体系。
保留的验证接口 /api/model-capabilities/validate
虽然前端已不再强制调用验证逻辑,后端validate_model_pair()(model_capability_service.py)仍然保留,用于排查问题时手动校验模型对是否满足某深度要求。它返回valid、warnings、recommendations三要素,检查项包括:快速模型能力等级是否达标、角色是否适配、是否支持工具调用、深度模型能力等级与推理特性等。
📊 分析深度与能力等级映射
五级分析深度说明
| 深度等级 | 说明 | 推荐配置 |
|---|---|---|
| 1级 - 快速 | 快速浏览,获取基本信息 | 快速模型:基础级,深度模型:基础级 |
| 2级 - 基础 | 基础分析,了解主要指标 | 快速模型:基础级,深度模型:标准级 |
| 3级 - 标准 | 标准分析,全面评估股票 | 快速模型:基础级,深度模型:标准级以上 |
| 4级 - 深度 | 深度研究,挖掘投资机会 | 快速模型:标准级,深度模型:高级以上,需要推理能力 |
| 5级 - 全面 | 全面分析,专业投资决策 | 快速模型:标准级,深度模型:专业级以上,强推理能力 |
深度要求的底层定义
上述表格的实际数据源是 app/constants/model_capabilities.py 中的ANALYSIS_DEPTH_REQUIREMENTS:
ANALYSIS_DEPTH_REQUIREMENTS = { "快速": { "min_capability": 1, "quick_model_min": 1, "deep_model_min": 1, "required_features": [ModelFeature.TOOL_CALLING], "description": "1级快速分析:任何模型都可以,优先选择快速响应的模型" }, "基础": { "min_capability": 1, "quick_model_min": 1, "deep_model_min": 2, "required_features": [ModelFeature.TOOL_CALLING], "description": "2级基础分析:快速模型可用基础级,深度模型建议标准级以上" }, "标准": { "min_capability": 2, "quick_model_min": 1, "deep_model_min": 2, "required_features": [ModelFeature.TOOL_CALLING], "description": "3级标准分析:快速模型可用基础级,深度模型需要标准级以上" }, "深度": { "min_capability": 3, "quick_model_min": 2, "deep_model_min": 3, "required_features": [ModelFeature.TOOL_CALLING, ModelFeature.REASONING], "description": "4级深度分析:快速模型需标准级,深度模型需高级以上,需要推理能力" }, "全面": { "min_capability": 4, "quick_model_min": 2, "deep_model_min": 4, "required_features": [ModelFeature.TOOL_CALLING, ModelFeature.REASONING], "description": "5级全面分析:快速模型需标准级,深度模型需专业级以上,强推理能力" } }可见:深度 4、5 级额外要求reasoning(强推理)特性;quick_model_min从 1 升到 2 意味着"深度/全面"分析的快速模型也至少需要标准级。
能力等级、角色与特性体系
同一常量文件中定义了完整的模型元数据体系:
- 能力等级
ModelCapabilityLevel(1~5):基础/标准/高级/专业/旗舰,对应描述见CAPABILITY_DESCRIPTIONS; - 角色
ModelRole:quick_analysis(快速分析:数据收集、工具调用)、deep_analysis(深度分析:推理、决策)、both(两者皆宜); - 特性标签
ModelFeature:tool_calling(工具调用,必需)、long_context(长上下文)、reasoning(强推理)、vision(视觉)、fast_response(快速响应)、cost_effective(成本效益高)。
DEFAULT_MODEL_CAPABILITIES(model_capabilities.py)为常见模型预置了能力配置,覆盖通义千问(qwen-turbo/plus/max/qwen3-max)、OpenAI(gpt-3.5-turbo/gpt-4/gpt-4-turbo/gpt-4o-mini/o1/o1-mini/o4-mini)、DeepSeek(deepseek-chat)、文心(ernie-3.5/4.0/4.0-turbo)、智谱(glm-3-turbo/glm-4/glm-4-plus)、Claude(haiku/sonnet/opus/3.5-sonnet)、Gemini(gemini-pro/1.5-pro/1.5-flash/2.0-flash/2.5-flash-lite)以及 Moonshot 系列,每个模型均带capability_level、suitable_roles、features、recommended_depths、performance_metrics与description。例如:
"qwen-turbo": { "capability_level": 1, "suitable_roles": [ModelRole.QUICK_ANALYSIS], "features": [ModelFeature.TOOL_CALLING, ModelFeature.FAST_RESPONSE, ModelFeature.COST_EFFECTIVE], "recommended_depths": ["快速", "基础"], "performance_metrics": {"speed": 5, "cost": 5, "quality": 3}, "description": "通义千问轻量版,快速响应,适合数据收集" }能力配置可存于 MongoDB(system_configs集合),服务读取时优先级为:数据库配置 → 默认映射表 → 聚合渠道映射 → 兜底默认配置(等级 2、both角色、tool_calling特性)。
🎨 UI 效果前后对比
修改前(警告样式)
⚠️ 模型选择建议 当前快速模型能力等级(2)低于标准分析要求(3)。 当前深度模型能力等级(2)低于标准分析要求(4)。 建议切换为: • 快速模型:通义千问 Plus • 深度模型:通义千问 Max [应用推荐]- 类型:
warning(黄色警告框) - 语气:强制性、警告性,聚焦于"你选错了"
修改后(信息样式)
💡 模型推荐 标准分析,全面评估股票 推荐模型配置: • 快速模型:通义千问-Turbo • 深度模型:通义千问-Plus • 快速模型:基础级,注重速度和成本,适合数据收集 • 深度模型:标准级,注重质量和推理,适合分析决策 [应用推荐]- 类型:
info(蓝色信息框) - 语气:建议性、友好性,聚焦于"什么最适合你"
两版对比的核心差异:新版先说明该分析深度的用途,再给出推荐配置,最后解释推荐理由,用户无需先"犯错"再被纠正。
🔄 降级说明
如果推荐接口 API 调用失败(网络异常、后端未启动等),前端会回退到内置的通用说明,保证推荐功能不因接口故障而缺失。前端维护的generalDescriptions与五级深度一一对应(SingleAnalysis.vue):
const generalDescriptions: Record<number, string> = { 1: '快速分析:使用基础模型即可,注重速度和成本', 2: '基础分析:快速模型用基础级,深度模型用标准级', 3: '标准分析:快速模型用基础级,深度模型用标准级以上', 4: '深度分析:快速模型用标准级,深度模型用高级以上,需要推理能力', 5: '全面分析:快速模型用标准级,深度模型用专业级以上,强推理能力' }注意该降级文案与后端常量文件中的description语义一致,两者共同构成"前后端双保险"的文案兜底策略。
✅ 优化带来的四方面优势
- 用户体验更好:不再有警告和强制性提示,改为友好的建议和说明,用户可以自主决策;
- 信息更清晰:直接说明分析深度的用途,清楚展示推荐的模型配置,并解释推荐理由(能力等级定位 + 用途匹配);
- 保留便捷功能:仍然可以一键应用推荐配置,降低用户操作成本;
- 更加灵活:用户可以根据实际情况选择,不强制使用推荐配置,适应不同使用场景(如成本敏感、追求速度、混合厂商模型等)。
🧪 测试与验证
手动测试步骤
- 刷新前端页面
- 进入单股分析页面
- 选择不同的分析深度(1-5 级)
- 查看推荐提示:
- 应该显示蓝色信息框(不是黄色警告框)
- 标题为"💡 模型推荐"
- 内容包含分析深度说明和推荐配置
- 点击"应用推荐"按钮:
- 模型配置应该自动切换
- 提示消失
- 显示成功消息
接口级验证
仓库自带集成测试 tests/test_model_config.py 的test_model_capability_service,直接对/api/model-capabilities/recommend发起 POST 请求并断言响应结构:
async with session.post( f"{BASE_URL}/api/model-capabilities/recommend", json={"research_depth": "标准"}, headers={"Content-Type": "application/json"} ) as response: if response.status == 200: result = await response.json() print(f"✅ 模型推荐成功:") print(f" - 快速模型: {result.get('data', {}).get('quick_model')}") print(f" - 深度模型: {result.get('data', {}).get('deep_model')}") print(f" - 推荐理由: {result.get('data', {}).get('reason')}")测试覆盖了recommend接口的请求/响应协议(请求体为research_depth,响应包含quick_model、deep_model、reason),可作为手工验证或回归测试的参考模板。
📁 本次修改涉及的文件清单
- ✅
frontend/src/views/Analysis/SingleAnalysis.vue- 修改
checkModelSuitability()函数 - 移除模型验证逻辑
- 改为显示推荐说明
- 修改
- ✅
app/routers/model_capabilities.py- 优化推荐理由格式
- 使用能力等级描述
- 简化说明文字
- ✅
docs/MODEL_RECOMMENDATION_UI_UPDATE.md- 新增功能说明文档
🎉 总结
本次优化将强制性的模型验证改为友好的推荐说明:前端从"校验不达标就警告"转向"始终给出基于当前分析深度的正向推荐",后端同步将推荐理由从"等级数字对比"精简为"能力定位 + 用途匹配"的清单式文案。整个链路建立在统一的"五级分析深度 × 五级模型能力 × 角色/特性"元数据体系之上(app/constants/model_capabilities.py),由 app/services/model_capability_service.py 完成候选筛选、性价比排序与聚合渠道映射,最终通过 app/routers/model_capabilities.py 暴露 REST 接口,前端经 frontend/src/api/modelCapabilities.ts 接入并在单股分析页以el-alert信息框呈现。该方案提升了用户体验,让用户可以根据自己的需求自主选择模型配置,同时保留了一键应用推荐的便捷功能。
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考