转载&存档丨AI 标准协议及调用(3)
实战示例:使用 OpenAI 协议调用 DeepSeek
示例 1:使用 Go
安装依赖
1 | go get [github.com/sashabaranov/go-openai](https://github.com/sashabaranov/go-openai) |
代码实现
1 | package main |
流式输出示例
1 | package main |
Tool Call 示例
1 | package main |
示例 2:使用原生 HTTP 请求
JavaScript 使用 fetch
1 | // chat-http.js |
使用 curl 命令
1 | curl [https://api.deepseek.com/v1/chat/completions](https://api.deepseek.com/v1/chat/completions) \ |
实战示例:使用 Claude API
Go 示例
安装依赖
1 | go get [github.com/anthropics/anthropic-sdk-go](https://github.com/anthropics/anthropic-sdk-go) |
基础对话示例
1 | package main |
流式输出
1 | package main |
Tool Use(Claude 的函数调用)
Claude 的工具调用机制与 OpenAI 类似,但有一些独特之处:
Claude Tool Use 的特点
- 工具定义:使用
input_schema而非parameters - 工具调用:在
content数组中,类型为tool_use - 工具结果:返回时使用
tool_result类型,包含tool_use_id - 消息结构:工具结果作为新的 user 消息发送
完整的 Tool Use 示例
1 | package main |
Claude vs OpenAI Tool Call 对比
| 特性 | OpenAI | Claude |
|---|---|---|
| 工具定义 | parameters |
input_schema |
| 工具调用位置 | tool_calls 字段 |
content 数组中的 tool_use 块 |
| 工具调用 ID | tool_calls[].id |
tool_use.id |
| 工具结果角色 | role: "tool" |
role: "user" |
| 工具结果类型 | 顶层 tool_call_id 和 content |
content 中的 tool_result 块 |
| 工具结果 ID 字段 | tool_call_id |
tool_use_id |
| 停止原因 | finish_reason: "tool_calls" |
stop_reason: "tool_use" |
统一接口工具
LiteLLM - 一套代码调用所有模型
LiteLLM 是一个统一的 API 接口,支持 100+ 种 LLM 模型,让你用一套代码调用所有模型。
安装
1 | pip install litellm |
使用示例
1 | from litellm import completion |
优势
- 统一接口:所有模型使用相同的调用方式
- 自动重试:内置重试和错误处理
- 成本追踪:自动记录 token 使用和成本
- 负载均衡:支持多个 API Key 轮换使用
OpenRouter - AI 模型聚合平台
OpenRouter 提供统一的 OpenAI 兼容接口,可以访问多家 AI 服务商的模型。
使用方法
1 | from openai import OpenAI |
优势
- 一个 API Key:访问所有模型
- 按需付费:只为实际使用付费
- 模型对比:方便测试不同模型的效果
- OpenAI 兼容:无需修改现有代码
Ollama - 本地运行开源模型
Ollama 让你在本地运行开源 LLM 模型,提供 OpenAI 兼容的 API。
安装
1 | # macOS/Linux |
运行模型
1 | # 下载并运行模型 |
API 调用
1 | from openai import OpenAI |
优势
- 完全免费:本地运行,无 API 费用
- 数据隐私:数据不离开本地
- 离线可用:无需网络连接
- OpenAI 兼容:代码无需修改
工具对比
| 工具 | 类型 | 优势 | 适用场景 |
|---|---|---|---|
| LiteLLM | 统一接口库 | 支持最多模型,功能丰富 | 需要调用多种模型的应用 |
| OpenRouter | 云端聚合平台 | 一个 Key 访问所有模型 | 快速测试和对比模型 |
| Ollama | 本地运行工具 | 免费、隐私、离线 | 开发测试、隐私敏感场景 |
错误处理最佳实践
1. 重试机制设计
重试机制是处理临时性错误(如网络波动、速率限制)的关键策略。
指数退避(Exponential Backoff)
指数退避是一种逐渐增加重试等待时间的策略,避免在服务压力大时继续施压。
核心原理:
- 第一次重试等待时间较短(如 1 秒)
- 后续每次重试等待时间呈指数增长(1秒 → 2秒 → 4秒 → 8秒…)
- 设置最大重试次数(通常 3-5 次)避免无限重试
- 区分错误类型:速率限制、网络错误需要重试;参数错误、认证失败不应重试
- 设置合理的超时时间(如 30 秒)防止请求长时间挂起
实现要点:
- 使用循环结构进行重试,记录当前尝试次数
- 捕获不同类型的异常并分类处理
- 速率限制错误使用较长的等待时间(指数增长)
- 网络连接错误使用较短的等待时间(线性增长)
- 参数错误、认证错误等直接抛出,不进行重试
带抖动的指数退避(Jitter)
在高并发场景下,添加随机抖动可以避免”惊群效应”(多个请求同时重试)。
核心原理:
- 在指数退避的基础上,增加随机时间偏移
- 例如:基础等待 4 秒 + 随机 0-1 秒 = 实际等待 4.0-5.0 秒
- 避免大量失败请求在同一时刻同时重试,造成服务器压力激增
- 特别适用于分布式系统和高并发场景
实现要点:
- 计算基础等待时间(指数退避)
- 生成随机抖动值(通常为 0 到 1 秒之间的随机数)
- 实际等待时间 = 基础等待时间 + 随机抖动
- 对于网络错误,也可以使用随机范围内的等待时间
2. 兜底机制设计
兜底机制确保即使 AI 调用失败,系统仍能提供基本服务。
多模型兜底
当主模型失败时,自动切换到备用模型。
核心原理:
- 定义模型优先级列表(主模型 → 备用模型 1 → 备用模型 2)
- 按优先级依次尝试,直到成功或全部失败
- 记录使用的模型信息,便于监控和分析
- 考虑成本因素:主模型可选性价比高的,备用模型选稳定性好的
- 所有模型都失败时,返回友好的错误提示
实现要点:
- 创建模型配置列表,包含模型名称、API 客户端、base_url 等信息
- 使用循环遍历模型列表,依次尝试调用
- 记录最后一次错误信息,用于最终的错误报告
- 设置较短的超时时间(如 10 秒),快速切换到下一个模型
- 返回结构化的结果,包含成功状态、使用的模型、响应内容等
缓存兜底
对于常见问题,使用缓存作为兜底。
核心原理:
- 对用户输入生成唯一标识(如 MD5 哈希)作为缓存键
- 优先从缓存获取结果,命中则直接返回
- 缓存未命中时调用 AI,成功后将结果存入缓存
- AI 调用失败时,可返回缓存的历史相似回答或通用回复
- 生产环境建议使用 Redis 等分布式缓存,支持过期时间和容量管理
实现要点:
- 使用哈希算法(如 MD5)为用户消息生成缓存键
- 实现三层查询逻辑:缓存 → AI 调用 → 兜底回复
- 成功的 AI 响应应存入缓存,供后续使用
- 设置合理的缓存过期时间,避免返回过时信息
- 返回结果时标注数据来源(cache/ai/fallback)
降级服务
当 AI 完全不可用时,提供降级的基础服务。
核心原理:
- 使用规则匹配或关键词识别提供基础回复
- 针对常见问题(价格、联系方式、使用帮助)预设模板回答
- 明确告知用户当前使用简化服务,设置合理预期
- 提供人工客服联系方式作为最终兜底
- 降级服务应简单可靠,避免依赖外部服务
实现要点:
- 实现基于关键词的规则匹配函数
- 为常见问题类型准备模板回复
- 在降级响应中明确标注服务状态
- 提供替代的联系方式(客服电话、文档链接等)
- 降级逻辑应足够简单,不依赖数据库或外部 API
3. 完整的错误处理示例
结合重试和兜底机制的完整实现:
1 | package main |
最佳实践总结
重试机制:
- 使用指数退避避免过度重试
- 添加随机抖动防止惊群效应
- 区分可重试错误(网络、速率限制)和不可重试错误(参数错误)
兜底机制:
- 多模型兜底:主模型失败时切换备用模型
- 缓存兜底:常见问题使用缓存响应
- 降级服务:提供基础的规则匹配服务
监控和日志:
- 记录每次重试和兜底的触发情况
- 监控各模型的成功率和响应时间
- 设置告警阈值,及时发现问题
成本优化建议
1. 选择合适的模型
1 | # 根据任务复杂度选择模型 |
2. 控制 token 使用
1 | def optimize_tokens(messages: list) -> list: |
3. 使用缓存
1 | from functools import lru_cache |
4. 批量处理
1 | def batch_process(questions: list) -> list: |
国内外主流 AI 服务
国内服务
| 服务商 | OpenAI 兼容 | 官网 |
|---|---|---|
| DeepSeek | 兼容 | https://www.deepseek.com/ |
| 阿里云通义千问 | 兼容 | https://tongyi.aliyun.com/ |
| 智谱 AI | 兼容 | https://www.zhipuai.cn/ |
| 百度文心 | 部分兼容 | https://yiyan.baidu.com/ |
| 月之暗面 | 兼容 | https://www.moonshot.cn/ |
国外服务
| 服务商 | 协议类型 | 官网 |
|---|---|---|
| OpenAI | OpenAI | https://openai.com/ |
| Anthropic | Claude | https://www.anthropic.com/ |
| Gemini | https://ai.google.dev/ |
其他服务:字节豆包、xAI (Grok) 等。
统一接口平台
| 平台 | 官网 |
|---|---|
| LiteLLM | https://litellm.ai/ |
| OpenRouter | https://openrouter.ai/ |
| Ollama | https://ollama.com/ |
参考资源
官方文档
DeepSeek
- 官方网站:https://www.deepseek.com/
- API 文档:https://platform.deepseek.com/api-docs/
- 定价:https://platform.deepseek.com/api-docs/pricing/
阿里云通义千问
- 官方网站:https://tongyi.aliyun.com/
- API 文档:https://help.aliyun.com/zh/dashscope/
- 控制台:https://dashscope.console.aliyun.com/
智谱 AI
百度文心
- 官方网站:https://yiyan.baidu.com/
- API 文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html
- 千帆平台:https://qianfan.cloud.baidu.com/
月之暗面(Kimi)
OpenAI(参考)
Anthropic Claude(参考)
Google Gemini
- 官方网站:https://ai.google.dev/
- API 文档:https://ai.google.dev/docs
- 快速开始:https://ai.google.dev/tutorials/python_quickstart
统一接口工具
LiteLLM
- GitHub:https://github.com/BerriAI/litellm
- 文档:https://docs.litellm.ai/
- 支持的模型列表:https://docs.litellm.ai/docs/providers
OpenRouter
Ollama
开发工具和库
Python
1 | # OpenAI SDK(兼容多数国内服务) |
JavaScript/TypeScript
1 | # OpenAI SDK |
学习资源
- OpenAI Cookbook:https://cookbook.openai.com/
- 包含大量实用示例和最佳实践
- LangChain 文档:https://python.langchain.com/
- 构建 LLM 应用的框架
- Prompt Engineering Guide:https://www.promptingguide.ai/
- 提示词工程指南
社区和论坛
- DeepSeek 开发者社区:https://github.com/deepseek-ai
- 阿里云开发者社区:https://developer.aliyun.com/
- 智谱 AI 开发者论坛:https://open.bigmodel.cn/forum
总结
本文详细介绍了大模型 API 调用的方方面面:
- 协议标准:理解了为什么需要标准化协议,以及 OpenAI 和 Claude 协议的区别
- 参数详解:掌握了各个请求参数的含义和使用场景
- Tool Call:学会了如何让 AI 调用外部函数和 API
- Prompt 优化:了解了编写高质量提示词的技巧
- 安全实践:认识到 API Key 安全的重要性和防护措施
- 实战示例:通过多个完整示例学会了使用不同方式调用 API
- 成本优化:掌握了降低 API 调用成本的方法
关键要点
- 始终使用环境变量存储 API Key,永远不要硬编码,千万不要把API Key暴露在前端
- 根据任务选择合适的模型和参数
- 实现完善的错误处理和重试机制
- 注意防范 Prompt 注入攻击
- 优化 token 使用以控制成本
- 国内服务在访问性、合规性上更有优势(但实际国外的AI比国内的要强得多)
下一步学习
- 探索 LangChain 等 LLM 应用框架
- 学习 RAG(检索增强生成)技术
- 了解 Agent 和 Multi-Agent 系统
- 实践构建完整的 AI 应用
最后更新:2026-3-30
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
