六维教程

文本生成入门

大语言模型能写文章、答问题、做摘要,但自己搭一套 GPU 推理服务成本高、运维麻烦。Cloudflare Workers AI 把这件事变成了几行代码,模型跑在 Cloudflare 的边缘 GPU 上,调用方式和写普通接口一样。这篇从零开始讲清楚怎么绑定 AI 资源、查模型列表、跑一次基础推理,以及怎么调整生成参数。

Workers AI 是什么

Workers AI 是 Cloudflare 的边缘 AI 推理服务。它在 Cloudflare 的全球 GPU 节点上托管了一批开源模型,你不用自己买显卡、不用装 CUDA、不用管模型权重加载,直接用代码调用就能拿到推理结果。

它运行在 Workers(Cloudflare 的边缘计算函数服务)之上。Workers 负责接收 HTTP 请求、跑你的业务逻辑,Workers AI 作为一种绑定资源挂载进来,Worker 代码里通过变量直接调用,不需要 API Key。

和自建推理服务对比

对比项 自建 GPU 服务 Workers AI
硬件 自己采购或租用 GPU Cloudflare 托管,按量计费
模型部署 自己下载权重、配置环境 平台预置,直接调用
扩容 手动加机器 自动扩缩
启动延迟 冷启动可能几十秒 几乎零冷启动
调用方式 自己封装 HTTP 或 gRPC env.AI.run 一行调用

Workers AI 按神经元(Neurons)计费,免费额度每天 10000 个,个人项目测试足够用。

绑定 AI 资源

使用 Workers AI 第一步是在 Worker 项目里声明 AI 绑定。打开 wrangler.toml,加一段配置

name = "ai-demo"
main = "src/index.js"
compatibility_date = "2024-09-01"

[ai]
binding = "AI"

字段说明

字段 作用
binding 代码里访问 AI 服务的变量名,这里叫 AI
[ai] 声明这是一个 Workers AI 绑定

配置好后,Worker 代码里就能通过 env.AI 访问 AI 服务。不需要任何密钥,平台内部信任 Worker 和 AI 服务之间的调用。

模型列表

Workers AI 提供了几十个开源模型,文本生成只是其中一类。模型用一个带前缀的字符串标识,格式是 @厂商/模型名

常用的文本生成模型

模型 ID 参数量 特点 适合场景
@cf/meta/llama-3.1-8b-instruct 8B 通用对话,稳定可靠 日常问答、摘要
@cf/meta/llama-3.1-8b-instruct-fast 8B 上一款的加速版 对延迟敏感的场景
@cf/meta/llama-3.3-70b-instruct-fp8-fast 70B 大模型,推理能力强 复杂推理、长文本
@cf/mistral/mistral-7b-instruct-v0.2 7B 32k 上下文,欧洲团队训练 长文档处理
@cf/qwen/qwq-32b 32B 推理型模型,擅长数学逻辑 数学、代码、逻辑题
@cf/deepseek/deepseek-r1-distill-qwen-32b 32B 推理能力强,思考过程透明 复杂分析任务

选型原则很简单。轻量任务用 8B 级别,又快又省。复杂推理上 32B 或 70B,质量更好但慢一些、神经元消耗也多。不确定就先用 llama-3.1-8b-instruct,跑通再换。

基础推理

文本生成有两种输入方式,prompt 单轮对话和 messages 多轮对话。实际开发用 messages 更多,因为它支持 system 角色设定模型行为。

export default {
  async fetch(request, env) {
    const response = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
      messages: [
        { role: "system", content: "你是一个用中文回答问题的助手" },
        { role: "user", content: "用一句话解释什么是边缘计算" },
      ],
    });

    return Response.json(response);
  },
};

返回结果的结构

{
  "response": "边缘计算是把计算任务放到离数据源更近的地方执行的一种方式。",
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 28,
    "total_tokens": 53
  }
}

字段说明

字段 含义
response 模型生成的文本
usage.prompt_tokens 输入消耗的 token 数
usage.completion_tokens 输出消耗的 token 数
usage.total_tokens 输入加输出的总 token 数

token 是模型处理文本的基本单位,一个中文字大约 1 到 2 个 token,一个英文单词大约 1 个 token。token 数直接影响神经元消耗和费用。

多轮对话

messages 数组可以放多轮历史,模型会参考上下文继续对话。把上一轮的回复作为 assistant 消息加进去就行

export default {
  async fetch(request, env) {
    const response = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
      messages: [
        { role: "system", content: "你是一个用中文回答问题的助手" },
        { role: "user", content: "什么是 RAG" },
        { role: "assistant", content: "RAG 是检索增强生成,先检索再生成。" },
        { role: "user", content: "它和微调有什么区别" },
      ],
    });

    return Response.json(response);
  },
};

三种角色的分工

角色 作用
system 设定模型的人设和行为规则
user 用户的提问
assistant 模型之前的回复,用于维持上下文

多轮对话的 token 会累积,历史越长消耗越大。生产环境要控制历史长度,比如只保留最近 5 到 10 轮。

参数调整

env.AI.run 的第二个参数除了 messages,还能传一组控制生成行为的参数。

常用参数

参数 类型 作用 建议范围
max_tokens 数字 限制输出最大 token 数 256 到 2048
temperature 数字 控制随机性,越大越发散 0 到 1
top_p 数字 核采样,和 temperature 二选一 0.5 到 1
top_k 数字 只从概率最高的 k 个 token 里选 0 到 100
repetition_penalty 数字 抑制重复,大于 1 减少重复 1 到 1.3
seed 数字 固定随机种子,让结果可复现 任意整数

temperature 是最常用的参数。调到 0 模型几乎确定性地选最高概率词,适合做摘要、提取信息这类要稳定结果的任务。调到 0.7 到 1 之间输出更有创意,适合写文案、聊天。

const response = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
  messages: [
    { role: "system", content: "你是一个创意文案写手" },
    { role: "user", content: "写一句咖啡店的广告语" },
  ],
  max_tokens: 100,
  temperature: 0.9,
});

要稳定输出就压低 temperature 和 top_p,要多样性就抬高。两者一般不同时调,OpenAI 官方建议 temperature 和 top_p 只改一个。

一个完整的问答接口

把前面讲的组合起来,写一个带参数校验的问答接口。前端 POST 一个问题过来,返回模型回复。

export default {
  async fetch(request, env) {
    if (request.method !== "POST") {
      return new Response("仅支持 POST", { status: 405 });
    }

    let body;
    try {
      body = await request.json();
    } catch {
      return new Response("请求体不是合法 JSON", { status: 400 });
    }

    const { question, system = "你是一个用中文回答问题的助手" } = body;
    if (!question) {
      return Response.json({ error: "缺少 question 字段" }, { status: 400 });
    }

    const response = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
      messages: [
        { role: "system", content: system },
        { role: "user", content: question },
      ],
      max_tokens: 512,
      temperature: 0.7,
    });

    return Response.json({
      answer: response.response,
      usage: response.usage,
    });
  },
};

本地调试用 npx wrangler dev --remote。注意 Workers AI 要加 --remote 标志,因为本地模拟器没有 GPU,必须连到 Cloudflare 网络才能跑模型。

小结

Workers AI 让文本生成变成一次 env.AI.run 调用。绑定写在 wrangler.toml 里,代码里通过 env.AI 访问,不用管密钥和基础设施。文本生成用 messages 数组传对话历史,配合 temperature 和 max_tokens 调整输出风格和长度。下一篇讲流式输出,让长文本生成能边生成边返回,用户体验更好。

下一篇 流式输出

上一篇
实现 RAG 检索
下一篇
流式输出