logo
0
0
WeChat Login
Update README.md

Multi-IaC-Eval: Diffusion LLM Evaluation

基于 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

脚本说明

1. validate_setup.py - 环境验证

验证运行环境是否正确配置,包括依赖包、模型文件和测试数据。

# 基本验证 python validate_setup.py # 包含生成测试 python validate_setup.py --test-generation

检查项目:

  • Python 依赖(torch, transformers, Levenshtein, tqdm)
  • 模型文件完整性
  • 测试数据存在性
  • 模型加载与推理

2. llada_generator.py - LLaDA 生成器

实现 LLaDA(Large Language Diffusion with mAsking)的核心生成逻辑。

生成流程:

  1. 将输出序列初始化为全 mask tokens
  2. 迭代预测并根据置信度 unmask tokens
  3. 使用双向注意力(非因果)进行推理
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 )

3. llm_judge.py - LLM 评判器

评估生成模板与期望模板的语义对齐程度。

评分标准(1-3 分):

  • 1 分:不对齐,未实现请求
  • 2 分:部分对齐,实现了部分请求
  • 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。


4. run_eval.py - 简化版评估

快速运行评估,仅计算 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

5. test_iac_dllm.py - 完整评估脚本(推荐)

包含论文中所有评估指标的完整评估流程。

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-samplesNone最大样本数(调试用)
--iac-typescloudformation terraform评估的 IaC 类型
--num-diffusion-steps64扩散步数
--temperature0.5生成温度
--max-retries3失败重试次数
--no-retryFalse禁用重试机制

评估指标

指标说明计算方式
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.json
  • tokenizer.json
  • modeling_llada.py
  • configuration_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 ============================================================

参考论文指标

FormatModelLint Pass RateCheckov Pass RateLLM CallsLLM JudgeEdit Distance
CFNLlama 3.2 11B72.11%89.91%2.711.89822
CFNDeepSeek R191.99%92.58%1.792.06733
CFNSonnet 3.5 V298.52%98.81%1.822.231190
TerraformLlama 3.2 11B84.80%100%2.732.011343
TerraformDeepSeek R198.83%98.83%1.812.121061
TerraformSonnet 3.5 V2100%100%2.12.391403

注意事项

  1. 扩散模型 vs 自回归模型:LLaDA 使用 mask-and-denoise 方式生成,与表格中的自回归模型(Llama、DeepSeek、Sonnet)机制不同

  2. LLM Calls 含义差异

    • 自回归模型:通常指 retry 次数
    • 扩散模型:指扩散步数
  3. transformers 版本兼容性:如遇到 all_tied_weights_keys 错误,需要在 modeling_llada.py 中添加该属性

License

MIT