基于QClaw与本地大模型构建个性化AI健身私教Agent实战
1. 项目缘起:一个健身爱好者的技术执念
作为一个常年泡在健身房和代码编辑器之间的人,我一直在寻找一种方式,能把我的两个爱好——健身和编程——更紧密地结合起来。我试过市面上几乎所有主流的健身App,从Keep到MyFitnessPal,从Fitbit到Apple Health。它们各有千秋,但总感觉差点意思:要么是记录功能太死板,无法适应我多变的训练计划;要么是饮食建议千篇一律,不考虑我当天的训练强度和身体状态;更别提那些所谓的“智能计划”,往往在几周后就变得不再“智能”,需要手动调整。
我真正想要的,是一个能真正理解我、能根据我的实时状态和长期目标动态调整的“数字私教”。它应该像一位经验丰富的线下教练,不仅能记录我深蹲做了几组、每组几次,还能在我抱怨“今天练腿后特别饿”时,给我一个兼顾蛋白质补充和热量控制的加餐建议,而不是冷冰冰地推送一条“每日热量摄入不超过2000大卡”的通用规则。
这个想法一直萦绕在我心头,直到我遇到了QClaw。最初吸引我的是它“低代码/无代码构建智能体(Agent)”的定位。在尝试了各种需要从零开始写Python、处理API调用、设计工作流的Agent框架后,QClaw的图形化编排界面让我眼前一亮。它不像某些平台那样功能简陋,而是提供了相当丰富的逻辑节点和数据处理能力,最关键的是,它支持接入我本地部署的大语言模型(如通过Ollama运行的模型),这保证了数据隐私和响应的灵活性。
于是,一个念头诞生了:用QClaw,亲手搭建一个属于我自己的、高度定制化的健身私教Agent。这个Agent要能自动解析我的运动记录(无论是手输的,还是从可穿戴设备同步的),分析我的饮食日志,并综合我的目标(增肌、减脂、保持),给出个性化的次日训练建议和饮食调整方案。这不仅仅是一个工具,更是我对“个性化AI助理”在垂直领域落地的一次深度实践。
2. 拆解需求:健身私教Agent的核心能力蓝图
在动手画流程图之前,我花了大量时间梳理,一个合格的“数字私教”到底需要具备哪些核心能力。这直接决定了我在QClaw中需要构建哪些模块(Skill),以及它们之间如何协作。
2.1 核心数据输入与理解
首先,Agent需要“看见”和“听懂”我的状态。这分为几个层面:
- 运动数据:这是最结构化的部分。我需要记录每次训练的动作、组数、次数、重量、间歇时间、主观疲劳程度(RPE)。理想情况下,这些数据可以手动输入一个固定格式的文本(例如:“深蹲 5组 每组8次 重量100kg RPE8”),或者未来通过API连接智能健身设备(如智能杠铃、运动手表)自动获取。Agent必须能准确解析这些文本,提取出结构化信息。
- 饮食数据:相对模糊,但至关重要。输入可能是“中午吃了食堂的番茄炒蛋、米饭二两、一块鸡胸肉”。Agent需要具备基础的营养学知识,能估算出这顿饭的大致热量、蛋白质、碳水、脂肪含量。更高级的,是能识别食物分量(“二两米饭”约100克),甚至处理“食堂的番茄炒蛋油多不多”这种模糊描述。
- 身体状态与目标:这是相对静态但指导性的数据。包括我的身高、体重、体脂率(定期更新)、长期目标(如“三个月内体脂降到15%”)、当日状态(如“昨晚睡眠只有5小时,感觉有点疲劳”、“练后肌肉酸痛感强烈”)。这些是Agent进行决策的“上下文”。
2.2 核心分析与决策能力
有了数据,Agent需要像教练一样“思考”:
- 训练负荷分析:根据历史训练数据,判断我当前的训练水平、是否进入平台期、是否存在过度训练的风险(比如连续几天RPE都很高且重量没增长)。这需要计算每周训练容量(组数次数重量),并跟踪其变化趋势。
- 营养缺口分析:结合我的目标(减脂需热量缺口,增肌需热量盈余)和当日运动消耗,估算出我全天的热量和三大营养素需求,并与饮食记录进行对比,找出缺口(如“蛋白质摄入不足30克”)。
- 个性化建议生成:这是最体现“智能”的地方。建议不能是模板:
- 训练建议:不能总是“明天练胸”。如果系统检测到我上次练腿后恢复不佳,它可能会建议“明天进行低强度有氧或休息,重点进行筋膜放松”;如果发现我卧推重量停滞,它可能会建议“下次训练尝试降低次数、增加重量,做3组5次,重量尝试110kg”。
- 饮食建议:不能只是“多吃蛋白质”。它需要结合缺口和现实场景给出建议:“你今天的蛋白质摄入距离目标还差35克,建议晚餐增加150克蒸鱼或4个鸡蛋白。如果在外就餐,可以优先选择鱼类或瘦肉类菜品。”
2.3 交互与反馈循环
一个好的私教离不开与学员的互动。我的Agent也需要:
- 自然语言交互:我能用最自然的话问它:“今天练得怎么样?”、“明天该怎么吃?”。它需要理解意图,并从数据库中组织语言回答。
- 反馈学习:当我执行了它的建议后,我需要能给出反馈:“按你说的做了容量日,感觉很好!”或者“这个新动作手腕不舒服”。Agent应该能记录这些反馈,微调未来的建议策略。例如,如果多次反馈某个动作不适,未来应避免推荐类似动作。
基于以上蓝图,我意识到,用传统编程方式实现这样一个系统,需要庞大的代码量和持续的调试。而QClaw这类Agent开发平台的价值就在于,它将这些能力(自然语言理解、逻辑判断、知识查询、动作执行)封装成了可视化的“技能”节点,我只需要像搭积木一样,把数据流和逻辑流连接起来。
3. 技术选型与QClaw实战:搭建智能体的“中枢神经”
明确了要做什么,接下来就是选择用什么做,以及怎么做。核心工具链的选择直接决定了项目的可行性和最终体验。
3.1 为什么是QClaw?—— 横向对比主流Agent框架
在项目开始前,我粗略调研了当时的几个热门选项:LangChain、LlamaIndex、AutoGen等开源框架,以及一些新兴的云平台。我的对比维度主要是:开发效率、定制灵活性、数据隐私、对本地模型的支持度。
- LangChain/ LlamaIndex:功能强大,生态丰富,是开发者的首选。但对于我这个想快速验证想法、且不希望陷入大量工程细节(如链的调试、记忆管理)的人来说,学习曲线稍陡。我需要的是一个更上层的、关注于业务逻辑编排的工具。
- 云平台型Agent服务:开箱即用,但通常黑盒化严重,定制能力弱,且所有数据需上传至云端,对于健身健康这类敏感数据,我心里有顾虑。
- QClaw:它恰好找到了一个平衡点。其图形化的工作流设计器(类似Node-RED)极大地降低了构建复杂Agent逻辑的门槛。我可以清晰地看到“用户输入”如何触发“意图识别”,然后分流到“查询训练记录”或“分析饮食”等不同的技能模块,最后经过“决策引擎”生成回复。这种可视化的数据流让我对Agent的“思考过程”有了掌控感。更重要的是,它明确支持接入自定义的LLM API,这意味着我可以轻松地将其后端指向我本地运行的Ollama服务,使用Mistral、Llama 3等开源模型,所有数据都在本地闭环,安全感十足。
注意:框架选择没有绝对优劣,只有是否适合。如果你是一名资深开发者,追求极致的控制和性能,LangChain可能是更好的起点。但如果你像我一样,希望快速构建一个功能完整、逻辑清晰的垂直领域Agent,且对数据隐私有要求,QClaw这类低代码平台是目前非常高效的选择。
3.2 核心架构搭建:在QClaw中设计工作流
在QClaw的编辑器中,我开始搭建我的健身私教Agent的核心工作流。整个架构可以看作一个由事件驱动的状态机。
1. 触发与意图识别节点:这是工作流的起点。我配置了一个“HTTP Webhook”或“消息监听”节点,用于接收我的输入。输入可能来自一个我开发的简单微信机器人、一个Telegram Bot,或者直接是QClaw平台内的聊天窗口。 输入文本首先流入一个“LLM调用”节点。这里我连接的是本地Ollama的llama3:8b模型。我给它设计了一个非常清晰的系统提示词(System Prompt):
你是一个健身助理,负责分析用户的输入并判断其意图。请从以下类别中选择最匹配的一项: 1. `LOG_WORKOUT` - 用户记录了一次训练(包含动作、组数、次数、重量等信息)。 2. `LOG_FOOD` - 用户记录了一餐饮食。 3. `QUERY_PROGRESS` - 用户询问训练进度、历史记录或数据分析。 4. `ASK_ADVICE` - 用户请求训练或饮食建议。 5. `UPDATE_STATUS` - 用户更新身体状态或目标(如体重、疲劳感)。 6. `CHITCHAT` - 日常问候或闲聊。 请只输出意图类别代号,不要有任何其他解释。 示例: 用户输入:“今天练了胸,平板卧推5组8次100kg,上斜哑铃卧推4组10次35kg。” 输出:LOG_WORKOUT这个节点的作用是将自然语言分类,输出一个标准化的意图标签。这一步至关重要,它决定了后续数据流向哪个处理分支。
2. 技能路由与处理分支:在意图识别节点后,我接了一个“条件判断”节点(在QClaw中可能叫“Switch”或“Router”)。它根据上一步输出的意图标签,将请求路由到不同的技能处理链。
LOG_WORKOUT分支:触发“训练记录解析与存储”技能链。LOG_FOOD分支:触发“饮食记录解析与存储”技能链。ASK_ADVICE分支:触发“综合分析与建议生成”技能链。这是最复杂的一条链。QUERY_PROGRESS和UPDATE_STATUS等也有各自相对简单的处理链。
3. 以ASK_ADVICE分支为例,详解复杂技能链:当用户问“明天我该怎么练?”时,工作流进入这个分支。这条链子包含了多个串联的节点:
- 节点A:获取上下文。首先,调用一个“函数”节点,从数据库中查询我最近一次的训练记录、近一周的饮食概况、当前设定的目标。
- 节点B:调用分析LLM。将上下文信息(最近练了腿、感觉恢复尚可、目标是增肌)组合成一个新的提示词,发送给另一个LLM(为了功能分离,我有时会使用与意图识别不同的模型,如
qwen:7b)。提示词范例如下:你是一名专业的健身教练。请根据以下会员信息,为他制定明天的训练计划。 会员目标:增肌。 最近一次训练(昨天):腿部训练(深蹲、腿举),主观疲劳度RPE 8。 会员自述状态:肌肉有正常酸痛,精力良好。 训练频率:每周练四休三。 请给出具体的训练安排,包括:训练部位、具体动作、组数、次数范围、重量建议(基于他上次训练重量推算)、休息时间。同时,请用鼓励性的口吻给出简短的理由。 - 节点C:结果格式化与存储。分析LLM返回的是一段文本。我需要再用一个“函数”节点,尝试从这段文本中提取出结构化的训练计划(部位、动作、组数次数等),并存入数据库的“建议计划”表,同时标记生成时间。这样下次查询进度时,可以调出历史建议。
- 节点D:生成回复。最后,将格式化后的训练计划,或者直接LLM生成的文本,通过“HTTP响应”或“消息发送”节点返回给我。
4. 数据持久化设计:QClaw本身可能提供简单的键值存储,但对于健身数据这种结构化、需要查询历史记录的数据,我选择外接了一个轻量级数据库。我在QClaw的“函数”节点中编写了几段简单的JavaScript代码,用于连接和操作一个本地的SQLite数据库(后期可无缝迁移到PostgreSQL)。数据库主要包含几张表:
workout_logs:记录每一次训练的动作详情。food_logs:记录饮食,包含估算的营养素数据。body_stats:记录体重、体脂的阶段性数据。goals:记录当前训练目标。coach_advice:记录Agent给出的每一次建议。
通过这样的架构,一个具备基本感知、分析、决策和记忆能力的健身私教Agent的“大脑”就在QClaw中搭建起来了。整个过程,我几乎没有写传统的业务逻辑代码,更多的是在设计和连接这些功能节点,并精心构思给每个LLM节点的提示词。
4. 核心难题攻克:让Agent真正“懂”健身
搭建框架是第一步,让Agent真正变得专业、可靠,才是最大的挑战。这里我遇到了几个核心难题,并摸索出一些实用的解决方案。
4.1 难题一:从模糊描述到精准数据——饮食记录的解析
用户不可能每次吃饭都像营养师一样精确称重。如何让Agent理解“一碗米饭”、“一大份沙拉”、“食堂的红烧肉”?
我的解决方案是“分层估算 + 确认反馈”机制:
- 构建基础食物数据库:我首先建立了一个小型的、本地化的常见食物营养数据库。例如:
{“米饭”: {“unit”: “碗”, “calories”: 200, “protein”: 5, “carbs”: 45, “fat”: 0.5}, “鸡胸肉”: {“unit”: “掌心大小”, “calories”: 120, “protein”: 25, “carbs”: 0, “fat”: 3}}。单位使用生活化的“碗”、“掌心”、“拳头”。 - 在
LOG_FOOD技能链中引入解析LLM:当用户输入“中午吃了红烧肉、炒青菜和一碗米饭”时,流程如下:- 首先,由LLM进行食物项拆分和标准化。提示词要求它将“红烧肉”映射为“红烧猪肉(炖)”,“炒青菜”映射为“清炒绿叶蔬菜”。
- 然后,我编写的估算函数会根据标准化后的食物名称,去本地数据库查找匹配项,并应用默认分量(如“一份红烧肉”按150克瘦肉+油脂估算)。
- 生成确认与追问:Agent不会默默接受估算。它会回复:“已记录午餐。根据估算,这餐约含550大卡,蛋白质30g,碳水45g,脂肪25g。其中‘红烧肉’的分量是按一份(约150克)估算的,准确吗?如果分量不同,你可以告诉我‘红烧肉吃了很多’或‘只吃了几块’来调整。”
- 用户反馈如“红烧肉吃了很多”,则会触发一个反馈学习节点,临时调高“红烧肉”本次记录的热量和脂肪估值,并可能将这次修正关联到用户ID,未来对同类描述进行微调。
这个过程虽然无法做到百分百精确,但通过交互,它能无限逼近真实情况,远比固定输入框体验更好,也培养了用户更精确描述的习惯。
4.2 难题二:超越模板化——生成真正个性化的训练建议
很多AI健身建议止步于“如果今天是周一,就推胸”的模板。我的目标是让建议能动态调整。
关键在于构建一个“训练状态评估”模块:在ASK_ADVICE分支的“获取上下文”节点之后,我新增了一个**“状态评估”函数节点**。这个节点的逻辑是我手动编写的规则引擎(初期可用简单规则,后期可考虑用机器学习模型),它综合分析:
- 近期训练负荷:计算过去7天的总训练容量,并与再之前7天对比,判断是上升、持平还是下降趋势。
- 恢复指标:结合用户自述的“睡眠质量”、“肌肉酸痛感”、“精力水平”(通过
UPDATE_STATUS意图收集),给出一个简单的恢复评分(如1-5分)。 - 计划完成度:检查上次Agent给出的建议,用户是否执行了?执行后反馈如何?
基于这些评估,该节点会输出一个状态标签,如:READY_FOR_HEAVY(状态好,可上强度)、NEED_RECOVERY(需要恢复/减量)、PLATEAU_SUSPECTED(可能进入平台期)。
这个状态标签会和基础上下文一起,送入最终生成建议的LLM。提示词会变为:
...(基础信息)... **会员当前训练状态评估**:`NEED_RECOVERY`(原因为近期容量增长较快且自述疲劳感强)。 因此,请设计一个以**主动恢复、技术打磨、筋膜放松**为主的训练日计划,避免大重量和力竭组。可以安排...这样,LLM得到的指令就非常具体,生成的建议自然就个性化、有针对性了。
4.3 难题三:保持长期记忆与一致性
Agent不能得“健忘症”。它需要记住我的长期目标(减脂),并在每次建议中贯彻,而不是今天让减脂,明天又推荐高碳水饮食。
解决方案是利用数据库和系统提示词的“固化上下文”:
- 长期目标入库:当用户设定目标时,不仅存入
goals表,还会在一个独立的agent_config表中设置一个键值对,如current_primary_goal: fat_loss。 - 在关键技能链中注入目标:在
ASK_ADVICE和LOG_FOOD的分析环节,从agent_config表中读取当前首要目标,并将其作为一条强约束,写入发送给LLM的提示词开头,例如:“核心原则:用户当前处于减脂期,所有建议需以创造合理热量缺口为前提。” - 定期回顾与调整:我设置了一个每周自动运行的QClaw工作流(使用定时触发器),它会自动汇总一周数据,生成简单的周报(“本周平均每日热量缺口约300大卡,体重下降0.3kg,符合预期”),并提示用户:“您的减脂进度良好。是否需要微调下周的饮食或训练计划?” 这模拟了私教的定期复盘。
通过攻克这三个难题,我的Agent逐渐从一个“记录提醒工具”进化成了一个有初步诊断、决策和持续跟踪能力的“数字私教”。它仍然不会完全替代人类教练的触觉指导和临场激励,但在提供数据驱动的、个性化的日常指导方面,已经展现出了巨大的实用价值。
5. 部署、迭代与真实体验分享
将QClaw工作流开发完成后,接下来的任务就是让它“跑起来”,并融入我的日常生活。
5.1 部署与接入:让Agent触手可及
QClaw提供了多种部署和触发方式。为了最大化便利性,我选择了以下组合方案:
- 后端服务化:我将完成开发的Agent工作流在QClaw平台上发布为一个独立的“智能体”,并启用其提供的API端点。这个端点接收JSON格式的请求(包含用户ID和消息内容),并返回Agent的处理结果。
- 前端交互界面:我追求极简,没有开发复杂的App。而是快速写了一个基于Telegram Bot的前端。
- 我在Telegram上通过
@BotFather创建了一个机器人,获取到Token。 - 然后写了一个不到100行的Python脚本,使用
python-telegram-bot库。这个脚本做两件事:一是接收我在Telegram里发给机器人的消息;二是将消息转发到我QClaw Agent的API端点,并把返回的结果发回Telegram。 - 我将这个Python脚本部署在一台始终开机的家庭服务器(树莓派)上,让它7x24小时运行。
- 我在Telegram上通过
- 数据持久化服务:同样在这台服务器上,我运行着SQLite数据库(未来计划改用PostgreSQL),QClaw工作流中的“函数”节点通过HTTP请求与一个简单的数据接口服务通信,进行数据的增删改查。所有数据均存储在本地服务器。
这样一来,我的健身私教就变成了一个Telegram聊天窗口。我可以在任何有网络的地方,像和朋友聊天一样记录训练、询问建议,体验非常无缝。
5.2 持续迭代:基于反馈的优化循环
上线只是开始。在使用了近一个月后,我根据实际体验进行了多次关键迭代:
- 提示词工程优化:最初的建议有时会“天马行空”,比如建议一些健身房没有的器械动作。我在提示词中增加了更多限制:“请只推荐在标准商业健身房中常见的训练动作。” 效果立竿见影。
- 新增“快速记录”模板:为了提升记录效率,我设计了快速命令。例如,输入“
/logw 深蹲 5x5 120kg”,Telegram Bot会直接将其转换为标准格式“记录训练:深蹲 5组5次 120kg”并发送给Agent,省去了打字的麻烦。 - 引入“情绪感知”:我在
UPDATE_STATUS意图中增加了对情绪的关键词捕捉(如“烦躁”、“压力大”、“兴奋”)。当检测到负面情绪时,生成建议的LLM会得到额外指令:“用户当前可能压力较大,建议中应包含鼓励性语言,并优先推荐其喜爱的、能带来成就感的训练动作。” - 数据可视化扩展:我增加了一个简单的
/report命令。触发后,Agent会调用一个外部图表生成服务(如QuickChart),根据数据库数据生成一张过去30天的训练容量趋势图或体重变化曲线,以图片形式返回。这比纯文字报告直观得多。
5.3 实战心得与避坑指南
经过这个从0到1的完整项目,我积累了一些宝贵的经验,也踩过不少坑:
- LLM不是万能的,清晰的边界很重要:不要指望一个LLM解决所有问题。我的架构将意图识别、信息提取、专业分析、回复生成等任务分给了不同的LLM调用或规则引擎。这比用一个“超级提示词”让一个LLM干所有事,效果更稳定、可控。例如,用小型、快速的模型做分类和提取,用更大、推理能力更强的模型做综合分析和生成。
- 提示词是“编程”,需要调试:把写提示词当成写代码一样严谨。定义清晰的输入输出格式(如要求LLM返回JSON),使用少样本示例(Few-shot)进行引导,明确列出约束条件。每次修改提示词后,都要用一系列测试用例去验证其效果。
- 本地模型的优势与妥协:使用Ollama本地模型,隐私和速度是巨大优势,尤其对于这种频繁交互的场景。但需要接受其在某些复杂推理任务上可能不如顶级商用API(如GPT-4)。我的策略是:对一致性要求高的分类任务用本地模型,对需要创造性和深度分析的“建议生成”任务,可以配置一个备用通道,在本地模型回答不满意时,手动切换或融合商用API的结果(需注意隐私条款)。
- QClaw节点的调试技巧:QClaw的图形化界面在调试时,一定要善用每个节点的“预览”或“日志”功能,查看流经该节点的具体数据。很多逻辑错误是因为数据格式不符合下游节点的预期。在关键节点后添加“调试”节点,将数据临时打印或存储,是快速定位问题的好方法。
- 从简单核心开始,逐步扩展:不要一开始就想着做一个全能教练。我最先实现的就是
LOG_WORKOUT和ASK_ADVICE(基于简单规则)这两个核心功能。先用起来,获得正反馈,然后再一步步加入饮食记录、状态更新、数据分析等模块。这能有效避免项目半途而废。
这个自建的健身私教Agent,现在已经成了我训练生活中不可或缺的一部分。它不完美,但足够贴心、足够个性化。更重要的是,构建它的过程,让我对AI Agent如何在实际场景中落地,有了远超阅读文档的深刻理解。它不再是一个遥远的概念,而是一个由我亲手塑造、每天都在与我共同成长的数字伙伴。如果你也对某个垂直领域有深度的需求,不妨也尝试用QClaw这样的工具,创造一个属于你自己的“智能体”,这个过程本身,就是最好的学习。
