☰
TradingAgents-CN 模型推荐功能优化:从强制验证警告到友好推荐提示的完整实现解析
2026/10/5 17:15:25 网站建设 项目流程

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)包含三条分支:

  1. 推荐成功:将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 }
  1. 推荐接口返回空数据:回退到内置的generalDescriptions通用说明(见下文"降级说明")。
  2. 接口异常(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。核心流程为:

  1. 通过get_model_capability_service()获取服务单例;
  2. 调用capability_service.recommend_models_for_depth(request.research_depth)得到(quick_model, deep_model)推荐对;
  3. 调用get_model_config()获取两个模型的完整能力信息;
  4. 按能力等级生成推荐理由并返回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(),可分四步:

  1. 读取启用模型:从unified_config.get_llm_configs()中过滤enabled的模型;
  2. 候选筛选:
    • 快速模型候选需满足:角色为quick_analysis或both、能力等级 ≥quick_model_min、且支持tool_calling特性(数据收集必需);
    • 深度模型候选需满足:角色为deep_analysis或both、能力等级 ≥deep_model_min;
  3. 性价比排序:快速模型候选按"能力等级降序 + 成本升序"排序,深度模型候选按"能力等级降序 + 质量降序"排序;
  4. 兜底:若无候选,回退到系统默认模型(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. 用户体验更好:不再有警告和强制性提示,改为友好的建议和说明,用户可以自主决策;
  2. 信息更清晰:直接说明分析深度的用途,清楚展示推荐的模型配置,并解释推荐理由(能力等级定位 + 用途匹配);
  3. 保留便捷功能:仍然可以一键应用推荐配置,降低用户操作成本;
  4. 更加灵活:用户可以根据实际情况选择,不强制使用推荐配置,适应不同使用场景(如成本敏感、追求速度、混合厂商模型等)。

🧪 测试与验证

手动测试步骤

  1. 刷新前端页面
  2. 进入单股分析页面
  3. 选择不同的分析深度(1-5 级)
  4. 查看推荐提示:
    • 应该显示蓝色信息框(不是黄色警告框)
    • 标题为"💡 模型推荐"
    • 内容包含分析深度说明和推荐配置
  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),可作为手工验证或回归测试的参考模板。

📁 本次修改涉及的文件清单

  1. ✅frontend/src/views/Analysis/SingleAnalysis.vue
    • 修改checkModelSuitability()函数
    • 移除模型验证逻辑
    • 改为显示推荐说明
  2. ✅app/routers/model_capabilities.py
    • 优化推荐理由格式
    • 使用能力等级描述
    • 简化说明文字
  3. ✅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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询