文本生成入门
大语言模型能写文章、答问题、做摘要,但自己搭一套 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 调整输出风格和长度。下一篇讲流式输出,让长文本生成能边生成边返回,用户体验更好。
下一篇 流式输出