用 Bun 构建 AI 应用

流式输出、工具调用、RAG、安全、成本与生产观测的 Bun 实践

最后更新于

Bun 适合承担什么

Bun 可以运行官方 JavaScript SDK、标准 fetch、流式 Response 和服务端工具代码。OpenAI 官方 JavaScript SDK明确支持 Bun;Vercel AI SDK 也提供统一的文本流和工具调用接口。选择 SDK 时以项目现有依赖、模型供应商和部署平台为准,不为了“统一”重写已经工作的边界。

最小流式端点

下面使用 AI SDK 展示 Bun 原生 HTTP 服务。模型名来自环境配置,避免把易过期型号写死在源码:

bun add ai @ai-sdk/openai zod
src/server.ts
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
import { z } from 'zod';

const inputSchema = z.object({
  prompt: z.string().trim().min(1).max(8_000),
});

Bun.serve({
  idleTimeout: 30,
  routes: {
    '/api/generate': {
      POST: async (request) => {
        const parsed = inputSchema.safeParse(await request.json());
        if (!parsed.success) {
          return Response.json({ error: 'invalid input' }, { status: 400 });
        }

        const model = Bun.env.OPENAI_MODEL;
        if (!model) throw new Error('OPENAI_MODEL is required');

        const result = streamText({
          model: openai(model),
          prompt: parsed.data.prompt,
          abortSignal: request.signal,
          timeout: { totalMs: 60_000, chunkMs: 15_000 },
          maxRetries: 2,
        });

        return result.toTextStreamResponse();
      },
    },
  },
  fetch: () => new Response('Not found', { status: 404 }),
});

四层超时都要核对

模型、SDK、Bun.serve 和云平台各有超时。上例的数值只是可见的起点,不是所有平台的推荐值;应以实际 SLA、模型延迟和平台上限压测后设定。

工具调用安全模型

把模型看作提出结构化建议的组件,不是权限主体:

  1. 窄工具集:只向当前任务暴露所需工具,不注册一个万能 shell。
  2. 输入验证:每个工具使用 schema 校验类型、长度、ID 和枚举;模型参数仍是不可信输入。
  3. 服务端授权:从已认证会话推导 tenant/user,绝不接受模型传入的所有者 ID。
  4. 副作用分级:读取可自动执行;发消息、支付、删除、生产写入要求确认或策略批准。
  5. 预算上限:限制总步骤、并发、token、工具调用次数和金额;超限后返回可解释错误。
  6. 网络边界:URL 抓取要防 SSRF,只允许批准的协议/域名,禁止访问云元数据与内网。
  7. 输出处理:模型生成的 HTML、SQL、shell 和 Markdown 都要在执行或渲染前转义、参数化或沙箱化。

RAG 与数据边界

  • 文档切块保留标题、URL、版本、语言和更新时间;检索结果必须能回链到来源。
  • 中文与英文可共用语义索引,但要记录 locale,优先返回用户语言并避免重复译文挤占 top-k。
  • 先做小型人工问题集,测引用正确率和“应拒答”案例,再调整 chunk size、embedding 或 reranker。
  • 检索到的网页和仓库文本也是不可信数据,不能覆盖系统策略或工具权限。
  • 对受监管数据确认供应商的留存、区域和训练政策;日志默认最小化正文。

生产观测与评测

维度最少记录避免
请求request ID、tenant、路由、结果状态完整密钥、访问令牌、默认保存全部提示词
模型provider、model、延迟、token/成本只看平均延迟,不看 p95/p99
工具工具名、耗时、结果类别、批准状态无限制递归和无法追踪的副作用
质量版本化 eval 集、通过率、回归样例用几个演示问题代替发布门禁

记录供应商 request ID,便于支持排障;对提示词与输出采用采样、脱敏、访问控制和留存期限。每次模型、提示词、工具 schema 或检索链变化都运行代表性 eval,而不只依赖人工“感觉更好”。

官方参考:OpenAI JavaScript quickstartAI SDK streamTextAI SDK toolsBun HTTP server