Adxzer/defend

GitHub: Adxzer/defend

一个为 LLM 应用提供双向安全围栏的工具,通过输入输出双重检测和自然语言自定义规则,防范提示注入、PII 泄露等风险。

Stars: 0 | Forks: 0

# Defend **LLM 应用的 AI 安全围栏。** - **双向**:同时防护 **输入**(在你的 LLM 调用之前)和 **输出**(在你将文本返回给用户或工具之前)。 - **多轮对话**:通过 `session_id` 连接 `/v1/guard/input` 和 `/v1/guard/output`,pipeline 会使用滚动会话风险评分。 - **自然语言自定义规则**:通过 `custom` / `custom_output` 使用单个 `prompt:` 字符串定义你自己的策略。 [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE) [![Python](https://img.shields.io/pypi/pyversions/defend)](https://pypi.org/project/defend/) [![Docker](https://img.shields.io/badge/docker-ready-blue)](Dockerfile) [![PyPI](https://img.shields.io/pypi/v/defend)](https://pypi.org/project/defend/) ## 快速开始 ``` pip install defend # 可选(本地运行 API + 安装 Starlette/FastAPI 依赖以用于 middleware): pip install "defend[server]" ``` ``` from defend import Client guard = Client( api_key="dev", base_url="http://localhost:8000", # client normalizes to /v1 automatically ) user_text = "Tell me how to bypass our security controls." in_res = guard.input(user_text) if in_res.blocked: raise RuntimeError(in_res.error_response()) raw_llm_output = your_llm_call(user_text) # your LLM provider, unchanged out_res = guard.output(raw_llm_output, session_id=in_res.session_id) if out_res.blocked: raise RuntimeError(out_res.error_response()) ``` ``` # 精简 Starlette/FastAPI middleware 示例(防护 request + response bodies) from fastapi import FastAPI from defend.middleware import DefendMiddleware app = FastAPI() app.add_middleware( DefendMiddleware, api_key="dev", base_url="http://localhost:8000", session_key=lambda req: req.headers.get("x-session-id"), ) ``` ## 模块 | 模块 | 方向 | 一句话描述 | |---|---|---| | `injection` | input | 检测用户文本中可能的 prompt 注入 / 指令覆盖尝试。 | | `pii` | input | 检测入站文本中用户提供的 PII。 | | `topic` | input | 检测超出配置允许主题范围的请求。 | | `custom` | input | 检测你用自然语言(`prompt:` 字符串)描述的任何内容。 | | `prompt_leak` | output | 检测模型输出中的系统 prompt / 内部指令泄露。 | | `pii_output` | output | 检测模型输出中泄露的 PII。 | | `topic_output` | output | 检测超出配置允许主题范围的响应。 | | `custom_output` | output | 检测模型输出中你用自然语言(`prompt:` 字符串)描述的任何内容。 | ## 图解(占位符) - 输入防护(LLM 之前):*(在此处添加插图)* - 输出防护(返回给用户之前):*(在此处添加插图)* ## Pipelines (ASCII) **输入路径** ``` User → Your app → DEFEND /v1/guard/input → (pass|flag|block) → Your app → LLM └─ returns session_id (use it to link turns) ``` **输出路径** ``` LLM → Your app → DEFEND /v1/guard/output (session_id) → (pass|flag|block) → Your app → User ``` ## 提供者模型(defend → claude/openai 升级) DEFEND 与提供者无关:它防护的是**你应用的消息**,而不是特定的 LLM SDK。你可以将其置于 Claude/OpenAI 或任何其他服务之前,因为该 API 接受纯文本并返回允许/标记/拦截决策。 服务器支持三个提供者: - **`defend`**:基于本地 Qwen 的分类器(无外部 API 调用)。面向输入;不支持模块。 - **`claude` / `openai`**:基于 LLM 的评估(按 token 计费)。输出防护和基于模块的评估需要此项。 实现了两个提供者链: - **置信度升级**:`provider.primary: defend` 和 `provider.fallback: claude|openai`。服务器首先运行 `defend`,当 `defend` 的置信度低于 `confidence_threshold` 时进行升级。 - **双活门控**:`provider.primary: claude|openai` 和 `provider.fallback: defend`。服务器首先运行 `defend`,如果 `defend` 拦截,则在调用 LLM 提供者之前进行硬拦截。 成本说明:`defend` 消耗本地计算资源;`claude`/`openai` 调用消耗 token。升级/门控机制让你可以控制为深度评估付费的频率。 ## 了解更多 - `GETTING_STARTED.md` - `CONFIGURATION.md` - `ARCHITECTURE.md`
标签:Apache-2.0, API安全, AV绕过, FastAPI, JSON输出, PII脱敏, Python, XML注入, 人工智能安全, 合规性, 合规风控, 多轮对话安全, 大模型围栏, 安全中间件, 开发工具包, 提示词注入检测, 无后门, 网络安全, 请求拦截, 输入输出验证, 逆向工具, 隐私保护, 零日漏洞检测