Create README.md
Browse files
README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
language:
|
| 4 |
+
- en
|
| 5 |
+
pipeline_tag: fill-mask
|
| 6 |
+
tags:
|
| 7 |
+
- code
|
| 8 |
+
---
|
| 9 |
+
# Shuu12121/CodeDiff-Owl-ModernBERT-base
|
| 10 |
+
|
| 11 |
+
## モデル概要
|
| 12 |
+
|
| 13 |
+
**CodeDiff-Owl-ModernBERT-base** は、GitHub の **コード差分(diff)とコミットメッセージ** を対象にマスク化言語モデル (MLM) で学習した、**diff・コミット履歴特化の ModernBERT 系モデル** です。
|
| 14 |
+
|
| 15 |
+
* ベースモデル: `ModernBERT`
|
| 16 |
+
* 事前学習タスク: マスク化言語モデル (Masked Language Modeling; MLM)
|
| 17 |
+
* 入力フォーマット:
|
| 18 |
+
`"[CLS]" + commit_message + "[SEP]" + diff`
|
| 19 |
+
* 対象言語:
|
| 20 |
+
diff 内のコードとして **Python / Java / JavaScript / Rust** を含むリポジトリ
|
| 21 |
+
|
| 22 |
+
コミットメッセージと diff を同時にエンコードすることで、**「どのような変更(diff)に対して、どのような説明(コミットメッセージ)が付くか」** という対応関係を捉えることを目的としています。
|
| 23 |
+
今後、学習を継続した「完全版」を公開予定です(本モデルは 1.8 epoch 時点の途中版です)。
|
| 24 |
+
|
| 25 |
+
---
|
| 26 |
+
|
| 27 |
+
## 想定される用途
|
| 28 |
+
|
| 29 |
+
### 主なユースケース
|
| 30 |
+
|
| 31 |
+
* コード変更差分に対する意味的検索
|
| 32 |
+
|
| 33 |
+
* 例: 「バグ修正」「ログ出力の追加」などの自然言語・疑似クエリと diff の類似度計算
|
| 34 |
+
* コミットメッセージと diff の表現獲得
|
| 35 |
+
|
| 36 |
+
* 例: コミットメッセージ・diff の埋め込みベクトルを用いたクラスタリングや可視化
|
| 37 |
+
* diff+コミットメッセージを入力とする下流タスクの初期化
|
| 38 |
+
|
| 39 |
+
* コミットメッセージ生成・補完
|
| 40 |
+
* コードレビューメモの生成 など
|
| 41 |
+
|
| 42 |
+
### 非推奨 / 注意が必要な用途
|
| 43 |
+
|
| 44 |
+
* 汎用自然言語モデルとしての利用(一般文書に対する性能は未検証)
|
| 45 |
+
* セキュリティやライセンス上の判断の自動化(著作権・ライセンス判定など)
|
| 46 |
+
* 高リスク領域での自動意思決定(法的判断、安全性が重要な場面など)
|
| 47 |
+
|
| 48 |
+
---
|
| 49 |
+
|
| 50 |
+
## 学習データ
|
| 51 |
+
|
| 52 |
+
### データソース
|
| 53 |
+
|
| 54 |
+
* GitHub 上の公開リポジトリ
|
| 55 |
+
* GitHub の「言語判定」により **Python / Java / JavaScript / Rust** 含有と判断されたリポジトリを対象
|
| 56 |
+
* 各リポジトリから、コミットごとの **diff とコミットメッセージ** を収集
|
| 57 |
+
* 各リポジトリあたり最大 **1万件** のコミットを上限としてサンプリング
|
| 58 |
+
* 収集した diff 全体で、おおよそ **70〜100GB 程度**(テキストベース)の規模
|
| 59 |
+
|
| 60 |
+
### 前処理・フィルタリング
|
| 61 |
+
|
| 62 |
+
* diff が **32KB を超える場合は途中で打ち切り**
|
| 63 |
+
|
| 64 |
+
* テキストとして読み取り可能な diff のみを利用
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
## 学習設定
|
| 69 |
+
|
| 70 |
+
* 初期化: ModernBERTアーキテクチャをもとにランダムな初期値から学習
|
| 71 |
+
* タスク: マスク化言語モデル (MLM)
|
| 72 |
+
* 入力フォーマット:
|
| 73 |
+
`"[CLS]" + commit_message + "[SEP]" + diff`
|
| 74 |
+
※実装で特別な変更は加えていません
|
| 75 |
+
* バッチサイズ: **64**
|
| 76 |
+
* 学習率 (learning rate): **1e-6**
|
| 77 |
+
* エポック数: **1.8 epoch**(時間制約により途中で打ち切り)
|
| 78 |
+
* 学習時間: 約 **4日間**
|
| 79 |
+
* その他:
|
| 80 |
+
|
| 81 |
+
* モデル構造自体には特別な改変なし
|
| 82 |
+
* 純粋に MLM のみで学習(コントラスト学習などは未実施)
|
| 83 |
+
|
| 84 |
+
今後、同様の設定でもう少し長く学習した「完全版」を公開予定です。
|
| 85 |
+
|
| 86 |
+
---
|
| 87 |
+
|
| 88 |
+
## 入力形式と使い方
|
| 89 |
+
|
| 90 |
+
### 入力形式
|
| 91 |
+
|
| 92 |
+
* **Segment A (sentence A)**: コミットメッセージ(自然言語)
|
| 93 |
+
* **Segment B (sentence B)**: 対応する diff テキスト
|
| 94 |
+
|
| 95 |
+
トークナイザには、以下のように「2つの入力」として与えてください。
|
| 96 |
+
|
| 97 |
+
```python
|
| 98 |
+
from transformers import AutoTokenizer, AutoModel
|
| 99 |
+
|
| 100 |
+
model_name = "Shuu12121/CodeDiff-Owl-ModernBERT-base"
|
| 101 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 102 |
+
model = AutoModel.from_pretrained(model_name)
|
| 103 |
+
|
| 104 |
+
commit_message = "Fix bug in user login flow"
|
| 105 |
+
diff_text = """
|
| 106 |
+
diff --git a/app/auth.py b/app/auth.py
|
| 107 |
+
index 1234567..89abcde 100644
|
| 108 |
+
--- a/app/auth.py
|
| 109 |
+
+++ b/app/auth.py
|
| 110 |
+
@@ -10,7 +10,9 @@ def login(user, password):
|
| 111 |
+
- if user.password == password:
|
| 112 |
+
- return True
|
| 113 |
+
- return False
|
| 114 |
+
+ if not user:
|
| 115 |
+
+ return False
|
| 116 |
+
+ return user.check_password(password)
|
| 117 |
+
"""
|
| 118 |
+
|
| 119 |
+
inputs = tokenizer(
|
| 120 |
+
commit_message,
|
| 121 |
+
diff_text,
|
| 122 |
+
return_tensors="pt",
|
| 123 |
+
truncation=True,
|
| 124 |
+
)
|
| 125 |
+
|
| 126 |
+
outputs = model(**inputs)
|
| 127 |
+
last_hidden_state = outputs.last_hidden_state # [batch, seq_len, hidden]
|
| 128 |
+
cls_embedding = last_hidden_state[:, 0] # [CLS] トークンの埋め込み
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
* `cls_embedding` を **コミット+diff の表現ベクトル** として検索・クラスタリング等に利用することを想定しています。
|
| 132 |
+
* diff が非常に長い場合はモデル側でトークン長に応じて自動的に切り詰められるため、必要に応じて自前で要約・抽出を行ってください。
|
| 133 |
+
|
| 134 |
+
---
|
| 135 |
+
|
| 136 |
+
## 評価
|
| 137 |
+
|
| 138 |
+
* 本モデルは現時点では **事前学習段階のスナップショット (1.8 epoch)** です。
|
| 139 |
+
* 具体的な使用用途については今後検討予定です。
|
| 140 |
+
|
| 141 |
+
---
|