Shuu12121/CodeDiff-Owl-ModernBERT-base

モデル概要

CodeDiff-Owl-ModernBERT-base は、GitHub の コード差分(diff)とコミットメッセージ を対象にマスク化言語モデル (MLM) で学習した、diff・コミット履歴特化の ModernBERT 系モデル です。

  • ベースモデル: ModernBERT
  • 事前学習タスク: マスク化言語モデル (Masked Language Modeling; MLM)
  • 入力フォーマット: "[CLS]" + commit_message + "[SEP]" + diff
  • 対象言語: diff 内のコードとして Python / Java / JavaScript / Rust を含むリポジトリ

コミットメッセージと diff を同時にエンコードすることで、「どのような変更(diff)に対して、どのような説明(コミットメッセージ)が付くか」 という対応関係を捉えることを目的としています。 今後、学習を継続した「完全版」を公開予定です(本モデルは 1.8 epoch 時点の途中版です)。


想定される用途

主なユースケース

  • コード変更差分に対する意味的検索

    • 例: 「バグ修正」「ログ出力の追加」などの自然言語・疑似クエリと diff の類似度計算
  • コミットメッセージと diff の表現獲得

    • 例: コミットメッセージ・diff の埋め込みベクトルを用いたクラスタリングや可視化
  • diff+コミットメッセージを入力とする下流タスクの初期化

    • コミットメッセージ生成・補完
    • コードレビューメモの生成 など

非推奨 / 注意が必要な用途

  • 汎用自然言語モデルとしての利用(一般文書に対する性能は未検証)
  • セキュリティやライセンス上の判断の自動化(著作権・ライセンス判定など)
  • 高リスク領域での自動意思決定(法的判断、安全性が重要な場面など)

学習データ

データソース

  • GitHub 上の公開リポジトリ
  • GitHub の「言語判定」により Python / Java / JavaScript / Rust 含有と判断されたリポジトリを対象
  • 各リポジトリから、コミットごとの diff とコミットメッセージ を収集
  • 各リポジトリあたり最大 1万件 のコミットを上限としてサンプリング
  • 収集した diff 全体で、おおよそ 70〜100GB 程度(テキストベース)の規模

前処理・フィルタリング

  • diff が 32KB を超える場合は途中で打ち切り

  • テキストとして読み取り可能な diff のみを利用


学習設定

  • 初期化: ModernBERTアーキテクチャをもとにランダムな初期値から学習

  • タスク: マスク化言語モデル (MLM)

  • 入力フォーマット: "[CLS]" + commit_message + "[SEP]" + diff ※実装で特別な変更は加えていません

  • バッチサイズ: 64

  • 学習率 (learning rate): 1e-6

  • エポック数: 1.8 epoch(時間制約により途中で打ち切り)

  • 学習時間: 約 4日間

  • その他:

    • モデル構造自体には特別な改変なし
    • 純粋に MLM のみで学習(コントラスト学習などは未実施)

今後、同様の設定でもう少し長く学習した「完全版」を公開予定です。


入力形式と使い方

入力形式

  • Segment A (sentence A): コミットメッセージ(自然言語)
  • Segment B (sentence B): 対応する diff テキスト

トークナイザには、以下のように「2つの入力」として与えてください。

from transformers import AutoTokenizer, AutoModel

model_name = "Shuu12121/CodeDiff-Owl-ModernBERT-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

commit_message = "Fix bug in user login flow"
diff_text = """
diff --git a/app/auth.py b/app/auth.py
index 1234567..89abcde 100644
--- a/app/auth.py
+++ b/app/auth.py
@@ -10,7 +10,9 @@ def login(user, password):
-    if user.password == password:
-        return True
-    return False
+    if not user:
+        return False
+    return user.check_password(password)
"""

inputs = tokenizer(
    commit_message,
    diff_text,
    return_tensors="pt",
    truncation=True,
)

outputs = model(**inputs)
last_hidden_state = outputs.last_hidden_state     # [batch, seq_len, hidden]
cls_embedding = last_hidden_state[:, 0]           # [CLS] トークンの埋め込み
  • cls_embeddingコミット+diff の表現ベクトル として検索・クラスタリング等に利用することを想定しています。
  • diff が非常に長い場合はモデル側でトークン長に応じて自動的に切り詰められるため、必要に応じて自前で要約・抽出を行ってください。

評価

  • 本モデルは現時点では 事前学習段階のスナップショット (1.8 epoch) です。
  • 具体的な使用用途については今後検討予定です。

Downloads last month
4
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support