
什么是巴西立法 LLM?
巴西立法 LLM 是一个端到端的研究与工程项目,旨在构建专门处理巴西立法文件的因果语言模型。该项目将众议院和联邦参议院的官方材料整理为可审计的开放数据集,然后完全从头开始使用 PyTorch 训练 Transformer 解码器。
该项目不使用预训练权重、封闭式 API,也不使用 Hugging Face Trainer 等高级训练抽象。其设计强调开放科学、可复现性、SHA-256 完整性检查,以及训练、验证和测试数据之间严格的因果隔离。
该模型是研究和教育成果,不应被视为事实性法律顾问或规范性决策工具,因为因果语言模型可能会虚构法律、修正案、摘要和法律条款。
主要特性
- 超过 360 GiB 的官方原始数据,包括众议院和参议院数据集。
- 超过 930,000 份文件和实质性版本,例如法案、宪法修正案、报告、意见、替代文本、最终文本和会议记录。
- 在 Hugging Face Hub 上发布的五个公共数据集版本,涵盖原始存档、提取文本和整理后的 Apache Parquet 数据。
- 仅使用训练集训练的 8,192 词元字节级 BPE 分词器。
- 使用 PyTorch 实现的显式因果 Transformer 解码器,包含六层、六个注意力头、384 维隐藏表示,以及 512 词元上下文窗口。
- 词元嵌入层与输出投影层之间共享权重。
- 基于有效目标总数进行精确的梯度累积,避免不同长度序列之间因填充而产生的权重误差。
- 基于立法家族标识符进行确定性的 80/10/10 数据划分,防止相关文件跨越训练集和测试集边界。
- 以
safetensors格式提供公开模型权重,同时提供分词器、配置、指标和独立推理代码。
了解数据和训练流程
该仓库将项目划分为多个专门阶段。官方众议院和参议院目录通过可靠且幂等的流程进行收集和下载。原始文件保留在 Git 之外,而轻量级元数据、模式和配置文件则纳入版本控制。
在 macOS 上,原生 Swift 提取适配器使用 PDFKit 处理包含嵌入文本的文档。扫描页面或文本密度不足的页面会转交给 Apple Vision OCR。随后,使用 R 通过精确的 SHA-256 去重、段落包含检测,以及基于 igraph 构建的全局立法家族图,对提取出的文本进行整理。
与同一立法流程相关的每项提案、修正案、报告、意见和替代文本都会获得相同的 family_id。该标识符的确定性哈希值会将整个家族分配到训练集、验证集或测试集,从而防止相关版本泄漏到不同的评估划分中。
完成划分后,Python 分词阶段仅使用训练数据训练包含 8,192 个词元的字节级 BPE 词汇表。它支持葡萄牙语重音符号、§、º、ª 和 Art. 等立法符号,以及数字和其他特殊字符。分词后的数据会写入二进制分片,并为 512 词元窗口建立索引。
设置仓库
1. 克隆项目
该仓库需要 Python 3.9 或更高版本。克隆仓库并进入项目目录:
git clone https://github.com/BaruqueRodrigues/llm-legislativo.git
cd llm-legislativo2. 创建虚拟环境
使用虚拟环境可以将项目依赖与系统的其他部分隔离:
python3 -m venv .venv
source .venv/bin/activate3. 安装软件包
以可编辑模式安装仓库,使本地源代码的修改能够立即生效:
pip install -e .该仓库包含 src/legislm/ 下的 Python 软件包、基础环境和 CPU 环境的锁定文件、R 可复现性元数据、声明式配置、笔记本、命令行脚本和测试套件。
验证安装
在尝试模型推理或大规模训练之前,请在本地 CPU 上运行自动化测试:
pytest tests/ -qREADME 介绍了超过 135 项单元测试和契约测试,涵盖模型行为、持久化、分词和评估。测试成功运行后,即可确认核心接口正常工作,而无需完整的数百 GB 语料库或 A100 GPU。
加载已发布的模型
训练好的模型可从 BaruqRodrigues/llm-legislativo 仓库获取。下面的示例会下载权重和分词器,重建模型架构,并加载 safetensors 状态字典。
import torch
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
from legislm.model.gpt import GPTModel
from legislm.model.config import ModelConfig
from tokenizers import Tokenizer
# 下载模型文件
weights_path = hf_hub_download(
repo_id="BaruqRodrigues/llm-legislativo",
filename="model.safetensors"
)
tokenizer_path = hf_hub_download(
repo_id="BaruqRodrigues/llm-legislativo",
filename="tokenizer.json"
)
# 重新创建分词器和模型配置
tokenizer = Tokenizer.from_file(tokenizer_path)
config = ModelConfig(
vocab_size=8192,
context_length=512,
d_model=384,
n_layers=6,
n_heads=6,
tie_embeddings=True
)
model = GPTModel(config)
# 加载训练好的参数
state_dict = load_file(weights_path)
model.load_state_dict(state_dict)
model.eval()生成立法文本
加载模型后,编码一段葡萄牙语立法提示词,并调用模型的生成方法。示例使用一段简短的法案开头,并请求最多生成 64 个新词元。
prompt = "PROJETO DE LEI Nº , DE 2026\n\nDispõe sobre"
input_ids = torch.tensor(
[tokenizer.encode(prompt).ids],
dtype=torch.long
)
with torch.no_grad():
output_ids = model.generate(
input_ids,
max_new_tokens=64,
temperature=0.7,
top_k=40,
eos_token_id=2
)
print(tokenizer.decode(output_ids[0].tolist()))模型使用最大 512 个词元的上下文长度。在此示例中,temperature=0.7 控制采样的变化程度,top_k=40 将采样限制在概率最高的 40 个候选项内。进行实验时可以调整这些值,但请记住,生成文本是统计输出,并非经过验证的法律内容。
探索公开数据集
该项目在 Hugging Face Hub 上发布了语料库的多个阶段版本:
- corpus-legislativo-pretraining:以 Parquet 格式发布的统一精选版本,包含按数据集系列组织的训练、验证和测试划分。
- camara-corpus-raw:众议院原始 TAR 存档和 SHA-256 清单。
- camara-corpus-text:经过质量验证的众议院结构化文本提取结果。
- senado-corpus-raw:联邦参议院数据目录和原始数据。
- senado-corpus-text:以列式 Parquet 格式提供的精选参议院文档和页面。
这些版本使人们能够检查流水线不同阶段的项目,从源存档和提取文本,到最终的训练矩阵。
复现或扩展训练
训练实现位于 src/legislm/training/,分词和分片生成位于 src/legislm/tokenization/。配置存储在 configs/ 中,notebooks/ 和 src/legislm/colab/ 提供了 Google Colab 工作流。
已发布的训练运行使用 NVIDIA A100-SXM4-40GB 环境,在大约 20 小时内完成了 173,209 次优化更新。该运行使用 AdamW、带 2,000 步线性预热的余弦调度器、混合 FP16 精度以及通过 Google Drive 持久化检查点,处理了约 12.5 亿个词元。
为了进行可复现实验,请将分词器限制在训练划分内,保留基于数据集系列的确定性划分流程,并保留仓库中的 SHA-256 清单和检查点元数据。这些细节对于避免数据泄漏以及公平比较结果至关重要。
正确评估结果
该项目在一个独立的测试划分上定义了标准化的 byte_nll_v1 评估协议,该划分包含 71,069 份文档和约 4.82 亿字节。报告结果包括每个有效目标平均损失 2.1065、词元困惑度 8.2197,以及词困惑度 65.6509。
归一化的字节级结果为每字节 0.7297 纳特,或每字节 1.0528 比特。报告值为众议院数据集每字节 0.7049 纳特,参议院数据集每字节 0.8817 纳特。在比较未来实验时,请使用相同的划分逻辑和评估定义,而不要仅依赖词元困惑度。
仓库布局
主要目录说明了修改或研究系统时应查看的位置:
R/:官方数据目录、下载、提取集成和整理。src/legislm/:分词器、模型、训练、Colab 持久化和评估代码。schemas/:Arrow 和 JSON Schema 数据契约。configs/:数据、整理、训练和 Colab 配置。notebooks/:试运行和完整的 Google Colab 工作流。scripts/:可执行的命令行入口。tests/:单元测试和契约测试。docs/:规范性文档、契约和报告。
高级实用技巧
- 从测试开始:CPU 验证是一种低成本方式,可在下载大型数据集或申请 GPU 资源前确认安装是否正确。
- 保留家族边界:如果希望结果与项目保持可比性,切勿创建随机的文档级划分,因为同一立法流程中的不同版本可能存在密切关联。
- 划分后训练分词器:在验证集或测试集上拟合词汇统计信息会破坏项目的泄漏控制。
- 跟踪有效目标:使用填充序列时,应按微批次中所有有效目标的总数累计交叉熵。
- 将构建产物保存在 Git 之外:该仓库有意对元数据和模式进行版本控制,而不是对原始二进制文件、模型权重和缓存进行版本控制。
- 使用公开发布版本进行检查:Hub 上的原始、提取和整理后数据集可以帮助你调查各个流水线阶段,而无需重新创建完整的数据收集流程。
- 谨慎解读生成结果:生成的立法语言可能看似合理,却包含虚构的引用或条款。
结论
LLM Legislativo Brasileiro 展示了一条从官方立法档案到专用因果语言模型的完整、可审计路径。安装软件包并运行测试后,你可以加载已发布的分词器和 PyTorch 模型、生成文本、检查公开数据集,并研究仓库所采用的抗数据泄漏整理与训练方法。其采用 MIT 许可证的代码和公开发布的构建产物,为葡萄牙语立法语言建模研究提供了有用的基础。
