🚀 Solidity(Web3スマートコントラクト)用のコード生成T5モデル
このモデルは、Solidity(Web3スマートコントラクト)のコード生成に特化したT5モデルです。詳細なコンテキストについては、こちらを参照してください。
🚀 クイックスタート
この学習済みモデルの使い方
このモデルを使用するためのHello Worldサンプルです。入力text
には以下の要素が含まれます。
pragma solidity ^0.5.7
のようなSolidityバージョンのヘッダー
- 親クラス/ライブラリの情報、例えば
ParentA
からのパブリック関数や定数
- コントラクト/ライブラリ/インターフェースの宣言ヘッダー、例えば
HelloWorld
で終わる{
また、ウィンドウの右側にあるテストウィジェットを使用してテストすることもできますが、デコードパラメータを指定しないと品質が低下することが知られています。
from transformers import AutoTokenizer, T5ForConditionalGeneration
DEVICE = 'cuda'
tokenizer = AutoTokenizer.from_pretrained("hululuzhu/solidity-t5")
model = T5ForConditionalGeneration.from_pretrained("hululuzhu/solidity-t5").to(DEVICE)
text = """pragma solidity ^0.5.7;
// Context: ParentA | Functions: helloA helloB | Constants: constantA
contract HelloWorld is ParentA {"""
input_ids = tokenizer(text, return_tensors="pt", truncation=True).input_ids.to(DEVICE)
generated_ids = model.generate(input_ids, max_length=256, num_beams=5, top_p=0.95, top_k=50)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
"""
string public constant name = "Hello World";
...
uint256 public constant override returns (uint256) {
return initialSupply;
}
function initialSupply() public view returns (uint256) {
...
"""
💻 使用例
基本的な使用法
from transformers import AutoTokenizer, T5ForConditionalGeneration
DEVICE = 'cuda'
tokenizer = AutoTokenizer.from_pretrained("hululuzhu/solidity-t5")
model = T5ForConditionalGeneration.from_pretrained("hululuzhu/solidity-t5").to(DEVICE)
text = """pragma solidity ^0.5.7;
// Context: ParentA | Functions: helloA helloB | Constants: constantA
contract HelloWorld is ParentA {"""
input_ids = tokenizer(text, return_tensors="pt", truncation=True).input_ids.to(DEVICE)
generated_ids = model.generate(input_ids, max_length=256, num_beams=5, top_p=0.95, top_k=50)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
"""
string public constant name = "Hello World";
...
uint256 public constant override returns (uint256) {
return initialSupply;
}
function initialSupply() public view returns (uint256) {
...
"""
📚 ドキュメント
背景
- ベースとなるT5コードモデル: https://huggingface.co/Salesforce/codet5-large
- ソースデータ: https://huggingface.co/datasets/mwritescode/slither-audited-smart-contracts
- 処理手順: クリーニング、コントラクトレベルのセグメンテーション分割、入力と出力の分割
- 処理後の入力サンプル
pragma solidity 0.5.7;
// Context: PauserRole | Functions: isPauser addPauser renouncePauser | Constants:
contract Pausable is PauserRole {
- 処理後の出力サンプル(インデントが悪いのは、トークンサイズを減らすためです)
event Paused(address account);
event Unpaused(address account);
bool private _pausableActive;
bool private _paused;
constructor () internal {
_paused = false;
}
function paused() public view returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!_paused);
_;
}
modifier whenPaused() {
require(_paused);
_;
}
function pause() public onlyPauser whenNotPaused whenPausableActive {
_paused = true;
emit Paused(msg.sender);
}
function unpause() public onlyPauser whenPaused whenPausableActive {
_paused = false;
emit Unpaused(msg.sender);
}
function _setPausableActive(bool _active) internal {
_pausableActive = _active;
}
modifier whenPausableActive() {
require(_pausableActive);
_;
}
}
- ソーストレーニングコード: コードディレクトリのエンドツーエンドノートブックを参照してください。
🔧 技術詳細
今後のTODO
- GPU予算の不足により、モデルは大幅に学習不足です。完全なトレーニングには約10倍のColabリソース(約$100)が必要です。
- モデルの使用方法には限界があります。潜在的には、GPT2のデコーダーのみのモデルに切り替えて比較することができますが、CodeT5には強力なコード最適化機能があります。
- 潜在的な欠陥を検出するために、より多くの分類器(T5やBERTのようなもの)が必要です。
📄 ライセンス
このプロジェクトは、Apache-2.0ライセンスの下で公開されています。