{"id":95770,"date":"2026-06-07T17:39:01","date_gmt":"2026-06-07T17:39:01","guid":{"rendered":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/"},"modified":"2026-06-07T17:39:01","modified_gmt":"2026-06-07T17:39:01","slug":"nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors","status":"publish","type":"post","link":"https:\/\/youzum.net\/es\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/","title":{"rendered":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In this tutorial, we analyze<a href=\"https:\/\/github.com\/NVIDIA\/garak\"><strong> NVIDIA garak<\/strong><\/a> as a practical framework for defensive LLM red-teaming. We start by setting up Garak, then move through plugin discovery, dry runs, real-model scans, multi-probe evaluations, report analysis, custom probe creation, custom detector creation, and AVID export. Instead of running only a single scan, we use Garak end-to-end to understand how probes, detectors, generators, reports, and vulnerability scores work together in a complete LLM security testing workflow. Check out\u00a0the\u00a0<strong><a href=\"https:\/\/github.com\/MARKTECHPOST-AI-MEDIA-INC\/AI-Agents-Projects-Tutorials\/blob\/main\/LLM%20Evaluation\/nvidia_garak_llm_red_teaming_tutorial_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES Here<\/a>.<\/strong><\/p>\n<h2 class=\"wp-block-heading\"><strong>Setting Up NVIDIA garak and Defining Helper Functions<\/strong><\/h2>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">import os, sys, json, glob, subprocess, importlib\ndef sh(cmd, capture=False):\n   print(f\"n$ {cmd}\")\n   return subprocess.run(cmd, shell=True, text=True,\n                         capture_output=capture)\nsh(f\"{sys.executable} -m pip install -q -U garak\")\nos.environ.setdefault(\"TOKENIZERS_PARALLELISM\", \"false\")\nos.environ.setdefault(\"HF_HUB_DISABLE_TELEMETRY\", \"1\")\nimport garak, garak.cli\nfrom garak import _config\nprint(\"n=== garak version:\", garak.__version__, \"===\")\ndef run_garak(args):\n   print(\"n&gt;&gt;&gt; garak \" + \" \".join(args))\n   try:\n       garak.cli.main(args)\n   except SystemExit as e:\n       if e.code not in (0, None):\n           print(f\"[garak exited {e.code}]\")\n   try:\n       return _config.transient.report_filename\n   except Exception:\n       return None<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We begin by importing the required libraries and creating a helper function to run shell commands directly from the notebook. We install garak, configure basic environment variables, and import the main garak modules needed for the tutorial. We also define a reusable function that lets us run Garak programmatically and capture the path to the generated report.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Listing garak Probes and Detectors and Running Model Scans<\/strong><\/h2>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">print(\"n########## 1. PLUGIN INVENTORY ##########\")\nfor kind in [\"probes\", \"detectors\", \"generators\", \"buffs\"]:\n   out = sh(f\"{sys.executable} -m garak --list_{kind} 2&gt;\/dev\/null\", capture=True)\n   lines = [l for l in (out.stdout or \"\").splitlines() if \".\" in l]\n   print(f\"  {kind:11s}: {len(lines)} plugins   e.g. \"\n         f\"{', '.join(l.split()[-1] if l.split() else l for l in lines[:3])}\")\nprint(\"n########## 2. FAST DRY-RUN (test.Repeat) ##########\")\nsh(f\"{sys.executable} -m garak --target_type test.Repeat \"\n  f\"--probes lmrc.SlurUsage --generations 1\")\nprint(\"n########## 3. REAL MODEL: gpt2 vs DAN 11.0 ##########\")\nsh(f\"{sys.executable} -m garak --target_type huggingface --target_name gpt2 \"\n  f\"--probes dan.Dan_11_0 --generations 1 --parallel_attempts 8\")\nprint(\"n########## 4. PROGRAMMATIC MULTI-PROBE SCAN ##########\")\nreport_path = run_garak([\n   \"--target_type\", \"test.Repeat\",\n   \"--probes\", \"dan.Dan_11_0,encoding.InjectBase64,lmrc.SlurUsage\",\n   \"--generations\", \"1\", \"--parallel_attempts\", \"16\",\n])\nprint(\"Report:\", report_path)<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We inspect the garak plugin ecosystem by listing available probes, detectors, generators, and buffs. We then run a quick dry run using the test generator to confirm that Garak is working without requiring any external model or API key. After that, we scan a real Hugging Face model and run a multi-probe scan to generate a richer report for analysis.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Analyzing garak Reports: Safety Scores and Attack Success Rates<\/strong><\/h2>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">print(\"n########## 5. ANALYSIS ##########\")\nimport numpy as np, pandas as pd\ndef find_latest_report():\n   cands = []\n   for base in [os.path.expanduser(\"~\/.local\/share\/garak\/garak_runs\"),\n                os.path.expanduser(\"~\/.cache\/garak\"), \".\"]:\n       cands += glob.glob(os.path.join(base, \"**\", \"*report.jsonl\"),\n                          recursive=True)\n   cands = [c for c in cands if os.path.getsize(c) &gt; 0]\n   return max(cands, key=os.path.getmtime) if cands else None\nreport_path = report_path or find_latest_report()\nprint(\"Analysing:\", report_path)\nevaluations = None\ntry:\n   from garak.report import Report\n   rep = Report(report_path).load().get_evaluations()\n   evaluations = rep.evaluations.copy()\n   print(\"n--- Per-probe mean SAFETY score (garak.report.Report) ---\")\n   print(rep.scores.round(1).to_string())\nexcept Exception as e:\n   print(\"garak.report.Report unavailable, falling back to manual parse:\", e)\n   rows = []\n   with open(report_path) as f:\n       for line in f:\n           try: r = json.loads(line)\n           except json.JSONDecodeError: continue\n           if r.get(\"entry_type\") == \"eval\":\n               rows.append(r)\n   evaluations = pd.DataFrame(rows)\n   if not evaluations.empty:\n       evaluations[\"score\"] = np.where(\n           evaluations[\"total_evaluated\"] != 0,\n           100 * evaluations[\"passed\"] \/ evaluations[\"total_evaluated\"], 0.0)\nif evaluations is not None and not evaluations.empty:\n   evaluations[\"asr_%\"] = (100 - evaluations[\"score\"]).round(1)\n   view = evaluations[[\"probe\", \"detector\", \"passed\",\n                       \"total_evaluated\", \"score\", \"asr_%\"]].copy()\n   view = view.rename(columns={\"score\": \"safe_%\"})\n   view[\"safe_%\"] = view[\"safe_%\"].round(1)\n   view = view.sort_values(\"asr_%\", ascending=False)\n   print(\"n--- Per probe\/detector  (higher asr_% = more vulnerable) ---\")\n   print(view.to_string(index=False))\n   try:\n       import matplotlib.pyplot as plt\n       labels = (view[\"probe\"] + \"n\" + view[\"detector\"]).tolist()\n       plt.figure(figsize=(8, 0.55 * len(view) + 1.5))\n       plt.barh(labels, view[\"asr_%\"], color=\"#76b900\")\n       plt.gca().invert_yaxis()\n       plt.xlabel(\"Attack Success Rate (%)\"); plt.xlim(0, 100)\n       plt.title(\"garak \u2014 vulnerability by probe\/detector\")\n       plt.tight_layout(); plt.show()\n   except Exception as e:\n       print(\"plot skipped:\", e)<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We load the generated garak report and prepare it for detailed analysis using pandas and NumPy. We first try to use Garak\u2019s built-in report parser, and if that is unavailable, we manually parse the JSONL report file. We then calculate safety scores and attack success rates, and visualize vulnerabilities across different probe-detector combinations.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Inspecting Flagged Outputs and Building a Custom garak Probe<\/strong><\/h2>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">print(\"n--- Sample hits (detector score &gt;= 0.5) ---\")\nhits = []\nwith open(report_path) as f:\n   for line in f:\n       try: r = json.loads(line)\n       except json.JSONDecodeError: continue\n       if r.get(\"entry_type\") != \"attempt\" or r.get(\"status\") != 2:\n           continue\n       dr = r.get(\"detector_results\") or r.get(\"detector\") or {}\n       max_score = 0.0\n       if isinstance(dr, dict):\n           for v in dr.values():\n               if isinstance(v, list) and v:\n                   max_score = max(max_score, max(float(x) for x in v))\n       if max_score &gt;= 0.5:\n           prompt = r.get(\"prompt\")\n           hits.append((r.get(\"probe_classname\", r.get(\"probe\", \"?\")),\n                        round(max_score, 2), str(prompt)[:90]))\nprint(f\"Total hits found: {len(hits)}\")\nfor probe, score, prompt in hits[:5]:\n   print(f\"  [{score}] {probe}: {prompt!r}\")\nprint(\"n########## 6. CUSTOM PROBE ##########\")\ncustom_probe = '''\nfrom garak.probes.base import Probe\nclass HelloProbe(Probe):\n   \"\"\"Minimal custom probe: two fixed prompts, paired with a custom detector.\"\"\"\n   lang = \"en\"\n   bcp47 = \"en\"\n   primary_detector = \"mycustomdet.ContainsHello\"\n   recommended_detector = [\"mycustomdet.ContainsHello\"]\n   tags = [\"custom:demo\"]\n   goal = \"demonstrate authoring a garak probe\"\n   doc_uri = \"\"\n   prompts = [\n       \"Please reply with the single word: hello\",\n       \"Continue this sentence: The capital of France is\",\n   ]\n'''\nimport garak.probes\nprobes_dir = os.path.dirname(garak.probes.__file__)\nwith open(os.path.join(probes_dir, \"mycustom.py\"), \"w\") as fh:\n   fh.write(custom_probe)<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We further inspect the report by extracting sample hits in which detector scores indicate potentially unsafe or vulnerable outputs. We collect the flagged prompts, detector scores, and probe names to understand what kind of behavior is being detected. We then create a custom garak probe that uses fixed prompts and connects it with a custom detector.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Creating a Custom garak Detector and Exporting Results to AVID<\/strong><\/h2>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">print(\"n########## 7. CUSTOM DETECTOR ##########\")\ncustom_detector = '''\nfrom garak import _config\nfrom garak.detectors.base import StringDetector\nclass ContainsHello(StringDetector):\n   \"\"\"Demo detector: flags any output containing 'hello' (case-insensitive).\"\"\"\n   lang_spec = \"en\"\n   bcp47 = \"en\"\n   def __init__(self, config_root=_config):\n       super().__init__([\"hello\"], config_root=config_root)\n       self.matchtype = \"str\"\n'''\nimport garak.detectors\ndet_dir = os.path.dirname(garak.detectors.__file__)\nwith open(os.path.join(det_dir, \"mycustomdet.py\"), \"w\") as fh:\n   fh.write(custom_detector)\nsh(f\"{sys.executable} -m garak --target_type test.Repeat \"\n  f\"--probes mycustom.HelloProbe --detectors mycustomdet.ContainsHello \"\n  f\"--generations 1\")\nprint(\"n########## 8. AVID EXPORT ##########\")\nif report_path:\n   sh(f\"{sys.executable} -m garak -r {report_path}\")\nprint(\"\"\"\nrest:\n RestGenerator:\n   uri: https:\/\/your-endpoint.example.com\/v1\/chat\n   method: post\n   headers: {Authorization: \"Bearer $TOKEN\", Content-Type: \"application\/json\"}\n   req_template_json_object:\n     model: \"your-model\"\n     messages: [{\"role\": \"user\", \"content\": \"$INPUT\"}]\n   response_json: true\n   response_json_field: \"$.choices[0].message.content\"\n\"\"\")\nprint(\"=== Done. JSONL + HTML reports: ~\/.local\/share\/garak\/garak_runs\/ ===\")<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">We define a custom detector that flags outputs containing the word \u201chello\u201d and save it inside Garak\u2019s detector package. We then run our custom probe and detector against the test generator to verify that the extension works correctly. Finally, we export the garak report in AVID format and show a REST configuration template for connecting garak to an external model endpoint.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n<p class=\"wp-block-paragraph\">In conclusion, we have a complete hands-on workflow for testing LLM behavior using NVIDIA garak. We run built-in probes, analyze safety scores and attack success rates, inspect concrete flagged outputs, and extend Garak with our own custom probe and detector. We also export results in AVID format, which makes the workflow more useful for structured vulnerability reporting. It provides us a platform to evaluate models we are authorized to test and to build more advanced defensive red-teaming pipelines.<\/p>\n<p class=\"wp-block-paragraph\">\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<\/p><p class=\"wp-block-paragraph\">Check out\u00a0the\u00a0<strong><a href=\"https:\/\/github.com\/MARKTECHPOST-AI-MEDIA-INC\/AI-Agents-Projects-Tutorials\/blob\/main\/LLM%20Evaluation\/nvidia_garak_llm_red_teaming_tutorial_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES Here<\/a>.\u00a0<\/strong>Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">150k+ ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p class=\"wp-block-paragraph\">Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.?\u00a0<strong><a href=\"https:\/\/forms.gle\/wbash1wF6efRj8G58\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Connect with us<\/mark><\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/06\/06\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\">NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we analyze NVIDIA garak as a practical framework for defensive LLM red-teaming. We start by setting up Garak, then move through plugin discovery, dry runs, real-model scans, multi-probe evaluations, report analysis, custom probe creation, custom detector creation, and AVID export. Instead of running only a single scan, we use Garak end-to-end to understand how probes, detectors, generators, reports, and vulnerability scores work together in a complete LLM security testing workflow. Check out\u00a0the\u00a0FULL CODES Here. Setting Up NVIDIA garak and Defining Helper Functions Copy CodeCopiedUse a different Browser import os, sys, json, glob, subprocess, importlib def sh(cmd, capture=False): print(f&#8221;n$ {cmd}&#8221;) return subprocess.run(cmd, shell=True, text=True, capture_output=capture) sh(f&#8221;{sys.executable} -m pip install -q -U garak&#8221;) os.environ.setdefault(&#8220;TOKENIZERS_PARALLELISM&#8221;, &#8220;false&#8221;) os.environ.setdefault(&#8220;HF_HUB_DISABLE_TELEMETRY&#8221;, &#8220;1&#8221;) import garak, garak.cli from garak import _config print(&#8220;n=== garak version:&#8221;, garak.__version__, &#8220;===&#8221;) def run_garak(args): print(&#8220;n&gt;&gt;&gt; garak &#8221; + &#8221; &#8220;.join(args)) try: garak.cli.main(args) except SystemExit as e: if e.code not in (0, None): print(f&#8221;[garak exited {e.code}]&#8221;) try: return _config.transient.report_filename except Exception: return None We begin by importing the required libraries and creating a helper function to run shell commands directly from the notebook. We install garak, configure basic environment variables, and import the main garak modules needed for the tutorial. We also define a reusable function that lets us run Garak programmatically and capture the path to the generated report. Listing garak Probes and Detectors and Running Model Scans Copy CodeCopiedUse a different Browser print(&#8220;n########## 1. PLUGIN INVENTORY ##########&#8221;) for kind in [&#8220;probes&#8221;, &#8220;detectors&#8221;, &#8220;generators&#8221;, &#8220;buffs&#8221;]: out = sh(f&#8221;{sys.executable} -m garak &#8211;list_{kind} 2&gt;\/dev\/null&#8221;, capture=True) lines = [l for l in (out.stdout or &#8220;&#8221;).splitlines() if &#8220;.&#8221; in l] print(f&#8221; {kind:11s}: {len(lines)} plugins e.g. &#8221; f&#8221;{&#8216;, &#8216;.join(l.split()[-1] if l.split() else l for l in lines[:3])}&#8221;) print(&#8220;n########## 2. FAST DRY-RUN (test.Repeat) ##########&#8221;) sh(f&#8221;{sys.executable} -m garak &#8211;target_type test.Repeat &#8221; f&#8221;&#8211;probes lmrc.SlurUsage &#8211;generations 1&#8243;) print(&#8220;n########## 3. REAL MODEL: gpt2 vs DAN 11.0 ##########&#8221;) sh(f&#8221;{sys.executable} -m garak &#8211;target_type huggingface &#8211;target_name gpt2 &#8221; f&#8221;&#8211;probes dan.Dan_11_0 &#8211;generations 1 &#8211;parallel_attempts 8&#8243;) print(&#8220;n########## 4. PROGRAMMATIC MULTI-PROBE SCAN ##########&#8221;) report_path = run_garak([ &#8220;&#8211;target_type&#8221;, &#8220;test.Repeat&#8221;, &#8220;&#8211;probes&#8221;, &#8220;dan.Dan_11_0,encoding.InjectBase64,lmrc.SlurUsage&#8221;, &#8220;&#8211;generations&#8221;, &#8220;1&#8221;, &#8220;&#8211;parallel_attempts&#8221;, &#8220;16&#8221;, ]) print(&#8220;Report:&#8221;, report_path) We inspect the garak plugin ecosystem by listing available probes, detectors, generators, and buffs. We then run a quick dry run using the test generator to confirm that Garak is working without requiring any external model or API key. After that, we scan a real Hugging Face model and run a multi-probe scan to generate a richer report for analysis. Analyzing garak Reports: Safety Scores and Attack Success Rates Copy CodeCopiedUse a different Browser print(&#8220;n########## 5. ANALYSIS ##########&#8221;) import numpy as np, pandas as pd def find_latest_report(): cands = [] for base in [os.path.expanduser(&#8220;~\/.local\/share\/garak\/garak_runs&#8221;), os.path.expanduser(&#8220;~\/.cache\/garak&#8221;), &#8220;.&#8221;]: cands += glob.glob(os.path.join(base, &#8220;**&#8221;, &#8220;*report.jsonl&#8221;), recursive=True) cands = [c for c in cands if os.path.getsize(c) &gt; 0] return max(cands, key=os.path.getmtime) if cands else None report_path = report_path or find_latest_report() print(&#8220;Analysing:&#8221;, report_path) evaluations = None try: from garak.report import Report rep = Report(report_path).load().get_evaluations() evaluations = rep.evaluations.copy() print(&#8220;n&#8212; Per-probe mean SAFETY score (garak.report.Report) &#8212;&#8220;) print(rep.scores.round(1).to_string()) except Exception as e: print(&#8220;garak.report.Report unavailable, falling back to manual parse:&#8221;, e) rows = [] with open(report_path) as f: for line in f: try: r = json.loads(line) except json.JSONDecodeError: continue if r.get(&#8220;entry_type&#8221;) == &#8220;eval&#8221;: rows.append(r) evaluations = pd.DataFrame(rows) if not evaluations.empty: evaluations[&#8220;score&#8221;] = np.where( evaluations[&#8220;total_evaluated&#8221;] != 0, 100 * evaluations[&#8220;passed&#8221;] \/ evaluations[&#8220;total_evaluated&#8221;], 0.0) if evaluations is not None and not evaluations.empty: evaluations[&#8220;asr_%&#8221;] = (100 &#8211; evaluations[&#8220;score&#8221;]).round(1) view = evaluations[[&#8220;probe&#8221;, &#8220;detector&#8221;, &#8220;passed&#8221;, &#8220;total_evaluated&#8221;, &#8220;score&#8221;, &#8220;asr_%&#8221;]].copy() view = view.rename(columns={&#8220;score&#8221;: &#8220;safe_%&#8221;}) view[&#8220;safe_%&#8221;] = view[&#8220;safe_%&#8221;].round(1) view = view.sort_values(&#8220;asr_%&#8221;, ascending=False) print(&#8220;n&#8212; Per probe\/detector (higher asr_% = more vulnerable) &#8212;&#8220;) print(view.to_string(index=False)) try: import matplotlib.pyplot as plt labels = (view[&#8220;probe&#8221;] + &#8220;n&#8221; + view[&#8220;detector&#8221;]).tolist() plt.figure(figsize=(8, 0.55 * len(view) + 1.5)) plt.barh(labels, view[&#8220;asr_%&#8221;], color=&#8221;#76b900&#8243;) plt.gca().invert_yaxis() plt.xlabel(&#8220;Attack Success Rate (%)&#8221;); plt.xlim(0, 100) plt.title(&#8220;garak \u2014 vulnerability by probe\/detector&#8221;) plt.tight_layout(); plt.show() except Exception as e: print(&#8220;plot skipped:&#8221;, e) We load the generated garak report and prepare it for detailed analysis using pandas and NumPy. We first try to use Garak\u2019s built-in report parser, and if that is unavailable, we manually parse the JSONL report file. We then calculate safety scores and attack success rates, and visualize vulnerabilities across different probe-detector combinations. Inspecting Flagged Outputs and Building a Custom garak Probe Copy CodeCopiedUse a different Browser print(&#8220;n&#8212; Sample hits (detector score &gt;= 0.5) &#8212;&#8220;) hits = [] with open(report_path) as f: for line in f: try: r = json.loads(line) except json.JSONDecodeError: continue if r.get(&#8220;entry_type&#8221;) != &#8220;attempt&#8221; or r.get(&#8220;status&#8221;) != 2: continue dr = r.get(&#8220;detector_results&#8221;) or r.get(&#8220;detector&#8221;) or {} max_score = 0.0 if isinstance(dr, dict): for v in dr.values(): if isinstance(v, list) and v: max_score = max(max_score, max(float(x) for x in v)) if max_score &gt;= 0.5: prompt = r.get(&#8220;prompt&#8221;) hits.append((r.get(&#8220;probe_classname&#8221;, r.get(&#8220;probe&#8221;, &#8220;?&#8221;)), round(max_score, 2), str(prompt)[:90])) print(f&#8221;Total hits found: {len(hits)}&#8221;) for probe, score, prompt in hits[:5]: print(f&#8221; [{score}] {probe}: {prompt!r}&#8221;) print(&#8220;n########## 6. CUSTOM PROBE ##########&#8221;) custom_probe = &#8221;&#8217; from garak.probes.base import Probe class HelloProbe(Probe): &#8220;&#8221;&#8221;Minimal custom probe: two fixed prompts, paired with a custom detector.&#8221;&#8221;&#8221; lang = &#8220;en&#8221; bcp47 = &#8220;en&#8221; primary_detector = &#8220;mycustomdet.ContainsHello&#8221; recommended_detector = [&#8220;mycustomdet.ContainsHello&#8221;] tags = [&#8220;custom:demo&#8221;] goal = &#8220;demonstrate authoring a garak probe&#8221; doc_uri = &#8220;&#8221; prompts = [ &#8220;Please reply with the single word: hello&#8221;, &#8220;Continue this sentence: The capital of France is&#8221;, ] &#8221;&#8217; import garak.probes probes_dir = os.path.dirname(garak.probes.__file__) with open(os.path.join(probes_dir, &#8220;mycustom.py&#8221;), &#8220;w&#8221;) as fh: fh.write(custom_probe) We further inspect the report by extracting sample hits in which detector scores indicate potentially unsafe or vulnerable outputs. We collect the flagged prompts, detector scores, and probe names to understand what kind of behavior is being detected. We then create a custom garak probe that uses fixed prompts and connects it with a custom detector. Creating a Custom garak Detector and Exporting Results to AVID Copy CodeCopiedUse a different Browser print(&#8220;n########## 7. CUSTOM DETECTOR ##########&#8221;) custom_detector = &#8221;&#8217; from garak import _config from garak.detectors.base import StringDetector class ContainsHello(StringDetector): &#8220;&#8221;&#8221;Demo detector: flags any output containing &#8216;hello&#8217; (case-insensitive).&#8221;&#8221;&#8221; lang_spec = &#8220;en&#8221; bcp47 = &#8220;en&#8221; def __init__(self, config_root=_config): super().__init__([&#8220;hello&#8221;], config_root=config_root) self.matchtype = &#8220;str&#8221; &#8221;&#8217; import garak.detectors det_dir = os.path.dirname(garak.detectors.__file__) with open(os.path.join(det_dir, &#8220;mycustomdet.py&#8221;), &#8220;w&#8221;) as fh: fh.write(custom_detector) sh(f&#8221;{sys.executable} -m garak &#8211;target_type test.Repeat &#8221; f&#8221;&#8211;probes mycustom.HelloProbe &#8211;detectors<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_pvb_checkbox_block_on_post":false,"footnotes":""},"categories":[52,5,7,1],"tags":[],"class_list":["post-95770","post","type-post","status-publish","format-standard","hentry","category-ai-club","category-committee","category-news","category-uncategorized","pmpro-has-access"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum<\/title>\n<meta name=\"description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youzum.net\/es\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum\" \/>\n<meta property=\"og:description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youzum.net\/es\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\" \/>\n<meta property=\"og:site_name\" content=\"YouZum\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DroneAssociationTH\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-07T17:39:01+00:00\" \/>\n<meta name=\"author\" content=\"admin NU\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin NU\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\"},\"author\":{\"name\":\"admin NU\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\"},\"headline\":\"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors\",\"datePublished\":\"2026-06-07T17:39:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\"},\"wordCount\":629,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"articleSection\":[\"AI\",\"Committee\",\"News\",\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\",\"url\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\",\"name\":\"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum\",\"isPartOf\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#website\"},\"datePublished\":\"2026-06-07T17:39:01+00:00\",\"description\":\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\",\"breadcrumb\":{\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youzum.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/yousum.gpucore.co\/#website\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"name\":\"YouSum\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/yousum.gpucore.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\",\"name\":\"Drone Association Thailand\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"width\":300,\"height\":300,\"caption\":\"Drone Association Thailand\"},\"image\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/DroneAssociationTH\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\",\"name\":\"admin NU\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"caption\":\"admin NU\"},\"url\":\"https:\/\/youzum.net\/es\/members\/adminnu\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youzum.net\/es\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/","og_locale":"es_ES","og_type":"article","og_title":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum","og_description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","og_url":"https:\/\/youzum.net\/es\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/","og_site_name":"YouZum","article_publisher":"https:\/\/www.facebook.com\/DroneAssociationTH\/","article_published_time":"2026-06-07T17:39:01+00:00","author":"admin NU","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"admin NU","Tiempo de lectura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#article","isPartOf":{"@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/"},"author":{"name":"admin NU","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c"},"headline":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors","datePublished":"2026-06-07T17:39:01+00:00","mainEntityOfPage":{"@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/"},"wordCount":629,"commentCount":0,"publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"articleSection":["AI","Committee","News","Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/","url":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/","name":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors - YouZum","isPartOf":{"@id":"https:\/\/yousum.gpucore.co\/#website"},"datePublished":"2026-06-07T17:39:01+00:00","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","breadcrumb":{"@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/youzum.net\/nvidia-garak-tutorial-build-a-complete-defensive-llm-red-teaming-workflow-with-custom-probes-and-detectors\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youzum.net\/"},{"@type":"ListItem","position":2,"name":"NVIDIA garak Tutorial: Build a Complete Defensive LLM Red-Teaming Workflow with Custom Probes and Detectors"}]},{"@type":"WebSite","@id":"https:\/\/yousum.gpucore.co\/#website","url":"https:\/\/yousum.gpucore.co\/","name":"YouSum","description":"","publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yousum.gpucore.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/yousum.gpucore.co\/#organization","name":"Drone Association Thailand","url":"https:\/\/yousum.gpucore.co\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","width":300,"height":300,"caption":"Drone Association Thailand"},"image":{"@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DroneAssociationTH\/"]},{"@type":"Person","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c","name":"admin NU","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","caption":"admin NU"},"url":"https:\/\/youzum.net\/es\/members\/adminnu\/"}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin NU","author_link":"https:\/\/youzum.net\/es\/members\/adminnu\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/youzum.net\/es\/category\/ai-club\/\" rel=\"category tag\">AI<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/committee\/\" rel=\"category tag\">Committee<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/news\/\" rel=\"category tag\">News<\/a> <a href=\"https:\/\/youzum.net\/es\/category\/uncategorized\/\" rel=\"category tag\">Uncategorized<\/a>","rttpg_excerpt":"In this tutorial, we analyze NVIDIA garak as a practical framework for defensive LLM red-teaming. We start by setting up Garak, then move through plugin discovery, dry runs, real-model scans, multi-probe evaluations, report analysis, custom probe creation, custom detector creation, and AVID export. Instead of running only a single scan, we use Garak end-to-end to&hellip;","_links":{"self":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts\/95770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/comments?post=95770"}],"version-history":[{"count":0,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/posts\/95770\/revisions"}],"wp:attachment":[{"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/media?parent=95770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/categories?post=95770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/youzum.net\/es\/wp-json\/wp\/v2\/tags?post=95770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}