PraisonAI Train 实战指南:LLM 微调与 Agent 迭代训练的完整方案
【免费下载链接】PraisonAIPraisonAI 🦞 — Hire a 24/7 AI Workforce. Stop writing boilerplate and start shipping autonomous self-improving agents that research, plan, code, and execute tasks. Deployed in 5 lines of code with built-in memory, RAG, and support for 100+ LLMs.项目地址: https://gitcode.com/GitHub_Trending/pr/PraisonAI
PraisonAI Train 是 PraisonAI 多智能体生态中的训练组件,负责两条训练路径:一是基于 Unsloth 的开源大模型微调(Llama、Qwen 等),二是通过 LLM-as-Judge 或人类反馈对 Agent 行为进行迭代式改进。本文以 praisonai-train/README.md 为主线,结合仓库源码与配置文件,系统讲解安装方式、两条训练路径的完整命令、配置参数、数据集工具(generate/validate/from-trials)以及会话管理与应用机制,读完即可上手"让 Agent 自己变强"的闭环流程。
一、PraisonAI Train 是什么
PraisonAI Train 是一个可独立安装的 Python 包(praisonai-train),也可作为完整praisonai栈的一部分使用。它解决了两个核心问题:
- Agent 行为训练:不需要 GPU、不需要微调模型,通过"运行 Agent → LLM 裁判打分/人工反馈 → 把改进建议回灌给 Agent → 重跑"的迭代循环,让同一个 Agent 在一次会话内持续改进回答质量。
- LLM 参数微调:基于 Unsloth 对开源模型(Llama、Qwen 等)做 LoRA 微调,需要 GPU 与完整 ML 依赖栈。
从源码结构看,该包的核心模块分布在 praisonai_train/train/(agent 训练与 LLM 训练两条路径)、praisonai_train/data/(数据集生成与质检)以及 praisonai_train/cli/(命令行入口)三大部分。
命令速览
| 命令 | 做什么 | 需要 GPU/ML 依赖? |
|---|---|---|
praisonai-train agents --input "What is Python?" | 运行 Agent,用 LLM 裁判给答案打分,把改进建议反馈回去,循环迭代 | 否 |
praisonai-train agents --input "Explain AI" --human | 同样的循环,但由你人工给出反馈 | 否 |
praisonai-train llm dataset.json | 用 Unsloth 在数据集上微调开源模型(Llama、Qwen 等) | 是 |
praisonai-train list/show/apply | 浏览训练会话、查看详情、把最佳迭代应用到 Agent | 否 |
praisonai-train generate --config generate.yaml | 从教师 LLM 合成指令数据集(含去重、可续跑) | 否 |
praisonai-train validate data/tamil.jsonl --out data/clean.jsonl | 数据集质检/过滤(去重、样板话与拒答、脚本纯度、多样性指标) | 否 |
praisonai-train from-trials trials.json -o data/train.jsonl | 从验证试验报告中导出通过样本为训练集 | 否 |
praisonai-train export ollama\|gguf\|hf | 导出已训练好的模型到 Ollama / GGUF / HuggingFace | 是 |
praisonai-train remote tail/stop | 远程 GPU 机器上训练任务的日志跟踪与停止 | 否(远端需要) |
CLI 入口定义在 cli/commands/train.py,通过main.py 注册为praisonai-train命令。
二、安装与依赖
按需选择安装方式
# Agent 训练专用(轻量级) pip install praisonai-train # + LLM 微调(重 ML 栈:torch、unsloth、trl 等) pip install "praisonai-train[llm]" # 或者作为完整 PraisonAI 栈的一部分(同样的命令通过 `praisonai train ...` 使用) pip install "praisonai[train]"基础依赖在 pyproject.toml 中声明,仅包含praisonaiagents>=1.6.126、litellm>=1.0、rich>=13.7、typer>=0.12.0、click>=8.4.2、PyYAML>=6.0——这正是 Agent 训练(通过praisonaiagents的BaseLLMGrader→litellm.completion()打分)所需的全部运行时依赖。[llm]extra 则额外拉入torch>=2.6.0、unsloth>=2025.9.1、trl>=0.18.2、peft、bitsandbytes、transformers>=4.51.3等重 ML 栈,以及praisonai-code和praisonai(llm命令会桥接到 code 层的 CLI runner 进行数据集调度,见 train.py 中_dispatch_remote与import_code_module相关逻辑)。
GPU 环境推荐 conda 安装
GPU 环境通常更推荐 conda 安装方式,它会固定 CUDA 兼容的版本:
setup-conda-env # 或: bash praisonai_train/setup/setup_conda_env.shsetup-conda-env同样注册为独立命令(见 pyproject.toml 的[project.scripts]),其实现位于 setup/setup_conda_env.py 与 setup/setup_conda_env.sh。
三、快速上手:2 分钟训练一个 Agent
Agent 训练是轻量路径的核心卖点——无需 GPU,无需微调,靠的是迭代反馈循环。
export OPENAI_API_KEY=sk-... # 最多三轮改进迭代,LLM 充当裁判 praisonai-train agents --input "Explain quantum entanglement to a 10-year-old" --iterations 3 # 查看训练过程 praisonai-train list praisonai-train show <session-id> # 应用最佳迭代,并与改进后的 Agent 对话 praisonai-train apply <session-id> --run "And what about Germany?"注意:
--iterations设置的是训练循环的最大轮数。在 LLM-as-Judge 模式下,当任何一轮得分达到≥ 9.5(优秀)时训练会提前停止,所以简单提示词可能一轮就结束。传--no-early-stop强制跑完全部轮次,或传--verbose查看何时停止。
Python API 等效写法
from praisonaiagents import Agent from praisonai_train import AgentTrainer, TrainingScenario agent = Agent(instructions="You are a helpful assistant.") trainer = AgentTrainer(agent=agent, iterations=3) trainer.add_scenario(TrainingScenario(id="demo", input_text="What is Python?")) report = trainer.run() report.print_summary()底层实现:AgentTrainer 的循环逻辑
从源码看,AgentTrainer 的run()方法核心循环为:
- 对每个
TrainingScenario(包含id、input_text、可选expected_output、context,见 models.py)逐个迭代; - 首轮直接用原始输入调用 Agent;后续轮次通过
_build_improvement_prompt()把上一轮的分数、反馈与改进建议拼进提示词(格式为[FEEDBACK FROM PREVIOUS ATTEMPT]块),再让 Agent 重跑; - 打分:LLM 模式调用
TrainingGrader,人工模式调用_get_human_feedback()交互式收集 1–10 分、反馈文本与逗号分隔的建议; - 每次迭代记录
TrainingIteration(输入、输出、分数、反馈、建议、时间戳与元数据)并持久化; - 当分数 ≥ 9.5 且未禁用提前停止、且还有剩余轮次时,置
early_stopped=True并中断; - 汇总生成
TrainingReport,提供avg_score、min_score、max_score、improvement(末轮减首轮分数)、passed(平均分 ≥ 7.0 判定通过)等统计属性。
值得注意的健壮性设计:Agent 运行失败(如 provider 不可达、凭据错误、超时)会被直接向上抛出,而不会作为训练数据被裁判打分后入库,避免把错误字符串训练进 Agent(源码注释明确说明该设计意图)。Agent 可以是Agent、Agents或任意可调用对象,_get_agent_output()会按callable→chat方法 →start方法三种形态适配。
LLM 裁判的实现
TrainingGrader 继承自praisonaiagents.eval.grader.BaseLLMGrader,复用其提示词构建、响应解析、惰性 litellm 导入与同步/异步打分逻辑,默认模型为gpt-4o-mini、温度为 0.1(保证打分一致性)、max_tokens=500。可通过--model参数替换裁判模型。
四、快速上手:微调一个 LLM
pip install "praisonai-train[llm]" # dataset.json 需为 ShareGPT 或 Alpaca 格式;config.yaml 不存在时会自动生成 praisonai-train llm dataset.json --model llama-3.1LoRA rank、epochs、量化方式、Ollama/HuggingFace 导出等调参项都集中在config.yaml中——模板见 setup/config.yaml。
llm命令的完整参数
cli/commands/train.py 中定义了完整参数,其中值得单独抽出为 flag 的调参项如下:
| 参数 | 说明 | 示例值 |
|---|---|---|
dataset(位置参数) | 训练数据集路径;当--config指定了数据集时可省略 | dataset.json |
--config/-c | 训练配置 YAML,其下所有 flag 会覆盖它 | config.yaml |
--model/-m | 基础模型 | llama-3.1 |
--method | 训练方法 | sft、cpt、dpo、orpo、kto |
--max-seq-length | 序列长度 | 2048 |
--epochs | 训练轮数(设置--max-steps时忽略) | 1 |
--max-steps | 最大步数 | 10 |
--learning-rate | 学习率 | 2.0e-4 |
--batch-size | 每设备批大小 | 2 |
--grad-accum | 梯度累积步数 | 2 |
--lora-r | LoRA 秩 | 16 |
--lora-alpha | LoRA alpha | 16 |
--output-dir | 检查点输出目录 | outputs |
--chat-template | 聊天模板名 | 依模型而定 |
--dry-run | 只打印解析后的配置并退出,不训练 | — |
--verbose/-v | 详细输出 | — |
--remote-host/--remote-python/--remote-workdir/--remote-gpus | SSH 远程训练:在远端机器执行训练 | gpubox |
配置优先级与 dry-run
实现上采用"文件为基线、flag 叠加其上"的优先级:_resolve_config()先加载--config指定的 YAML,再合并 flag 覆写。--dry-run会打印最终解析结果并标注哪些值来自 flag,同时验证远程设置(如配置了remote块)——在租用 GPU 之前先看清将要执行的配置,避免"预览一套、实际训练另一套"的偏差。真正运行时,解析后的配置会物化写入当前目录的config.yaml(若该文件已存在则先备份为config.yaml.bak),再由 legacy 调度器读取执行。
配置模板详解
setup/config.yaml 是微调配置的完整模板,核心字段如下:
- 保存与模型:
ollama_save/huggingface_save/train开关;model_name(默认unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit);hf_model_name与ollama_model用于发布;model_parameters如8b。 - LoRA 参数:
lora_r: 16、lora_alpha: 16、lora_dropout: 0、lora_bias: "none"、lora_target_modules(默认覆盖q_proj/k_proj/v_proj/o_proj/gate_proj/up_proj/down_proj全部线性层)、use_rslora: false、loftq_config: null。 - 数据加载:
dataset为列表,每项可含name(数据集 id 或本地路径)、split_type、processing_func(如format_prompts)、rename(字段重命名)、filter_data/filter_column_value/filter_value(按列过滤)、num_samples(采样数);另有dataset_text_field: "text"、dataset_num_proc: 2、packing: false。 - 训练超参:
per_device_train_batch_size: 2、gradient_accumulation_steps: 2、warmup_steps: 5、num_train_epochs: 1、max_steps: 10、learning_rate: 2.0e-4、optim: "adamw_8bit"、weight_decay: 0.01、lr_scheduler_type: "linear"、seed: 3407、output_dir: "outputs"。 - 量化:
load_in_4bit: true、quantization_method: ["q4_k_m"]。
模板后半部分给出了大量可安全省略的可选配置(注释形式):检查点与续训(save_strategy、save_steps、save_total_limit、resume_from_checkpoint、final_model_dir)、从训练集切分验证集并取最优检查点(val_split_ratio、eval_strategy、load_best_model_at_end、metric_for_best_model)、早停(early_stopping_patience)、多 GPU(torchrun --nproc_per_node=N -m praisonai_train.train.llm.trainer train --config config.yaml启动,ddp_find_unused_parameters)、精度(dtype: "bfloat16"、load_in_8bit、full_finetuning)、高级 LoRA(use_dora、modules_to_save)以及任意原始SFTConfig字段的透传(training_arguments)。
导出训练好的模型
训练完成后可用export子命令发布,无需重跑训练:
# 发布到 Hugging Face praisonai-train export hf --model-dir lora_model --hf me/my-model # 生成本地 GGUF 文件(可配合 serve 使用) praisonai-train export gguf --model-dir lora_model --quant q4_k_m # 本地 GGUF + 推送 Hub praisonai-train export gguf --model-dir lora_model --hf me/my-model # 创建并推送 Ollama 模型 praisonai-train export ollama --model-dir lora_model --ollama me/my-model --quant q4_k_m--mtp-draft/--no-mtp-draft可额外下载 Gemma-4 的 MTP draft 模型以加速推理(对应 train/_mtp.py)。模型名会优先取--base-model、其次取训练后模型config.json的_name_or_path、最后回退到目录名,用于聊天模板选择。
五、数据集工具:generate + validate
合成指令数据集(generate)
从教师 LLM 合成指令数据集,支持配方驱动与 YAML 配置:
# 用配方 + 多样性轴、JSON 模式、去重、可续跑偏移量合成数据 praisonai-train generate --config generate.yaml praisonai-train generate -r tamil -d gpt-4o -n 1000 -o data/tamil.jsonlgenerate.yaml 的字段包括:
| 字段 | 说明 |
|---|---|
recipe | 已注册的配方名(如tamil),或内联配方{system, template, axes} |
deployment | 教师模型 / Azure deployment 名(如gpt-4o) |
azure | true表示 Azure OpenAI;false表示 OpenAI 兼容接口 |
num_examples | 生成条数 |
concurrency | 并发数(如 50) |
start_offset | 起始偏移,可让多个并行 worker 使用不相交偏移 |
output | 输出 JSONL 路径 |
snapshot_every | 每 N 行写一次增量快照 |
dedup_from | 已有 JSONL 文件列表,生成时跳过其中已覆盖的指令 |
stop_file | 触摸该文件即可立即停止(熔断开关) |
质量检查与过滤(validate)
# 质检/过滤(去重、样板话与拒答、脚本纯度、多样性指标) praisonai-train validate data/tamil.jsonl --out data/clean.jsonl脚本纯度默认是泰米尔语(Tamil)。QC 过滤器会丢弃低于目标 Unicode 区块纯度下限的输出,该区块默认是泰米尔语(script_range: [2944, 3071] # U+0B80–U+0BFF,见 validate.yaml)。其他语言必须显式设置script_range(例如拉丁语用[65, 591]),否则非泰米尔语输出会被标记为low_script_purity而丢弃。
validate.yaml 完整字段:
| 字段 | 说明 |
|---|---|
input/output | 输入与过滤后输出路径 |
min_output_chars | 最小输出字符数(默认 20) |
near_dup | 是否开启近似去重 |
near_dup_jaccard | Jaccard 阈值(默认 0.7,等价于 Self-Instruct 的 ROUGE-L 0.7) |
script_range | 目标 Unicode 区块[起始, 结束] |
script_drop | 低于此脚本纯度则丢弃(默认 0.50) |
script_flag | 在 drop 与 flag 之间则标记保留(默认 0.70) |
与generate、dedup一样,validate会原子性地重写--out文件;当零行通过时,保留已有文件不动。要向流程添加语言/领域,只需注册一个Recipe;要添加新的 QC 规则,注册一个RowCheck(实现见 praisonai_train/data/),它们会自动出现在工具中。
六、从真实 Agent 运行学习:verify → export → train → re-verify
除了合成数据,还可以在 Agent自己经过验证的行为上进行微调。给定一份 trials 报告(每个 case 有 K 次带轨迹的打分尝试),from-trials会保留通过的尝试并写出可直接用于训练的 ShareGPT 数据集——把"验证"到"数据生成"的闭环闭合起来:
# 1) 把通过的尝试导出为 ShareGPT 数据集(附带 provenance 边车文件) praisonai-train from-trials trials.json -o data/train.jsonl # 2) 用现有训练器微调,无需任何改动 praisonai-train llm data/train.jsonl # 3) 在微调后的模型上重跑 trials,对比通过率衡量提升Python API 等价写法:
from praisonai_train.data import export_trials summary = export_trials( report, "data/train.jsonl", only_passed=True, # 基于验证器的拒绝采样(默认) frontier_only=True, # 跳过饱和 / 零通过 case(默认) ) print(summary) # written / skipped_failed / skipped_tool_runs / skipped_no_text / ...选择逻辑与边车文件
- 未打分的尝试永远不会成为候选;
only_passed只保留验证器通过的尝试;frontier_only只保留0 < pass_rate < 1的 case(饱和 case 只会重复已掌握行为的近重复样本,零通过 case 则无内容可导出);- 默认排除使用工具的运行(
--all、--include-saturated可放宽这些限制); - 输出旁会生成
{out}.jsonl.meta.json边车文件,把每一行映射到其 case id、尝试索引和分数,且发射顺序是确定性的 → 文件可复现; - 传
--qc可让行通过 QC 过滤器(去重、样板话/拒答、长度、多样性)——泰米尔脚本纯度检查在此被跳过,因为 Agent 轨迹默认是英文的;要为其他语言重新启用脚本检查,给export_trials传qc_cfg并带script_range(及/或显式的script_drop/script_flag),这些键中的任何一个都会以 QC 过滤器自身默认值重新启用检查; - 用
--format alpaca可输出 instruction/input/output 格式。
诚实的筛选:
only_passed本质是拒绝采样——它放大的是 Agent 已经能产生的行为,并会继承判定该运行"通过"的打分器/裁判的任何偏差。它无法教会 Agent 从未展示过的行为;请把它当作对已验证胜利的强化,而不是一个万能预言机。
该功能的实现位于 praisonai_train/data/export_trials.py,并有对应的单元测试 tests/unit/data/test_export_trials.py。
七、训练会话管理:list / show / apply
会话存储
每次 Agent 训练会话以train-{8位hex}的 ID 标识(见 orchestrator.py 中self.session_id = f"train-{uuid.uuid4().hex[:8]}"),数据默认以 JSON 文件形式存放在~/.praison/train/目录(storage.py 中DEFAULT_STORAGE_DIR)。
存储支持三种可插拔后端(--storage-backend参数):
| 后端 | 说明 | 示例 |
|---|---|---|
file | 默认 JSON 目录存储 | --storage-backend file --storage-path /data/train |
sqlite | SQLite 数据库 | --storage-backend sqlite --storage-path /data/train.db |
redis://url | Redis 存储,键前缀train: | --storage-backend redis://localhost:6379 |
TrainingStorage内部复用praisonaiagents.storage.base.BaseJSONStore(线程安全、带文件锁),每个会话一个 JSON 文件,包含 scenarios、iterations 与 report 三部分。SQLite 后端会保持数据库连接,因此TrainingStorage实现了close()与上下文管理器协议,避免 Windows 上的PermissionError与未关闭数据库的资源警告。
命令一览
# 列出最近会话(默认 20 个,-n 调整;-j 输出 JSON) praisonai-train list # 查看会话详情;--iterations 展开详细轮次;--json 输出 JSON praisonai-train show train-abc123 praisonai-train show train-abc123 --iterations praisonai-train show train-abc123 --json # 应用最佳迭代(默认取最高分轮次) praisonai-train apply train-abc123 # 应用指定迭代 praisonai-train apply train-abc123 --iteration 2 # 应用到 YAML 文件定义的 Agent 并立即运行 praisonai-train apply train-abc123 --agent my_agent.yaml --run "Hello, how are you?"show会高亮最佳迭代("Best Iteration: #N (Score: X/10)"),并按分数给每次迭代加星标、预览反馈前 50 字符;--iterations时额外展示前 3 条改进建议。
apply 的工作机制
apply把会话中最高分(或指定)迭代的改进建议整理为TrainingProfile(含agent_name、suggestions、quality_score、summary、iteration_num、session_id),再通过 hooks 注入到 Agent 的运行时提示词中。--run指定提示词时,会创建/加载 Agent、应用训练配置,并立即用该提示词跑一遍给出改进后的回答;未指定--run时则打印后续操作指引(CLI 与 Python API 两种形式)。
八、Agent 训练 CLI 完整参数
praisonai-train agents子命令(train.py)支持以下参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
agent_file(位置参数) | 无 | Agent YAML 文件路径(Python 文件支持在开发中) |
--iterations/-n | 3 | 最大训练迭代数;LLM 模式下得分达 9.5 提前停止 |
--no-early-stop | False | 即使得分达 9.5 也跑完全部迭代 |
--human/-h | False | 使用人工反馈代替 LLM 打分 |
--scenarios/-s | 无 | scenarios JSON 文件路径(list 或{scenarios: [...]}结构) |
--input/-i | 无 | 单条训练输入(与 scenarios 文件二选一) |
--expected/-e | 无 | 该输入的期望输出(可选) |
--output/-o | ~/.praison/train/ | 训练数据输出目录 |
--model/-m | gpt-4o-mini | 打分的 LLM 裁判模型 |
--verbose/--quiet/-v/-q | True | 详细进度输出 |
--dry-run | False | 只打印将执行的内容不实际运行 |
--storage-backend | 无 | 存储后端:file、sqlite、redis://url |
--storage-path | 无 | 存储后端路径(file 目录或 sqlite db 路径) |
常用示例:
# 单条输入 praisonai-train agents --input "What is Python?" # 带期望输出 praisonai-train agents --input "What is 2+2?" --expected "4" # 用 scenarios 文件训练多个场景 praisonai-train agents --scenarios scenarios.json # 人工反馈模式 praisonai-train agents --input "Explain AI" --human # 更多迭代 praisonai-train agents --input "Hello" --iterations 5 # 从 Agent YAML 文件 + scenarios 文件 praisonai-train agents my_agent.yaml --scenarios scenarios.json九、在 PraisonAI 栈中的位置
praisonaiagents (核心 SDK) ├── praisonai-code (终端 CLI) ├── praisonai-bot (bots & gateway) └── praisonai-train (本包) └── praisonai (wrapper: 一键安装全部)- 仅依赖
praisonaiagents——无循环依赖,可独立安装; - 安装完整栈后,同样的命令可通过
praisonai train ...使用; - 旧导入路径(
praisonai.train.agents、python -m praisonai.train.llm.trainer)通过 wrapper shim 保持可用(对应 praisonai_train/_wrapper_bridge.py 与 _code_bridge.py)。
从依赖方向看,包内还有专门的导入方向门禁检查(train 包不得反向导入 wrapper),相关脚本见 scripts/check_c10_train_imports.sh,边界细节记录在 src/praisonai/tests/PRAISONAI_TRAIN_MANIFEST.md。
十、开发与测试
在 monorepo 根目录下:
# 运行 agent 训练相关单元测试 cd src/praisonai-train PYTHONPATH="../praisonai-agents:." python -m pytest tests/unit/train -q # 导入方向门禁检查(train 不得导入 wrapper) bash ../../scripts/check_c10_train_imports.sh单元测试覆盖了训练主链路与周边设施,例如 tests/unit/train/test_orchestrator.py(训练循环与提前停止)、test_grader.py(LLM 裁判)、test_storage.py(会话存储),以及 tests/unit/data/ 下的数据集工具测试(test_dedup.py、test_export_trials.py、test_generate_progress.py等)。
总结
PraisonAI Train 提供了一条"从轻到重"的完整训练路径:
- 轻量 Agent 训练:无需 GPU,
agents命令借助 LLM-as-Judge 或人工反馈,通过迭代循环让单个 Agent 的回答质量在数分钟内提升; - 数据集工程:
generate合成指令数据、validate质检过滤、from-trials从 Agent 自身已验证行为导出训练集; - 重量 LLM 微调:
llm命令基于 Unsloth 完成 LoRA 微调,全部调参项集中在config.yaml,支持export发布到 Ollama / GGUF / HuggingFace,也支持远程 GPU 训练; - 闭环管理:
list/show/apply让"训练 → 评估 → 应用 → 再验证"成为可复现、可审计的工作流。
无论是想快速改进 Agent 行为,还是准备在领域数据集上微调自己的开源模型,PraisonAI Train 都提供了开箱即用的完整工具链。
【免费下载链接】PraisonAIPraisonAI 🦞 — Hire a 24/7 AI Workforce. Stop writing boilerplate and start shipping autonomous self-improving agents that research, plan, code, and execute tasks. Deployed in 5 lines of code with built-in memory, RAG, and support for 100+ LLMs.项目地址: https://gitcode.com/GitHub_Trending/pr/PraisonAI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考