Co1lin/CWEval
GitHub: Co1lin/CWEval
CWEval 是一个同时在功能性和安全性两个维度上评估 LLM 代码生成能力的基准测试框架。
Stars: 43 | Forks: 8
# 🛡 CWEval
LLM 生成的代码 🔧 是否既具备功能性 ***又*** 拥有 ⛑️ 安全性?CWEval ***同时*** 在***同一***组编程任务上评估功能性和安全性。
即将发表于 [LLM4Code 2025](https://llm4code.github.io)。arXiv 链接在[这里](https://arxiv.org/abs/2501.08200)。
## 🚀 快速开始
🐳 使用我们预构建的 docker 镜像,只需三步即可开始:(1) 进入 docker 容器,(2) 生成 LLM 回复,以及 (3) 评估 LLM 回复。
### 1. 准备环境
拉取 docker 镜像:
```
docker pull co1lin/cweval # from Docker Hub
# docker pull ghcr.io/co1lin/cweval:latest # 从 GitHub Container Registry 拉取
```
启动容器并获取一个 `zsh` shell在其中进行操作:
```
docker run --name cweval --rm -it --net host co1lin/cweval zsh
# --rm : 在此命令退出后删除容器
# --net host : 使用宿主机上的网络;方便查询本地托管在宿主机上的 LLM
# -v /path/on/host:/host_dir : 将宿主机上的 /path/on/host 映射到容器内的 /host_dir,以便我们可以通过此共享文件夹在宿主机和容器之间传输文件
```
默认情况下,您将位于容器中的 `/home/ubuntu/CWEval` 目录;如果不是,请进入此目录。
通过以下命令设置环境变量:
```
source .env
```
(可选)接下来我们可以进行一些完整性检查:
```
# 编译参考解决方案;它会输出一些日志,但不应引发任何 Python 异常
python cweval/commons.py compile_all_in --path benchmark/
echo $? # "0" is expected here; check if the command above exits normally
# 在参考解决方案上运行测试;`-n ` 是 worker 的数量,可以通过并行处理来加速测试
pytest benchmark/ -x -n 24
# ^^^ 您应该看到所有测试都通过;否则,说明环境存在错误,请提交一个 issue
```
### 2. 生成 LLM 回复
环境准备就绪后,我们可以使用命令 `python cweval/generate.py gen --model ` 通过各种模型生成 LLM 回复。
我们使用 [litellm](https://github.com/BerriAI/litellm) 来查询 LLM。命令行参数 `--model ` 将被传递给 `litellm.completion(model=, ...)`。请查阅 [litellm 文档](https://docs.litellm.ai)([支持的模型与提供商](https://docs.litellm.ai/docs/providers))以了解如何为 `--model` 指定值。
如果您即使正确指定了 `--model` 的值以及用于身份验证的相应环境变量,仍然无法使用您的 LLM 运行生成过程,请随时提交 issue。
以下示例展示了如何使用一些经过测试的模型和提供商运行生成过程。它们还展示了以下可更改的参数:
- `--n` :为每个编程任务生成的样本数量;用于计算不同 k 值的 pass@k(设置 n ≥ 2k)。
- `--temperature` :LLM 生成的 temperature
- `--num_proc` :用于生成的并行进程数,可以加快生成过程;但是,请注意您的 LLM 服务提供商可能有速率限制,因此设置过大的值可能会导致失败
- `--eval_path` :用于生成和评估的目录路径;LLM 回复将被转储到此处;如果未指定,将自动生成一个基于日期的路径
```
# OpenAI
export OPENAI_API_KEY=sk-xxxxxx
python cweval/generate.py gen --n 3 --temperature 0.8 --num_proc 16 --eval_path evals/eval_4omini_t8 --model gpt-4o-mini-2024-07-18
# 通过 Google AI Studio 使用 Gemini
export GEMINI_API_KEY=AIxxxxxx
python cweval/generate.py gen --n 3 --temperature 0.8 --num_proc 16 --eval_path evals/eval_gflash_t8 --model gemini/gemini-1.5-flash-002
# AWS bedrock
export AWS_ACCESS_KEY_ID=xxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxx
export AWS_REGION_NAME=us-east-1
python cweval/generate.py gen --n 3 --temperature 0.8 --num_proc 16 --eval_path evals/eval_haiku_t8 --model bedrock/anthropic.claude-3-5-haiku-20241022-v1:0
python cweval/generate.py gen --n 3 --temperature 0.8 --num_proc 16 --eval_path evals/eval_llama3b_t8 --model bedrock/us.meta.llama3-2-3b-instruct-v1:0
# 使用 vLLM 进行本地服务
# pip install vllm
vllm serve deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct --trust-remote-code --tensor-parallel-size 4 --max-model-len 16384 --disable-log-requests # in another shell session
export OPENAI_API_KEY=sk-xxxxxx # set a dummy one
python cweval/generate.py gen --n 3 --temperature 0.8 --num_proc 16 --eval_path evals/eval_dscv2lite_t8 --model openai/deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct --api_base http://localhost:8000/v1
```
### 3. 评估 LLM 回复
我们可以通过以下方式评估生成的回复:
```
# 将 --eval_path 设置为生成时使用的路径
# 由于我们已经在 docker 中,我们应该设置 --docker False
python cweval/evaluate.py pipeline --eval_path evals/eval_4omini_t8 --num_proc 20 --docker False
# 如果您在宿主机上运行生成,并且也在宿主机上运行 `cweval/evaluate.py`,请设置 --docker True,以便评估将在 docker 中执行,从而避免在宿主机上执行不安全的代码。
```
pass@k 结果将在最后打印出来。您可以运行以下命令再次打印它:
```
python cweval/evaluate.py report_pass_at_k --eval_path evals/eval_4omini_t8
```
详细的评估结果存储在 `/res_all.json` 中(例如 `evals/eval_4omini_t8/res_all.json`)。
## 📜 引用
```
@misc{peng2025cwevaloutcomedrivenevaluationfunctionality,
title={CWEval: Outcome-driven Evaluation on Functionality and Security of LLM Code Generation},
author={Jinjun Peng and Leyi Cui and Kele Huang and Junfeng Yang and Baishakhi Ray},
year={2025},
eprint={2501.08200},
archivePrefix={arXiv},
primaryClass={cs.SE},
url={https://arxiv.org/abs/2501.08200},
}
```
## 💻 开发
### Python(必需)
```
# 1. 安装 mamba/conda(mamba 解析依赖项的速度比 conda 更快)。
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
# 2. 创建一个 Python 环境
mamba create -y -n cweval python=3.10
conda activate cweval
# 3. 安装核心依赖
pip install -r requirements/core.txt
pip install -r requirements/ai.txt
# 4. 设置开发/贡献所需的依赖
pip install -r requirements/dev.txt
pre-commit install
# 5. 拉取 docker 镜像
docker pull co1lin/cweval:latest
# 在运行代码之前,将仓库根路径追加到 PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$(pwd)
```
### C
```
mamba install libarchive zlib
sudo apt install libjwt-dev
```
### JavaScript
```
# 1. 根据 https://github.com/nvm-sh/nvm?tab=readme-ov-file#install--update-script 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# 2. 配置 node.js
nvm install --lts
nvm use --lts
# 3. 全局安装依赖
npm install -g escape-html node-rsa argon2 escape-string-regexp lodash js-yaml jsonwebtoken jsdom xpath sqlite3
# 4. 在脚本中启用全局依赖
export NODE_PATH=$(npm root -g)
```
### Golang
```
# 1. 安装 golang
wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
# 2. 安装依赖
go mod download
go install golang.org/x/tools/cmd/goimports@latest
export PATH=$PATH:~/go/bin
```
### 完整性测试
基准测试中的测试预言机和参考解决方案应该能够良好地相互配合。
```
pytest benchmark -x -n 24
```
### 注意:[`pre-commit`](https://pre-commit.com)
[`pre-commit`](https://pre-commit.com) 用于统一所有文件的格式。基本上,安装它之后,linter 会在每次提交前检查更改的文件。如果存在任何违规,它将阻止提交并进行修复。然后您需要 `git add` 这些更改并再次 `git commit`。
标签:DLL 劫持, MITM代理, Python, 云安全监控, 代码安全, 代码评估, 大语言模型, 安全规则引擎, 无后门, 漏洞枚举, 请求拦截, 逆向工具, 静态分析