译自最初发表于 vc.ru(2026年9月14日) — 原文

我们正在打造 1trAIner——一个帮助用户将训练与自身目标、恢复情况和日程相结合的服务,而不是再给一份千篇一律的计划。教练在 Telegram 中运行,同时还有小程序和网站上的个人中心。第一个可用版本于 2026 年 5 月上线。本文将介绍我们如何使用 Garmin 数据、为什么将规划划分为不同时间范围,以及为什么语言模型与手表指标的联动仍然需要限制和校验。

为什么还需要另一个教练

网上的计划有一个有用的特性:它提供了结构。但这样的文档本身并不知道你睡得怎么样、昨天做了什么、周四到底能不能训练。在表格和现实生活之间还有工作要做:评估情况、调整训练安排、决定今天是否应该进行高强度部分。

和真人教练可以讨论这些调整。但一对一指导可能很贵,而且回复不一定及时。同时,我们并不认为语言模型能自动替代专业经验。它的角色不同:汇集可用的上下文,并给出一个可以阅读和讨论的计划。

因此对我们来说,跑步 AI 教练不是根据简短问卷生成漂亮日程的工具。重要的是,在制定每日计划时,上下文中要保留目标、之前的训练、恢复指标和个人的限制条件。否则个性化就止步于称呼名字。

对话本身也是必要的。并非每种情况都会反映在手表里,也不是每个问题都能提前变成表单字段。在 1trAIner 中,可以用文字请求修改计划。但我们将硬性限制与自由对话分开:禁训日期、可训练的工作日和时长上限都在个人中心设置。

我们在方法论页面描述了这一方法。其意义不在于为了分析而收集尽可能多的指标。数据应该帮助回答一个更具体的问题:在当前整体训练和可用时间的框架下,什么样的负荷是合适的。

分层规划:赛季、月度、周、日

规划采用分层结构:赛季 → 月度 → 周 → 日。下层建立在上层之上。每日任务应该是周计划的一部分,而周计划应该是更长计划的延续,而不是模型偶然给出的、与之前内容无关的单独回答。

这是架构上的限制,而不是要求模型“记住策略”。如果所需的上层尚未生成,服务会先补全它。不能默默跳过缺失环节,直接给出每日计划,仿佛整条链路已经存在。

否则会出现一种令人不快的偷换:今天的文本看起来很有说服力,却不清楚它解决的是备赛中的哪项任务。存在一条连贯的链条本身并不能证明建议的质量。但它为下一步提供了支撑,也不允许把没有计划当作正常的初始状态。

还有一个简单的内容检查:只有不少于 300 个字符的文本才算计划。“规划器未返回文本”这条消息不会成为计划,也不会作为下一层级的依据继续传递。这是对占位内容的防护,而不是对文本运动专业性的评价。

个人的日程比一周模板更重要。如果某个日期被锁定、某天不可用,或训练设置了分钟上限,这些条件必须严格遵守。如果为了完成安排得漂亮的训练负荷而需要无视自己的日历,那它就没有意义。

训练负荷呈阶梯式增长。减量的时机由训练负荷、就绪度和已完成训练课的质量决定,而不是按固定的周次交替。因此,这里的长期计划并不意味着未来的每一天都已最终确定:下层级的规划正是为了细化整体结构。

手表训练分析能带来什么

对模型来说,重要的不只是跑过步这一事实。上下文中会带入最近几次训练及其日期和“今天”或“昨天”的标记,以及基于 Garmin 数据对最新训练的自动分析。其中包含心率区间、分段和天气。这样可以讨论具体的训练,而不是抽象的“我昨天跑了跑”。

这种分析所依据的主要数据类别:

  • 睡眠和静息心率——下一次负荷前恢复情况的一部分上下文。
  • 心率变异性(HRV)和就绪度——提示词中为这些指标设定了强度调整规则。
  • 训练负荷——这一上下文使最新训练不能脱离之前的训练单独看待。
  • 乳酸阈心率(LT)、心率区间和各距离预测——用于把强度绑定到运动员自身数据而非通用表格的参照。
  • 分段和天气——模型在分析时可获取的最新训练细节。

提示词中的规则表述得很直接:当就绪度、HRV 或睡眠偏低,以及急性训练负荷偏高时,强度下调。就绪度高时,允许进行高质量训练。关键词是“允许”:一项有利指标并不能取消本周目标和日程限制。

这样,数据可以改变明天。如果整体结构中安排了高强度训练,但恢复偏低,模型会收到下调强度的指示。这是对决策规则的描述,而不是承诺模型的任何回答都准确无误地符合它。

心率区间和乳酸阈的情况类似。我们传入训练指标,是为了不让强度按适用于任何跑者的通用表格来指定。分段和天气补充了已完成训练的具体情况。但它们本身并不能让人有把握地解释任何一次不理想的训练:拥有数据和正确解读是两回事。

除手表外,上下文中还有个人资料、目标、运动员记忆以及最近 7 天的饮食日记。如果在长距离训练日前存在明显热量缺口,教练会提醒补给不足。这不是医疗饮食方案,而是在讨论训练范围内的有限提示。

我们另外在「跑步 AI 教练」页面整理了跑步方法的说明。对我们来说,重要的不是输入字段的数量,而是它们之间的联系:用户原本打算做什么、已经做了什么,以及在什么条件下完成下一项任务。

AI 会在哪里出错

语言模型可能在数字上出错、误解问题或给出不完整的回答。一份篇幅长、写得自信的计划,并不会仅仅因为提到了你的指标就变得正确。我们不认为接入 Garmin 是消除模型错误的方法。

因此,把格式检查和含义检查区分开是有用的。300 字符的门槛可以挡掉简短的占位内容,但它并不能说明负荷选择是否正确、文本内部是否存在矛盾。把这样的过滤说成对训练方法的质量把控,是不诚实的。

补全缺失的层级解决的是另一个问题:下层计划必须有支撑。它填补了链条中的断点,但同样不会把模型的每一句话都变成经过核实的事实。两项措施都需要,但各自的作用范围都很有限。

个人中心里的硬性限制是另一回事。被锁定的日期、按星期几的可训练时间,以及每日分钟上限,比一周的模板更重要。这些不是可以为了更漂亮的文本而牺牲的愿望,它们划定了边界,只有在这个边界内提出训练安排才有意义。

计划始终可以在个人中心和小程序里完整查看。任何修改都可以用文字提出。这样的界面让人有机会发现不一致并回到讨论,而不是只拿到一条没有其余上下文的简短任务。

错误也可能出现在规划阶段之前。语音消息由我们的服务基于 faster-whisper 识别。没有领域提示时,模型会在专有名词上出错,因此提示中加入了运动术语、路线和山峰名称。这又是一个例子,说明为什么通用工具必须用具体任务的上下文来补充。

医疗问题不在服务范围内。教练会建议去看医生,不做诊断,也不开治疗或药物。1trAIner 是信息服务;手表指标不会改变这条边界。

我们对公开文本也施加限制。网站上有针对结果承诺和医疗断言的自动检查,每篇文章都标注作者和更新日期。这不是对每日计划的检查,而是另一项工作,关乎我们如何描述产品:不能对外承诺系统在内部无法可靠保证的事情。

费用是多少,以及为什么没有自动扣款

前 7 天免费,之后订阅费用为每月 450 ₽或每年 4999 ₽。没有自动扣款,不保存银行卡,续订需通过链接手动完成。关于我们的主要信息可在主页查看。

对用户来说,这种方案意味着很简单的一件事:续订需要单独操作。我们认为,把用户是否继续使用教练的决定与支付设置的惯性混在一起并不合适。同时,我们不会把没有自动续订归因于对留存或其他指标的影响——本文中没有这类数据。

订阅费用和模型请求费用是不同层面的。我们使用的语言模型是 DeepSeek。默认指定的是 deepseek-v4-pro,而从 2026 年 9 月 10 日起,请求会路由到 V4.1 Flash。因此,在讨论开销时,重要的是查看当前价格,而不只是设置中的模型名称。

自 2026 年 9 月 10 日起,基础价格为每百万输入 token 0.15 美元、每百万缓存输入 token 0.003 美元、每百万输出 token 0.60 美元。高峰时段价格翻倍:分别为每百万 0.30 美元、0.006 美元和 1.20 美元。

根据供应商价格,高峰时段为工作日 UTC 01:00–04:00 和 06:00–10:00。周末不算高峰。我们会在莫斯科时间 03:15–03:59 预生成每日计划:按 UTC 计算,这段时间不在高峰区间内。

生成和发送是分开的。用户会在自己的发送时间收到计划,默认是莫斯科时间 6:00。对于可以提前准备的任务,没有必要把计算绑定到发送时刻。

这是用于管理请求成本的具体工程方案,但不是现成的单位经济模型。没有使用量数据,就无法从 token 价格推导出订阅成本。我们不公布收入、用户数量和以卢布计的单位经济模型。

接下来

iPhone 和 Apple Watch 应用正在 TestFlight 中进行封闭测试。我们在此不承诺发布日期。对我们来说,更重要的是把已经运行的机制与预期分开讨论:训练上下文、分层规划、日程限制,以及查看完整回答的可能性。

对我们来说,下一步是继续处理有说服力的文字与有用计划之间的差距。更多数据并不能取消这项任务。AI 教练应当有清晰的建议依据,也有同样清晰的边界,超出边界后需要的不是模型的又一个回答。

附上哪些截图

  • 方法论页面(/methodology):展示教练如何做决策的说明。
  • 跑步 AI 教练页面(/ai-trener/po-begu):展示服务方法在跑步方向上的描述。
  • 首页(/):展示带有服务说明的引导页。

来源: vc.ru