基于 Multi-IaC-Eval 论文的评估框架,用于测试扩散语言模型(LLaDA)在基础设施即代码(IaC)变更任务上的表现。
IaC_dllm/ ├── validate_setup.py # 环境验证脚本 ├── llada_generator.py # LLaDA 生成器模块 ├── llm_judge.py # LLM 评判器 ├── run_eval.py # 简化版评估脚本 ├── test_iac_dllm.py # 完整评估脚本 ├── test.csv # 测试数据集 └── models/ # 模型文件目录 ├── config.json ├── tokenizer.json ├── modeling_llada.py └── configuration_llada.py
验证运行环境是否正确配置,包括依赖包、模型文件和测试数据。
# 基本验证
python validate_setup.py
# 包含生成测试
python validate_setup.py --test-generation
检查项目:
实现 LLaDA(Large Language Diffusion with mAsking)的核心生成逻辑。
生成流程:
from llada_generator import LLaDAGenerator
generator = LLaDAGenerator("./models", device="cuda")
# 生成 IaC 模板
template, num_calls = generator.generate_iac(
initial_template="...",
utterance="Add an S3 bucket",
iac_type="cloudformation",
max_new_tokens=512,
num_steps=64,
temperature=0.5
)
评估生成模板与期望模板的语义对齐程度。
评分标准(1-3 分):
# 批量评估结果
python llm_judge.py \
--results-file ./results/results_20240101_120000.jsonl \
--output-file ./results/judge_results.json \
--api-key YOUR_OPENAI_API_KEY
注意: 需要 OpenAI API Key。如无 API Key,将使用基于 Levenshtein 距离的规则评估作为 fallback。
快速运行评估,仅计算 Edit Distance 和 LLM Calls。
python run_eval.py \ --model-path ./models \ --test-data ./test.csv \ --output-dir ./results \ --max-samples 100 \ --num-steps 32 \ --temperature 0.5
包含论文中所有评估指标的完整评估流程。
python test_iac_dllm.py \ --model-path ./models \ --test-data ./test.csv \ --output-dir ./results \ --iac-types cloudformation terraform \ --num-diffusion-steps 64 \ --temperature 0.5 \ --max-retries 3
参数说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
--model-path | ./models | 模型路径 |
--test-data | ./test.csv | 测试数据路径 |
--output-dir | ./results | 输出目录 |
--max-samples | None | 最大样本数(调试用) |
--iac-types | cloudformation terraform | 评估的 IaC 类型 |
--num-diffusion-steps | 64 | 扩散步数 |
--temperature | 0.5 | 生成温度 |
--max-retries | 3 | 失败重试次数 |
--no-retry | False | 禁用重试机制 |
| 指标 | 说明 | 计算方式 |
|---|---|---|
| Lint Pass Rate | 语法检查通过率 | cfn-lint (CFN) / tflint (Terraform) |
| Checkov Pass Rate | 安全最佳实践通过率 | Checkov 扫描 |
| Number of LLM Calls | 模型调用次数 | 扩散步数 + 重试次数 |
| LLM Judge Score | 语义对齐评分 (1-3) | GPT-4 评判 / 规则 fallback |
| Edit Distance | 编辑距离 | Levenshtein 距离 |
# Python 依赖
pip install torch transformers python-Levenshtein tqdm
# Lint 工具
pip install cfn-lint checkov
# tflint (macOS)
brew install tflint
# tflint (Linux)
curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
确保 ./models/ 目录包含以下文件:
config.jsontokenizer.jsonmodeling_llada.pyconfiguration_llada.py# 1. 验证环境
python validate_setup.py
# 2. 快速测试(10 个样本)
python test_iac_dllm.py --max-samples 10
# 3. 完整评估
python test_iac_dllm.py
# 4. LLM Judge 评分(可选)
export OPENAI_API_KEY=your_key
python llm_judge.py \
--results-file ./results/results_*.jsonl \
--output-file ./results/judge_results.json
============================================================ EVALUATION SUMMARY ============================================================ Total samples: 1000 Overall Metrics: Lint Pass Rate: 78.50% Checkov Pass Rate: 92.30% Avg LLM Calls: 2.45 Avg Edit Distance: 1024.32 CLOUDFORMATION Metrics (n=500): Lint Pass Rate: 72.11% Checkov Pass Rate: 89.91% Avg LLM Calls: 2.71 Avg Edit Distance: 822 TERRAFORM Metrics (n=500): Lint Pass Rate: 84.80% Checkov Pass Rate: 100.00% Avg LLM Calls: 2.73 Avg Edit Distance: 1343 ============================================================
| Format | Model | Lint Pass Rate | Checkov Pass Rate | LLM Calls | LLM Judge | Edit Distance |
|---|---|---|---|---|---|---|
| CFN | Llama 3.2 11B | 72.11% | 89.91% | 2.71 | 1.89 | 822 |
| CFN | DeepSeek R1 | 91.99% | 92.58% | 1.79 | 2.06 | 733 |
| CFN | Sonnet 3.5 V2 | 98.52% | 98.81% | 1.82 | 2.23 | 1190 |
| Terraform | Llama 3.2 11B | 84.80% | 100% | 2.73 | 2.01 | 1343 |
| Terraform | DeepSeek R1 | 98.83% | 98.83% | 1.81 | 2.12 | 1061 |
| Terraform | Sonnet 3.5 V2 | 100% | 100% | 2.1 | 2.39 | 1403 |
扩散模型 vs 自回归模型:LLaDA 使用 mask-and-denoise 方式生成,与表格中的自回归模型(Llama、DeepSeek、Sonnet)机制不同
LLM Calls 含义差异:
transformers 版本兼容性:如遇到 all_tied_weights_keys 错误,需要在 modeling_llada.py 中添加该属性
MIT