在LLM调用时,传统方式是基于OpenAI SDK同步:
方式1:使用 OpenAI SDK(同步)
python
from openai import OpenAI
client = OpenAI(api_key="xxx", base_url="https://api.deepseek.com")
# 同步调用,一个接一个
for i in range(100):
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "决策..."}]
)
# 100个请求串行执行,耗时很长
✓ 方式一:使用 OpenAI 官方 SDK(异步)
对于异步场景,OpenAI SDK v1.0+ 现在也支持异步(AsyncOpenAI),但这个代码可能是在那之前写的,或者是为了保持对多个非官方提供商的统一接口。如果只需要 OpenAI 官方 API,改用 SDK 可以简化代码。
代码示例(异步)
python
import asyncio
from openai import AsyncOpenAI
async def use_openai_sdk():
client = AsyncOpenAI(api_key="your-api-key-here")
response = await client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
# 运行
asyncio.run(use_openai_sdk())
优点:
- 简洁易读:无需手动构造请求头、JSON body。
- 类型安全:支持 Pydantic 模型,返回结构化对象。
- 自动重试、超时、流式处理等高级功能。
- 官方维护,与 API 同步更新。
缺点:
- 需要额外安装
openai包。 - 灵活性略低(但对大多数场景足够)。
但是面对大量请求,并且希望代码支持多个 LLM 提供商(deepseek、mimo、bigmodel),它们都提供 OpenAI 兼容 API。使用 aiohttp 可以统一调用方式,实现原生异步支持 + 高并发控制,不需要为每个提供商安装不同的 SDK。
✓ 方式二:使用 aiohttp 手动发起 HTTP 请求
aiohttp 是一个基于 Python 的 异步 HTTP 客户端/服务器框架,它建立在 asyncio(Python 内置的异步 I/O 框架)之上,支持 异步发送 HTTP 请求(客户端) 和 构建异步 Web 服务(服务器)。常用于:
- 调用 RESTful API(如 OpenAI、GitHub API 等)
- 并发抓取多个网页
- 微服务间通信
使用前安装依赖:
bash
pip install aiohttp
代码示例(异步)
python
import asyncio
import aiohttp
import json
async def use_aiohttp():
url = "https://api.openai.com/v1/chat/completions"
headers = {
"Authorization": "Bearer your-api-key-here",
"Content-Type": "application/json"
}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=headers, json=payload) as resp:
if resp.status == 200:
data = await resp.json()
print(data["choices"][0]["message"]["content"])
else:
error = await resp.text()
print(f"Error: {resp.status}, {error}")
# 运行
asyncio.run(use_aiohttp())
优点:
- 完全控制请求细节(如自定义超时、代理、重试逻辑等)。
- 不依赖 OpenAI SDK,适合轻量级或定制化场景。
- 可用于调用任何兼容 OpenAI 协议的第三方 API(如本地部署的 LLM)。
缺点:
- 代码冗长,需手动处理 JSON、错误、认证等。
- 无类型提示,容易出错(如拼错字段名)。
- 需自行实现流式响应、重试、速率限制等逻辑。
🔍 对比总结
| 特性 | OpenAI SDK(AsyncOpenAI) | aiohttp 手动请求 |
|---|---|---|
| 代码简洁性 | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 类型安全 | ✓(Pydantic 模型) | ❌(纯 dict) |
| 自动处理认证/序列化 | ✓ | ❌(需手动) |
| 流式响应支持 | ✓(stream=True) |
✓(但需手动解析 SSE) |
| 灵活性 | 中等 | 极高 |
| 依赖 | 需 openai 包 |
仅需 aiohttp |
| 适用场景 | 快速开发、标准调用 | 定制协议、调试、轻量环境 |
💡 建议
- 日常开发推荐使用 OpenAI SDK,它更安全、高效、可维护。
- 只有在需要绕过 SDK 限制(如使用非官方 endpoint、自定义中间件、性能极致优化)时,才考虑用 aiohttp。
除了aiohttp,requests 和 httpx 都是 Python 中用于发送 HTTP 请求的流行库,但它们在设计理念、使用场景和功能特性上有显著区别:
| 库名 | 类型 | 异步支持 | 同步支持 | 是否可做 Web 服务器 |
|---|---|---|---|---|
requests |
同步 HTTP 客户端 | ❌ | ✓ | ❌ |
aiohttp |
异步 HTTP 客户端 + 服务器 | ✓ | ❌ | ✓ |
httpx |
现代 HTTP 客户端(同步+异步) | ✓ | ✓ | ❌ |
✓ = 支持,❌ = 不支持
码示例对比
场景:向 https://httpbin.org/post 发送 POST 请求
1. requests(同步)
python
import requests
response = requests.post(
"https://httpbin.org/post",
json={"hello": "world"},
headers={"User-Agent": "MyApp/1.0"}
)
print(response.json()["json"])
2. aiohttp(异步)
python
import aiohttp
import asyncio
async def main():
async with aiohttp.ClientSession() as session:
async with session.post(
"https://httpbin.org/post",
json={"hello": "world"},
headers={"User-Agent": "MyApp/1.0"}
) as resp:
data = await resp.json()
print(data["json"])
asyncio.run(main())
3. httpx(同步 or 异步)
✓ 同步模式(像 requests):
python
import httpx
response = httpx.post(
"https://httpbin.org/post",
json={"hello": "world"},
headers={"User-Agent": "MyApp/1.0"}
)
print(response.json()["json"])
✓ 异步模式(简洁):
python
import httpx
import asyncio
async def main():
async with httpx.AsyncClient() as client:
response = await client.post(
"https://httpbin.org/post",
json={"hello": "world"},
headers={"User-Agent": "MyApp/1.0"}
)
print(response.json()["json"])
asyncio.run(main())