Giskard 完全指南:用开源工具为 AI Agent 构建自动化测试与安全红队体系
为什么 AI Agent 需要专业的测试体系?
传统软件测试的断言方式——输入 X 得到 Y——在面对 LLM 的非确定性输出时彻底失效。同一个 prompt 可能得到不同的回答,而它们可能都是「正确」的。再加上多轮对话、工具调用、外部知识检索等复杂行为,AI Agent 的质量保障成为一个全新的挑战。
Giskard 是一个开源(Apache-2.0)的 LLM 评估与测试库,GitHub 5470+ stars,专为动态、多轮的 AI Agent 场景设计。它提供两个核心产品:Giskard Library(结构化测试框架)和 Giskard Scan(自动化红队与漏洞扫描),覆盖从单元测试到安全审计的完整链路。
核心架构
Giskard v3 是整个项目的重写版本,设计理念是模块化、轻量化和异步优先。它的核心抽象只有三个:
- Check:一个可复用的断言——检查 LLM 输出是否满足某个条件(如上下文相关性、安全性、格式合规)
- Scenario:定义一次完整的测试交互——输入、调用 LLM、运行检查
- Suite:多个 Scenario 的集合,作为一个整体运行并生成报告
这种设计让测试用例可以像 pytest 一样组织,无需依赖厚重的框架。
安装
Giskard Library 是核心测试框架:
pip install giskard
Giskard Scan 是漏洞扫描层,需额外安装:
pip install giskard-scan
Giskard v2(旧版,含完整的 RAG 评估和扫描功能,不再主动维护):
pip install "giskard[llm]>2,<3"
当前推荐使用 v3 进行日常测试,仅在需要旧版扫描和 RAGET 功能时回退到 v2。
功能详解
1. 内置 Checks:从字符串匹配到 LLM-as-Judge
Giskard 提供多种内置检查器,覆盖不同粒度:
- 字符串匹配:精确匹配、正则匹配、包含检查
- 语义相似度:检查 LLM 输出是否与预期结果语义接近
- Groundedness(上下文相关性):验证 LLM 的回答是否基于给定的上下文,而非凭空编造
- Conformity(合规性):检查输出是否符合预定义的规则(如 JSON 格式、长度限制)
- LLMJudge:用一个 LLM 评判另一个 LLM 的输出质量(LLM-as-Judge 模式)
2. Scenario:定义一次完整的测试交互
Scenario 是 Giskard 的测试用例单元。它描述一次完整的交互:先向 LLM 输入内容,获取输出,再对其运行一系列检查:
from openai import OpenAI
from giskard.checks import Scenario, Groundedness
client = OpenAI()
def get_answer(inputs: str) -> str:
response = client.chat.completions.create(
model="gpt-5-mini",
messages=[{"role": "user", "content": inputs}],
)
return response.choices[0].message.content
scenario = (
Scenario("test_dynamic_output")
.interact(
inputs="What is the capital of France?",
outputs=get_answer,
)
.check(
Groundedness(
name="answer is grounded",
context="France is a country in Western Europe. Its capital is Paris.",
)
)
)
注意 run() 方法是异步的,需要 asyncio.run() 或 await 上下文。
3. 多轮对话测试
Agent 的典型场景不是一问一答,而是多轮对话。Giskard 的文档中有专门的「Multi-Turn Scenarios」教程章节,支持定义一系列连续的输入-输出步骤,每个步骤都可以运行独立的检查。这种逐轮检查的能力,让测试不再是「最终结果比对」,而是对话过程中的行为验证。
4. Test Suites:批量测试
当你有多个 Scenario 后,可以组织成 Suite 统一运行。Suite 支持嵌套和分类,适合按功能模块组织:
from giskard.checks import Suite
suite = Suite("Customer Support")
suite.add(scenario_returns)
suite.add(scenario_complaints)
suite.add(scenario_orders)
results = await suite.run()
results.print_report()
5. pytest 集成
Giskard 原生支持 pytest,你可以将 Scenario 直接嵌入到测试函数中:
import pytest
from giskard.checks import Scenario
@pytest.mark.asyncio
async def test_knowledge_base():
result = await scenario.run()
assert result.passed, f"Test failed: {result.failures}"
这让 LLM 测试可以无缝融入现有的 CI/CD 流水线。
6. 自定义 Checks
内置的 Checks 无法覆盖所有场景时,可以实现自定义 Check。Giskard 提供了可扩展的 Checks 接口,让你能针对业务需求编写专用验证逻辑——比如检查输出中是否包含特定关键词、验证 JSON 响应结构、或调用外部 API 做交叉验证。自定义 Check 实现了完整的 pass/fail 报告机制,可以和内置 Checks 一起混合组成 Suite 运行。
7. Giskard Scan:自动化红队测试
Giskard Scan 是独立的安全测试层。只需提供 Agent 的描述和目标函数,它就能自动生成对抗性测试用例,覆盖 OWASP LLM Top-10 威胁类别(prompt injection、有害内容、刻板印象、虚假信息等):
import asyncio
from giskard.scan import vulnerability_scan
async def main():
await vulnerability_scan(
target=my_agent,
description="A customer support chatbot for an e-commerce platform.",
languages=["en"],
)
asyncio.run(main())
Scan 会自动从内置的攻击载荷库中选取合适的测试用例,运行后生成包含各威胁类别得分的安全报告。
你也可以扩展自定义的 ScenarioGenerator 实例来覆盖特定场景,或者注册到 vulnerability_suite_generator_registry 中。
8. CI/CD 集成
Giskard 的异步架构使其天然适合 CI/CD 环境。典型的 GitHub Actions 配置如下:
name: LLM Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install giskard
- run: pytest tests/llm/
结合 pytest 集成,每次代码推送都会自动运行 LLM 测试用例,及时发现回归问题。
排错指南
问题:run() 报错 coroutine was never awaited
Giskard v3 的 run() 方法是异步的。在脚本中需要使用 asyncio.run() 包裹:
import asyncio asyncio.run(scenario.run())
问题:pip install giskard 速度慢
Giskard 依赖比较多,建议使用 uv 加速:
pip install uv uv pip install giskard
问题:Scan 返回结果为空
检查 description 参数是否过于简短。Scan 依赖自然语言描述来生成有意义的测试用例,描述越详细,生成的测试覆盖越全。
FAQ
Q:Giskard v3 和 v2 有什么区别?
v3 是重写版,专注于动态多轮 Agent 测试,去掉了 v2 中的 RAGET 和旧版 Scan 的大文件依赖。v2 仍可用但不再维护。两者可以共存。
Q:Giskard 支持哪些模型?
框架无关——你只需提供调用 LLM 的函数(OpenAI、Anthropic、本地模型均可),Giskard 只负责测试逻辑。
Q:Scan 和 Library 的 Checks 有什么区别?
Checks 是你手写的断言(有明确期望的验证),Scan 是自动生成的对抗性测试(你不知道输入是什么——它自动选)。两者互补:Checks 覆盖已知的风险点,Scan 发现未知的漏洞。
Q:Giskard 可以和 LangChain / LlamaIndex 一起用吗?
可以。Giskard 不绑定框架——你只需将 Chain 或 Agent 封装成一个接受输入返回输出的函数即可传入 Scenario。
总结
Giskard 填补了 AI Agent 测试领域的空白。它的 v3 版本以模块化、异步优先、框架无关的设计,为 LLM 开发者提供了从结构化断言到自动化红队测试的完整工具链。如果你正在构建 AI Agent 应用,Giskard 是一个值得加入测试基础设施的开源选择。
- GitHub: https://github.com/Giskard-AI/giskard
- 文档: https://docs.giskard.ai/oss
- 社区: https://github.com/Giskard-AI/giskard/discussions