2026年6月13日 2 分钟阅读

如何用 RiskKernel 为 AI Agent 搭建硬预算护栏?防止 Agent 深夜暴走烧钱

tinyash 0 条评论

带 AI Agent 的生产级应用跑起来之后,最让人心惊胆战的一个画面就是:凌晨三点收到告警——Agent 陷入了死循环,几小时内烧掉了数百美元的 API 费用。LangGraph、CrewAI 等框架擅长编排 Agent 的推理逻辑,但它们没有提供原生的预算控制、循环检测和崩溃恢复能力。

RiskKernel 是一个开源的 Agent 可靠性运行时(Go, Apache-2.0, github.com/prashar32/riskkernel),它在你的 Agent 和 LLM API 之间插入一层确定性运行控制——硬预算限额、循环上限、崩溃可恢复检查点,全部由编译后的 Go 代码执行,不依赖 LLM 的「自觉」。

为什么需要一层「硬控制」?

Agent 框架解决的问题是「如何让 Agent 思考」,但生产环境 Agent 的问题往往是:

  • 死循环:Agent 反复调用同一个工具,每次调用都在花钱,框架没有任何循环检测
  • 意外超支:一个回答的 token 消耗远超预期,$0.01 的任务跑到 $10
  • 崩溃丢失状态:进程 kill -9 后,已经花掉的钱不可回收,重新跑又要再花一遍
  • 无审核门禁:Agent 可以自行决定执行删除文件、发送邮件等副作用操作

RiskKernel 不是另一个 API 网关(那是 LiteLLM 做的事),也不是另一个可观测性面板(那是 Langfuse 的领域)。它填补的是框架和网关之间的空白:Agent 运行时的确定性控制层

三种集成方式

RiskKernel 提供了三种递进的集成方式:

方式一:零代码代理模式

最简单的用法——设置一个环境变量,将 OpenAI 基地址指向 RiskKernel 的代理端口:

export OPENAI_BASE_URL=http://localhost:7070/v1

每个请求自动被截获、计量、经预算校验后,转发到真正的 API 提供商。不需要改一行代码。

方式二:Python SDK 深度集成

用装饰器控制函数级别的预算和行为:

from riskkernel import governed_run, ApprovalGate

@governed_run(budget_dollars=0.50, max_loops=100, max_seconds=3600)
def my_agent_loop():
    # 你的 Agent 逻辑不动
    pass

approve = ApprovalGate()
result = approve.request("删除 /data/temp 目录中的所有文件")
if result.approved:
    # 执行删除
    pass

方式三:OpenTelemetry 通用集成

RiskKernel 本身就是一个 OTLP 端点和发射器——可以管理已用 OpenLLMetry 等 SDK 做探针的 Agent,同时将追踪数据导出到你的 Grafana 或 SigNoz。

核心功能拆解

💸 硬成本上限(Hard Cost Ceiling)

每个运行可以设定固定的美元限额。Agent 的请求一旦累计费用超过上限,立即返回 HTTP 402 中断运行,但状态被持久化保存

docker run --rm -p 7070:7070 \
  -e ANTHROPIC_API_KEY=xxx \
  -e RISKKERNEL_DEFAULT_DOLLARS=0.50 \
  ghcr.io/prashar32/riskkernel:latest

curl -s -D- http://localhost:7070/v1/chat/completions \
  -H 'content-type: application/json' \
  -H 'X-RiskKernel-Run-Id: demo' \
  -d '{"model":"claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}]}'

🔁 循环上限与墙钟时间(Loop & Wall-Clock Budget)

即使单次调用未超限,RiskKernel 也会追踪调用次数总执行时间。默认安全值:$5 / 100 次循环 / 1 小时。这意味着你忘记停止的 Agent 最坏情况也不超过这个范围。

💾 崩溃可恢复检查点

最亮眼的功能:如果 kill -9 杀掉了守护进程,重新启动后 RiskKernel 会自动从上一个检查点恢复,已经花掉的费用不会被重复计算

riskkernel serve &
kill -9 $RISKKERNEL_PID

riskkernel serve
riskkernel runs list   # 看到之前的运行继续

✋ 人工审批门禁

RiskKernel 支持框架无关的审批门禁。当 Agent 需要执行有副作用的工具调用(如删除文件、发送邮件、数据库写入)时,运行会暂停等待人工确认——通过 CLI、本地 Web 面板或 Webhook 三种方式。

🧠 自有记忆系统

运行状态、审计日志和配置以 Git-native Markdown/YAML 存储在你的磁盘上,会话状态存在本地 SQLite 中。不依赖任何外部数据库。

快速上手

启动 RiskKernel 的方法非常直接:

docker run --rm -p 7070:7070 -v "$PWD/data:/data" \
  -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
  -e RISKKERNEL_DEFAULT_DOLLARS=0.50 \
  ghcr.io/prashar32/riskkernel:latest

go install github.com/prashar32/riskkernel/cmd/riskkernel@latest
riskkernel init   # 在当前目录生成 .env + 示例
riskkernel serve  # 启动守护进程

启动后,查看受控运行的审计日志:

riskkernel runs list          # 列出所有受控运行
riskkernel audit export   # 导出费用账目(JSON)
riskkernel audit tools    # 导出受控工具调用记录

对比:有 RiskKernel vs 无保护

场景无保护有 RiskKernel
Agent 陷入死循环持续扣费直到手动停止或余额耗尽到达循环上限(默认 100 次)自动停机
意外使用高成本模型Token 超支无感知硬成本上限触发 HTTP 402
服务器重启丢失运行上下文,重跑重新扣费自动恢复检查点,不重复计费
删除操作Agent 可自行决定执行暂停等待人工审批
问题排查无运行日志完整审计导出 + OTLP 追踪

注意事项

  • RiskKernel 目前是单人维护的开源项目(18⭐),代码质量可靠但功能迭代节奏取决于社区反馈
  • 代理模式目前仅支持 OpenAI 兼容接口——Anthropic 直接调用需通过 SDK 方式
  • 安装 Go 原生版本需要本地有 Go 工具链;纯 Docker 模式对 Python/Node 用户更友好
  • 审批门禁目前支持 CLI 和 Webhook,本地 Web UI 正在开发中

总结

RiskKernel 解决的是一个被大多数 Agent 框架忽视的问题:运行时层缺乏确定性控制。它不是替代 LangGraph 或 LangChain,而是在它们下面加一层「硬底」。如果你的 Agent 已经到了生产环境、处理真实数据、有明确的开销预算约束,花 60 秒跑一个 Docker 容器加上这层护栏,是投资回报率极高的「保险」。

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。