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

📝本文首发于 栏轩·阁

欢迎访问阅读原文,获取更好的阅读体验。


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

前言

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

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


一、Workers AI 是什么

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

额度与定价

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

套餐免费额度超出价格
Workers Free10,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 AIAI 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 等。

3.2 查看可用模型

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

3.3 Cloudflare-hosted vs Third-party

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

类型说明调用方式
Cloudflare-hostedCloudflare 自身托管的开源模型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.tsexportinterfaceEnv{AI:Ai;// Workers AI 绑定// ... 其他绑定}

5.3 调用模型

constresult=awaitenv.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 promptconstidentity=`/no_think 你是 Ava,栏轩阁博客看板娘...`;construles="你是个可爱的小话痨,喜欢聊天也懂点技术~\n...";// 调用 Workers AIconstresult=awaitenv.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_tokensconstisChat=modeKey==="chat";constresult=awaitenv.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 请求:

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

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


七、遇到的坑与解决方案

7.1 Qwen3 深度思考模式的关闭

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

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

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

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

constidentity=(name:string)=>{constc=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{constresult=awaitenv.AI.run("@cf/qwen/qwen3-30b-a3b-fp8",{...});// ... 正常返回}catch(e:any){consterrStr=JSON.stringify(e?.message||e?.toString()||e);if(errStr.includes("3036")||errStr.includes("used up")||errStr.includes("limit")){// 额度用尽,返回随机替代回复constmsgs=QUOTA_MSGS[modeKey]?.[ch]??QUOTA_MSGS.chat.Ava;returnrespond({reply:msgs[Math.floor(Math.random()*msgs.length)]},"ok",1,origin);}returnrespond({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

附录:相关链接

  • Cloudflare Workers AI 官方文档
  • Workers AI 定价
  • Qwen3-30B-A3B 模型详情
  • Workers AI 错误码参考
  • 项目 GitHub 仓库