MarekLM/DriftCheck
GitHub: MarekLM/DriftCheck
一款自托管的 LLM 测试与行为比较工具,用于评估大语言模型的输出一致性、漂移情况和提示注入抵抗力。
Stars: 0 | Forks: 0
# DriftCheck
**DriftCheck** 是一个小型的自托管工具,用于测试 LLM 的稳定性、漂移、prompt 行为以及模型间的差异。
它会针对一个或多个模型多次运行相同的 prompt,并评估模型是否:
- 回答一致,
- 满足预期标准,
- 始终基于参考文档,
- 遵循请求的输出格式,
- 抵御 prompt 注入攻击,
- 在受到质疑时避免过度迎合,
- 在填充轮次或重复运行后表现出不同的行为。
我们的目的不在于断言哪一个模型是绝对最好的,而是让模型的行为变得可见且具有可比性。
## 它测试什么
DriftCheck 内置了 13 种示例测试类型:
| 测试 | 检查内容 |
|---|---|
| `capital-of-france` | 基本的事实一致性和标准匹配。 |
| `rag-privacy-policy` | 忠实度:回答必须基于参考文档。 |
| `assentation-meaning-of-life` | 模型在受到轻微反驳后是否会改变答案。 |
| `ambiguous-question` | 模型是否能妥善处理歧义,而不是凭空捏造确定性。 |
| `contradiction-in-prompt` | 模型是否能注意到相互冲突的指令或事实。 |
| `long-context-needle` | 模型是否能从较长的上下文中检索到相关细节。 |
| `format-compliance` | 模型是否遵循了要求的回答格式。 |
| `json-output` | 模型是否返回了有效的 JSON 且没有多余的描述。 |
| `refusal-consistency` | 拒绝行为在多次重复运行中是否稳定。 |
| `negation-handling` | 模型是否能正确处理“否定”、排除项和负面约束。 |
| `numeric-stability` | 数值型回答在多次重复运行中是否保持稳定。 |
| `multi-step-task` | 是否能一致地遵循多步骤指令。 |
| `prompt-injection-resistance` | 不受信任的插入指令是否会覆盖原始任务。 |
## 支持的提供商
DriftCheck 使用简单的 HTTP 调用,可以针对以下服务运行:
- OpenAI
- Anthropic
- Google Gemini
- Mistral(通过 OpenAI 兼容 API)
- 本地 OpenAI 兼容服务器,例如 Ollama, LM Studio, vLLM, TGI, LiteLLM
提供商和模型定义位于 [`settings/config.yaml`](settings/config.yaml) 中。
## 文件夹结构
```
driftcheck/
├── settings/
│ └── config.yaml # connections, defaults, tests
├── inputs/
│ ├── prompts/ # prompt files used by tests
│ └── files/ # reference documents for RAG/faithfulness tests
├── outputs/ # generated JSON results, ignored by git
├── src/ # Python runner and local UI server
├── ui/ # local interactive UI
├── docs/ # GitHub upload guide, benchmark notes, LinkedIn draft
├── Dockerfile
├── docker-compose.yml
├── .env.example
└── README.md
```
## 安装
克隆代码库并创建您的本地 `.env` 文件:
```
git clone https://github.com//driftcheck.git
cd driftcheck
cp .env.example .env
```
只需填写您需要的 API key:
```
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
GOOGLE_API_KEY=
MISTRAL_API_KEY=
LOCAL_API_KEY=not-needed
```
在 Windows PowerShell 中,您也可以使用以下命令复制示例文件:
```
copy .env.example .env
notepad .env
```
## 使用本地 UI 运行
启动 UI:
```
docker compose up --build driftcheck-ui
```
打开:
```
http://localhost:8080
```
### UI 流程
1. **启动容器**
docker compose up --build driftcheck-ui
2. **打开 UI**
http://localhost:8080
3. **选择一个或多个测试**
示例:`capital-of-france`、`rag-privacy-policy`、`prompt-injection-resistance`。
4. **设置运行参数**
推荐的初始值:
repeats: 5 或 10
temperature: 0.2 用于稳定的 QA 检查
temperature: 0.7 用于漂移/变化检查
filler turns: 0(除非测试对话过程中的漂移)
5. **选择一个或多个模型**
您可以选择来自 OpenAI、Anthropic、Google、Mistral 的模型,或本地 OpenAI 兼容的端点。
6. **运行测试**
UI 会调用本地 API,并为每个测试/模型组合在 `outputs/` 目录中写入一个 JSON 结果文件。
7. **查看结果**
主要指标:
- `Consistency`:越高表示在多次重复运行中答案越相似。
- `Criterion pass rate`:越高表示答案符合配置的预期条件。
- `Faithfulness`:对于 RAG/参考测试,越高表示回答基于参考文档。
- `Assentation flip rate`:越高表示模型在受到反驳后改变了答案。
- `n_errors`:运行期间发生的 provider/API 错误。
8. **使用历史记录**
UI 会列出 `outputs/` 中的过往运行记录。点击结果可检查原始回答和指标。
9. **停止 UI**
docker compose down
## 通过 CLI 运行
运行 `settings/config.yaml` 中的每个测试:
```
docker compose run --rm driftcheck run
```
运行单个测试:
```
docker compose run --rm driftcheck run --test capital-of-france
```
针对所有已配置的模型运行一个测试:
```
docker compose run --rm driftcheck run --test capital-of-france --all
```
针对选定的连接运行一个测试:
```
docker compose run --rm driftcheck run --test capital-of-france \
-c gpt-5-5 \
-c sonnet-5 \
-c mistral-small
```
列出已配置的测试:
```
docker compose run --rm driftcheck list
```
## 配置模型
编辑 [`settings/config.yaml`](settings/config.yaml)。
OpenAI 连接示例:
```
- name: gpt-5-5
provider: openai
api_key: ${OPENAI_API_KEY}
model: gpt-5.5
rpm_limit: 500
max_retries: 4
```
Anthropic 连接示例:
```
- name: sonnet-5
provider: anthropic
api_key: ${ANTHROPIC_API_KEY}
model: claude-sonnet-5
rpm_limit: 50
max_retries: 4
```
Gemini 连接示例:
```
- name: gemini-2-5-flash
provider: google
api_key: ${GOOGLE_API_KEY}
model: gemini-2.5-flash
rpm_limit: 15
max_retries: 4
```
通过 OpenAI 兼容 API 的 Mistral 连接示例:
```
- name: mistral-small
provider: openai
api_key: ${MISTRAL_API_KEY}
model: mistral-small-latest
base_url: https://api.mistral.ai/v1
rpm_limit: 10
max_retries: 4
```
本地 Ollama/LM Studio/vLLM 连接示例:
```
- name: local-ollama
provider: openai
api_key: ${LOCAL_API_KEY}
model: llama3.1
base_url: http://host.docker.internal:11434/v1
```
## 速率限制与重试
提供商 API 通常会有每分钟请求数限制。如果您在运行多个模型时设置 `repeats: 20`,可能会遇到 `429 rate_limit` 错误。
请使用:
```
rpm_limit: 10
max_retries: 4
```
为了方便调试,请先从较小的数值开始:
```
repeats: 3
```
在提供商和模型配置稳定后,再增加到 10 或 20。
## 输出
每次运行都会在 `outputs/` 目录中创建一个 JSON 文件:
```
outputs/20260705T150027Z__prompt-injection-resistance__gpt-5-5.json
```
这些文件被有意设置为对 git 隐藏。您可以将它们保存在本地、附加到基准测试报告中,或者单独发布选定的汇总结果。
## 注意事项
这是一个早期的测试工具,而不是正式的基准测试。结果取决于:
- prompt,
- 模型版本,
- 提供商限制,
- temperature,
- 重试行为,
- 评分规则,
- 错误是被排除还是被计算在内。
请使用 DriftCheck 在您自己的条件下比较模型行为。
标签:LLM测试, RAG评估, SOC Prime, 一致性测试, 人工智能, 开发工具, 模型评估, 用户模式Hook绕过, 请求拦截, 逆向工具