共计 2127 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景
ChatGPT API 的上传限制主要源于两方面:HTTP 协议层和模型层。在 HTTP 协议层,服务器对 multipart/form-data 请求有默认大小限制(通常为 10MB),这是为了防止资源滥用。而在模型层,所有输入内容(包括上传文件)都需要转换成 token 进行处理,GPT-3.5 模型的最大 token 限制为 4096(约 3000 英文单词)。

值得注意的是,不同文件类型的 token 计算方式不同:
- 纯文本:直接按字符编码计算
- PDF/Word:需要先提取文字内容
- 图片:通过 CLIP 模型转换为描述文本
常见错误与计算示例
开发者最常遇到的错误是413 Payload Too Large,这是 HTTP 协议层的限制响应。此外还有:
429 Too Many Requests:速率限制400 Bad Request:token 超限
不同文件类型的 token 消耗示例:
- 纯文本文件(1MB 约 =78 万 token)
- 扫描版 PDF(1 页约 =1500token)
- 高清图片(通过 CLIP 转换后约 =300token)
5 大解决方案
方案 1:文件分片上传
Python 示例实现断点续传功能:
import hashlib
import os
CHUNK_SIZE = 2 * 1024 * 1024 # 2MB
def upload_file(file_path, api_key):
file_id = hashlib.md5(file_path.encode()).hexdigest()
uploaded = check_uploaded_chunks(file_id) # 伪代码
with open(file_path, 'rb') as f:
chunk_index = 0
while True:
chunk = f.read(CHUNK_SIZE)
if not chunk:
break
if chunk_index in uploaded:
continue
headers = {'Authorization': f'Bearer {api_key}',
'Content-Range': f'bytes {chunk_index*CHUNK_SIZE}-{(chunk_index+1)*CHUNK_SIZE-1}/*'
}
try:
response = requests.post(
'https://api.openai.com/v1/files',
headers=headers,
data=chunk
)
mark_chunk_uploaded(file_id, chunk_index) # 伪代码
except Exception as e:
log_error(f'Chunk {chunk_index} failed: {str(e)}')
chunk_index += 1
方案 2:内容压缩预处理
文本精简技巧:
- 移除重复段落
- 提取关键句子
- 使用摘要模型(如 BERT-extractive)
- 替换长短语为缩写
方案 3:Temporary URL
AWS S3 生成预签名 URL 示例:
import boto3
from datetime import datetime, timedelta
s3 = boto3.client('s3')
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-bucket', 'Key': 'object.key'},
ExpiresIn=3600
)
方案 4:流式传输
使用 chunked encoding 的 HTTP 头部:
Transfer-Encoding: chunked
Content-Type: application/octet-stream
方案 5:异步处理
Celery 配置示例:
@app.task(bind=True)
def process_large_file(self, file_url):
try:
result = download_and_process(file_url)
update_task_status(self.request.id, 'COMPLETED')
except Exception as e:
update_task_status(self.request.id, 'FAILED')
性能对比
| 方案 | API 调用次数 | 延迟 | 实现复杂度 |
|---|---|---|---|
| 文件分片 | 高 | 中等 | 高 |
| 内容压缩 | 低 | 低 | 中等 |
| Temporary URL | 最低 | 最低 | 低 |
| 流式传输 | 中等 | 高 | 高 |
| 异步处理 | 低 | 最高 | 最高 |
避坑指南
- 分片 MD5 校验:不要对整个文件做单一 MD5,应该分块校验
- 流式超时:设置合理的
read_timeout(建议 30-60 秒) - 异步状态检查:实现心跳机制避免任务丢失
开放性问题
- 如何根据网络状况动态调整分片大小?
- 当触发速率限制时,应该如何设计退避算法?
- 在多用户系统中,如何实现上传配额的动态分配?
实践建议
根据我们的实测经验,对于中小型文件(<50MB),内容压缩 +Temporary URL 组合方案性价比最高。而对于需要保真度的大型文件(如高清设计图),建议采用分片上传配合断点续传功能。
流式传输虽然技术先进,但在移动网络环境下稳定性较差,建议配合 WebSocket 实现进度通知。异步处理适合后台分析场景,但需要完善的任务监控体系。
最后提醒:所有方案都应考虑实施重试机制(建议指数退避)和详细的日志记录,这对后期排查问题至关重要。
正文完
发表至: 未分类
近一天内
