跳到正文
Hacker News· dreamlight·· 10 天前AI 评分62

Bud Ecosystem 发布 Decision Studio,本地运行开源决策模型

Show HN: Decision Studio – LM Studio for open-source, Jev-style decision models

AI 导读

Bud Ecosystem 发布 Decision Studio,一个可在本机运行开源决策模型的桌面应用,输入情境和问题后直接返回每个答案的校准概率,号称是 Jev 类 System One 模型的 LM Studio。

正文 · AI 翻译

Bud Decision Studio icon

在你自己的电脑上运行开放决策模型。
给模型一个情境和几个问题;在毫秒内为每个答案获得校准后的概率。
类似 Jev 的“System One”模型的 LM Studio,来自 Bud Ecosystem。

Download macOS Windows Linux

Bud Decision Studio: choosing an example, pressing Decide, and reading every answer as a chart

文档:用户手册、安装、指南、API 参考和开发者文档位于 site/docs/,由 site/docs-src/ 中的 Markdown 构建而成。在浏览器中打开 site/docs/index.html,或提供 site/ 文件夹。

安装

一行命令,完成后应用会自动打开:

系统 命令
macOS(Apple Silicon)和 Linux curl -fsSL https://raw.githubusercontent.com/BudEcosystem/Bud-Decision-Engine/main/get.sh | sh
Windows(PowerShell) irm https://raw.githubusercontent.com/BudEcosystem/Bud-Decision-Engine/main/get.ps1 | iex

或从 最新版本 下载:

你的电脑 下载 然后
搭载 Apple Silicon(M1 或更新)的 Mac …_aarch64.dmg 打开它并将应用拖到“应用程序”
Windows 10 或 11 …_x64-setup.exe(或 .msi) 运行它;应用会被添加到开始菜单
Ubuntu 或 Debian …_amd64.deb / …_arm64.deb sudo apt install ./Bud*.deb
Fedora 或 openSUSE …x86_64.rpm / …aarch64.rpm sudo dnf install ./Bud*.rpm
任何其他 Linux …AppImage chmod +x Bud*.AppImage 并打开它;它会将自己添加到你的应用程序菜单

NVIDIA GB10(DGX Spark)和其他 ARM64 Linux 电脑使用 arm64 / aarch64 文件。

首次运行时会发生什么

Setup asks where models should run

  1. 它会检查你的电脑:显卡、处理器、内存和可用磁盘空间。
  2. 它会询问模型在哪里运行:GPU(有 GPU 时推荐)或处理器。每个选项都会说明它会安装什么以及有多大。
  3. 它会自行安装引擎:一个私有的 Python,带有与你的硬件匹配的 PyTorch 构建,以及所有模型库。无需其他设置,也不会在应用自己的文件夹之外安装任何东西。
  4. 你选择要下载哪些模型。在你选择之前不会下载任何内容;已为你勾选了两个适合你电脑的模型。它们会在后台一次下载一个。
你的硬件 模型运行于
NVIDIA GPU(GeForce、RTX、GB10 / DGX Spark、数据中心卡) CUDA 12.6、12.8 或 13.0,根据你的驱动选择
搭载 Apple Silicon 的 Mac Apple GPU,通过 Metal
Intel Core Ultra 或 Arc 显卡 Intel GPU(XPU)
Linux 上的 AMD GPU ROCm(实验性)
其他任何情况 处理器;小模型约一秒内作答

你之后可以在 System 页面在 GPU 和处理器之间切换。

它的功能

决策模型不写文本。你给它一个情境(一封电子邮件、一张支持工单、一行日志、一个 JSON 对象)和带类型的问题,它会在一次快速处理中返回你允许的每个答案的概率。问题有六种:

Create new Decision: the six kinds of question

问题 你定义 你得到
选一个 一组命名选项 每个选项的概率,以及胜出者
按量表评分 2 到 10 个有序等级 每个等级的概率,以及平均位置
是或否 一个陈述 它为真的概率
任选 选项和阈值 高于阈值的每个选项
排序 一组选项 选项从最可能到最不可能
估算一个数字 它可能取的值 最佳估计值和 80% 范围

页面

Playground
Playground。写一个情境和问题(用 New 从空白开始,或从示例开始),按 Decide,然后以图表形式阅读每个答案。模型按钮(Ctrl+L)可加载任何模型;JSON 和 Code 标签页显示确切的请求。
Models
模型。 一张表里包含十一个开放模型:每个模型擅长什么、其规模、读取什么,以及其已发布结果与 Jev 的对比。一键下载、加载和弹出。
Evaluate
评估。 在多个模型上对许多带标签的示例运行一个问题:排行榜、校准和阈值图表,以及一条建议。
History
历史。 每个决策,无论是来自 Playground 还是任何程序,都保存在这台电脑上:按模板、模型、答案或时间筛选,查看哪些需要人工处理,为正确答案打标签,在另一个模型上重新运行。
Templates
模板。 可复用的决策,带有变量、默认模型和设置。每次保存都是一个版本;在切换之前,在真实流量上比较两个版本。
API
API。 服务器地址以及可直接运行的 curl、Python、JavaScript 和官方 TypeSafe SDK 示例。
Train
训练。 用一张示例电子表格,在这台电脑的 GPU 上教会模型你自己的决策。它会留出一些示例,只有当新模型在这些示例上更好、且在没有变得更差于一般决策时,才会添加新模型。工作原理。

整个流程的短视频:docs/media/demo.mp4。

模板和历史

模板是你复用的决策:它的问题、填充情境的变量(一条消息、一个计划层级、一张截图)、默认模型和设置。它可以在任何模型上运行。每次保存都是一个新版本,因此代码可以固定 support-triage@3、跟随 support-triage@production,或采用最新版本。每个 Playground 场景的入门模板都已包含。

历史将每个决策保存在这台电脑上,无论它来自哪种方式:情境、问题、答案、模型、版本和时间。从那里,你可以为正确答案打标签,将决策转化为测试示例,在另一个模型上重新运行,或查看版本 3 的答案与版本 2 在相同输入上的对比。

# Once: a template with two variables (PUT again with changes and it becomes version 2)
curl -s -X PUT http://127.0.0.1:8420/v1/studio/templates/support-triage -H 'content-type: application/json' -d '{
  "name": "Support triage",
  "variables": {"customer_message": {"type": "string"},
                "account_tier": {"type": "string", "enum": ["free", "pro", "enterprise"], "default": "free"}},
  "state": {"tier": "{{account_tier}}", "message": "{{customer_message}}"},
  "questions": {"department": {"type": "choice", "instructions": "Which department should handle this?",
                               "criteria": ["billing", "technical", "sales"]},
                "urgent": {"type": "noul", "instructions": "Does it need an answer today?"}},
  "model": "laya", "settings": {"act_threshold": 0.85}
}'

# Every time: fill in the variables
curl -s http://127.0.0.1:8420/v1/studio/decisions -H 'content-type: application/json' -d '{
  "template": "support-triage",
  "variables": {"customer_message": "We were billed twice. Refund it today.", "account_tier": "pro"}
}'
# -> {"id": "dec_...", "act": false, "needs_review": ["urgent"], "answers": {...}, "template": {"id": "support-triage", "version": 1}, ...}

每个答案都会说明它是否足够确定可以采取行动(其确定性对照模板的阈值),因此你的代码可以自动执行或询问人工。完整参考,包含每个字段、规则和错误:docs/studio-api.md。

教会模型你自己的决策

当模型的决定方式与你的团队不同时,展示给它看。训练页面接收一张过往决策的电子表格(一列文本,每个答案一列),推荐一个模型,并使用 LoRA 在这台电脑的 GPU 上训练它,LoRA 是原始权重旁边的一个小型变更文件。只有当新模型在它从未见过的示例上更好、在它从未训练过的一般决策上没有变得更差,并且在保存和重新加载后答案完全相同时,才会保留新模型。训练后的模型随后会出现在 Playground、Evaluate 和你的代码中,与其他模型并列,导出和导入训练模型可在电脑之间移动它。

每个模型都由工作室自己在 NVIDIA GB10 上训练,并在训练前留出的示例上进行测量:

模型 任务 之前 → 之后 一般决策
Julia 1 支持工单(内置示例文件) 52% → 91% −0.4
Laya 政策主题(16 个领域) 59% → 80% +0.2
Laya Multilingual 业务工作流(类型化决策) 34% → 62% +12.7
Laya Typed-Decisions 政策主题 61% → 81% +0.2
GLiNER2.5 Decide 政策主题 66% → 75% +0.7
Kev 0.5B 政策主题 65% → 79% +0.6
Kev 4B 政策主题 77% → 82% +0.2
Intern-Decision 4B 对话中的情绪(16 种) 61% → 76% +0.2
Lev 政策主题 75% → 82% +2.5
CLM 8B 业务工作流 39% → 68% +11.2
Jev-Omni 业务工作流 62% → 77% 0.0

训练需要 NVIDIA RTX 30 系列或更新(包括 GB10)或 Apple M2 或更新;Intel Arc 和 Core Ultra、Linux 上的 AMD 以及较旧的 NVIDIA 显卡为实验性支持。工作原理、检查内容以及每次运行:docs/trainer/README.md 和 docs/trainer/RESULTS.md。

十一个模型

模型 大小 擅长 读取
Julia 1 144M 快速多语言路由 文本
Laya Multilingual 322M 100 多种语言的决策 文本
Laya 421M 英语分诊、护栏 文本
Laya Typed-Decisions 421M 发票、安全、支持工作流 文本
Kev 0.5B 0.5B 了解架构如何工作 文本
GLiNER2.5 Decide 340M 操作标签;在处理器上快速运行 文本
Intern-Decision 4B 4B 最佳全能选手 文本、图像
Kev 4B 4B 谨慎且校准良好;长策略 文本
Lev 4B 每个问题数百个选项 文本
CLM 8B 8B 代理操作、对众多候选进行排序 文本
Jev-Omni 12B 最难的问题;图像、音频和视频(需要 NVIDIA GPU) 文本、图像、音频、视频

每个模型都附带为其制作的示例,经过检查以给出正确答案:CLM 8B 以一个网络代理选择下一步行动开场,Lev 以一个包含 77 个选项的问题开场,Kev 4B 以一个带例外情况的退款政策开场,Laya Multilingual 以一条日语消息开场,Jev-Omni 以一张收据照片开场。在 Playground 中选择模型会显示其自带的示例(除非你自己写了示例),Models 页面在 Try it 下列出它们。scripts/model-examples.py 检查每个模型是否仍按预期回答其示例。

权重来自各发布者的 Hugging Face 仓库,并保留在标准的 Hugging Face 缓存中,与你的其他工具共享。每个模型保留自己的许可证;应用中的模型页面会链接到它。

从代码中使用

该工作室使用 TypeSafe 的 Jev API 以及基于它构建的网关格式,因此为 Jev 编写的代码只需更改基础 URL 即可运行。应用打开时,服务器位于 http://127.0.0.1:8420(API 页面显示确切地址)。

curl -s http://127.0.0.1:8420/v1/systemone -H 'content-type: application/json' -d '{
  "model": "laya",
  "state": "The package arrived crushed and the screen is cracked.",
  "questions": {
    "damaged": {"type": "noul", "instructions": "Was the item damaged?"},
    "team": {"type": "choice", "instructions": "Who should handle this?",
             "criteria": {"returns": "refunds and replacements", "shipping": "carriers and delivery", "sales": null}}
  }
}'
# pip install typesafe-sdk
from typesafe_sdk import TypeSafeClient, Noul

client = TypeSafeClient(api_key="local", base_url="http://127.0.0.1:8420", model="laya")
res = client.system_one(state="My card was charged twice for the same order.",
                        questions={"billing": Noul(instructions="Is this a billing problem?")})
print(res.answers["billing"].noul)   # probability of yes
端点 格式
POST /v1/systemone、GET /v1/models TypeSafe Jev API;官方 typesafe-sdk(Python)和 @typesafe-ai/sdk(JavaScript)无需更改即可运行
POST /api/alpha/decisions、POST /api/v1/systemone OpenRouter 的 Decisions API
POST /typesafe/v1/systemone、GET /typesafe/v1/models Vercel AI Gateway 的 TypeSafe 路由
POST /v1/evaluate Vercel AI Gateway 的评估 API
/v1/studio/... 该工作室自己的 API:模板、带历史的决策、反馈、测试示例、设置(参考)

扩展,在每个端点上均被接受:multi、rank 和 number 问题类型;"media" 用于图像、音频和视频;"settings": {"temperature": 2.0} 用于校准;以及标头 X-Basal-Extensions: 1 以同时接收 decision、top_probability、probabilities 和 latency_ms。没有该标头时,响应完全符合 TypeSafe 的格式。交互式 API 文档位于 /docs。

决策保存在 History 中,来自每个端点,默认保留 30 天(可在 History 页面更改)。响应在 x-basal-decision-id 标头中指明所存储的决策。若某次调用不保留任何内容,请在正文中发送 "store": false(TypeSafe 自己的服务器会忽略它,因此同一代码可对两者运行)或标头 X-Basal-Store: 0;"answers_only" 保留答案但不保留情境。标记为 sensitive 的变量用于决策,且从不写入磁盘。

默认安全。该工作室仅在此计算机上监听;浏览器中打开的其他网站无法向其发送请求,更改(加载、下载、删除)需要标头 X-Basal-Client: 1。要为其他机器提供服务,请使用 --host 0.0.0.0 启动并设置 BASAL_API_KEY;客户端随后发送 Authorization: Bearer <key>。

已测试

内容 方式 结果
API 一致性 tests/test_conformance.py:TypeSafe 发布的 OpenAPI schema、两个官方 SDK、OpenRouter 的 schema 14 项中 14 项通过
模板、历史和工作室 API tests/test_studio_api.py(一个带有确定性测试模型的实时工作室)、tests/test_templates.py、tests/test_history_store.py、tests/test_contract.py 89 项中 89 项通过
每个模型,从端到端贯穿整个界面 scripts/e2e.py 在浏览器中驱动应用:全部十一个模型上的全部六种问题类型,两个能读取图像的模型上的图像,Evaluate、History、API 页面的示例、下载,以及在 GPU 和处理器之间切换 21 项中 21 项通过(详情与耗时)
训练模型(训练器) tests/training/(数据格式、发布门槛、设备策略、任务队列;每个模型系列一个契约测试)以及通过界面的 scripts/e2e_train.py;在 docs/trainer/RESULTS.md 中进行真实的微调 34 项核心测试中 34 项通过;Train 页面端到端通过(详情)
桌面应用 首次运行设置(硬件检查、安装、设备检查)、启动器入口、启动和停止引擎、强制退出后的恢复 NVIDIA GB10 上的 Linux ARM64

从源码运行

git clone https://github.com/BudEcosystem/Bud-Decision-Engine.git && cd Bud-Decision-Engine
./install.sh          # detects your hardware, asks where models run, installs everything into .venv (Windows: install.ps1)
./run.sh              # then open http://127.0.0.1:8420

构建桌面应用:cd desktop && npm install && npx tauri build(详情见 desktop/README.md)。运行测试:pip install -r requirements-dev.txt,然后 pytest tests/test_conformance.py 和 python scripts/e2e.py。

它是如何构建的

desktop app (desktop/, Tauri)   first run: installer/engine.py detects the hardware and installs PyTorch + libraries
      |                          later runs: starts the studio server and shows it in the window
      v
app window or browser (ui/) --HTTP--> studio server (basal/server.py, FastAPI; never touches the GPU)
                                         +- API formats (basal/api_compat.py): TypeSafe, OpenRouter, Vercel
                                         +- download queue (basal/hub.py): one at a time, smallest first
                                         +- where models run (basal/config.py): the device chosen in setup
                                         +- worker manager (basal/workers.py)
                                         v
                              one process per loaded model (basal/worker.py) --> GPU or processor
                                         +- an adapter per model family (basal/adapters/)
  • 每个已加载模型一个进程。 弹出模型会结束其进程,这是归还每一字节内存的唯一方式;一个模型崩溃不会拖垮整个 studio。
  • 适配器将一种通用请求格式(basal/contract.py)转换为每个模型自己的库,并返回原始概率;contract.build_answers 将它们转换为答案,因此置信度对每个模型含义相同。
  • 界面是纯 HTML、CSS 和 JavaScript,无需构建步骤。DESIGN.md 描述了它的设计系统。
路径 它是什么
desktop/ 桌面应用:设置界面以及负责安装、启动和停止引擎的 Rust 外壳
installer/engine.py 硬件检测和一步式引擎安装,由应用和 install.sh 共享
basal/ 运行时:服务器、API 格式、模型目录、工作进程、适配器
ui/ 界面;ui/registry.json 保存每个模型的详细信息和已发布结果
tests/、scripts/e2e.py、scripts/smoke.py 一致性、端到端和冒烟测试
get.sh、get.ps1 单行安装程序

故障排除

  • macOS 提示应用来自未识别的开发者。 右键点击应用并选择“打开”一次,或使用单行命令安装,可避免该警告。
  • Windows SmartScreen 对安装程序发出警告。 选择“更多信息”,然后选择“仍要运行”。单行命令可避免该警告。
  • 模型无法加载。 通常需要更多内存:从侧边栏或 System 页面弹出其他模型。每个模型的日志在其 Models 页面(View log)。
  • 下载速度慢。 Hugging Face 限制匿名下载;运行一次 hf auth login 并重启应用。
  • 设置未完成。 按“重试”;Details 日志会说明哪一步失败。设置不会更改应用自身文件夹之外的任何内容。
  • 将模型移到另一个处理器。 打开 System 页面,然后再次运行设置。

来源:Hacker News · github.com