有哪些适合学习的免费公开 AI API?如何优化 WEB DEV 应用?
学习 Web 开发时,可以用 Gemini API、Groq API 或 Cloudflare Workers AI 的免费额度,做一个问答页或文本摘要工具。先选一家,把请求接通,集中练习表单提交、异步请求和错误处理。
优化应用时,先看浏览器实际下载了哪些资源、请求花了多长时间,再着手减少首屏 JavaScript、压缩图片、按需加载功能,并控制 AI 请求的输入和输出长度。减小文件体积能改善加载速度,模型生成耗时则需要单独优化。
有哪些可以免费学习的 AI API?
“公开 API”通常指有公开文档、允许开发者注册使用的接口,使用时仍需要账号和 API Key。免费层也会限制额度、可用模型或调用频率。
| 服务 | 适合练习什么 | 免费使用的前提与限制 |
|---|---|---|
| Gemini API | 问答、摘要,以及受支持模型的多模态调用 | 部分模型提供免费层;模型和额度以定价页及账号控制台为准 |
| Groq API | 文本生成、聊天界面、服务端 API 转发 | 提供 Free Plan,不同模型有不同的请求数和 token 限制,详见限流文档 |
| Cloudflare Workers AI | 把模型调用接入 Worker,练习部署后端接口 | 当前提供每天 10,000 Neurons 的免费额度;Neurons 是计算用量单位,不等于请求次数,部分模型要求采用付费计费方式 |
注册前,先确认服务是否支持所在地区,以及所选模型是否在免费范围内。开启付费计费后,还要检查预算和用量设置。
Gemini 免费层的定价说明包含将内容用于改进产品的条款,具体适用范围见服务条款。学习时请使用虚构数据,不要提交密码、个人资料或未公开的业务代码。Gemini 定价与数据使用说明
旧教程经常推荐 Hugging Face 的免费推理额度,但当前 Inference Providers 计费页显示,免费账户没有月度赠送额度,需要购买额度或升级订阅。模型可以免费下载,不代表托管推理也免费。Hugging Face 计费说明
如何把 AI API 接入 Web 应用?
让浏览器通过自己的后端调用 AI 服务:
浏览器 → 自己的后端接口 → AI 服务
API Key 保存在后端。用户可以查看前端 JavaScript、打包后的文件和浏览器网络请求,因此这些地方都不能保存服务端密钥。
第一个练习可以按这个顺序完成:
- 在服务商控制台创建 API Key,选择账号可用的模型。
- 编写自己的
/api/chat接口,接收用户输入并调用模型。 - 前端只请求
/api/chat,显示加载状态、结果和错误信息。 - 测试空输入、超长输入、超时和限流时,页面能否正确处理。
示例:通过后端调用 Groq
这个示例需要一个使用 App Router 的 Next.js 项目,服务端运行环境需支持 fetch、Response.json() 和 AbortSignal.timeout()。其他后端框架也可以采用相同流程,无须为了调用 API 更换框架。Next.js Route Handlers 文档
在项目根目录的 .env.local 中配置:
GROQ_API_KEY=replace_with_your_api_key
GROQ_MODEL=replace_with_an_available_model_id
将占位值替换为实际配置,模型 ID 从控制台选择。不要给密钥变量加上 NEXT_PUBLIC_ 前缀,也不要将密钥文件提交到仓库。
创建 app/api/chat/route.js:
export const runtime = "nodejs";
function reply(data, status = 200) {
return Response.json(data, {
status,
headers: { "Cache-Control": "no-store" },
});
}
export async function POST(request) {
const body = await request.json().catch(() => null);
const prompt =
typeof body?.prompt === "string" ? body.prompt.trim() : "";
if (!prompt || prompt.length > 2000) {
return reply({ error: "请输入 1 到 2000 个字符。" }, 400);
}
const apiKey = process.env.GROQ_API_KEY;
const model = process.env.GROQ_MODEL;
if (!apiKey || !model) {
return reply({ error: "服务端尚未配置完成。" }, 500);
}
try {
const upstream = await fetch(
"https://api.groq.com/openai/v1/chat/completions",
{
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model,
messages: [{ role: "user", content: prompt }],
max_completion_tokens: 512,
}),
signal: AbortSignal.timeout(15000),
}
);
if (!upstream.ok) {
return reply(
{ error: upstream.status === 429 ? "请求过于频繁,请稍后再试。" : "AI 服务请求失败。" },
upstream.status === 429 ? 429 : 502
);
}
const data = await upstream.json();
return reply({ text: data.choices?.[0]?.message?.content ?? "" });
} catch (error) {
const timeout = error?.name === "TimeoutError";
return reply(
{ error: timeout ? "请求超时,请稍后再试。" : "暂时无法连接 AI 服务。" },
timeout ? 504 : 502
);
}
}
接口地址、请求字段和返回结构可对照 Groq API Reference。max_completion_tokens 限制生成的 token 数,token 数与字符数并不相同。这里的 512 和 15 秒仅用于演示,实际配置需要根据模型和任务调整。
启动项目后,在终端验证自己的接口:
curl -X POST http://localhost:3000/api/chat \
-H 'Content-Type: application/json' \
-d '{"prompt":"用两句话解释 HTTP 缓存。"}'
这个示例适合本地学习。公开部署前,还需要在后端增加身份验证、按用户限流和请求体大小限制,防止他人耗尽额度。前端禁用提交按钮只能避免误点,无法替代后端限制。
如何减小文件体积?
用浏览器开发者工具的 Network 面板检查生产构建,按传输体积排序,先处理最大的资源,再比较优化前后的变化。
| 资源 | 优先处理方式 |
|---|---|
| JavaScript | 删除未使用的依赖,启用生产构建;将编辑器、图表等大功能按需加载 |
| CSS | 清理无用样式;使用自动清理工具时,确认动态生成的类名不会被误删 |
| 图片 | 按显示尺寸生成图片,比较 WebP、AVIF 等格式;使用 srcset 提供不同分辨率 |
| 字体 | 减少字体家族和字重,使用 WOFF2;中文字体做子集时保留所需字符 |
| API 响应 | 只返回页面需要的字段,列表分页,避免重复传输完整数据 |
| HTML、CSS、JS 等文本资源 | 在服务器或 CDN 启用 Brotli 或 gzip,并在 Network 中确认实际生效 |
如果构建工具支持,可以用动态 import() 拆分较大的功能模块,等用户使用时再下载。压缩减少的是字节数,代码拆分则能减少首次进入页面时需要下载和执行的代码。JavaScript 代码拆分说明
屏幕外的图片可以使用 loading="lazy",同时设置尺寸,减少布局跳动:
<img
src="/images/example.webp"
alt="应用操作示例"
width="800"
height="450"
loading="lazy"
/>
首屏关键大图应及时加载,不宜给所有图片统一添加懒加载。选择图片格式和尺寸时,也要比较实际画质与体积。图片性能优化说明
文件已经很小,为什么应用还是慢?
先根据出现卡顿或等待的位置排查:
- 页面刚打开就慢:检查首屏资源、服务器响应,以及阻塞渲染的 CSS 和 JavaScript。
- 页面能打开,但点击或滚动卡顿:用 Performance 面板检查长任务、频繁渲染和大量 DOM 更新。
- 点击“生成”后等待很久:检查后端耗时、上游模型响应和输出长度。
- 请求频繁失败:检查 HTTP 状态码、账号额度和限流情况。
优化 AI 调用时,可以从这些地方入手:
- 只发送必要的上下文,避免每次附带全部聊天记录。
- 根据任务限制输出长度,短摘要不需要预留长篇回答的输出额度。
- 请求期间显示加载状态,避免重复提交。
- 遇到
429时遵守服务商的重试规则;有Retry-After时按其提示等待,避免立即循环重试。 - 需要逐字显示回答时,使用流式输出。它能让用户更早看到内容,但不保证缩短完整生成时间。
- 缓存可以复用的结果;涉及个人资料的回答需要按用户隔离,不能直接进入公共缓存。
验证时,尽量保持网络条件、设备和缓存状态一致,分别记录页面加载、交互和 AI 请求的耗时,以判断哪些修改有效。
备注:内容仅供参考。
