ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Workers AI 实战模式全解析:从 RAG、SSE 流式到错误重试与成本优化

Workers AI 实战模式全解析:从 RAG、SSE 流式到错误重试与成本优化 Workers AI 实战模式全解析从 RAG、SSE 流式到错误重试与成本优化【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills导读本文是 Cloudflare Workers AI 服务端推理实战的模式速查手册完整覆盖在 Cloudflare Workers 中构建 AI 应用时最常用的 7 类代码模式RAG 检索增强生成、SSE 流式响应、错误处理与指数退避重试、模型回退、提示词工程、并行执行以及成本优化。读完本文你将获得一套可直接复制、可组合进自己 Worker 项目的 TypeScript 实现方案并理解每个模式背后的平台机制GPU 冷启动、神经元计费、Vectorize 向量检索约束等。模式总览与适用场景Workers AI 通过原生 binding 在 Worker 边缘运行时上提供 GPU 推理无需外部 API 调用。其运行形态决定了以下现实约束也构成了各类模式的出发点依据见 workers-ai/README.md冷启动模型首次请求加载耗时 13 秒后续请求约 100500ms按神经元计费不同模型每次推理消耗的 neurons 差异巨大从嵌入的 ~10 到图像生成的 ~10,000速率限制命中后返回错误码7505需要重试策略上下文窗口2K8K token 不等超出即报7506。因此一套健壮的 Workers AI 应用几乎必然同时用到本文的多个模式用 RAG 补足上下文与事实准确性、用 SSE 提升首字节体验、用重试与回退保证可用性、用并行与批量控制成本。下面是每个模式的完整实现。RAG检索增强生成RAGRetrieval-Augmented Generation是在上下文超出模型窗口或需要基于私有语料作答时的首选方案。在 Cloudflare 技术栈中RAG 由Workers AI嵌入 生成 Vectorize向量检索两个产品协作完成vectorize/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 } ] });关键细节data[0]与响应结构嵌入模型cf/baai/bge-base-en-v1.5的返回结构为{ data: number[][], shape: number[] }查询时传入data[0]而不是data或整个响应对象vectorize/patterns.md、gotchas.md。传入错误对象会导致 Vectorize 查询失败或维度不匹配。returnMetadata的取值与性能关系vectorize/api.mdnone最快→indexed推荐topK 可达 100→alltopK 上限降至 20。需要「先嵌入文档再入库」时务必保持嵌入模型与查询时一致维度一致性是硬约束cf/baai/bge-small-en-v1.5为 384 维bge-base-en-v1.5为 768 维bge-large-en-v1.5为 1024 维。RAG 与直接生成怎么选依据 workers-ai/README.md 的决策树用 RAG回答特定文档/数据的问题、需要已知语料上的事实准确性、上下文超过模型窗口4K tokens、构建知识库聊天用直接生成创意写作/头脑风暴、通用知识问答、小上下文可放入提示词4K tokens、以及成本敏感场景RAG 会额外叠加嵌入与向量检索成本。进阶从向量结果取全文向量库里存的是截断/摘要元数据时可先用returnMetadata拿到引用 key再回源拉取完整文档R2/D1/KV拼入上下文这是生产级 RAG 的常见变体const docs await Promise.all(results.matches.map(m env.R2.get(m.metadata.key).then(o o?.text()) ));StreamingSSE 流式输出文本生成类模型支持stream: true返回一个可异步迭代的流。把模型输出逐 chunk 转发为Server-Sent EventsSSE可以显著降低用户感知的首字节延迟——不必等全文生成完毕再一次性返回api.md 也提到「Stream long responses - reduce perceived latency」。const stream await env.AI.run(cf/meta/llama-3.1-8b-instruct, { messages, stream: true }); 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 } });要点拆解stream: true后env.AI.run返回的是ReadableStreamgotchas.md每个 chunk 形如{ response: ... }可通过chunk.response取增量文本TransformStream做背压桥接上游模型流与下游 HTTP Response 之间通过 writer/reader 连接模型生成速度慢于网络发送时不会丢数据SSE 帧协议每条消息以data:前缀 JSON 两个换行\n\n结束结束信号用data: [DONE]OpenAI 兼容约定必须设置Content-Type: text/event-stream否则浏览器端EventSource无法解析。简化的直接转发写法不拆帧直接透传也成立const stream await env.AI.run(model, { messages, stream: true }); return new Response(stream, { headers: { Content-Type: text/event-stream } });注意AI Gateway 的响应缓存不支持流式ai-gateway/features.md流式场景不要依赖网关缓存。错误处理与重试指数退避Workers AI 的错误码体系api.md错误码含义处理建议7502模型不存在核对模型名拼写7504输入校验失败检查输入 schema文本生成需messages嵌入需text7505被限流rate limited降低请求速率或升级套餐可重试7506上下文超出窗口缩减输入大小其中7505是唯一值得自动重试的瞬时错误。官方推荐模式是对它做指数退避重试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; } } }设计要点只重试可恢复错误7502模型不存在、7504输入校验失败、7506上下文超限属于确定性错误重试无意义应立即抛出退避节奏第 0 次失败等 1s2^0×1000第 1 次等 2s第 2 次等 4s……用Math.pow(2, attempt) * 1000实现attempt maxRetries - 1保证最后一次失败不再等待而是直接抛出可进一步结合 ai-gateway 的速率限制功能在入口侧削峰从源头减少 7505 的出现。模型回退用容量换可用性当高规格模型不可用时降级到小模型保证服务不中断。这是可用性模式与大模型选型决策树README.md配套70B 模型质量最好但昂贵8B 均衡7B Mistral 最快最便宜。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 }); }落地建议可以扩展到多级回退链70B → 8B → 7B每级降一档捕获范围可以更精细只有 7505 类瞬时错误才触发回退模型名拼写错误不应回退可参照上文runWithRetry的错误分类思路从 gotchas.md 的成本角度看70B 单次可达 ~2000 neurons8B 约 ~200回退本身也是成本保护伞。提示词模式System Prompt 与 Few-shot常用 System Prompt 模板把高频指令抽成常量对象便于统一管理与切换策略// System prompts const PROMPTS { json: Respond with valid JSON only., concise: Keep responses brief., cot: Think step by step before answering. };json强制结构化输出配合下游JSON.parse使用cotChain-of-Thought引导模型先推理再作答适合复杂推理题追求确定性时给生成参数设temperature: 0gotchas.md 指出这是消除「响应不一致」的手段。Few-shot给模型示范在messages中穿插「问题 → 理想答案」示例让模型模仿输出格式。这是让 LLM 输出严格结构化的最可靠手段之一// 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 } ]结合 api.md 的说明messages数组可含system/user/assistant三种角色并支持temperature01与max_tokens参数生成的文本在response字段。进阶函数调用Function Calling对于需要「结构化工具调用」而非纯文本的场景Workers AI 支持tools参数仅cf/meta/llama-3.1-*与mistral-7b-instruct-v0.2等少数模型原生支持见 gotchas.mdconst response await env.AI.run(model, { messages, tools: [ { type: function, function: { name: getWeather, parameters: { ... } } } ]}); if (response.tool_calls) { const args JSON.parse(response.tool_calls[0].function.arguments); // 执行函数后把结果作为 assistant 消息回传 }并行执行一次请求搞定多任务Workers AI 的每次run是独立的推理请求多个独立任务可用Promise.all并发执行避免串行等待累计延迟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 }) ]);适用场景与注意事项典型用例同一篇内容同时做情感分析、摘要抽取、向量嵌入入库一次请求并发完成三类产出混用模型是故意的小任务情感分类用便宜的小模型生成任务用质量模型嵌入用专门的嵌入模型——与成本优化模式天然互补不要并行执行有依赖关系的调用并发上限受套餐速率限制约束批量任务过重时仍需配合节流可参考 vectorize/api.md 中「每批 500 条」的分批思路。成本优化神经元预算的工程化Workers AI 按神经元neurons计费免费额度为每天 10,000 neuronsREADME.md。各任务类型典型消耗patterns.md 与 gotchas.md 综合任务推荐模型神经元约分类/轻量文本cf/mistral/mistral-7b-instruct-v0.1~50常规对话cf/meta/llama-3.1-8b-instruct~200复杂任务cf/meta/llama-3.1-70b-instruct~2000嵌入cf/baai/bge-base-en-v1.5~10从这张表可以得出几条可操作的省钱原则按任务匹配模型分类用 ~50 的 Mistral 7B别用 ~2000 的 70B「用能满足需求的最小模型」gotchas.md 原话「Use smallest that works」嵌入成本极低但量级大RAG 管线的每次文档入库、每次查询都产生嵌入调用单次虽仅 ~10 neurons累计起来不容忽视批量嵌入一次处理多段文本用一次调用代替多次// Batch embeddings const response await env.AI.run(cf/baai/bge-base-en-v1.5, { text: textsArray // Process multiple at once });图像生成是成本大头SDXL 一次约 ~10,000 neurons几乎耗尽免费额度非必要慎用README.md。配合外部手段进一步省钱AI Gateway 缓存对确定性提示词如常见问候、模板化回答开启缓存缓存 TTL 支持 60s30 天ai-gateway/features.mdtemperature: 0的请求更容易命中缓存冷启动意识首次请求 13s、后续 100500msapi.md热模型的重复调用既快又省避免频繁切换模型打散热缓存。组合使用一个完整的模式编排示例把上述模式串起来一个「知识库问答 Worker」的典型调用链是嵌入查询 → Vectorize 检索RAG→ 并行做摘要与情绪分析 → SSE 流式返回全程包裹重试与模型回退// 1. 嵌入 检索 const emb await runWithRetry(env, cf/baai/bge-base-en-v1.5, { text: query }); const matches await env.VECTORIZE.query(emb.data[0], { topK: 5, returnMetadata: true }); // 2. 构建上下文 const context matches.matches.map(m m.metadata?.text).join(\n\n); // 3. 流式生成失败则回退到 8B const model cf/meta/llama-3.1-70b-instruct; const fallback cf/meta/llama-3.1-8b-instruct; const stream await runWithRetry(env, model, { messages: [ { role: system, content: Answer based on:\n\n${context} }, { role: user, content: query } ], stream: true }).catch(() env.AI.run(fallback, { messages: [{ role: user, content: query }], stream: true })); // 4. SSE 转发 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 } });环境与配置前提以上所有模式均依赖 Workers AI binding 的正确配置详见 configuration.md{ name: my-ai-worker, main: src/index.ts, compatibility_date: 2024-01-01, ai: { binding: AI }, vectorize: { bindings: [{ binding: VECTORIZE, index_name: embeddings-index }] } }本地开发必须wrangler dev --remote本地无 GPU 推理能力纯本地模式env.AI不可用configuration.mdTypeScript 类型安装cloudflare/workers-types后Env接口中声明AI: Ai; VECTORIZE: VectorizeIndex;不要安装已废弃的cloudflare/ai包一律使用原生 bindingenv.AI.rungotchas.md本文所有模式均在 Cloudflare Workers 运行时环境env.AIbinding下成立若在 Worker 之外通过 REST API 调用对应端点为POST https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/{model}api.md。相关资源workers-ai/README.md — 模型选型决策树、RAG vs 直接生成、平台限制workers-ai/api.md —env.AI.run()参数、错误码、性能提示workers-ai/configuration.md — wrangler.jsonc 绑定配置workers-ai/gotchas.md — 已废弃包警告、限流、定价细节vectorize/patterns.md — RAG 集成、批量入库、多租户检索vectorize/api.md — 查询/写入 API、过滤运算符、性能权衡ai-gateway/features.md — 缓存、限流、日志等网关能力【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表