| | --- |
| | license: apache-2.0 |
| | language: |
| | - en |
| | pipeline_tag: fill-mask |
| | tags: |
| | - code |
| | --- |
| | # 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つの入力」として与えてください。 |
| |
|
| | ```python |
| | 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)** です。 |
| | * 具体的な使用用途については今後検討予定です。 |
| |
|
| | --- |
| |
|