
JitRL 智能运动训练处方生成智能体
基于 JitRL(无梯度更新的 LLM Agent 持续强化学习) 技术,结合六级约束优先级与六大标准化业务模块,自动生成个性化运动训练处方。
目录
核心特性
1. JitRL 无梯度持续强化学习
不同于传统强化学习需要更新模型权重,JitRL 通过以下机制实现 LLM Agent 的持续策略改进:
-
经验回放缓冲区:持久化存储
(state, action, reward, outcome)经验元组,支持基于人员画像相似度的 top-k 检索 -
奖励模型:5 维加权奖励信号(完成率 30% + 无疼痛 25% + 疲劳适中 15% + 约束满足 20% + 体能进步 10%)
-
无梯度策略改进:检索高质量历史经验作为 LLM in-context 示例,无需更新模型权重即可改进策略
-
ε-greedy 探索利用:以 ε 概率随机探索新策略,1-ε 概率利用最优经验
-
自我反思:基于奖励分生成反思总结,指导后续处方优化
2. 六级约束优先级
严格执行六级约束优先级,数值越小优先级越高:
| 优先级 | 模块 | 说明 |
|---|---|---|
| P1 | 动作风控过滤器 | 匹配伤病/FMS 限制,输出禁做动作(强约束) |
| P2 | 体能素质调度器 | 主攻素质训练频次高于普通保持素质 |
| P3 | 肌群间隔编排器 | 同一大肌群训练间隔≥48 小时 |
| P4 | 1RM 负重换算引擎 | 自动计算力量动作训练重量 |
| P5 | 四周周期渐进控制器 | 适应期降量、提高期超负荷、稳定期维持 |
| P6 | 时长 & 增幅控制器 | 单日≤90 分钟,相邻周增幅≤10% |
3. 六大标准化业务模块
每个模块独立可测试,通过 Agent 编排器串联执行。
4. 双 LLM 后端
-
Ollama:本地大模型,适合隐私敏感场景
-
vLLM:高吞吐推理服务,适合生产环境
5. 双入口
-
CLI:命令行交互,支持文件输入与交互式生成
-
FastAPI:RESTful API,支持系统集成
系统架构
┌─────────────────────────────────────────────────────────────┐ │ 输入参数(JSON) │ │ 运动负荷指数 | 体能短板 | 人员信息 | 健康伤病信息 │ │ 体测记录 | 历史训练执行记录 | 个性化训练需求 │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ JitRL 持续强化学习层 │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ 经验回放缓冲区│◄─│ 奖励模型 │ │ 无梯度策略改进 │ │ │ │ (top-k检索) │─►│ (5维加权) │ │ (in-context示例) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 六级约束优先级编排器 │ │ P1 风控过滤 → P2 体能调度 → P3 肌群间隔 │ │ → P4 1RM换算 → P5 周期渐进 → P6 时长增幅 │ └──────────────────────────┬──────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 输出运动训练处方 │ │ 禁做动作 | 每周计划 | 1RM负重 | 周期渐进 | 约束检查 | 建议 │ └─────────────────────────────────────────────────────────────┘
快速开始
1. 环境要求
-
Python ≥ 3.10
-
可选:Ollama 或 vLLM 服务(用于 LLM 增强)
-
可选:Neo4j 数据库(用于知识图谱检索,缺省回退到内置知识库)
2. 安装依赖
cd /home/z/my-project
pip install -r requirements.txt
3. 运行示例
# CLI 方式生成处方
python -m jitrl_agent.cli generate -i examples/sample_input.json -o output/prescription.json
# 启动 FastAPI 服务
python -m jitrl_agent.cli serve --host 0.0.0.0 --port 8000
4. 查看结果
处方将保存到 output/prescription.json,同时在终端输出格式化的训练计划表格。
输入参数说明
输入 JSON 包含以下顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
latestExerciseLoadIndex |
float/null | 最新一条训练记录的运动负荷指数 |
fitnessWeakness |
string[] | 体能短板数组(标准体能素质名称) |
personInfo |
object | 人员基础信息 |
healthInfo |
object | 健康伤病信息 |
fitnessTestRecords |
object[] | 体能测试记录数组 |
trainExecuteRecords |
object[] | 历史训练执行记录数组 |
trainDemand |
object | 训练需求与硬性约束条件 |
完整示例见 examples/sample_input.json。
六级约束优先级
P1: 动作风控过滤器(最高优先级)
-
输入:
healthInfo.currentAilment(强约束)+healthInfo.pastInjury(弱约束) -
处理:基于 Neo4j 标签隔离图谱检索,匹配动作风险标签与伤病关键词
-
输出:禁做动作列表(含冲突原因)、谨慎动作列表、安全动作池
-
回退:Neo4j 不可用时回退到内置 34 个动作的知识库
P2: 体能素质调度器
-
主攻素质来源:
fitnessWeakness+mainTrainGoal解析 + 体测短板自动检测 -
调度策略:主攻素质训练频次倍率 1.5×,保持素质 1.0×
-
输出:每周各素质训练次数分布
P3: 肌群间隔编排器
-
约束:同一大肌群训练间隔≥48 小时(核心肌群 24 小时,恢复更快)
-
算法:交错排列,避免同一素质连续两天训练
-
回退:某素质无可用动作时,自动回退到其他可用素质
P4: 1RM 负重换算引擎
-
1RM 估算:基于体重 × 动作系数(青少年降权 0.85,女性降权 0.7)
-
训练百分比:适应期 60% / 提高期 75% / 稳定期 70%
-
输出:目标训练重量 kg、1RM 估算值、训练百分比
P5: 四周周期渐进控制器
-
阶段划分:适应期 25% / 提高期 50% / 稳定期 25%
-
负荷系数:适应期 0.60 / 提高期 0.70-0.80 / 稳定期 0.75
-
训练量系数:适应期 0.80(降量)/ 提高期 1.10(超负荷)/ 稳定期 1.00(维持)
P6: 时长 & 增幅控制器
-
单日时长:≤90 分钟(可配置),超时自动裁剪末尾动作
-
周增幅上限:≤10%(可配置),超限自动下调
-
约束检查:输出违反列表,用于自我反思修正
JitRL 持续强化学习
核心机制
JitRL 实现了无梯度更新的 LLM Agent 持续强化学习,核心流程:
1. 初始化:从历史训练记录批量构建经验缓冲区 2. 检索:基于人员画像相似度检索 top-k 高质量经验 3. 生成:将经验作为 in-context 示例注入 LLM prompt 4. 执行:生成处方并执行 5. 反馈:记录执行结果,计算奖励,更新经验缓冲区 6. 改进:下次生成时利用更丰富的经验
奖励模型
5 维加权奖励(0~1):
| 维度 | 权重 | 计算方式 |
|---|---|---|
| 完成率 | 30% | 动作平均完成率 |
| 无疼痛 | 25% | 训练中无疼痛=1,有疼痛=0 |
| 疲劳适中 | 15% | 轻微疲劳=1,无疲劳=0.5,重度=0 |
| 约束满足 | 20% | 处方通过所有约束检查=1 |
| 体能进步 | 10% | 体测成绩提升=1 |
经验回放缓冲区
-
持久化:JSON 文件存储,重启不丢失
-
检索:基于人员画像相似度(年龄、性别、BMI、短板、伤病)
-
容量:默认 500 条,FIFO 淘汰
-
top-k:默认检索 3 条高质量经验作为示例
LLM 后端配置
Ollama(默认)
# 启动 Ollama 服务
ollama serve
# 拉取模型
ollama pull qwen2.5:7b
# 环境变量配置
export JITRL_LLM_BACKEND=ollama
export OLLAMA_BASE_URL=http://localhost:11434
export OLLAMA_MODEL=qwen2.5:7b
vLLM
# 启动 vLLM 服务
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--port 8000
# 环境变量配置
export JITRL_LLM_BACKEND=vllm
export VLLM_BASE_URL=http://localhost:8000
export VLLM_MODEL=Qwen/Qwen2.5-7B-Instruct
export VLLM_API_KEY=EMPTY
无 LLM 模式
当 LLM 后端不可用时,系统自动回退到纯规则引擎模式,仍可生成完整处方(仅缺少 LLM 增强的自然语言建议)。
Neo4j 知识图谱
启用 Neo4j
# 环境变量配置
export NEO4J_ENABLED=true
export NEO4J_URI=bolt://localhost:7687
export NEO4J_USER=neo4j
export NEO4J_PASSWORD=your_password
export NEO4J_DATABASE=neo4j
图谱标签隔离
Neo4j 图谱使用以下标签进行隔离检索:
-
:Action- 动作节点 -
:Injury- 伤病节点 -
:MuscleGroup- 肌群节点 -
:Equipment- 器械节点 -
:Person- 人员节点
内置知识库回退
当 Neo4j 不可用时,系统回退到内置 34 个动作的知识库,包含:
-
下肢爆发力动作(徒手深蹲、靠墙静蹲、臀桥等)
-
核心稳定性动作(平板支撑、死虫式、鸟狗式等)
-
上肢力量动作(俯卧撑、哑铃划船、哑铃肩推等)
-
柔韧性动作(坐位体前屈、猫牛式等)
API 接口文档
启动服务后访问 http://localhost:8000/docs 查看交互式 API 文档。
核心接口
1. 生成运动训练处方
POST /api/prescription/generate
Content-Type: application/json
{
"latestExerciseLoadIndex": 520.0,
"fitnessWeakness": ["下肢爆发力", "核心稳定性"],
...
}
2. 记录训练执行结果(JitRL 持续学习)
POST /api/prescription/record-execution
Content-Type: application/json
{
"person_input": { ... }, // 原始输入
"prescription": { ... }, // 生成的处方
"execution": { // 执行结果
"execId": "E002",
"trainDate": "2026-08-15",
"actionExecuteDetail": [
{"actionDesc": "徒手深蹲", "finishRate": 0.9}
],
"exerciseLoadIndex": 580.0,
"subjectiveFatigue": "轻微疲劳",
"inTrainingPain": false
}
}
3. 查询经验缓冲区
GET /api/jitrl/experiences?limit=20
4. 健康检查
GET /api/health
CLI 命令
生成处方
python -m jitrl_agent.cli generate \
-i examples/sample_input.json \
-o output/prescription.json \
--backend ollama \
--neo4j
启动服务
python -m jitrl_agent.cli serve --host 0.0.0.0 --port 8000 --reload
交互式生成
python -m jitrl_agent.cli interactive
项目结构
jitrl_agent/ ├── __init__.py # 包入口 ├── config.py # 全局配置 ├── agent.py # Agent 编排器 ├── cli.py # CLI 入口 ├── models/ │ ├── enums.py # 枚举定义 │ └── schemas.py # Pydantic 数据模型 ├── knowledge/ │ ├── action_library.py # 内置动作库(34个动作) │ ├── muscle_mapping.py # 肌群映射 │ ├── fitness_standards.py # 体能测试标准 │ └── neo4j_client.py # Neo4j 知识图谱客户端 ├── llm/ │ ├── base.py # LLM 客户端基类 │ ├── ollama_client.py # Ollama 客户端 │ └── vllm_client.py # vLLM 客户端 ├── modules/ # 六大业务模块 │ ├── risk_filter.py # P1 动作风控过滤器 │ ├── fitness_scheduler.py # P2 体能素质调度器 │ ├── muscle_arranger.py # P3 肌群间隔编排器 │ ├── one_rm_calculator.py # P4 1RM 负重换算引擎 │ ├── periodization.py # P5 四周周期渐进控制器 │ └── duration_controller.py # P6 时长增幅控制器 ├── rl/ # JitRL 持续强化学习层 │ ├── experience_buffer.py # 经验回放缓冲区 │ ├── reward_model.py # 奖励模型 │ └── jitrl_trainer.py # JitRL 训练器 └── api/ └── server.py # FastAPI 服务
配置参数
所有参数均可通过环境变量覆盖:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
JITRL_LLM_BACKEND |
ollama | LLM 后端(ollama/vllm) |
OLLAMA_BASE_URL |
http://localhost:11434 | Ollama 服务地址 |
OLLAMA_MODEL |
qwen2.5:7b | Ollama 模型名 |
VLLM_BASE_URL |
http://localhost:8000 | vLLM 服务地址 |
VLLM_MODEL |
Qwen/Qwen2.5-7B-Instruct | vLLM 模型名 |
NEO4J_ENABLED |
false | 是否启用 Neo4j |
NEO4J_URI |
bolt://localhost:7687 | Neo4j 连接地址 |
DAILY_MAX_MINUTES |
90 | 单日训练时长上限 |
WEEKLY_LOAD_INCREMENT_CAP |
0.10 | 周负荷增幅上限 |
MUSCLE_GROUP_INTERVAL_HOURS |
48 | 肌群间隔小时数 |
JITRL_BUFFER_SIZE |
500 | 经验缓冲区容量 |
JITRL_TOP_K |
3 | 检索 top-k 经验数 |
JITRL_EPSILON |
0.15 | 探索率 ε |
示例输出
运行 python -m jitrl_agent.cli generate -i examples/sample_input.json 后,系统将输出:
-
处方 ID:唯一标识
-
禁做动作:12 个踝关节相关动作被禁做
-
4 周周期计划:
-
第 1 周(适应期):负荷 249.6
-
第 2 周(提高期):负荷 274.8(+10%)
-
第 3 周(提高期):负荷 302.4(+10%)
-
第 4 周(稳定期):负荷 332.8(+10%)
-
-
交错排列:周一(下肢)、周二(核心)、周四(下肢)、周五(核心),周三休息
-
1RM 负重:哑铃罗马尼亚硬拉 25.8kg(60%) → 32.2kg(75%) → 30.1kg(70%)
-
JitRL 元信息:缓冲区 1 条经验,平均奖励 0.875
-
约束检查:全部通过
