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绕过, 请求拦截, 逆向工具