Cloudflare Workers AI 实战指南:边缘 GPU 推理、模型选型与 RAG 落地全解析
【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills
本文是面向开发者的 Cloudflare Workers AI 完整实操指南,覆盖在 Cloudflare 边缘网络上运行 GPU 加速 AI 推理的核心路径:如何通过原生 Workers Binding 调用 50+ 预训练模型、如何按文本生成 / Embeddings / 图像生成等任务选型、如何组合 Vectorize 构建 RAG 检索增强生成,以及流式输出、Function Calling、REST API、成本控制与常见坑位排查。读完本文,你将能在 Workers / Pages 中直接部署可用的 AI 推理服务,并掌握一套从配置、调用到上线的可复制方案。
Workers AI 是什么:边缘上的无服务器 GPU 推理
Workers AI 是 Cloudflare 提供的无服务器 AI 推理服务,核心特点可归纳为以下几点(依据 workers-ai/README.md):
- 50+ 预训练模型:覆盖 LLM 文本生成、Embeddings 向量化、图像生成、语音转文字、翻译等任务类型;
- 原生 Workers Binding:通过
env.AI.run()直接调用,无需任何外部 API 调用与额外依赖; - 按量付费:每次推理消耗 "neurons"(神经元),按模型复杂度阶梯计价;
- OpenAI 兼容 REST API:非 Workers 环境、外部服务可通过标准 HTTP 调用,兼容 OpenAI SDK;
- 流式输出:文本生成原生支持 Streaming,降低首字延迟;
- Function Calling:部分模型支持工具调用,可用于构建 Agent 应用。
从架构上看,推理运行在 Cloudflare 的 GPU 网络中。模型在首次请求时加载,存在约 1~3 秒的冷启动延迟,后续请求会显著加快(据 api.md,后续请求约 100~500ms)。理解这一点对设计缓存与预热策略至关重要。
在仓库的 SKILL.md 决策树中,Workers AI 被定位为 "Need AI / Run inference (LLMs, embeddings, images)" 的首选参考,与 Vectorize(向量数据库)、Agents SDK(有状态 Agent)、AI Gateway(缓存/路由)、AI Search(AI 搜索组件)构成完整的 AI 基础设施组合。
快速开始:部署你的第一个 AI Worker
1. 配置 wrangler.jsonc 并添加 Binding
在wrangler.jsonc中添加ai绑定(依据 configuration.md):
{ "name": "my-ai-worker", "main": "src/index.ts", "compatibility_date": "2024-01-01", "ai": { "binding": "AI" } }2. 安装 TypeScript 类型
npm install --save-dev @cloudflare/workers-types安装后即可在Env接口中使用Ai类型(该类型来自@cloudflare/workers-types,见 gotchas.md):
interface Env { AI: Ai; } export default { async fetch(request: Request, env: Env) { const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: [{ role: 'user', content: 'What is Cloudflare?' }] }); return Response.json(response); } };3. 本地开发与部署
# Setup - add binding to wrangler.jsonc wrangler dev --remote # Must use --remote for AI wrangler deploy关键前提:本地(Local)开发环境不包含模型权重,AI 推理必须使用wrangler dev --remote(见 configuration.md)。执行wrangler deploy前,请先通过npx wrangler whoami确认已认证(参考 SKILL.md)。
模型选择决策树
正确选型是控制成本与质量的核心。以下决策树完整继承自 README.md:
文本生成(Chat / Completion)
| 优先级 | 模型 ID | 特点 | 神经元成本 |
|---|---|---|---|
| 质量最佳 | @cf/meta/llama-3.1-70b-instruct | 70B 参数,质量最高但昂贵 | ~2000 neurons |
| 均衡 | @cf/meta/llama-3.1-8b-instruct | 质量与成本平衡,默认推荐 | ~200 neurons |
| 最快最省 | @cf/mistral/mistral-7b-instruct-v0.1 | 速度快、成本最低 | ~50 neurons |
- Function Calling(工具调用):使用
@cf/meta/llama-3.1-8b-instruct或@cf/meta/llama-3.1-70b-instruct(原生工具支持); - 代码生成:使用
@cf/deepseek-ai/deepseek-coder-6.7b-instruct(代码专项优化)。
Embeddings(语义搜索 / RAG)
| 场景 | 模型 ID | 维度 | 说明 |
|---|---|---|---|
| 英文·最佳 | @cf/baai/bge-base-en-v1.5系列中的bge-large-en-v1.5 | 1024 | 质量最高 |
| 英文·均衡 | @cf/baai/bge-base-en-v1.5 | 768 | 质量良好 |
| 英文·快速 | @cf/baai/bge-small-en-v1.5 | 384 | 维度低、质量略低但快 |
| 多语言 | @hf/sentence-transformers/paraphrase-multilingual-minilm-l12-v2 | - | 多语言场景 |
说明:README 原文将英文场景三个模型分别写作
bge-large-en-v1.5/bge-base-en-v1.5/bge-small-en-v1.5,仓库其余文档(api.md、patterns.md)中的完整 ID 为@cf/baai/bge-base-en-v1.5等,选择具体型号时请在官方模型目录中核对完整 ID 以确保拼写无误(错误模型 ID 会触发错误码 7502)。
图像生成
- Stable Diffusion:
@cf/stabilityai/stable-diffusion-xl-base-1.0(约 10,000 neurons,属于高成本任务); - 人像/面部优化:
@cf/lykon/dreamshaper-8-lcm(针对人脸优化)。
其他任务
- 语音转文字:
@cf/openai/whisper - 翻译:
@cf/meta/m2m100-1.2b(支持 100 种语言) - 图像分类:
@cf/microsoft/resnet-50
三种调用方式:SDK 方法决策树
原生 Binding(推荐)
适用场景:构建 Workers / Pages 应用,且使用 TypeScript。优势:零外部依赖、性能最佳、类型原生。
await env.AI.run(model, input);REST API
适用场景:外部服务、非 Workers 环境、测试调试。优势:标准 HTTP,任意环境可用。
curl https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai/run/@cf/meta/llama-3.1-8b-instruct \ -H "Authorization: Bearer <API_TOKEN>" \ -d '{"messages":[{"role":"user","content":"Hello"}]}'对应在代码中通过fetch调用(见 configuration.md):
const response = await fetch( `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/@cf/meta/llama-3.1-8b-instruct`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_TOKEN}` }, body: JSON.stringify({ messages: [{ role: 'user', content: 'Hello' }] }) } );API Token 需在 Cloudflare 控制台创建,授予 "Workers AI - Read" 权限(见 configuration.md)。
Vercel AI SDK / OpenAI SDK 集成
适用场景:需要使用 Vercel AI SDK 的流式 UI、工具调用抽象等能力。优势:跨提供商统一接口。
import { openai } from '@ai-sdk/openai'; const model = openai('model-name', { baseURL: 'https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai/v1', headers: { Authorization: 'Bearer <API_TOKEN>' } });原生 OpenAI SDK 同样适用(configuration.md),只需将baseURL指向 Workers AI 的 OpenAI 兼容端点/ai/v1:
import OpenAI from 'openai'; const client = new OpenAI({ apiKey: env.CLOUDFLARE_API_TOKEN, baseURL: `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/ai/v1` });核心 API 详解:env.AI.run 的完整用法
文本生成
核心方法是await env.AI.run(model, input)(api.md):
const result = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: [ { role: 'system', content: 'You are helpful' }, { role: 'user', content: 'Hello' } ], temperature: 0.7, // 0-1 max_tokens: 100 }); console.log(result.response);temperature:采样温度,范围 0~1,值越低输出越确定(设为 0 可获得确定性输出,见 gotchas.md);max_tokens:单次输出最大 token 数,注意不要超过模型上下文窗口(2K~8K token,随模型而异)。
流式输出(Streaming / SSE)
const stream = await env.AI.run(model, { messages, stream: true }); return new Response(stream, { headers: { 'Content-Type': 'text/event-stream' } });stream: true时返回ReadableStream,可逐 chunk 消费(for await),或通过TransformStream包装为标准 SSE 格式(完整实现见 patterns.md):
const { readable, writable } = new TransformStream(); const writer = writable.getWriter(); (async () => { for await (const chunk of stream) { await writer.write(new TextEncoder().encode(`data: ${JSON.stringify(chunk)}\n\n`)); } await writer.write(new TextEncoder().encode('data: [DONE]\n\n')); await writer.close(); })(); return new Response(readable, { headers: { 'Content-Type': 'text/event-stream' } });Embeddings(批量向量化)
const result = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: ['Query', 'Doc 1', 'Doc 2'] // 批量提交以提高效率 }); const [queryEmbed, doc1Embed, doc2Embed] = result.data; // 768 维向量返回结构为{ data: number[][]; shape: number[] },data是按输入顺序排列的向量数组(gotchas.md)。批量提交多条文本是官方推荐的性能优化手段(见 api.md)。
Function Calling(工具调用)
const tools = [{ type: 'function', function: { name: 'getWeather', description: 'Get weather for location', parameters: { type: 'object', properties: { location: { type: 'string' } }, required: ['location'] } } }]; const response = await env.AI.run(model, { messages, tools }); if (response.tool_calls) { const args = JSON.parse(response.tool_calls[0].function.arguments); // 执行函数,把结果回传给模型 }注意:目前仅@cf/meta/llama-3.1-*与mistral-7b-instruct-v0.2支持工具调用(gotchas.md)。
图像生成
const image = await env.AI.run('@cf/stabilityai/stable-diffusion-xl-base-1.0', { prompt: 'Mountain sunset', num_steps: 20, // 1-20 guidance: 7.5 // 1-20 }); return new Response(image, { headers: { 'Content-Type': 'image/png' } });语音识别(Speech-to-Text)
const audioArray = Array.from(new Uint8Array(await request.arrayBuffer())); const result = await env.AI.run('@cf/openai/whisper', { audio: audioArray }); console.log(result.text);翻译
const result = await env.AI.run('@cf/meta/m2m100-1.2b', { text: 'Hello', source_lang: 'en', target_lang: 'es' }); console.log(result.translated_text);错误码速查表
| 错误码 | 含义 | 修复方法 |
|---|---|---|
| 7502 | 模型不存在 | 检查模型 ID 拼写,在官方模型目录核对 |
| 7504 | 输入校验失败 | 核对输入 schema(文本生成需messages数组,Embeddings 需text字段) |
| 7505 | 触发限流 | 降低请求频率或升级套餐 |
| 7506 | 上下文超限 | 缩减输入长度(messages内容) |
RAG vs 直接生成:何时组合 Vectorize
使用 RAG(Vectorize + Workers AI)的场景
- 回答关于特定文档 / 私有数据的提问;
- 需要从已知语料中获得事实准确的回答;
- 上下文超过模型窗口(>4K tokens,部分模型仅 2K~8K);
- 构建知识库问答系统。
使用直接生成的场景
- 创意写作、头脑风暴;
- 通用知识问答;
- 上下文较小、可完整放进 prompt(<4K tokens);
- 成本敏感场景(RAG 会增加 embedding 与向量检索成本)。
RAG 完整落地实现
仓库 patterns.md 给出了四步式标准实现:
// 1. Embed query(向量化查询) const embedding = await env.AI.run('@cf/baai/bge-base-en-v1.5', { text: query }); // 2. Search vectors(检索向量库) const results = await env.VECTORIZE.query(embedding.data[0], { topK: 5, returnMetadata: true }); // 3. Build context(拼接上下文) const context = results.matches.map(m => m.metadata?.text).join('\n\n'); // 4. Generate with context(带上下文生成) const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: [ { role: 'system', content: `Answer based on:\n\n${context}` }, { role: 'user', content: query } ] });配套的 Vectorize 配置(见 configuration.md):
{ "ai": { "binding": "AI" }, "vectorize": { "bindings": [{ "binding": "VECTORIZE", "index_name": "embeddings-index" }] } }Vectorize 是全局分布式向量数据库(详见 vectorize/README.md),创建索引时需指定维度与距离度量,且索引配置不可变(创建后无法修改维度或度量方式)。文本/语义搜索建议使用cosine度量。若追求更高一致性,可在检索后从 R2/D1/KV 拉取全文再喂给模型,具体见 vectorize/patterns.md。
平台限制与成本优化
平台限制一览(继承自 README.md)
| 限制项 | 免费额度 | 付费套餐 |
|---|---|---|
| Neurons/天 | 10,000 | 按量付费 |
| 速率限制 | 随模型而异 | 更高(联系支持) |
| 上下文窗口 | 视模型而定(2K-8K) | 相同 |
| 流式输出 | ✅ 支持 | ✅ 支持 |
| Function Calling | ✅ 支持(部分模型) | ✅ 支持 |
定价:免费额度 10,000 neurons/天,超出后按实际消耗的神经元计费(随模型而异)。
神经元成本对照(来自 patterns.md 与 gotchas.md)
| 任务类型 | 模型 | Neurons/请求 |
|---|---|---|
| 分类 | @cf/mistral/mistral-7b-instruct-v0.1 | ~50 |
| 聊天 | @cf/meta/llama-3.1-8b-instruct | ~200 |
| 复杂任务 | @cf/meta/llama-3.1-70b-instruct | ~2000 |
| Embeddings | @cf/baai/bge-base-en-v1.5 | ~10 |
| 图像生成 | Stable Diffusion XL 等 | 10,000+ |
成本优化要点
- 按任务选最小可用模型:能 8B 解决的不要上 70B,例如用
@cf/meta/llama-3.1-8b-instruct替代 70B; - 批量 Embeddings:单次请求传入多个文本(
text: textsArray),一次调用完成多段向量化(patterns.md); - 流式输出长响应:降低感知延迟(api.md);
- 接受冷启动:首次请求约 1~3 秒,后续约 100~500ms;对高频 prompt 可借助 AI Gateway 缓存(gotchas.md)。
工程实战模式:重试、回退与并行
错误处理与指数退避重试
针对 7505 限流错误实现重试(patterns.md):
async function runWithRetry(env, model, input, maxRetries = 3) { for (let attempt = 0; attempt < maxRetries; attempt++) { try { return await env.AI.run(model, input); } catch (error) { if (error.message?.includes('7505') && attempt < maxRetries - 1) { await new Promise(r => setTimeout(r, Math.pow(2, attempt) * 1000)); continue; } throw error; } } }模型回退(Fallback)
高成本模型失败时回退到低成本模型(patterns.md):
try { return await env.AI.run('@cf/meta/llama-3.1-70b-instruct', { messages }); } catch { return await env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages }); }Prompt 模式:System Prompt 与 Few-shot
// System prompts const PROMPTS = { json: 'Respond with valid JSON only.', concise: 'Keep responses brief.', cot: 'Think step by step before answering.' }; // Few-shot 示例 messages: [ { role: 'system', content: 'Extract as JSON' }, { role: 'user', content: 'John bought 3 apples for $5' }, { role: 'assistant', content: '{"name":"John","item":"apples","qty":3}' }, { role: 'user', content: actualInput } ]并行执行
同一请求内并行执行多个独立任务(patterns.md):
const [sentiment, summary, embedding] = await Promise.all([ env.AI.run('@cf/mistral/mistral-7b-instruct-v0.1', { messages: sentimentPrompt }), env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: summaryPrompt }), env.AI.run('@cf/baai/bge-base-en-v1.5', { text }) ]);常见坑位与排查指南(Gotchas)
关键警告:@cloudflare/ai包已弃用
不要安装@cloudflare/ai包,请使用原生 Binding(gotchas.md):
// ❌ 错误 - 不要安装 @cloudflare/ai import Ai from '@cloudflare/ai'; // ✅ 正确 - 使用原生 binding export default { async fetch(request: Request, env: Env) { await env.AI.run('@cf/meta/llama-3.1-8b-instruct', { messages: [...] }); } }常见问题速查表
| 问题 | 原因与修复 |
|---|---|
| 本地 AI 不工作 | 本地无模型权重,使用wrangler dev --remote |
env.AI is undefined | wrangler.jsonc缺少ai绑定配置 |
类型Ai未找到 | 安装@cloudflare/workers-types |
| 输出为空 | 检查上下文限制(2K-8K tokens),校验输入结构 |
| 输出不一致 | 设置temperature: 0获得确定性输出 |
| 冷启动延迟 | 首次请求 1-3s 属正常,高频 prompt 使用 AI Gateway 缓存 |
Embedding 返回结构差异
不同模型返回结构可能不同:bge-base-en-v1.5返回{ data: [[0.1, 0.2, ...]] },取向量时使用response.data[0](gotchas.md)。推荐的类型定义:
interface TextGenerationResponse { response: string; } interface EmbeddingResponse { data: number[][]; shape: number[]; }多模型统一管理与推荐阅读顺序
多模型配置模板
将常用模型集中管理,便于切换与维护(configuration.md):
const MODELS = { chat: '@cf/meta/llama-3.1-8b-instruct', embed: '@cf/baai/bge-base-en-v1.5', image: '@cf/stabilityai/stable-diffusion-xl-base-1.0' };开发工作流命令汇总
# 本地开发(AI 必须 --remote) wrangler dev --remote # 部署到生产 wrangler deploy # 查看模型目录(在 Cloudflare 官方文档核对模型 ID 与参数)配套文档阅读路径
Workers AI 参考文档按主题拆分为四份,按需取用:
- configuration.md — wrangler.jsonc 配置、TypeScript 类型、Bindings、环境变量与 RAG 配置;
- api.md —
env.AI.run()全量用法、流式、Function Calling、REST API、响应类型与错误码; - patterns.md — RAG 与 Vectorize 集成、Prompt 工程、批处理、错误处理与缓存;
- gotchas.md — 已弃用包、限流、定价、常见错误排查。
推荐路径:快速开始(本文)→ 首次配置读 configuration.md → 选模型用上文的决策树 → 深入调用读 api.md → 构建 RAG 读 patterns.md → 成本与排错读 gotchas.md。
关联生态
Workers AI 常与以下平台服务组合使用(见 README.md):
- vectorize — 向量数据库,承载 RAG 检索;
- ai-gateway — 为 AI 请求提供缓存、限流与分析;
- workers — Worker 运行时与 fetch handler 模式。
至此,从模型选型、Binding 配置、三类调用方式、核心 API、RAG 落地到成本与排错,你已具备在 Cloudflare 边缘网络上线 AI 推理能力的完整工具箱。
【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考