ART框架代码风格指南:保持项目一致性的编码规范
在开源项目协作中,统一的代码风格是提升开发效率、降低维护成本的关键因素。本文将详细介绍ART(Agent Reinforcement Trainer)框架的代码风格规范,帮助开发者编写符合项目标准的高质量代码。
代码格式化与 linting 工具
ART 项目采用 ruff 作为代码格式化和 linting 的主要工具。ruff 是一个用 Rust 编写的超快 Python 代码检查工具,集成了格式化、静态分析等多种功能。
工具使用方法
项目提供了统一的代码质量检查脚本,开发者在提交代码前必须运行:
# 运行所有代码质量检查(格式化、linting 和依赖同步)
./scripts/run_checks.sh
# 自动修复可修复的问题
./scripts/run_checks.sh --fix
该脚本会执行以下检查:
- 使用 ruff 检查代码格式化
- 使用 ruff 进行 linting 分析
- 验证
uv.lock与pyproject.toml的同步性
这些检查会在 CI 流程中自动运行,任何未通过检查的 PR 将无法合并。
配置文件
ruff 的具体规则配置可以在项目根目录的 pyproject.toml 文件中找到。如需添加自定义规则或修改现有规则,请提交 PR 并说明修改理由。
Python 编码规范
文件结构与命名
ART 项目遵循以下文件结构约定:
- 源代码放在
src/art/目录下 - 示例代码放在
examples/目录下 - 开发相关工具放在
dev/目录下 - 测试代码放在
tests/目录下
文件和目录命名规则:
- Python 文件:使用小写字母和下划线,如
trajectory_logging.py - 目录:使用小写字母和下划线,如
tokenize_trajectory - 类名:使用 PascalCase,如
TrajectoryGroup - 函数和变量:使用 snake_case,如
tokenize_trajectory
代码组织
函数定义规范
ART 框架中的函数定义遵循以下模式:
def tokenize_trajectory(
tokenizer: "PreTrainedTokenizerBase",
history: History,
advantage: float,
allow_training_without_logprobs: bool,
) -> TokenizedResult | None:
# 函数实现
pass
关键点:
- 参数每行一个,便于添加注释
- 明确指定参数和返回值类型
- 使用类型别名提高可读性,如
TokenizedResult
类定义规范
类定义应遵循以下格式:
class TrajectoryGroup:
"""
轨迹组,包含多个轨迹对象和异常信息
Attributes:
trajectories: 轨迹对象列表
exceptions: 异常列表
"""
def __init__(
self,
trajectories: Iterable[Trajectory | BaseException],
*,
exceptions: list[BaseException] = [],
) -> None:
# 初始化代码
pass
def __len__(self) -> int:
# 实现代码
pass
关键点:
- 类定义前添加文档字符串,说明类的用途
- 构造函数参数清晰,使用关键字参数(* 之后的参数)
- 实现必要的魔术方法,如
__len__、__iter__
错误处理
ART 框架定义了多个自定义异常类,位于 src/art/errors.py 文件中。在开发中应优先使用这些异常类,而不是通用的 Exception。
# 正确示例
raise ARTError("模型注册失败", status_code=400)
# 不推荐
raise Exception("模型注册失败")
异步编程规范
ART 框架大量使用异步编程提高性能,特别是在处理网络请求和并发任务时。异步代码应遵循以下规范:
异步函数定义
async def train_model(
self,
model: "TrainableModel",
trajectory_groups: list[TrajectoryGroup],
config: TrainConfig,
dev_config: dev.TrainConfig,
verbose: bool = False,
) -> AsyncIterator[dict[str, float]]:
# 异步实现代码
pass
异步任务管理
使用 asyncio 管理异步任务时,应使用项目提供的工具函数,如 src/art/utils/limit_concurrency.py 中的 limit_concurrency 装饰器控制并发数量:
@limit_concurrency(4) # 限制最大并发数为4
async def process_trajectory(trajectory: Trajectory):
# 处理轨迹数据
pass
文档规范
良好的文档是代码可维护性的关键。ART 项目遵循以下文档规范:
文档字符串格式
使用 Google 风格的文档字符串:
def tokenize_trajectory(
tokenizer: "PreTrainedTokenizerBase",
history: History,
advantage: float,
allow_training_without_logprobs: bool,
) -> TokenizedResult | None:
"""
将轨迹数据转换为模型训练用的 token 表示
Args:
tokenizer: 用于 tokenize 的预训练 tokenizer
history: 轨迹历史数据
advantage: 优势值
allow_training_without_logprobs: 是否允许在没有 logprobs 的情况下训练
Returns:
包含 token 化结果的对象,或 None(如果处理失败)
"""
# 函数实现
pass
类型注解
所有函数和方法都必须添加类型注解,包括参数类型和返回值类型。这有助于静态类型检查工具发现潜在问题,并提高代码可读性。
示例和教程
复杂功能应提供示例代码,放在 examples/ 目录下。如 examples/2048/ 目录提供了 2048 游戏 AI 训练的完整示例。
测试规范
为确保代码质量,ART 项目要求所有新功能都必须包含相应的测试。
测试文件位置
测试文件应放在 tests/ 目录下,与源代码保持相同的目录结构。例如,src/art/trajectories.py 的测试应放在 tests/trajectories_test.py。
测试类型
- 单元测试:测试独立功能单元,使用
pytest框架 - 集成测试:测试模块间交互
- 基准测试:测试性能关键路径,如 examples/2048/display_benchmarks.ipynb
测试覆盖率
项目使用 pytest-cov 工具监控测试覆盖率,目标是保持 80% 以上的代码覆盖率。
代码审查规范
为维护代码质量,所有 PR 都必须经过代码审查。审查重点包括:
- 代码是否符合本文档中的风格规范
- 是否添加了必要的测试
- 是否更新了相关文档
- 代码逻辑是否正确
- 是否存在性能问题
PR 提交信息格式
PR 标题应简洁明了,描述主要变更。PR 描述应包含:
- 变更目的
- 实现方法
- 测试方法
- 相关文档
项目特有规范
轨迹数据处理
ART 框架的核心是轨迹数据(Trajectory)处理,相关代码应遵循:
- 使用 src/art/trajectories.py 中定义的
Trajectory和TrajectoryGroup类管理轨迹数据 - 使用 src/art/auto_trajectory.py 中的工具捕获自动轨迹
- 轨迹数据序列化应使用 src/art/utils/trajectory_logging.py 中的工具函数
模型训练流程
模型训练相关代码应遵循:
- 使用 src/art/model.py 中定义的
Model和TrainableModel类 - 训练循环实现在 src/art/dev/train.py
- 训练配置使用 src/art/types.py 中定义的数据结构
可视化工具
训练过程中的数据可视化应使用项目提供的工具函数,如 src/art/preprocessing/pack.py 中的 plot_packed_tensors 函数:
def plot_packed_tensors(
packed_tensors: PackedTensors, output_dir: str | None = None
) -> None:
# 可视化 packed tensors
pass
生成的可视化结果类似下图(项目中的实际可视化示例):
总结
遵循统一的代码风格规范是 ART 项目高效协作的基础。本文档涵盖了代码格式化、命名约定、文档规范、测试要求等方面的内容。随着项目发展,本规范也会不断更新,建议定期回顾最新版本。
如需了解更多项目相关信息,请参考:
- 官方文档:docs/
- 贡献指南:CONTRIBUTING.md
- 示例代码:examples/
通过共同遵守这些规范,我们可以构建一个更加健壮、可维护的 LLM 智能体训练框架。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




