不用花一分钱,我让博客看板娘学会了聊天 _ 用 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 & AI→AI,即可进入 Workers AI 管理页面。在这里可以查看额度使用情况、浏览可用模型、调试 Prompt 等。
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.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: false或thinking: 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 的使用要点:
- 选对模型:Qwen3-30B-A3B 的 MoE 架构,速度快、效果好、性价比高,适合对话场景
- 做好错误处理:额度用尽(错误码 3036)时优雅降级,返回预设文本而非直接报错
- 精细化 Token 管理:按场景分级控制 max_tokens,避免浪费额度
- 善用提示词工程:
/no_think跳过推理过程、自然语言约束回复格式,比 API 参数更灵活 - 接入极简:声明 AI Binding →
env.AI.run()一行代码即可调用,无需 SDK 或 API Key
附录:相关链接
- Cloudflare Workers AI 官方文档
- Workers AI 定价
- Qwen3-30B-A3B 模型详情
- Workers AI 错误码参考
- 项目 GitHub 仓库
