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