
@[toc]
本指南将分为五个部分:
- 核心概念与准备工作:深入解释API调用的基本原理、Token、以及环境配置。
- OpenAI标准格式详解:以OpenAI API为蓝本,拆解每一个请求参数和响应字段。
- 主流模型API调用的详细实战:提供Claude、Google Gemini、DeepSeek等模型的完整可运行代码,并指出细微差别。
- 关键技巧与最佳实践:包括流式输出、函数调用、错误处理、成本控制。
- 一个完整的开发工作流示例:从构思到实现一个简单的多轮对话机器人。
第一部分:核心概念与准备工作
1.1 什么是API调用?
API(应用程序编程接口)就像是一个"软件信使"。你的代码(客户端)向模型提供商的服务器(服务端)发送一个格式化好的"请求",服务器处理这个请求(运行模型推理),然后返回一个"响应"。整个过程通过HTTP/HTTPS协议完成。
1.2 理解Token
大语言模型(LLM)并不直接理解文字,它理解的是"Token"。Token可以是一个单词、一个单词的一部分、甚至是一个标点符号。
- 举例 :
"我爱编程"可能被切分为["我", "爱", "编程"]三个Token。"ChatGPT is great!"可能被切分为["Chat", "G", "PT", " is", " great", "!"]。 - 重要性 :模型按Token收费。你发送的输入 (消息+历史)和模型生成的输出都消耗Token。大多数模型有上下文窗口限制(比如4096个Token),超出则无法处理。
1.3 环境搭建与通用库
-
Python :最常用。我们主要使用
openai库,它已经成为标准。bash# 创建一个虚拟环境(推荐) python -m venv myenv source myenv/bin/activate # 在Windows上用 myenv\Scripts\activate # 安装必要的库 pip install --upgrade openai requests python-dotenvopenai: 官方库,兼容大部分模型。requests: 发送HTTP请求的底层库,当模型不完全兼容OpenAI时使用。python-dotenv: 用于从.env文件中读取敏感信息(如API Key),避免将其硬编码在代码里。
-
Node.js (JavaScript/TypeScript):
bashnpm install openai axios dotenv
1.4 安全的API Key管理
在你的项目根目录创建一个 .env 文件:
env
# .env
OPENAI_API_KEY="sk-xxxxx"
DEEPSEEK_API_KEY="sk-yyyyy"
ANTHROPIC_API_KEY="sk-zzzzz"
在你的Python代码中:
python
import os
from dotenv import load_dotenv
load_dotenv() # 加载.env文件中的变量到环境变量
openai_key = os.getenv("OPENAI_API_KEY")
deepseek_key = os.getenv("DEEPSEEK_API_KEY")
重要 :确保 .env 被添加到 .gitignore 文件中,绝不提交到代码仓库。
第二部分:OpenAI标准格式详解(核心基础)
绝大多数模型(DeepSeek、智谱、通义千问等)都提供了与OpenAI API完全兼容或高度兼容的接口。掌握了OpenAI的格式,你就掌握了90%。
2.1 完整的请求参数
python
from openai import OpenAI
client = OpenAI(
api_key="你的API_KEY",
base_url="https://api.openai.com/v1" # 默认值,其他模型需要覆盖
)
response = client.chat.completions.create(
# --- 必填参数 ---
model="gpt-3.5-turbo", # 指定模型版本
messages=[ # 对话上下文列表
{
"role": "system", # 系统角色:设定背景、规则
"content": "你是一个乐于助人的AI助手,用中文回答,语气友好。"
},
{
"role": "user", # 用户角色:实际用户的问题
"content": "什么是机器学习?请用一句话简单解释。"
}
],
# --- 核心调节参数 ---
temperature=0.7, # 控制随机性 (0-2)。温度越低越确定,越高越有创造性。
max_tokens=150, # 生成回复的最大Token数。
top_p=1, # 核采样。通常与temperature二选一调节。
# --- 高级参数 ---
frequency_penalty=0, # 减少重复 -2.0 到 2.0
presence_penalty=0, # 鼓励谈论新话题 -2.0 到 2.0
stop=["\n", "用户:"] # 遇到这些字符串时停止生成。
)
# 提取模型回复
assistant_reply = response.choices[0].message.content
print(assistant_reply)
# 查看Token消耗(用于成本核算)
print(f"提示消耗: {response.usage.prompt_tokens}")
print(f"生成消耗: {response.usage.completion_tokens}")
print(f"总计消耗: {response.usage.total_tokens}")
2.2 响应对象详解
response 对象的结构大致如下:
json
{
"id": "chatcmpl-12345...",
"object": "chat.completion",
"created": 1677652288,
"model": "gpt-3.5-turbo-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "机器学习是人工智能的一个分支,使计算机能够从数据中学习。"
},
"finish_reason": "stop" // 结束原因: stop(正常结束), length(max_tokens), content_filter(违规)
}
],
"usage": {
"prompt_tokens": 25,
"completion_tokens": 20,
"total_tokens": 45
}
}
第三部分:主流模型API调用的详细实战
3.1 Claude (Anthropic) - 使用官方库
Claude的API与OpenAI不完全兼容,建议使用其官方库或requests。
- 安装 :
pip install anthropic - 代码示例:
python
import anthropic
client = anthropic.Anthropic(
api_key=os.getenv("ANTHROPIC_API_KEY"),
)
message = client.messages.create(
model="claude-3-5-sonnet-20240620", # 使用最新、最强的模型
max_tokens=1024, # Claude的必填参数
temperature=0.5,
system="你是一个编程专家,回答要精准并包含代码示例。", # Claude的system prompt放在这里
messages=[
{"role": "user", "content": "用Python写一个快速排序算法。"},
# Claude的响应会被自动处理,你只需继续添加新的user消息即可维持多轮对话
]
)
print(message.content[0].text)
- 与OpenAI的主要区别 :
max_tokens是必填项。- System prompt通过独立的
system参数传递,而不是messages列表中的一个特殊角色。 - 响应结果在
message.content[0].text。
3.2 Google Gemini - 使用官方库 (Vertex AI 或 Google AI Studio)
这里以更简单的Google AI Studio(使用API Key)为例。
- 安装 :
pip install google-generativeai - 获取API Key :访问 Google AI Studio,点击"Get API Key"。
- 代码示例:
python
import google.generativeai as genai
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
# 选择模型
model = genai.GenerativeModel('gemini-1.5-flash')
# 简单对话
response = model.generate_content("解释一下量子纠缠。")
print(response.text)
# 带系统指令的多轮对话
model = genai.GenerativeModel(
'gemini-1.5-pro',
system_instruction="你是一个物理老师,用通俗的比喻解释复杂概念。"
)
chat = model.start_chat(history=[])
chat.send_message("什么是黑洞?")
response = chat.send_message("那白洞呢?")
print(response.text)
# 查看Token用量
print(response.usage_metadata)
3.3 DeepSeek (通过阿里云百炼) - OpenAI兼容模式
DeepSeek本身提供API,但通过国内云服务(如阿里云百炼)可以获得更好的稳定性和合规性。它们通常实现OpenAI兼容接口。
- 获取凭证:在阿里云百炼平台创建API Key。
- 代码示例(与OpenAI代码几乎一样):
python
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("ALIBABA_DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" # 关键区别:改这里
)
response = client.chat.completions.create(
model="deepseek-v3.2", # 指定DeepSeek模型
messages=[
{"role": "system", "content": "你是一个数学老师。"},
{"role": "user", "content": "解释一下勾股定理。"}
],
temperature=0.6,
stream=False # 是否流式输出
)
print(response.choices[0].message.content)
3.4 国产模型(智谱、通义千问、文心一言) - 通用兼容模式
目前,主流国产模型都提供OpenAI兼容的接口。
| 模型 | Base URL (需核实最新) | 模型名称示例 |
|---|---|---|
| 智谱AI (GLM) | https://open.bigmodel.cn/api/paas/v4/ |
glm-4-plus |
| 通义千问 (Qwen) | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-max |
| 文心一言 (ERNIE) | https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions |
ernie-4.0-8k-latest |
| 讯飞星火 | 相对复杂,需组装请求头和签名,建议使用官方SDK。 | - |
调用方式与上面的DeepSeek示例完全一致,只需要更换 base_url 和 model 即可。
第四部分:关键技巧与最佳实践
4.1 流式输出 (Streaming)
对于长回复,流式输出可以逐词显示,极大提升用户体验。
python
from openai import OpenAI
client = OpenAI(api_key="your_key")
stream = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "写一篇关于AI的短文"}],
stream=True # 开启流式
)
# 处理流式响应
for chunk in stream:
# 每个chunk可能包含多个content部分,通常取第一个
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
4.2 函数调用 (Function Calling / Tools)
让模型有能力调用你的本地函数或外部API。例如:"帮我查一下北京天气",模型会返回一个结构化的函数调用请求,而不是文本。
python
# 定义工具
tools = [{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "城市名,如北京"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
}]
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "北京天气如何?"}],
tools=tools,
tool_choice="auto" # 让模型决定是否调用
)
# 检查模型是否需要调用函数
if response.choices[0].message.tool_calls:
function_name = response.choices[0].message.tool_calls[0].function.name
arguments = json.loads(response.choices[0].message.tool_calls[0].function.arguments)
location = arguments.get("location")
# 调用你自己的 get_current_weather(location) 函数...
# 将结果发回给模型,生成最终回复...
4.3 错误处理与重试(指数退避)
网络请求经常出错,必须优雅处理。
python
from openai import OpenAI, APIError, APIConnectionError, RateLimitError
import time
def call_with_retry(client, **kwargs):
max_retries = 5
base_delay = 1 # 初始等待1秒
for attempt in range(max_retries):
try:
return client.chat.completions.create(**kwargs)
except RateLimitError as e: # 429 请求过多
wait_time = base_delay * (2 ** attempt) # 1, 2, 4, 8, 16 秒
print(f"达到速率限制,{wait_time}秒后重试...")
time.sleep(wait_time)
except (APIError, APIConnectionError) as e:
print(f"API错误: {e}")
# 对于非速率限制错误,可能只需重试一次
if attempt == max_retries - 1:
raise
time.sleep(base_delay)
return None
# 使用
response = call_with_retry(client, model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hi"}])
4.4 成本控制与监控
-
设置硬限制 :在调用时设置
max_tokens防止单个请求无限生成长文。 -
使用TikToken计算Token :在发送前估算成本。
pythonimport tiktoken encoding = tiktoken.encoding_for_model("gpt-3.5-turbo") token_count = len(encoding.encode("你的消息内容")) -
日志记录 :记录每次请求的
response.usage,定期分析。
第五部分:一个完整的开发工作流示例
目标:实现一个命令行多轮对话机器人,支持切换模型。
-
项目结构 my_chatbot/ ├── .env ├── config.py ├── models.py └── main.py
-
config.py:加载配置pythonimport os from dotenv import load_dotenv load_dotenv() class Config: OPENAI_KEY = os.getenv("OPENAI_API_KEY") DEEPSEEK_KEY = os.getenv("DEEPSEEK_API_KEY") # 默认使用DeepSeek(便宜) DEFAULT_PROVIDER = "deepseek" DEFAULT_MODEL = "deepseek-v3.2" -
models.py:封装不同模型调用pythonfrom openai import OpenAI from config import Config import google.generativeai as genai class ModelRouter: def __init__(self, provider=Config.DEFAULT_PROVIDER): self.provider = provider self.client = self._get_client() self.model_name = self._get_model_name() self.history = [] # 存储对话历史 def _get_client(self): if self.provider == "openai": return OpenAI(api_key=Config.OPENAI_KEY) elif self.provider == "deepseek": return OpenAI( api_key=Config.DEEPSEEK_KEY, base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" ) # ... 其他模型 else: raise ValueError(f"不支持的服务商: {self.provider}") def _get_model_name(self): if self.provider == "openai": return "gpt-3.5-turbo" elif self.provider == "deepseek": return "deepseek-v3.2" # ... def send_message(self, user_message): self.history.append({"role": "user", "content": user_message}) try: response = self.client.chat.completions.create( model=self.model_name, messages=self.history, # 传入整个历史 temperature=0.7, max_tokens=500 ) assistant_reply = response.choices[0].message.content self.history.append({"role": "assistant", "content": assistant_reply}) return assistant_reply except Exception as e: return f"出错啦:{e}" def reset(self): """重置对话历史""" self.history = [] -
main.py:用户交互界面pythonfrom models import ModelRouter def main(): print("聊天机器人启动!输入 'reset' 重置对话,'quit' 退出。") router = ModelRouter(provider="deepseek") # 可以改这里 while True: user_input = input("\n你: ") if user_input.lower() == 'quit': break if user_input.lower() == 'reset': router.reset() print("对话已重置。") continue reply = router.send_message(user_input) print(f"机器人: {reply}") if __name__ == "__main__": main()
yaml
5. **运行**
```bash
python main.py
```
你就可以在命令行中与机器人流畅对话了。想要切换模型?只需将 `provider` 参数从 `"deepseek"` 改为 `"openai"` 即可。
---
这份超详细指南涵盖了从原理到实战、从简单调用到健壮工程的所有关键步骤。希望它成为你开发路上的一个好帮手。如果有任何具体的模型或场景想深入了解,随时可以再问我!