LLM API 入门
大语言模型(LLM)API 是 AI 工程的基础。本章带你从开通账号、配置环境,到稳健调用、成本/安全/可观测性要点,完成入门闭环。
1) 生态速览与选型
| API | 特点 | 适合场景 |
|---|---|---|
| OpenAI (GPT-5/4.1/4o) | 生态完善,兼容性强 | 通用聊天、代码、产品内嵌 |
| Anthropic Claude 3 | 长上下文、安全性佳 | 文档处理、代码审阅 |
| Google Gemini 3 (Pro/Flash) | 多模态一体 | 图片/视频/文档混合输入 |
选型建议:通用先选 OpenAI;长文档/安全 → Claude;多模态 → Gemini 3 Pro/Flash;预算敏感先用“小”模型。
示意图:LLM API 调用链路
2) 环境与密钥管理
- 创建并保存 API Key:OpenAI [platform.openai.com]、Claude [console.anthropic.com]、Gemini [ai.google.dev]。
- 将 Key 写入
.env,不要硬编码或放前端:
OPENAI_API_KEY=sk-xxx
ANTHROPIC_API_KEY=sk-ant-xxx
GEMINI_API_KEY=xxx
- 安装 SDK(常用):
- Python:
pip install openai anthropic google-generativeai - Node:
npm i openai @anthropic-ai/sdk @google/generative-ai
- Python:
- 网络与超时:国内需代理;客户端超时 30s 以上,必要时设置重连。
3) 第一次调用(Python & Node)
Python (OpenAI):
from openai import OpenAI
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
messages = [
{"role": "system", "content": "你是一个简洁的技术助手"},
{"role": "user", "content": "用一句话解释什么是 API"}
]
resp = client.chat.completions.create(model="gpt-5", messages=messages)
print(resp.choices[0].message.content)
print("tokens:", resp.usage.total_tokens)
Node (Claude):
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
const resp = await client.messages.create({
model: 'claude-3-haiku-20240307',
system: '你是一个简洁的技术助手',
messages: [{ role: 'user', content: '用一句话解释什么是 API' }],
max_tokens: 200
});
console.log(resp.content[0].text);
console.log('tokens:', resp.usage.input_tokens + resp.usage.output_tokens);
多轮对话:在客户端维护 messages/history,每轮附带上下文发送。
4) 核心参数与调优
- model:先用最新的“小”模型(成本低),需要质量再换高配。
- temperature / top_p:随机性,0-0.7 常用;更创意可升高。
- max_tokens:限制输出长度,避免爆量扣费。
- presence_penalty / frequency_penalty:减少/增加重复。
- stop:定义停止符,控制输出格式。
- 系统提示:用 system 设定角色与风格,保持稳定输出。
5) 响应格式与结构化
- 要求 JSON 输出:在 prompt 明确格式,或使用厂商 JSON Mode(如 OpenAI
response_format={"type":"json_object"})。 - 验证输出:用 JSON schema 校验;失败时重试或降级。
- 表格/列表:指定字段名、顺序和示例,减少跑题。
6) 流式输出与体验
- 开启
stream获取增量:- OpenAI Python:
stream=True,迭代for chunk in resp - Node:遍历 AsyncIterable,实时拼接
- OpenAI Python:
- 前端/终端要点:逐字追加、保留光标、支持取消。
7) 错误处理与可靠性
- 常见错误:401(Key/权限)、429(限流/配额)、5xx(服务端)。
- 重试策略:指数退避(如 0.5s, 1s, 2s...),限制最大重试次数;对 4xx 先检查配置。
- 超时与取消:为 HTTP 客户端设置超时;长流式可提供中断。
- 记录:日志包含请求 ID、模型、延迟、tokens 用量;必要时打点到 APM。
8) 成本与配额管理
- Token 概念:输入/输出分别计费;控制对话长度、裁剪历史。
- 节省策略:优先小模型;压缩上下文(摘要/检索 top-k);设置
max_tokens。 - 监控:关注各平台配额/用量面板,异常用量要报警。
9) 安全与合规
- 不在前端暴露 Key;推荐后端代理网关统一鉴权、限流、审计。
- 数据最小化:少传 PII,必要时脱敏;避免把敏感文件直接送模型。
- 内容安全:利用厂商自带的安全过滤(如 Gemini 安全级别)或在网关二次校验。
- 访问控制:按环境分 Key(dev/uat/prod),最小权限,定期轮换。
10) 工程化封装与多提供商
- 抽象调用层:统一请求体、日志、错误码,方便切换模型或厂商。
- 多提供商回退:主模型失败时自动切换次优模型;对关键路径可并行竞速取最快。
- 观测性:埋点模型名称、延迟、成功率、tokens,用仪表盘追踪。
11) 性能与延迟优化
- 并发与队列:对高并发入口做排队/令牌桶,避免 429;控制单用户速率。
- 请求模板化:常用系统提示/格式模板化,减少重复字符串拼接。
- 压缩上下文:摘要历史、只带必要字段;长文本先做分段检索再拼上下文。
- 缓存:对确定性回答(FAQ/静态知识)可在上游缓存,命中直接返回。
- 传输优化:开启 HTTP/2;减少无关请求头;避免巨型 JSON。
12) 本地调试与模拟
- 使用真实 Key 前,先在本地用最小 prompt 验证。
- Mock:对前端/集成测试可用固定回复的 mock 服务,避免消耗额度。
- 速查:打印完整请求(去敏处理)与响应头,定位限流/区域问题。
13) 生产就绪清单
- Key 管理:分环境、可回收、可轮换;禁止前端暴露。
- 异常处理:401/403/429/5xx 有清晰提示;重试/超时策略已配置。
- 监控:成功率、P95 延迟、token 成本、限流次数、回退次数。
- 安全:输入脱敏、输出审查;日志避免泄露用户敏感内容。
- 灰度:新模型/参数走灰度或小流量 A/B,对比质量与成本。
14) 小练习
- 写一个脚本:接受用户输入,调用 LLM,支持切换
temperature与模型。 - 在代码中加入 429/5xx 重试 + 30s 超时,打印 tokens/成本估算。
- 开启流式输出,在终端实时显示增量文字;失败时自动降级为非流式。
📚 相关资源
❓ 常见问题
关于本章主题最常被搜索的问题,点击展开答案
调 LLM API 第一步该选 OpenAI、Claude 还是 Gemini?
通用聊天/代码/产品内嵌选 OpenAI(GPT-5/4.1/4o,生态最全);长文档处理和代码审阅选 Claude 3(长上下文 + 安全性强);图片/视频/文档混合输入选 Gemini 3 Pro/Flash(多模态原生)。预算敏感先用每家的「小」模型,需要质量再换高配。
API Key 应该放在哪里?前端能不能直接调?
永远不要在前端暴露 Key。把 OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY 写进 `.env`,由后端代理网关统一鉴权、限流、审计。按环境分 Key(dev/uat/prod)、最小权限、定期轮换;前端调用走自家后端,后端再转发到模型厂商。
遇到 429 限流要怎么处理?重试策略怎么写?
用指数退避:0.5s → 1s → 2s → 4s,最多 3-5 次。区分错误类型——401/403 是 Key 配置问题不要重试;429 是限流退避后重试;5xx 是服务端,重试同时降级到备选模型。客户端超时设 30 秒以上,每次请求记录 request ID、模型、延迟、tokens 用量。
max_tokens 和 temperature 应该设多少?
max_tokens 必须设——不设会爆量扣费,建议按场景设 200-2000。temperature 通用任务 0-0.7(确定性回答用 0,创意用 0.7);top_p 一般默认即可,别和 temperature 同时大改。用 system 设角色风格保稳定,用 stop 定义停止符控制输出格式。
怎么开启流式输出(streaming)?前端体验有什么注意点?
OpenAI Python 设 `stream=True` 然后 `for chunk in resp` 迭代;Node 遍历 AsyncIterable 实时拼接。前端要做三件事:逐字追加显示、保留光标动画、支持用户取消(cancel)。失败时自动降级回非流式,避免死等;HTTP/2 + 较小 chunk 体验最稳。