Show HN: Forge – 护栏机制将8B模型在智能体任务上的准确率从53%提升至99%

Hacker News Top 工具

摘要

Forge是一个为自托管LLM工具调用设计的可靠性层,通过护栏机制和上下文管理,显著提升多步智能体任务的性能,将本地8B模型的准确率从53%提高到99%。

Hi HN,我是Antoine Zambelli,德州仪器AI总监。<p>我构建了Forge,一个用于自托管LLM工具调用的开源可靠性层。<p>它的功能:<p>- 为在消费级硬件上运行的本地模型添加领域和工具无关的护栏机制(重试提示、步骤强制、错误恢复、VRAM感知上下文管理)<p>- 在不更改模型本身的情况下,仅通过改变周围系统,将8B模型在多步智能体工作流中的准确率从约53%提升至约99%<p>- 附带评估工具和交互式仪表盘,便于重现每个数字<p>我希望为自己的一些始终在线的智能体系统提供支持,不想支付云端前沿模型的费用,但立即遇到了本地模型上的复合数学问题。90%的每步准确率听起来不错,但5步工作流意味着40%的失败率。现有框架似乎都没有解决这个机械可靠性问题——它们似乎都是为云端前沿量身定制的。<p>演示视频:<a href="https://youtu.be/MzRgJoJAXGc" rel="nofollow">https://youtu.be/MzRgJoJAXGc</a>(并排对比:相同模型、相同任务,有和没有Forge护栏机制)<p>论文(已被ACM CAIS '26接收,将于5月26-29日在圣何塞展示)涵盖了97个模型/后端配置、18个场景、每组50次运行的同行评审结果。关键数据:<p>- Ministral 8B配合Forge:99.3%。Claude Sonnet配合Forge:100%。免费本地8B模型(运行在600美元GPU上)与前沿API之间的差距不到1个百分点。<p>- 同一本地8B模型配合Forge(99.3%)优于没有护栏的Claude Sonnet(87.2%)——一个有框架支持的8B模型击败了仅通过前沿API能获得的最佳结果。<p>- 所有测试的模型(本地和前沿)在没有重试机制的情况下,错误恢复得分均为0%。这不是能力差距,而是架构缺失。<p>我目前在自己的家庭助手上使用它(运行Ministral 14B-Reasoning),以及我的本地托管智能体编码工具(8B模型已成功为代码库贡献代码!)。<p>护栏堆栈有五个层,每层可独立开关。根据McNemar检验的消融研究,影响最大的两层:重试提示(禁用后下降24-49个百分点)和错误恢复(下降约10个百分点,对每个测试模型都显著)。步骤强制具有情境性——仅对排序纪律较弱的模型触发。救援解析和上下文压缩在评估中不显著,但在生产工作负载中保留,因为它们偶尔会激活。<p>我完全没想到的一件事:服务后端很重要。相同的Mistral-Nemo 12B权重在llama-server(使用原生函数调用)上产生7%的准确率,而在Llamafile的提示模式下达到83%。仅基础设施不同就导致75个百分点的波动。我认为没人发表过这一点,因为标准基准没有控制服务后端。<p>另一个意外:当前的LLM工具调用中,没有区分“工具成功运行并返回了数据”和“工具成功运行但未找到任何内容”。两者都返回值,编排器标记步骤完成,坏数据向下游级联。这相当于HTTP有200但没有404。Forge将其添加为一个新的异常类(ToolResolutionError)——模型可以看到错误并重试,而不是静默传递垃圾数据。<p>最大的技术挑战是内存受限硬件上的上下文压缩。Ollama和Llamafile在模型超出VRAM时都会静默回退到CPU——没有警告,没有错误,只是推理速度慢10-100倍。Forge在启动时查询nvidia-smi并推导出token预算以防止这种情况。<p>如何尝试:<p>- 克隆仓库,在我未测试的模型上运行评估工具。如果你得到有趣的结果,我会将其添加到仪表盘。<p>- 尝试代理服务器模式——将任何兼容OpenAI的客户端指向Forge,它会透明地处理护栏。这是最新的模式,我希望有更多人关注它。<p>- 通过自用,我优化了v0.6.0中的模型参数。更难的评估套件(26个场景)旨在提高上限,使无人能达到100%。原来套件中能做到的模型中有几个无法完成全部(包括Opus 4.6)。我很好奇是否有人能发现我未考虑到的漏洞场景。论文数据基于v0.6.0之前的代码。<p>背景:之前有非监督学习的ML发表(83次引用)。这篇论文已被ACM CAIS '26接收——将于5月26-29日展示。<p>仓库:<a href="https://github.com/antoinezambelli/forge" rel="nofollow">https://github.com/antoinezambelli/forge</a><p>论文:<a href="https://www.caisconf.org/program/2026/demos/forge-agentic-reliability/" rel="nofollow">https://www.caisconf.org/program/2026/demos/forge-agentic-reliability/</a> <a href="https://github.com/antoinezambelli/forge/blob/main/docs/forge_ieee_preprint.pdf" rel="nofollow">https://github.com/antoinezambelli/forge/blob/main/docs/forge_ieee_preprint.pdf</a><p>仪表盘:<a href="https://github.com/antoinezambelli/forge/docs/results/dashboard.html" rel="nofollow">https://github.com/antoinezambelli/forge/docs/results/dashboard.html</a>
查看原文
查看缓存全文

缓存时间: 2026/05/19 22:05

antoinezambelli/forge

来源:https://github.com/antoinezambelli/forge

forge

PyPI (https://pypi.org/project/forge-guardrails/) 测试 (https://github.com/antoinezambelli/forge/actions/workflows/tests.yml) codecov (https://codecov.io/gh/antoinezambelli/forge) Python 3.12+ (https://www.python.org/downloads/) 许可证:MIT

自托管 LLM 工具调用的可靠性层。Forge 通过防护栏(救援解析、重试提示、步骤强制执行)和上下文管理(VRAM 感知预算、分层压缩),将 8B 本地模型提升至多步骤智能体工作流的顶尖水平。当前最佳自托管配置(Ministral-3 8B Instruct Q8 在 llama-server 上)在 forge 的 26 场景评估套件中得分 86.5%,在最高难度级别中得分 76%。

三种使用方式:

  • WorkflowRunner — 定义工具、选择后端、运行结构化智能体循环。Forge 管理完整生命周期:系统提示、工具执行、上下文压缩和防护栏。SlotWorker 增加了优先级队列共享推理槽,支持自动抢占——适用于专业工作流共享 GPU 槽的多智能体架构。最适合直接基于 forge 构建时使用。

  • 防护栏中间件 — 在自己的编排循环中使用 forge 的可靠性栈(可组合中间件)。你控制循环,forge 验证响应、修复格式错误的工具调用、强制执行必需步骤。

  • 代理服务器 — 即开即用的 OpenAI 兼容代理(python -m forge.proxy),位于任何客户端(opencode、Continue、aider 等)与本地模型服务器之间。透明地应用防护栏——客户端会以为它正在与更智能的模型对话。

支持 Ollama、llama-server(llama.cpp)、Llamafile 和 Anthropic 作为后端。

要求

  • Python 3.12+
  • 运行中的 LLM 后端(见下文)

安装

pip install forge-guardrails                # 仅核心
pip install "forge-guardrails[anthropic]"   # + Anthropic 客户端

开发环境:

git clone https://github.com/antoinezambelli/forge.git
cd forge
pip install -e ".[dev]"

后端设置(选择其一)

llama-server(推荐——前 10 评估配置均运行在 llama-server 上):

# 从 https://github.com/ggml-org/llama.cpp/releases 安装
llama-server -m path/to/Ministral-3-8B-Instruct-2512-Q8_0.gguf --jinja -ngl 999 --port 8080

Ollama(备选——设置更简单,但较难工作负载上稍弱):

# 从 https://ollama.com/download 安装
ollama pull ministral-3:8b-instruct-2512-q4_K_M

Anthropic(API,无需本地 GPU):

pip install -e ".[anthropic]"
export ANTHROPIC_API_KEY=sk-...

完整说明请参见后端设置,根据硬件选择模型请参见模型指南

快速开始

import asyncio
from pydantic import BaseModel, Field
from forge import (
    Workflow, ToolDef, ToolSpec,
    WorkflowRunner, OllamaClient,
    ContextManager, TieredCompact,
)

def get_weather(city: str) -> str:
    return f"72°F and sunny in {city}"

class GetWeatherParams(BaseModel):
    city: str = Field(description="城市名称")

workflow = Workflow(
    name="weather",
    description="查询某城市的天气。",
    tools={
        "get_weather": ToolDef(
            spec=ToolSpec(
                name="get_weather",
                description="获取当前天气",
                parameters=GetWeatherParams,
            ),
            callable=get_weather,
        ),
    },
    required_steps=[],
    terminal_tool="get_weather",
    system_prompt_template="你是一个乐于助人的助手。使用可用工具回答用户。",
)

async def main():
    client = OllamaClient(model="ministral-3:8b-instruct-2512-q4_K_M", recommended_sampling=True)
    ctx = ContextManager(strategy=TieredCompact(keep_recent=2), budget_tokens=8192)
    runner = WorkflowRunner(client=client, context_manager=ctx)
    await runner.run(workflow, "巴黎的天气怎么样?")

asyncio.run(main())

有关多步骤工作流、多轮对话和后端自动管理,请参见用户指南。如果构建长期会话(CLI、聊天服务器、语音助手),请参见长期会话建议中关于过滤临时消息的重要指导。

代理服务器

可代替本地模型服务器的即开即用组件。将任何 OpenAI 兼容客户端指向代理,即可免费获得 forge 的防护栏。

# 外部模式 — 你管理 llama-server,forge 代理它
python -m forge.proxy --backend-url http://localhost:8080 --port 8081

# 托管模式 — forge 同时启动 llama-server 和代理
python -m forge.proxy --backend llamaserver --gguf path/to/model.gguf --port 8081

然后将客户端配置为使用 http://localhost:8081/v1 作为 API 基础 URL。

注意: 当请求中包含工具时,代理会自动注入一个合成 respond 工具。模型调用 respond(message="...") 而不是直接输出文本,从而保持在工具调用模式,此时 forge 的完整防护栏堆栈会发挥作用。出站响应中会剥离 respond 调用——客户端会看到一个正常的文本响应(finish_reason: "stop"),完全不知道这个工具的存在。这对于小型本地模型(~8B)至关重要,因为它们无法可靠地在文本和工具调用之间做出选择——引导它们使用工具是必须的。完整分析请参见 ADR-013

后端

后端适用场景原生 FC?
Ollama设置最简单,自带模型管理
llama-server最佳性能,完全控制是(需 --jinja
Llamafile单一二进制,零依赖否(提示注入)
Anthropic前沿基线,混合工作流

详情请参见后端设置进行安装,或参见模型指南选择模型。

运行测试

python -m pytest tests/ -v --tb=short
python -m pytest tests/ --cov=forge --cov-report=term-missing

评估工具

26 个场景,衡量模型+后端组合在多步骤工具调用工作流中的可靠性——分为 OG-18 基线级别和 8 个场景的 advanced_reasoning 级别,用于区分顶尖配置。完整 CLI 参考请参见评估指南

# llama-server(先在另一个终端启动;见评估指南)
python -m tests.eval.eval_runner --backend llamafile --llamafile-mode prompt --gguf "path/to/Ministral-3-8B-Instruct-2512-Q8_0.gguf" --runs 10 --stream --verbose

# 批量评估(JSONL 输出,自动恢复)
python -m tests.eval.batch_eval --config all --runs 50

# 报告(ASCII 表格、HTML 面板、Markdown 视图)
python -m tests.eval.report eval_results.jsonl

项目结构

src/forge/
  __init__.py          # 公共 API 导出
  errors.py            # ForgeError 层次结构
  server.py            # setup_backend()、ServerManager、BudgetMode
  core/
    messages.py        # Message、MessageRole、MessageType、MessageMeta
    workflow.py        # ToolSpec、ToolDef、ToolCall、TextResponse、Workflow
    inference.py       # run_inference() — 共享前半部分(压缩、折叠、验证、重试)
    runner.py          # WorkflowRunner — 智能体循环
    slot_worker.py     # SlotWorker — 优先级队列槽访问
    steps.py           # StepTracker
  guardrails/
    nudge.py           # Nudge 数据类
    response_validator.py  # ResponseValidator、ValidationResult
    step_enforcer.py   # StepEnforcer、StepCheck
    error_tracker.py   # ErrorTracker
  clients/
    base.py            # ChunkType、StreamChunk、LLMClient 协议
    ollama.py          # OllamaClient(原生 FC)
    llamafile.py       # LlamafileClient(原生 FC 或提示注入)
    anthropic.py       # AnthropicClient(前沿基线)
  context/
    manager.py         # ContextManager、CompactEvent
    strategies.py      # CompactStrategy、NoCompact、TieredCompact、SlidingWindowCompact
    hardware.py        # HardwareProfile、detect_hardware()
  prompts/
    templates.py       # 工具提示构建器(提示注入路径)
    nudges.py          # 重试和步骤强制执行提示模板
  tools/
    respond.py         # 合成 respond 工具(respond_tool()、respond_spec())
  proxy/
    proxy.py           # ProxyServer — 编程启动/停止 API
    server.py          # 原生 asyncio HTTP 服务器、SSE 流式传输
    handler.py         # 请求处理程序 — HTTP 与 run_inference 之间的桥梁
    convert.py         # OpenAI 消息 ↔ forge Messages 转换
tests/
  unit/                # 865 个确定性测试 — 无需 LLM 后端
  eval/                # 评估工具 — 针对真实后端的模型资格认证

文档

  • 用户指南 — 使用模式、多轮对话、上下文管理、防护栏、槽工作者、长期会话建议
  • 模型指南 — 根据硬件选择模型和后端
  • 后端设置 — 后端安装和服务器设置
  • 评估指南 — 评估工具 CLI 参考、批量评估
  • 架构 — 完整设计文档
  • 工作流内部 — 工作流设计和运行器内部机制
  • 贡献 — 如何设置、测试、添加新后端或场景

论文

Forge 防护栏框架和消融研究已发表为:

Zambelli, A. Forge: A Reliability Layer for Self-Hosted LLM Tool-Calling. https://doi.org/10.1145/3786335.3813193

预发表前的预印本也存放在 docs/forge_ieee_preprint.pdf — 作为历史文献保留。请引用上述发表版本;DOI 链接可能因出版商发布时间而无法立即解析。

许可证

MIT — 版权所有 (c) 2025-2026 Antoine Zambelli

相似文章

具备潜在推理能力的鲁棒高效护栏

arXiv cs.AI

CoLaGuard 是一种新型护栏模型,它将多步安全推理转移到连续潜在空间中,与显式推理基线相比,实现了 12.9 倍的加速和 22.4 倍的 Token 缩减,同时在十个安全基准上匹配宏 F1 性能。