Shuu12121's picture
Create README.md
65edab8 verified
---
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)** です。
* 具体的な使用用途については今後検討予定です。
---