专门用于理解、生成和分析 Solidity 智能合约的微调大型语言模型:Solidity-LLM
Solidity-Code-LLM 论文解读
一、模型概述
Solidity-Code-LLM 是由 ChainGPT 开发的一种专门用于理解、生成和分析 Solidity 智能合约的微调大型语言模型。该模型专注于以太坊兼容区块链中占主导地位的 Solidity 语言,旨在为去中心化开发生态系统提供高效且准确的智能合约编写和调试辅助工具。Solidity-Code-LLM 的开发基于 Salesforce 的 codegen-2B-multi 模型,并采用 MIT 许可证。
二、模型细节
Solidity-Code-LLM 的训练分为两个阶段:预训练和指令式微调。预训练阶段使用大量未经结构化的 Solidity 数据集,而微调阶段则基于清理和策划过的数据集进行。该模型具有以下特点:
-
类型:因果语言模型(Causal LLM)代码生成器
-
令牌器:GPT2Tokenizer
-
参数数量:20 亿
-
层数:32 个 Transformer 块
-
上下文长度:完整 2048 个令牌
-
数据类型:bfloat16
三、模型比较与基准测试
Solidity-Code-LLM 与其他模型(如 GPT-4.5 Preview、GPT-4o-mini、Qwen 2.5-Coder-7B 和 DeepSeek-Coder-7B-Instruct-v1.5)进行了比较,主要从以下参数进行评估:
-
编译成功率(Compilation %):生成的合约无需修改即可成功编译的百分比。
-
OpenZeppelin 合规性(OpenZeppelin Compliance %):遵循 OpenZeppelin 库使用和标准的程度。
-
气体效率(Gas Efficiency %):基于 Slither 建议的气体优化程度。
-
安全性(Security %):Slither 检测到的无常见漏洞的代码百分比。
-
平均代码行数(Lines of Code):生成合约中的非空行数(包括注释),反映代码的冗长或简洁程度。
在这些评估指标中,Solidity-Code-LLM 表现如下:
-
编译成功率最高(约 83%),表明其生成的 Solidity 语法和结构非常强大。
-
OpenZeppelin 合规性良好(约 65%),尽管其规模较小,但仍能频繁使用标准库和合约模式。
-
气体效率最高(约 72%),生成的代码经过优化,适合成本敏感的部署。
-
安全性得分中等(约 58%),表明虽然有一定的安全性,但仍有改进空间。
-
代码简洁(约 70% LOC 得分),生成的智能合约相对紧凑且高效。
四、模型用途
Solidity-Code-LLM 的用途包括:
-
直接用途:协助开发人员编写 Solidity 智能合约,作为学习 Solidity 的教育工具,或自动生成文档或合约模板。
-
下游用途:集成到 IDE 或智能合约开发平台中,支持与区块链交互的自主代理。
-
不适用用途:不适用于 Solidity 之外的通用代码生成,不应用于未经人工监督的法律审计或形式化验证,也不应用于未经专家审查的生产环境合约部署。
五、模型的偏见、风险和限制
Solidity-Code-LLM 可能会反映出从网络抓取的内容中的偏见(例如,过时或不安全的编码实践)。该模型可能会生成幻觉代码或提供语法上有效但逻辑上不正确的建议。在高风险或金融环境中使用生成的代码时,未经彻底审查存在风险。
六、使用建议
用户(无论是直接使用还是下游使用)都应了解模型的风险、偏见和限制。强烈建议在部署前进行手动代码审查和测试。
七、如何开始使用该模型
Solidity-Code-LLM 的生成过程分为两步:首先生成代码的自然语言描述,然后根据给定的提示生成相应的源代码。完整的输出在内部生成后才会显示给用户。对于需要直接生成代码而无需中间描述的场景,可以使用流式模式实时生成代码。
使用该模型的环境要求如下:
pip install transformers==4.51.3 torch==2.7.0 accelerate==1.6.0
以下是使用该模型的代码示例:
from transformers import AutoModelForCausalLM, AutoTokenizermodelpath = \"Chain-GPT/Solidity-LLM\"tokenizer = AutoTokenizer.from_pretrained(modelpath)model = AutoModelForCausalLM.from_pretrained(modelpath).to(\"cuda\")prompt = \"Write a Solidity function to transfer tokens.\"inputs = tokenizer(prompt, return_tensors=\"pt\").to(\"cuda\")outputs = model.generate(**inputs, max_new_tokens=1400, pad_token_id=tokenizer.eos_token_id)generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)print(generated_text)
八、训练细节
Solidity-Code-LLM 的微调使用了以下计算资源:
-
4 个 GPU 集群,每个 GPU 80 GB
-
训练时长:1095 小时,大约为一个半月
预训练阶段使用了 10 亿个未经结构化的原始语料库令牌。微调阶段则使用了 Solidity 版本 >= 0.5 的合约,令牌长度在 200 到 4000 之间,去除了重复项,并过滤掉了接口、库、带有无关注释或相对导入的合约,仅保留了可编译和可执行的合约。微调过程中使用了 650K 指令。
九、评估指标
为了评估 Solidity-Code-LLM 在生成 Solidity 智能合约方面的性能,使用了 Slither,这是一个广泛用于分析 Solidity 代码的静态分析框架。评估的关键标准包括编译成功率、OpenZeppelin 标准合规性、气体优化机会、安全漏洞和平均代码行数(LOC)。这些指标从正确性、效率、安全性和可用性等多个维度提供了模型有效性的全面视图。
十、总结
尽管 Solidity-Code-LLM 的参数规模仅为 20 亿,但其在生成 Solidity 智能合约方面表现出色。它在编译成功率(83%)、OpenZeppelin 合规性(65%)、气体效率(72%)和代码简洁性(70% LOC 得分)方面均取得了优异成绩,尽管安全性得分(58%)表明还有改进空间,但该模型仍能生成足够安全的合约以供实际使用。总体而言,Solidity-Code-LLM 是一个资源高效、可靠且平衡良好的 Solidity 代码生成模型。未来版本将专注于改进对 Solidity 语言和 OpenZeppelin 库新版本的支持,增强用户交互性,扩展对其他语言(如 Rust)的兼容性,并开发能够处理更长上下文窗口的更大模型。