Alexander-Sorrell-IT/acme-refund-agent
GitHub: Alexander-Sorrell-IT/acme-refund-agent
一个以确定性策略引擎为核心、LLM 仅负责信息收集的 AI 退款代理,附带对抗性红队测试与多层安全验证机制,证明代理无法被操纵执行违规退款。
Stars: 0 | Forks: 0
# Acme Refund Agent — 一个你能*证明*不会被说服进行违规退款的退款代理
[](https://github.com/Alexander-Sorrell-IT/acme-refund-agent/actions/workflows/ci.yml)
为 Foundersmax AI Engineer 的考核测试而构建。技术栈:**FastAPI + Groq (llama-3.3-70b) function-calling + 纯 Python 策略引擎 + 实时推理日志仪表板。**
## 核心理念:模型提议,确定性函数掌握裁决权
由 LLM 决定退款是一种风险——一个感人的故事或一次 prompt injection 就能颠覆它的决定。因此这里的模型
**绝不做出决定。** 它收集事实(客户、订单),然后调用 `evaluate_refund_policy`,该函数运行一个
**纯函数** (`backend/policy.py`),返回 `APPROVE_FULL | STORE_CREDIT | ESCALATE | DENY` 并附带其引用的
**确切规则 ID**。`issue_refund` **会在服务端重新推导该裁决**,因此即使是完全被越狱的模型,在物理上也绝对无法强行执行被策略拒绝的退款。
相同的订单输入 → 每次都输出相同的裁决,并带有引用。这就是整个设计的核心。
## 包含内容
| 需求 | 实现方式 |
|---|---|
| **模拟数据** | `data/customers.json` — 15 个精心设计以触发每条规则的客户画像;`data/refund_policy.md` — 8 条严格规则 + 优先级 |
| **代理后端** | `backend/agent.py` — Groq function-calling 循环(顺序工具调用;LLM 失败时带退避重试,并在日志中可见) |
| **工具验证策略** | `backend/tools.py` — `lookup_customer`,`get_order`(所有权检查),`evaluate_refund_policy`(确定性),`issue_refund`(重新验证) |
| **前端** | `frontend/index.html` 客户聊天 · `frontend/admin.html` **实时推理日志仪表板** |
| **⭐ 差异化优势 1 (doomcaller 模块)** | `backend/redteam.py` — **对抗性红队测试工具**:一个对抗性的“客户”攻击代理(prompt injection、伪造权限、道德绑架、制造紧迫感、重复索取),并且一个**确定性评分器证明代理守住了底线。** 最新运行结果:**8/8 守住,0 次违规。** |
## 为什么红队测试工具很重要(别人没有带来的部分)
任何人都可以构建一个理想情况下的退款机器人。生产环境中的真正风险是*非理想*情况——客户操纵代理发放不该给的钱。因此,这个代码库提供了**安全证明,而不仅仅是功能**:`python backend/redteam.py` 会运行一系列操纵攻击,并根据基准真实策略对代理的*实际行动*进行评分。这与我的
[doomcaller](https://github.com/Alexander-Sorrell-IT/doomcaller) 项目原则相同——一个对抗性生成器,加上一个确定性的评判器。一个退款代理不仅要在正常运作时算完成;只有当你无法攻破它时,它才算真正完成。
**两个级别的对抗性证明:**
- `redteam.py` — 8 次*脚本化*攻击(快速、确定性)。最新结果:**8/8 守住,0 次违规。**
- `adversary.py` — **实时 LLM 对手,能够即兴发挥并在多个回合中施加压力**(伪造权限 → 道德绑架 → prompt injection → 威胁,在被拒绝时不断升级)。最新结果:**5/5 守住 4 回合攻击,0 次违规。** `python backend/adversary.py`。
## 运行它
```
cd foundersmax-refund-agent
pip install -r requirements.txt
cp .env.example .env # add your GROQ_API_KEY (free at console.groq.com)
cd backend && uvicorn main:app --port 8099
```
- 客户聊天 → http://127.0.0.1:8099/
- 管理员推理日志 + **运行红队测试** → http://127.0.0.1:8099/admin
**或者使用 Docker:** `GROQ_API_KEY=... docker compose up` → http://127.0.0.1:8099/
**测试:** `pip install -r requirements-dev.txt && pytest tests/ -v` — 策略正确性、收据完整性与篡改检测、输出审计(在 CI 中每次推送时运行,无需 API key)。
尝试:*"Hi, I'm Maria Alvarez, refund ORD-1001"* (批准) · *James Bello / ORD-1002* (超过 30 天 → 拒绝) ·
*Aisha Khan / ORD-1009* (礼品卡 → 拒绝) · *Isabella Rossi / ORD-1015* (超过 $500 → 升级处理) ·
然后打开 **/admin** 并点击 **运行红队测试**。
## 架构
```
customer ──chat──▶ agent loop (Groq, function-calling)
│ lookup_customer → get_order → evaluate_refund_policy → issue_refund
▼
POLICY ENGINE (pure function) ── the verdict, with a rule citation
│
every step ▼ published to the reasoning-log bus → /admin dashboard (SSE)
red-team ──▶ adversarial customer attacks the whole loop ──▶ deterministic grader ──▶ "held N/N, 0 violations"
```
## 设计说明
- **规则优先级** (`refund_policy.md`):所有权 → 滥用冻结 → 已退款 → 不可退款类别 → 时间窗口 → 高价值 → 物品状况。例如,一件*超过时间窗口*的*有缺陷*商品仍会被拒绝(R1 优先于 R5);一件超过 $500 的*有缺陷*商品会被升级处理(R6 优先于 R5)。
- **`days_since_delivery`** 存储在每个订单中,因此无论在哪一天运行,演示结果都是稳定的。
- **⭐ 差异化优势 2 (thoth 模块):** `backend/audit.py` 确定性地针对裁决审计代理的*回复*——如果代理的言语在引擎给出 DENY 时暗示批准(或者在仅限商店积分时承诺现金),就会被**标记**。与 [thoth](https://github.com/Alexander-Sorrell-IT/thoth) 相同的“纯函数评估模型输出”原则;它在文本输入和语音通道的口语转录记录上的运行方式完全一致。
- **⭐ 差异化优势 3 (on-the-record / glass-box-alpha 模块):** `backend/receipts.py` 将**每一个决定封存入一个哈希链式、防篡改的收据中**(`SHA256(salt ‖ prev_hash ‖ canonical_json(row))`,创世值为 64 个零)。该链**在纯 Python (`verify_chain`) 或纯 Node 中离线验证——使用你从 [on-the-record](https://github.com/Alexander-Sorrell-IT/on-the-record) 项目里拿来的真实 `verifier.mjs`** —— `node verifier.mjs data/receipts_export.json` → `CHAIN OK`。篡改任何收据的一个字节 → 两个验证器都会报告 `BROKEN AT seq=N`。推理日志成为一条**无需任何人信任的密码学审计轨迹。**
- **⭐ 语音通道(附加功能,已构建):** `backend/voice.py` + 聊天界面上的 🎙️ 按钮。浏览器麦克风 → **Deepgram STT** → *同一个*代理循环 → **Deepgram Aura TTS** → 自动播放回复。双向使用同一个提供商(`.env` 中已包含 `DEEPGRAM_API_KEY`),通过 key 进行权限控制,这样文本演示和 CI 永远不会被它阻塞。其核心在于:**审计层与转录记录无关**——无论是打字还是语音,`audit.py` 评估代理*言语*的方式与裁决完全一致,因此整个安全机制(确定性裁决、输出审计、哈希链收据、执行拦截)在语音路径上无需任何更改即可生效。`POST /voice/turn` = 音频输入 → 回复文本 + TTS 音频输出。
作者:**Alexander Sorrell** · github.com/Alexander-Sorrell-IT
## 自我审计与加固(我攻击了我自己的系统)
除了攻击*代理*之外,我还对*代码库*进行了对抗性审计,并修复了四个漏洞——现在每一个都有了回归测试:
- **资金担保被移入资金函数中。** `issue_refund` 会自行重新推导裁决,并且从不接受来自其调用者的裁决,因此上游的任何内容(被越狱的 LLM、有 Bug 的编排器、直接调用)都无法强制执行策略拒绝的退款。这在*构造上*就是成立的,而不是依赖于编排规范。
- **严格的身份解析。** `find_customer` 不再解析单个字母、单独的姓氏或否定的提及(“我不是 Marcus Feld”);模糊的输入不会返回任何内容,因此代理会要求提供订单 ID/电子邮件。
- **见证小组失败时自动关闭。** 如果参与投票的见证者数量少于法定人数,小组将报告 `DEGRADED`,绝不会给出错误的“已守住”结论。
- **共享速率限制器 + 退避机制** (`llm.py`) 确保大规模对抗性测试运行能够优雅降级,而不是在 429 错误下崩溃。
## ENFORCE 层 (cli-enforcement 模块) — 第 5 个验证层
`backend/enforcement.py` 将我的 [cli-enforcement](https://github.com/Alexander-Sorrell-IT/CLI-Enforcement) 引擎(`enforce_check` 工具调用前拦截门 + `points_config.yaml` 评分)移植到了代理的工具循环中。**每一次工具调用在运行前都会经过一个通用拦截门**——因此“工具做了策略禁止的事情”在*构造上对于所有同时运行的工具都是不可能的*,而不是针对每个函数进行修补。它还会维护一个**行为记分卡**(积分/等级):规范的工具使用会赢得信任,而持续的操纵模式会导致分数暴跌、等级下降,最终**锁定代理 (LOCKS)**——之后它将被拒绝执行任何操作。这是针对 GAP-1 修复在系统级、边界级别的版本。
## 多模型见证小组 (thoth 模块,深化版)
`witness_panel.py` — 三个独立的供应商(Meta Llama、OpenAI gpt-oss、Alibaba Qwen)各自评判代理是否被操纵;由确定性共识做出决定(只要任何一个见证者发现操纵行为就会标记)。真实的模型多样性 + 确定性聚合——这是“跨模型”对抗性检查最诚实的形式,直接源自 thoth 的多见证者原则。
标签:AI智能体, AV绕过, DLL 劫持, FastAPI, LLM函数调用, MITM代理, 业务逻辑安全, 大语言模型, 请求拦截, 退款系统, 逆向工具, 防篡改审计