AI Prompt 管理平台 版本化 · 可对比 · 可回滚

调用 AI,一条 REST 就够。

Prompt、版本、模型都在这里集中管理:网页上改 prompt、看 diff、一键回滚,多版本多模型横向对比。 业务方那侧,只要 POST 一个稳定的 slug —— 换模型、换版本、调 prompt,调用方一个字都不用改。

打开工作台 看它怎么运作 改完即生效 · 不重新部署
tasks / review-score · 工作台
slug review-score ● v3 production v4 draft
你是电商评审助手。给下面这条用户评论按 0–5 打分, 只返回 JSON:{{comment}}
试运行 { "score": 4, "sentiment": "positive" } 豆包 · 812ms · ¥0.0007
调用侧

模型、重试、Key…… 复杂都收在后台。

调用 AI 不该是一堆配置。模型选型、temperature、prompt 拼接、失败重试、密钥管理 —— 这些全被 Prompt Exchange 收在后面。调用方只需发一条 HTTP 请求:把输入递进去,把结果拿回来。

没有它 · 全塞进业务代码
app/services/ai_call.rb
client = OpenAI.new(api_key: ENV["ARK_KEY"])
prompt = "你是评审助手…" + comment + "…只返回 JSON"
resp = client.chat(
  model:       "doubao-1.5-pro",
  temperature: 0.2,
  max_tokens:  512,
  response_format: { type: "json_object" }
)
with_retry(3) { … }        # 慢调用别卡住请求
data = JSON.parse(resp.dig("choices", 0, …))  # 自己解析 / 兜错
用 Prompt Exchange · 一条 REST
任意语言 · 任意服务
# 只发一条 REST,body 就是业务输入
curl -X POST …/api/tasks/review-score/invoke \
     -d '{ "input": { "comment": "发货很快" } }'

→ 202 { "run_id": 8812 }
# 结果走回调,或 GET /api/runs/8812

换模型、调 prompt、加 Schema、改 temperature —— 全在后台点几下,这条 REST 一个字都不用动。

为什么需要它

Prompt 变了,但没人给它版本管理。

Prompt 散落在各个服务的数据库和配置里,改一个字往往要发一次版;出了问题不知道改了什么、更不知道怎么退回去。Prompt Exchange 把这三件事一次解决。

01 / 即时

改完即生效

在网页里改 prompt、激活新版本,线上立刻切换 —— 不改一行代码,不重新部署。

02 / 可追溯

每次改动 = 一个不可变版本

行级 diff 看清改了什么,paper_trail 记录是谁在何时改的,历史版本永远躺在那儿。

03 / 可回退

一键回滚

回滚就是"重新激活某个历史版本"。同一 prompt 永远只有一个 production,秒级切回。

核心能力

从编写、对比到调用,一条闭环。

每一块都用产品里真实的界面元素说话 —— 真实的 diff、真实的对比矩阵、真实的调用响应。

Task · 稳定调用点

一个 slug 打包 prompt + 版本通道 + 模型 + JSON + 回调。业务方只说"给这条评论打分",不管背后是哪个版本、哪个模型。

POST /api/tasks/:slug/invoke
# 异步 · 立即 202 返回 run_id
curl -X POST …/api/tasks/review-score/invoke
  -d '{ "input": { "comment": "发货很快" } }'
→ 202 { "run_id": 8812, "state": "pending" }

多模型注册表

国内五家 + OpenAI + Claude + 火山即梦,一处注册。API Key / AK / SK 全部加密存库,对比与调用随手切换。

豆包 doubao Kimi 千问 智谱 DeepSeek OpenAI Claude 火山即梦
api_key encrypted ••••••••••••3f7a

版本化 & 行级 diff

任选两个版本并排比对,正文行级高亮、params 键级增删改一目了然,回滚就是激活历史版本。

v2 → v3
- 给评论打分,返回一个数字
+ 给评论按 0–5 打分,只返回 JSON
params.temperature 0.70.2

对比台 · 样本 × 版本 × 模型 矩阵

选一批样本、几个版本、几个模型,后台并发跑出笛卡尔积,同一批输入公平横比 —— 一眼看出哪个组合更好,连 token、耗时、成本都摆在格子里。

样本 \ 组合 v3 · 豆包 v4 · 豆包 v4 · Kimi v4 · Claude
好评 · "发货很快"
4 ·812ms
5 ·640ms
5 ·910ms
4 ·1.2s
差评 · "包装破损"
2 ·780ms
1 ·655ms
2 ·870ms
1 ·1.1s
中评 · "一般般吧"
3 ·805ms
3 ·690ms
4 ·880ms
3 ·1.0s

Schema 强约束输出

给版本挂一份 JSON Schema,走 with_schema 让模型稳定吐结构化数据;Schema 随版本走,可回滚。优先级 schema > json。

output_schema
{ score:int,
  sentiment:enum }
# parsed Hash
{ score: 4,
  sentiment: "pos" }

生成车道 · 图 / 视频

同一套版本、试运行、记录闭环,也能管图片和视频生成的 prompt。接火山即梦,走两步异步生成协议。

chat
image
video
Prompt.kind = image → jimeng_seedream · TOS 媒体链接

统计 Dashboard · 调用量 / token / 成本 / 成功率

每个 task 花了多少钱、跑了多少次、成功率多少,一目了然。数据走每日 rollup,记录被清理也不会失真。

12,480
总调用
98.6%
成功率
¥ 41.7
累计成本
3.2M
tokens
版本生命周期

一条状态机管住每一个版本。

同一 prompt 在任意时刻只有一个 production。数据库层用可空唯一标记强制这条不变量 —— 不可能同时上线两个版本。

draft

草稿版本
随便改、随便试运行

activate!激活
● production

当前生效
API 调用命中它

activate!换新版
archived

归档留档
diff / 回滚随时可取

回滚 = 重新激活某个 archived 版本,让它变回 ● production —— 秒级、无需部署。
技术栈

只押 RubyLLM 一个核心依赖。

用 RubyLLM 核心当 LLM 客户端,不押那些单人 prompt gem。后台异步执行慢调用,网页拿到 202 就走。

Ruby 4.0 Rails 8.1 RubyLLM 1.16 Hotwire Turbo · Stimulus Tailwind v4 Solid Queue 后台任务 MySQL 8 paper_trail 审计 RSpec
开始使用

给你的每一句 prompt,一个可管理的家。

建一个 Task,写下第一版 prompt,拿到一个稳定的 slug —— 剩下的版本、对比、回滚、成本,都交给 Prompt Exchange。