Giskard-AI/giskard-oss · 上手攻略

  • 仓库:Giskard-AI/giskard-oss
  • 链接:https://github.com/Giskard-AI/giskard-oss
  • 分类:AI · LLM Agent 测试与评估
  • 作者:Tom
  • 更新:2026-07-14

一、是什么

Giskard 是一个开源 Python 库,专为测试和评估 AI Agent 系统而设计,由法国团队 Giskard-AI 维护。它经历了从 v2 到 v3 的重大重写:v3 采用模块化架构,将功能拆分为 giskard-checks(轻量测试)、giskard-scan(红队漏洞扫描)和规划中的 giskard-rag(RAG 评估)三个独立包,去掉了 v2 中的重型依赖,专注于动态、多轮对话场景下的 AI 系统评测。

简言之:Giskard 解决的是「LLM 输出不稳定,如何写测试?」和「我的 Agent 有没有安全漏洞?」这两件事。


二、解决什么问题

  1. 非确定性输出的回归测试:传统单元测试依赖精确输出匹配,但 LLM 的同一输入可能产生多个正确答案,Giskard 用 LLM-as-Judge 方式绕过这个问题。
  2. Agent 安全漏洞扫描:自动生成对抗性测试用例,覆盖 OWASP LLM Top-10 威胁类别(提示注入、有害内容、刻板印象、虚假信息等)。
  3. RAG 质量验证:检查答案是否基于检索到的上下文,而非模型幻觉。
  4. 多轮对话场景测试:不同于单轮 QA,Giskard 支持模拟完整的多轮对话流程。

三、快速安装

v3(当前 Beta,主推):

pip install giskard-checks      # 测试与评估(scenario API)
pip install giskard-scan         # 红队漏洞扫描

v2(旧版,仍可用但不维护):

pip install "giskard[llm]>2,<3"

⚠️ 注意:v3 核心包要求 Python 3.12+。v2 则兼容更广但已停止维护,新项目强烈建议使用 v3。

📊 遥测提示giskard-checks 默认发送可选的聚合使用统计,不包含任何 Prompt、输出或场景文本,可通过文档中的选项关闭。


四、核心用法

4.1 giskard-checks:编写测试(Eval)

使用 Scenario API 定义一个测试,输入问题并用 outputs 函数包装 LLM 调用:

from openai import OpenAI
from giskard.checks import Scenario, Groundedness
import asyncio

client = OpenAI()

def get_answer(inputs: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-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.",
        )
    )
)

result = asyncio.run(scenario.run())
result.print_report()

内置 Check 类型: - Groundedness:答案是否基于给定上下文 - LLMJudge:用另一个 LLM 评判输出质量 - 字符串匹配、正则、语义相似度等传统方法也有内置支持

⚠️ scenario.run() 是异步的,在脚本中需要用 asyncio.run() 包装。

4.2 giskard-scan:漏洞扫描

用自然语言描述你的 Agent,系统自动生成对抗性测试套件:

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())

扫描覆盖的威胁类别(OWASP LLM Top-10): - 提示注入(Prompt Injection) - 有害内容生成 - 刻板印象与歧视 - 虚假信息 - 数据泄露 等

内置提供提示注入载荷数据集,支持扩展自定义 ScenarioGenerator

4.3 giskard-rag(RAG 评估,尚未发布)

import pandas as pd
from giskard.rag import generate_testset, KnowledgeBase

df = pd.read_csv("path/to/knowledge_base.csv")
knowledge_base = KnowledgeBase.from_pandas(df, columns=["column_1", "column_2"])

testset = generate_testset(
    knowledge_base,
    num_questions=60,
    language="en",
    agent_description="A customer support chatbot for company X",
)

⚠️ v3 状态:目前 giskard-scan 和 RAG 评估仍依赖 Giskard v2 引擎,giskard-rag 尚在规划中,详见 v3 Announcement


五、典型适用场景

场景 推荐模块
上线前回归测试(验证修改没有破坏 LLM 输出质量) giskard-checks
发现 Agent 安全漏洞(红队演练) giskard-scan
RAG 系统答案质量评估 giskard-rag(v3 规划中,用 v2 过渡)
多轮对话流程测试 giskard-checks + Scenario
持续集成中自动跑 Evals giskard-checks

六、坑与注意

  1. Python 版本门槛:v3 核心包要求 Python 3.12+,旧项目升级前先确认环境。
  2. v3 功能不完整giskard-rag 和完全脱离 v2 的 scan 功能仍在开发中,若需要完整的 RAGET 功能,暂时仍需用 v2。
  3. run() 是异步的:常见错误是在同步函数中忘记 asyncio.run(),导致只返回一个协程对象而非结果。
  4. 遥测数据:如在意隐私,注意查看并关闭可选的使用统计上传。
  5. LLM-as-Judge 成本:每次判断都会调用一次 Judge LLM,大批量测试时需留意 API 费用。
  6. 模型兼容性:示例中用的是 OpenAI API,理论上任何兼容 OpenAI 接口的模型(如本地部署的 vLLM)都可以,需要自行适配 base_url

七、与同类对比

工具 定位 优点 缺点
Giskard v3 LLM/Agent 测试 + 漏洞扫描 模块化、轻量、v3 新架构现代化 功能不完全、RAG 评估依赖 v2
LangSmith 完整 MLOps + Eval 完整链路、可视化强 主要是闭源 SaaS,免费额度有限
Braintrust LLMPrompt/Eval 平台 简单易用、开源 SDK 偏托管,自托管功能弱
Promptfoo Prompt 对比 + 测试 强大、多模型对比 主要面向 Prompt 调优,非 Agent 专用
Giskard v2 全套 ML + LLM 测试 功能完整 依赖重、不再维护

Giskard v3 在轻量级 Agent 测试 + 安全扫描这个交集点上最具竞争力,适合不想引入 LangSmith 等重型平台、但又需要对 Agent 行为做系统化评测的团队。


八、一句话推荐结论

如果你在做 LLM Agent 开发,需要为非确定性输出写测试、或者想做红队安全扫描,Giskard v3 是目前最值得关注的开源轻量方案——尤其它的模块化设计让按需引入成为可能,不会有依赖负担。(Python 3.12+ 环境优先,生产级 RAG 评估功能需等待 v3 完善或暂时用 v2 过渡。)


来源:GitHub README · Giskard v3 Announcement Discussion · Giskard v3 Roadmap Issue