メインコンテンツへ移動
AIチュートリアル

PyTorchでブラジル立法言語モデルを構築して実行する

LLM Legislativo Brasileiroがブラジルの公式立法文書を収集・整理し、因果Transformerをゼロから学習させ、データパイプラインを検証し、公開済みのモデルとトークナイザーで推論を実行する方法を学びます。

PyTorchでブラジル立法言語モデルを構築して実行する

LLM Legislativo Brasileiroとは?

LLM Legislativo Brasileiroは、ブラジルの立法文書に特化した因果言語モデルを構築するための、エンドツーエンドの研究・エンジニアリングプロジェクトです。下院と連邦上院の公式資料を監査可能なオープンデータセットとして整理し、その後、PyTorchでTransformerデコーダーを完全にゼロから学習します。

このプロジェクトでは、事前学習済みの重み、クローズドAPI、Hugging Face Trainerなどの高水準な学習抽象化を使用していません。設計では、オープンサイエンス、再現性、SHA-256整合性チェック、そして学習・検証・テストデータ間の厳格な因果分離を重視しています。

このモデルは研究・教育用の成果物です。因果言語モデルは法律、改正、要約、法規定を幻覚する可能性があるため、事実に基づく法律アドバイザーや規範的な判断のためのツールとして扱うべきではありません。

主な機能

  • 下院と上院のコレクションを含む、360 GiBを超える公式生データ。
  • 法案、憲法改正案、報告書、意見書、代替案、最終文書、会議記録など、930,000件を超える文書および実質的な版。
  • Hugging Face Hubで公開されている5つのデータセットリリース。生アーカイブ、抽出テキスト、キュレーション済みApache Parquetデータを収録。
  • 学習用分割データだけを使用して学習した、8,192トークンのバイトレベルBPEトークナイザー。
  • PyTorchで実装した明示的な因果Transformerデコーダー。6層、6つのアテンションヘッド、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-legislativo

2. 仮想環境を作成する

仮想環境を使用すると、プロジェクトの依存関係をシステムの他の部分から分離できます。

python3 -m venv .venv
source .venv/bin/activate

3. パッケージをインストールする

ローカルのソース変更をすぐに反映できるよう、リポジトリを編集可能モードでインストールします。

pip install -e .

このリポジトリには、src/legislm/配下のPythonパッケージ、基本環境およびCPU環境用のロックファイル、Rの再現性メタデータ、宣言的な設定、ノートブック、コマンドラインスクリプト、テストスイートが含まれています。

インストールを検証する

モデル推論や大規模な学習を試す前に、CPU上で自動テストをローカル実行します。

pytest tests/ -q

READMEには、モデルの動作、永続化、トークン化、評価を対象とする135件を超える単体テストおよびコントラクトテストが記載されています。テストが正常に完了すれば、数百ギガバイト規模のコーパス全体や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形式で統合・整理されたリリース。ファミリー別にtrain、validation、testの各分割が構成されています。
  • camara-corpus-raw:ブラジル下院の生TARアーカイブとSHA-256マニフェスト。
  • camara-corpus-text:品質検証済みの、下院テキストの構造化抽出データ。
  • senado-corpus-raw:ブラジル連邦上院のインベントリと一次データ。
  • senado-corpus-text:Parquetの列指向形式で整理された、上院の文書とページ。

これらのリリースにより、ソースアーカイブや抽出テキストから最終的な学習行列まで、パイプラインのさまざまな段階でプロジェクトを確認できます。

学習を再現または拡張する

学習の実装はsrc/legislm/training/にあり、トークン化とシャード生成はsrc/legislm/tokenization/にあります。設定はconfigs/に保存され、Google Colabのワークフローはnotebooks/とsrc/legislm/colab/に用意されています。

公開された学習実行では、NVIDIA A100-SXM4-40GB環境を使用し、約20時間で173,209回の最適化更新を完了しました。AdamW、2,000ステップの線形ウォームアップを伴うコサインスケジューラー、混合FP16精度、Google Drive経由のチェックポイント保存を使用して、約12.5億トークンを処理しました。

再現性のある実験では、トークナイザーを学習分割に限定し、ファミリーに基づく決定論的な分割手順を維持し、リポジトリのSHA-256マニフェストとチェックポイントメタデータを保持してください。これらは、データリークを防ぎ、結果を公平に比較するために不可欠です。

結果を正しく評価する

このプロジェクトでは、71,069件の文書と約4億8,200万バイトを含む独立したテスト分割に対して、標準化されたbyte_nll_v1評価プロトコルを定義しています。報告された結果は、有効なターゲットあたりの平均損失が2.1065、トークンパープレキシティが8.2197、単語パープレキシティが65.6509です。

正規化されたバイトレベルの結果は、1バイトあたり0.7297 nats、つまり1バイトあたり1.0528 bitsです。下院コレクションでは1バイトあたり0.7049 nats、上院コレクションでは0.8817 natsと報告されています。今後の実験を比較する際は、トークンパープレキシティだけに頼らず、同じ分割ロジックと評価定義を使用してください。

リポジトリ構成

主なディレクトリを確認すると、システムの変更や調査時に参照すべき場所が分かります。

  • R/:公式データインベントリ、ダウンロード、抽出連携、キュレーション。
  • src/legislm/:トークナイザー、モデル、学習、Colab保存、評価コード。
  • schemas/:ArrowおよびJSON Schemaのデータ契約。
  • configs/:データ、キュレーション、学習、Colabの設定。
  • notebooks/:パイロットおよび完全版のGoogle Colabワークフロー。
  • scripts/:実行可能なコマンドラインエントリーポイント。
  • tests/:ユニットテストと契約テスト。
  • docs/:規範的ドキュメント、契約、レポート。

実践的な応用ヒント

  • まずテストから始める: CPU検証は、大規模なデータセットをダウンロードしたりGPUリソースを要求したりする前に、インストールを確認できる低コストな方法です。
  • ファミリーの境界を維持する: プロジェクトと比較可能な結果が必要な場合は、文書単位で無作為に分割しないでください。1つの立法プロセスに由来するバージョン同士は、密接に関連している可能性があるためです。
  • 分割後にトークナイザーを学習する: 検証データやテストデータで語彙統計を適合させると、プロジェクトのデータリーケージ対策が損なわれます。
  • 有効なターゲットを追跡する: パディングされたシーケンスを使用する場合は、マイクロバッチ全体で有効なターゲットの総数に基づいて交差エントロピーを集計してください。
  • 成果物をGitの外部に置く: このリポジトリでは、未加工バイナリ、モデルの重み、キャッシュではなく、メタデータとスキーマを意図的にバージョン管理しています。
  • 調査には公開リリースを使う: Hubで公開されている未加工、抽出済み、キュレーション済みのデータセットを使えば、収集プロセス全体を再現せずに、パイプラインの各段階を個別に調査できます。
  • 生成結果は慎重に解釈する: 生成された立法文書の文体はもっともらしく見えても、架空の参照や規定が含まれている可能性があります。

結論

LLM Legislativo Brasileiroは、公式の立法アーカイブから専門化された因果言語モデルに至るまでの、完全で監査可能な手順を示しています。パッケージをインストールしてテストを実行した後、公開されたトークナイザーとPyTorchモデルを読み込み、テキストを生成し、公開データセットを調査し、データリーケージに耐性のあるリポジトリのキュレーションおよび学習手法を研究できます。MITライセンスのコードと公開された成果物は、ポルトガル語の立法言語モデリング研究に役立つ基盤を提供します。