不用花一分钱,我让博客看板娘学会了聊天 _ 用 Workers AI 实现自由对话

在线体验栏轩阁 — 左下角的看板娘已接入 AI 对话,欢迎来聊聊天~(๑•̀ㅂ•́)و✧

前言

我的博客(栏轩阁)一直有 Live2D 看板娘陪伴访客浏览。最初看板娘只能播放预设的触碰反馈和定时闲聊,虽然可爱,但说来说去就那几句话,用户很快会腻。我一直在想:能不能让看板娘真正「活」过来,能和访客自由对话?

当然可以——但需要一个足够轻量、免费的 AI 推理方案。Cloudflare Workers AI 正好满足这个需求。


一、Workers AI 是什么

Workers AI 是 Cloudflare 推出的边缘 AI 推理服务,允许在 Cloudflare Workers 中直接调用 GPU 加速的开源模型,无需管理任何基础设施。它在全球 330+ 城市的数据中心运行,延迟极低。

额度与定价

Workers AI 采用 Neurons(神经元) 作为计量单位——这是 Cloudflare 对 GPU 算力的抽象,统一了文本、嵌入、图像、音频等不同模型的计价口径:

套餐 免费额度 超出价格
Workers Free 10,000 Neurons/天(UTC 0 点重置) 必须升级 Paid
Workers Paid 包含 10,000 Neurons/天 $0.011 / 1,000 Neurons

对于我的博客场景——轻量对话、短回复、非高频访问——免费额度完全够用。即使在免费额度已用尽时,代码层面也有优雅的降级方案(后面详述)。

为什么适合我的博客

  • 零运维:不需要部署 GPU 服务器,不需要配置 API Key
  • 边缘执行:Worker 和 AI 推理在同一运行时,延迟极低
  • 完全免费:10,000 Neurons/天对小博客绰绰有余
  • 和项目无缝集成:博客的前端(Next.js)和 API(Worker)已经全部部署在 Cloudflare 生态中

二、Workers AI vs AI Gateway

Cloudflare 提供了两个与 AI 相关的产品,容易混淆,这里做个区分:

Workers AI AI Gateway
本质 Cloudflare 自有的 AI 推理服务 第三方 AI API 的代理/网关
模型 Cloudflare 托管的开源模型(50+) 接入 OpenAI、DeepSeek 等外部 API
计费 Neurons 免费额度 按 API 调用量计费(加上第三方费用)
适用场景 轻量推理、小模型、免费使用 用特定模型(如 GPT-4)、企业级管理

简单理解:Workers AI 像是 Cloudflare 自带的「免费小卖部」——直接拿,不用配置;AI Gateway 像是「外卖中转站」——本质还是调用 DeepSeek/OpenAI 等的付费 API,Cloudflare 帮你管理流量、缓存和费用。

对于看板娘对话这种对模型要求不高的场景,Workers AI 完全足够


三、在 Cloudflare Dashboard 中启用 Workers AI

在使用代码调用之前,先在 Cloudflare Dashboard 中了解 Workers AI 的能力。

3.1 登录 Cloudflare,进入 AI Workers 页面

登录 Cloudflare Dashboard,在左侧菜单找到 Workers & AIAI,即可进入 Workers AI 管理页面。在这里可以查看额度使用情况、浏览可用模型、调试 Prompt 等。

Workers AI 管理页面

3.2 查看可用模型

在 AI 页面的 Models 标签页(或直接访问 AI Models 目录),可以浏览所有可用的 50+ 模型,包括 LLM、图像生成、嵌入、分类等。

模型列表截图

3.3 Cloudflare-hosted vs Third-party

在模型列表中,你会发现模型分为两大类:

类型 说明 调用方式
Cloudflare-hosted Cloudflare 自身托管的开源模型 Workers AI 直接调用(env.AI.run()
Third-party 第三方模型供应商的模型 需要通过 AI Gateway 集成

我们使用 Cloudflare-hosted 的模型,它直接通过 Workers AI Binding 调用,不需要额外的 API Key 或配置。

3.4 查看官方示例代码

点击任一 Cloudflare-hosted 模型的详情页面,官方会直接提供示例代码:

模型示例代码

示例代码通常提供两种调用方式:

  • Workers Binding 方式:在 Worker 中用 env.AI.run() 调用
  • REST API 方式:通过 cURL 或 HTTP 客户端直接调用 API

你可以直接复制这些代码到 Worker 中运行,或者在 Dashboard 的 Playground 中在线调试。


四、模型选择:Qwen3-30B-A3B

经过调研,我的项目选择了 @cf/qwen/qwen3-30b-a3b-fp8(阿里通义千问 3),这是一个 MoE(混合专家)架构 模型:

关键特性

属性 数值
总参数 30B(300 亿)
每次激活参数 3B(30 亿)
上下文窗口 32,768 tokens
函数调用
推理能力
许可证 Apache 2.0

MoE 架构的优势

MoE 的关键在于:虽然模型有 300 亿参数,但每次推理只激活 30 亿参数。这意味着:

  • 速度快:激活参数量小,推理延迟低
  • 效果好:总参数量大,知识面广
  • 性价比高:消耗的 Neurons 比同规模稠密模型少得多

定价参考

Token 类型 价格(每百万 tokens)
输入 $0.051
输出 $0.34

按看板娘平均每次回复 30-50 tokens 计算,即使在 Paid 计划下,每天数千次对话也花不了几分钱。


五、快速开始:配置 Workers AI

5.1 声明 AI Binding

wrangler.json 中添加 ai 绑定:

{
  "name": "blog-api",
  "main": "src/index.ts",
  "compatibility_date": "2026-06-10",
  "ai": {
    "binding": "AI"
  }
}

5.2 TypeScript 类型声明

// src/types.ts
export interface Env {
  AI: Ai;  // Workers AI 绑定
  // ... 其他绑定
}

5.3 调用模型

const result = await env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", {
  messages: [
    { role: "system", content: "你是一个可爱的看板娘..." },
    { role: "user", content: "今天天气怎么样?" },
  ],
  max_tokens: 300,
});

响应格式支持两种形态,兼容处理:result.response(旧格式)或 result.choices[0].message.content(OpenAI 兼容格式)。

至此,一个基础的 AI 对话能力就已经接入了。但要把看板娘真正用起来,还需要很多细节打磨——下面进入实践部分。


六、项目实践:在 Worker 中集成 Workers AI

6.1 整体架构

                  POST /ai/chat
Next.js 前端 ──────────────────→  Cloudflare Worker
{ message, character,            │
  history, mode }                ├── env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", { messages })
                                 │      ↓
                                 └── 返回 { reply }

所有 AI 对话请求不经过后端 Spring Boot,直接由 Cloudflare Worker 处理。前端只需要向 Worker 发送 POST 请求,传递四个参数即可——无需 SDK、无需 API Key。

6.2 提示词(Prompt)设计

Workers AI 的调用形式是标准的 messages 数组:system + user / assistant。关键在 system prompt 的设计——既要定义角色行为,又要控制回复质量。

// 拼接 system prompt
const identity = `/no_think 你是 Ava,栏轩阁博客看板娘...`;
const rules = "你是个可爱的小话痨,喜欢聊天也懂点技术~\n...";

// 调用 Workers AI
const result = await env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", {
  messages: [
    { role: "system", content: identity + "\n" + rules },
    { role: "user", content: message },
  ],
  max_tokens: 300,
});

system prompt 中包含了:

  • 角色身份:名字、性格、与其他角色的关系
  • 行为约束:回复长度限制(不超过20字)、语气风格(带emoji)、禁忌(不要反问)
  • 博客背景:博客名称、博主信息

注意:不要在 system prompt 中塞过多 JSON 或结构化的约束,Workers AI 上的模型对自然语言指令的遵循效果最好。

6.3 多模式与 Token 分级

同一个 AI 接口可以服务多种场景,关键在于按场景分级控制 token 消耗

// 根据 mode 选择不同的 system prompt 和 max_tokens
const isChat = modeKey === "chat";
const result = await env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", {
  messages: [
    { role: "system", content: MODE_PROMPTS[modeKey] },
    ...(isChat ? history.slice(-6) : []), // chat 模式带历史
    { role: "user", content: message },
  ],
  max_tokens: isChat ? 300 : 100, // 自由对话 vs 单次点评
});
模式 用途 max_tokens 是否带历史
chat 自由对话 300 最近6条
article/project/about 页面点评 100

为什么这样分级? 自由对话需要上下文连贯,300 tokens 可以让角色说出完整的话;页面点评只是一两句俏皮话,100 tokens 足够。合理的 token 分级能在免费额度下支撑更多对话

6.4 前端调用

前端只需向 Worker 发送一个 POST 请求:

const res = await fetch(`https://api.lxpavilion.top/ai/chat`, {
  method: "POST",
  body: JSON.stringify({
    message: "今天天气怎么样?",
    character: "Ava",    // 或 "Diana"
    history: [...],       // 之前对话记录(用于保持上下文)
    mode: "chat",         // 或 "article" / "project" / "about"
  }),
});
const { data: { reply } } = await res.json();

Worker 返回统一的 { code, data: { reply }, msg } 格式,前端拿到 reply 后渲染到对话框即可。


七、遇到的坑与解决方案

7.1 Qwen3 深度思考模式的关闭

问题:Qwen3 模型默认开启深度思考(Reasoning)模式,会在回复前输出一大段思考过程(类似 ...),导致:

  • 回复不即时,用户需要等很久才能看到回复
  • 浪费大量 tokens,加速额度消耗
  • 看板娘的「简短俏皮」人设被破坏

尝试:查阅文档发现 Qwen3 没有提供 reasoning: falsethinking: false 这样的 API 参数来关闭思考模式。

解决方案:在系统提示词的最开头添加 /no_think 标记:

const identity = (name: string) => {
  const c = CHAR_ID[name];
  return `/no_think 你是 ${name},栏轩阁博客看板娘,${c.trait}~\n${c.friend}`;
};

这是一个隐式的提示词工程技巧——Qwen3 在训练中学习了 /no_think 前缀表示跳过思考链、直接输出。加上这个前缀后,回复速度大幅提升,tokens 消耗也明显减少。

如果你的项目也使用了 Qwen3 并发现思考过程过长,试试在 system prompt 前面加 /no_think 不同版本的 Qwen 行为可能不同,建议在自己的测试环境中验证效果。

7.2 额度超限的优雅降级

问题:免费额度用尽后,Workers AI 会返回错误码 3036(HTTP 429):

Error code 3036: "You have used up your daily free allocation of 10,000 neurons."

此时如果直接返回错误给前端,用户体验很差。

解决方案:在 catch 中捕获额度错误,返回预设的替代消息:

try {
  const result = await env.AI.run("@cf/qwen/qwen3-30b-a3b-fp8", { ... });
  // ... 正常返回
} catch (e: any) {
  const errStr = JSON.stringify(e?.message || e?.toString() || e);
  if (errStr.includes("3036") || errStr.includes("used up") || errStr.includes("limit")) {
    // 额度用尽,返回随机替代回复
    const msgs = QUOTA_MSGS[modeKey]?.[ch] ?? QUOTA_MSGS.chat.Ava;
    return respond(
      { reply: msgs[Math.floor(Math.random() * msgs.length)] },
      "ok", 1, origin
    );
  }
  return respond({ error: e.message }, "AI error", 0, origin);
}

我为每位角色、每种模式都准备了 5-10 条替代消息,风格完全贴合角色性格。例如 Ava 额度用尽时会说:

「哎呀~今天聊了好多呀,我先下线啦,明天再来找你玩!(。•́︿•̀。)」
「唔…今天先到这里吧,我得去充电了~明天满血复活!🔋」

用户完全感知不到是额度用尽——模型降级到预设文本,体验依然流畅。

7.3 额度优化:缓存与简短原则

为了在免费额度下容纳更多对话,我从设计层面做了几项优化:

① 按模式区分 max_tokens

max_tokens: isChat ? 300 : 100, // 自由对话 300 tokens,页面点评仅 100 tokens

页面点评只是一两句话的俏皮话,100 tokens 完全够用,节省了 2/3 的消耗。

② 角色规则限制回复长度

在系统提示词中明确约束:

每句话都很长但是别超过20个字啦!(๑•̀ㅂ•́)و✧
不要反问。
10-25字,带emoji。

这不仅节省 tokens,还贴合看板娘「简短俏皮」的人设——AI 太啰嗦反而出戏。

③ 按场景分层调用,减少重复请求

对于同一页面,AI 点评内容不会变化,可以使用预加载 + 缓存策略:进入页面时提前请求一次 AI 点评,将结果缓存到前端;页面浏览期间不再重复请求,只有用户主动发起自由对话时才消耗额外额度。


八、总结

Cloudflare Workers AI 为轻量 AI 推理提供了一个零运维、低成本的解决方案。整个系统从 Worker 到模型推理都在 Cloudflare 边缘网络完成,延迟低、无需额外服务器。

回顾这次实践,Workers AI 的使用要点:

  1. 选对模型:Qwen3-30B-A3B 的 MoE 架构,速度快、效果好、性价比高,适合对话场景
  2. 做好错误处理:额度用尽(错误码 3036)时优雅降级,返回预设文本而非直接报错
  3. 精细化 Token 管理:按场景分级控制 max_tokens,避免浪费额度
  4. 善用提示词工程/no_think 跳过推理过程、自然语言约束回复格式,比 API 参数更灵活
  5. 接入极简:声明 AI Binding → env.AI.run() 一行代码即可调用,无需 SDK 或 API Key

附录:相关链接

posted @ 2026-07-31 13:47  PC2005-cloud  阅读(43)  评论(0)    收藏  举报