
giskard-oss giskard-checks/v1.0.4
ð¢ LLMãšãŒãžã§ã³ãåãã®ãªãŒãã³ãœãŒã¹è©äŸ¡ã»ãã¹ãã©ã€ãã©ãª
ãšãŒãžã§ã³ãã·ã¹ãã ã®ããã®Evalsãã¬ããããŒãã³ã°ããã¹ãçæ
ã¢ãžã¥ãŒã«åŒã軜éãåçããããŠAsyncãã¡ãŒã¹ã
ããã¥ã¡ã³ã ⢠ãŠã§ããµã€ã ⢠ã³ãã¥ããã£
[!IMPORTANT] Giskard v3 ã¯ãAIãšãŒãžã§ã³ãã®åçãã€ãã«ãã¿ãŒã³ã®ãã¹ãã®ããã«èšèšããããæ°èŠã«æžãçŽãããããŒãžã§ã³ã§ãããã®ãªãªãŒã¹ã§ã¯ãå¹çæ§ãé«ããããã«éãäŸåé¢ä¿ãåé€ãã€ã€ããã匷åãªAIè匱æ§ã¹ãã£ããŒãšæ¡åŒµãããRAGè©äŸ¡ãå°å ¥ããŠããŸãããããã¯ã©ã¡ãã
giskard-scanã«ãã€ãã£ãã«æèŒãããv2ãžã®äŸåã¯ãããŸããã衚圢åŒ/MLã¢ãã«çšã®ã¬ã¬ã·ãŒã¹ãã£ã³ã®ã¿ãv2å°çšã®ãŸãŸã§ãã Giskard v2 ã¯åŒãç¶ãå©çšå¯èœã§ãããç©æ¥µçãªã¡ã³ããã³ã¹ã¯è¡ãããŠããŸããã 鲿ã远ã â v3ã¢ããŠã³ã¹ãèªã · ããŒãããã
ã€ã³ã¹ããŒã«
pip install giskard # ãã§ã㯠(+ agents, llm, core)
pip install "giskard[scan]" # + èåŒ±æ§ / å質ã¹ãã£ã³
pip install "giskard[openai]" # LLMãžã£ããž / ãžã§ãã¬ãŒã¿ãŒçšãããã€ããŒSDK
Python 3.12+ ãå¿ èŠã§ãã
| Extra | 远å ããããã® |
|---|---|
| (ãªã) | giskard-checks ãšäŸåé¢ä¿ |
scan | giskard-scan |
openai / anthropic / ⊠| ãããã€ããŒSDK (pyproject.toml ã®ãªãã·ã§ã³äŸåé¢ä¿ãåç
§) |
ãã¬ã¡ããªãŒ: giskard-core ã«ãããªãã·ã§ã³ã®éèšåæãããã³ãããåºåã¯éä¿¡ãããŸããã
Giskardãã€ã³ããŒãããåã«ãªããã¢ãŠã: export DO_NOT_TRACK=1 ãŸã㯠export GISKARD_TELEMETRY_DISABLED=1
詳现: giskard-core README
Giskardã¯ããšãŒãžã§ã³ãã·ã¹ãã ã®ãã¹ããšè©äŸ¡ã®ããã®ãªãŒãã³ãœãŒã¹ã®Pythonã©ã€ãã©ãªã§ããv3ã¢ãŒããã¯ãã£ã¯ãå¿ èŠãªäŸåé¢ä¿ã®ã¿ãæã€ãçŠç¹ãçµã£ãããã±ãŒãžçŸ€ãããªãã¢ãžã¥ãŒã«åŒã®ã»ããã§ãããLLMããã©ãã¯ããã¯ã¹ãšãŒãžã§ã³ãããã«ãã¹ããããã€ãã©ã€ã³ãªã©ããããããã®ãã©ããã§ããããã«ãŒãããæ§ç¯ãããŠããŸãã
| ã¹ããŒã¿ã¹ | ããã±ãŒãž | 説æ |
|---|---|---|
| â å®å®ç | giskard-checks | ãã¹ããšè©äŸ¡ â ã·ããªãªAPIãçµã¿èŸŒã¿ãã§ãã¯ãLLM-as-judge |
| â å®å®ç | giskard-scan | ãšãŒãžã§ã³ãè匱æ§ã¹ãã£ã㌠+ RAG/å質è©äŸ¡ â ã¬ããããŒãã³ã°ãããã³ããã€ã³ãžã§ã¯ã·ã§ã³ãè±çãæå®³ã³ã³ãã³ã (vulnerability_scanãv2 Scan ã®åŸç¶)ãããã³ãã¬ããžããŒã¹å質è©äŸ¡ (quality_scanãv2 RAGET ã®åŸç¶) |
ãããã¯ãgiskard-core (å
±æãŠãŒãã£ãªãã£ãšãã¬ã¡ããªãŒ)ãgiskard-llm (ãããã€ããŒã«äŸåããªãLLMã«ãŒãã£ã³ã°)ãgiskard-agents (ãšãŒãžã§ã³ããšã¯ãŒã¯ãããŒã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³) ãšãã3ã€ã®åºç€ã©ã€ãã©ãªã®äžã«æ§ç¯ãããŠããããããã¯èªåçã«åã蟌ãŸããçŽæ¥äœ¿çšãããããšã¯ã»ãšãã©ãããŸããã
Giskard Checks â ãšãŒãžã§ã³ãããã¹ãããããã®Evalsã®äœæãšé©çš
pip install giskard-checks
Giskard Checks ã¯ãLLMããŒã¹ã®ã·ã¹ãã ããã¹ãããè©äŸ¡ (evals) ãäœæããããã®è»œéã©ã€ãã©ãªã§ããåçŽãªã¢ãµãŒã·ã§ã³ããLLM-as-judgeè©äŸ¡ãŸã§ãã«ããŒããŸããåŸæ¥ã®ãŠããããã¹ããšã¯ç°ãªããevalsã¯é決å®çãªåºåã®ããã«èšèšãããŠãããåãå ¥åã«å¯ŸããŠç°ãªãæå¹ãªå¿çãçæãããå¯èœæ§ããããŸãã
Giskard Checksã以äžã®çšéã«äœ¿çšããŸã:
- ãªã°ã¬ãã·ã§ã³ã®æ€åº â 倿ŽåŸãã·ã¹ãã ãæ£ããåäœããããšã確èª
- RAGåè³ªã®æ€èšŒ â åçãååŸãããã³ã³ããã¹ãã«åºã¥ããŠãããã確èª
- å®å šæ§ã«ãŒã«ã®é©çš â åºåãã³ã³ãã³ãããªã·ãŒã«æºæ ããŠããããšã確èª
- ãã«ãã¿ãŒã³ãšãŒãžã§ã³ãã®è©äŸ¡ â åäžã®ããåãã ãã§ãªããäŒè©±å šäœããã¹ã
çµã¿èŸŒã¿ã®evalsã«ã¯ãæååãããã³ã°ãæ¯èŒãæ£èŠè¡šçŸãæå³çé¡äŒŒæ§ãããã³LLM-as-judgeãã§ã㯠(GroundednessãConformityãLLMJudge) ãå«ãŸããŸãã
æŠå¿µ
- Target â ãã¹ã察象ã®ã·ã¹ãã : ä»»æã®åæ/éåæåŒã³åºãå¯èœãªããžã§ã¯ã
(inputs) -> outputs(ãªãã·ã§ã³ã§traceä»ã) - Scenario â 1ã€ã®eval: ã€ã³ã¿ã©ã¯ã·ã§ã³ + ãã§ãã¯
- Check â ãã¬ãŒã¹ã«å¯Ÿããã¢ãµãŒã·ã§ã³ãŸãã¯LLMãžã£ããž
- Suite â äžç·ã«å®è¡ããã倿°ã®ã·ããªãª
giskard.agents.Generator ã¯ãã¯ãŒã¯ãããŒ/ãžã£ããžçšã®LLMã¯ã©ã€ã¢ã³ãã§ãããŠãŒã¶ãŒã¡ãã»ãŒãžãåæãã giskard.checks ã®å
¥åãžã§ãã¬ãŒã¿ãŒ (LLMGenerator) ãšã¯ç°ãªããŸãã
ã¯ã€ãã¯ã¹ã¿ãŒã
import asyncio
from giskard.checks import Scenario, Groundedness
def get_answer(inputs: str) -> str:
return "Paris" # ã¢ãã« / ãšãŒãžã§ã³ãã«çœ®ãæããŠãã ãã
async def main() -> None:
scenario = (
Scenario("test_france_capital")
.interact(inputs="What is the capital of France?", outputs=get_answer)
.check(
Groundedness(
name="answer is grounded",
context="France is in Western Europe. Its capital is Paris.",
)
)
)
result = await scenario.run()
result.print_report()
asyncio.run(main())
Groundedness ã¯LLMãžã£ããžã§ãããããã€ããŒã®extra (äŸ: pip install "giskard[openai]") ãã€ã³ã¹ããŒã«ãã察å¿ããAPIããŒãèšå®ããŠãã ãããããã©ã«ãã¢ãã«: openai/gpt-4o-miniã
SuitesãLLMJudgeããã«ãã¿ãŒã³ã·ããªãªãªã©ã«ã€ããŠã¯ãå®å
šãªããã¥ã¡ã³ã ãåç
§ããŠãã ããã
Giskard Scan â AIãšãŒãžã§ã³ãçšã®è匱æ§ã¹ãã£ããŒ
pip install "giskard[scan]" # ãŸãã¯: pip install giskard-scan
Giskard Scan ã¯ããšãŒãžã§ã³ãã·ã¹ãã ã®ã¬ããããŒãã³ã°ããã³è匱æ§ã¹ãã£ã³ã¬ã€ã€ãŒã§ãããšãŒãžã§ã³ãã®å¹³æãªè±èªã§ã®èª¬æãããããã³ããã€ã³ãžã§ã¯ã·ã§ã³ãæå®³ã³ã³ãã³ããã¹ãã¬ãªã¿ã€ãã誀æ å ±ãªã©ãã«ããŒããæµå¯Ÿçãã¹ãã¹ã€ãŒããèªåçã«çæããŸãã
Giskard Scanã以äžã®çšéã«äœ¿çšããŸã:
- ãšãŒãžã§ã³ãã®ã¬ããããŒãã³ã° â OWASP LLM Top-10è åšã«ããŽãªã«ãããæµå¯Ÿçå ¥åãèªåçæ
- ããã³ããã€ã³ãžã§ã¯ã·ã§ã³ãããŒãã®å®è¡ â ããã«äœ¿çšã§ããã€ã³ãžã§ã¯ã·ã§ã³ãã€ããŒãã®çµã¿èŸŒã¿ããŒã¿ã»ãã
- ã«ã¹ã¿ã ãžã§ãã¬ãŒã¿ãŒã«ããæ¡åŒµ â ç¬èªã®
ScenarioGeneratorã€ã³ã¹ã¿ã³ã¹ãgenerate_suiteã«æž¡ãããvulnerability_suite_generator_registryã«ç»é²
ã¯ã€ãã¯ã¹ã¿ãŒã
import asyncio
from giskard.scan import vulnerability_scan
async def my_agent(inputs: str) -> str:
# ãšãŒãžã§ã³ã / ã¢ãã«ã®åŒã³åºãã«çœ®ãæããŠãã ãã
return f"Echo: {inputs}"
async def main() -> None:
await vulnerability_scan(
target=my_agent,
description="A customer support chatbot for an e-commerce platform.",
languages=["en"],
)
asyncio.run(main())
ã¹ãã£ã³ãžã§ãã¬ãŒã¿ãŒã«ããäžèšã®Checksãžã£ããžãšåæ§ã«ãLLMãããã€ããŒã®extraãšAPIããŒãå¿ èŠã§ãã
Giskard v2ããæ¢ãã§ãã?
Giskard v2ã«ã¯ãScan (èªåèåŒ±æ§æ€åº) ãšRAGET (RAGè©äŸ¡ãã¹ãã»ããçæ) ãå«ãŸããŠããŸããã
LLMãšãŒãžã§ã³ãã®å Žåãäž¡æ¹ãšãv3ã§ã¯ giskard-scan ã«çœ®ãæããããŠããŸã: v2ã®LLMã¹ãã£ã³ã®ä»£ããã« vulnerability_scan ããRAGETã®ä»£ããã« quality_scan (KnowledgeBase ä»ã) ã䜿çšããŠãã ããã
v3ã¯MLã¢ãã«ã§ãåäœããŸã â ã¢ãã«ãã¿ãŒã²ãããšããŠã©ããããgiskard-checks ãŸã㯠giskard-scan ã§è©äŸ¡ããŸãã以äžã®äŸãã«ããŒããŠããã®ã¯ãv2å°çšã®èªå衚圢åŒã¹ãã£ã³ â giskard.Model + giskard.Dataset ãæ€æ»ããŠããã©ãŒãã³ã¹ããã€ã¢ã¹ãå
ç¢æ§ã®åé¡ãèªåæ€åºããæ€åºåšã¹ã€ãŒã â ãšãgiskard.testing MLãã¹ãã¹ã€ãŒããããã³Giskard Hubã§ãããããã¯v3ã§ã¯èšç»ãããŠããŸããã
pip install "giskard[llm]>2,<3"
Scan â ããã©ãŒãã³ã¹ããã€ã¢ã¹ãã»ãã¥ãªãã£ã®åé¡ãèªåæ€åº
ã¢ãã«ãã©ããããŠã¹ãã£ã³ãå®è¡ããŸã:
import giskard
import pandas as pd
# my_llm_chain ãå®éã®LLMãã§ãŒã³ãŸãã¯ã¢ãã«æšè«ããžãã¯ã«çœ®ãæããŠãã ãã
def model_predict(df: pd.DataFrame):
"""ãã®é¢æ°ã¯DataFrameãåãåããåºåã®ãªã¹ã (è¡ããšã«1ã€) ãè¿ãå¿
èŠããããŸãã"""
return [my_llm_chain.run({"query": question}) for question in df["question"]]
giskard_model = giskard.Model(
model=model_predict,
model_type="text_generation",
name="My LLM Application",
description="A question answering assistant",
feature_names=["question"],
)
scan_results = giskard.scan(giskard_model)
display(scan_results)
RAGET â RAGã¢ããªã±ãŒã·ã§ã³çšã®è©äŸ¡ããŒã¿ã»ãããçæ
ãã¬ããžããŒã¹ãã質åãåç §åçãã³ã³ããã¹ããèªåçæããŸã:
import pandas as pd
from giskard.rag import generate_testset, KnowledgeBase
# ãã¬ããžããŒã¹ã®ããã¥ã¡ã³ããèªã¿èŸŒã
df = pd.read_csv("path/to/your/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",
)
ð ã³ãã¥ããã£
AIã³ãã¥ããã£ããã®è²¢ç®ãæè¿ããŸã! å§ããã«ã¯ãã®ã¬ã€ãããèªã¿ããã ããDiscord ã§æŽ»æ°ããã³ãã¥ããã£ã«åå ããŠãã ããã
鲿ããã©ããŒããŠãã£ãŒãããã¯ãå ±æ: v3ã¢ããŠã³ã¹ · ããŒãããã
ð ã¹ã¿ãŒãæ®ããŠãã ããããããžã§ã¯ããä»ã®äººã«çºèŠãããåªãããªãŒãã³ãœãŒã¹ããŒã«ãæ§ç¯ãç¶ããã¢ãããŒã·ã§ã³ã«ã€ãªãããŸã! ð
â€ïž ç§ãã¡ã®äœæ¥ã圹ã«ç«ã€ãšæãããããGitHubã§ã¹ãã³ãµãŒã«ãªãããšããæ€èšãã ãããæ¯æã®ã¹ãã³ãµãŒã·ããã§ãã¹ãã³ãµãŒãããžãååŸãããã®readmeã«äŒç€Ÿã衚瀺ãããã°ã¬ããŒããåªå çã«åŠçããŠãããããšãã§ããŸããã³ã³ãµã«ãã£ã³ã°ãããžã§ã¯ããžã®åå ãã¯ãŒã¯ã·ã§ããã®éå¬ã貎瀟ã§ã®è¬æŒããåžæã®å Žåã¯ãäžåéãã®ã¹ãã³ãµãŒã·ãããæäŸããŠããŸãã