Thông báo lỗi
Nếu bạn đang cố gắng gửi một hình ảnh tới GPT-4o hoặc GPT-4-vision-preview và gặp trở ngại, rất có thể bạn sẽ thấy lỗi chính xác này trong console của mình:
openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid image URL. Only 'data' URLs are supported for this request."}}
Tại sao lỗi này xảy ra
OpenAI không quá khắt khe, nhưng nó sẽ không tự động "tìm thấy" một tệp tin nằm trên máy tính của bạn. Dưới đây là những nguyên nhân thường gặp:
- Đường dẫn tệp cục bộ: Bạn đang truyền một đường dẫn như
C:\Users\Desktop\image.jpg. API chạy trên một máy chủ từ xa và không có quyền truy cập vào ổ cứng cục bộ của bạn. - Thiếu Header Data URI: Bạn đã chuyển đổi hình ảnh sang Base64 nhưng quên thêm tiền tố (prefix). API cần biết loại tệp (JPEG, PNG, v.v.) trước khi xử lý chuỗi.
- Liên kết web bị hỏng: Nếu bạn sử dụng một URL công khai, nó phải có thể truy cập trực tiếp. Nếu liên kết yêu cầu đăng nhập hoặc chuyển hướng đến một trang đích, API sẽ thất bại.
Cách khắc phục: Sử dụng mã hóa Base64
Trừ khi bạn muốn lưu trữ hình ảnh của mình trên một S3 bucket công khai, mã hóa Base64 là lựa chọn tốt nhất. Nó chuyển đổi hình ảnh của bạn thành một chuỗi văn bản dài mà bạn có thể gửi trực tiếp trong payload JSON.
1. Chuyển đổi hình ảnh
Đọc tệp cục bộ của bạn dưới dạng dữ liệu nhị phân và mã hóa nó. Điều này sẽ chuyển đổi các pixel thô thành định dạng văn bản tiêu chuẩn.
2. Thêm tiền tố Data URI
Chuỗi của bạn phải bắt đầu bằng data:image/jpeg;base64, (hoặc image/png). Nếu không có header này, OpenAI sẽ coi dữ liệu đó là một URL bị hỏng thay vì một hình ảnh.
Ví dụ triển khai (Python)
import base64
from openai import OpenAI
client = OpenAI()
def encode_image(image_path):
with open(image_path, "rb") as image_file:
# Mã hóa sang base64 và chuyển đổi bytes thành chuỗi UTF-8
return base64.b64encode(image_file.read()).decode('utf-8')
# Tệp hình ảnh cục bộ của bạn
image_path = "inventory_photo.jpg"
base64_string = encode_image(image_path)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Có những vật dụng nào trong bức ảnh này?"},
{
"type": "image_url",
"image_url": {
# f-string thêm tiền tố quan trọng
"url": f"data:image/jpeg;base64,{base64_string}"
},
},
],
}
],
max_tokens=300,
)
print(response.choices[0].message.content)
Xác minh cách khắc phục
Làm thế nào để biết nó đang hoạt động? Đầu tiên, terminal của bạn sẽ trả về trạng thái 200 OK. Nếu bạn in base64_string, nó sẽ trông giống như một khối ký tự ngẫu nhiên khổng lồ—nếu nó trông giống một đường dẫn tệp, việc mã hóa đã thất bại. Cuối cùng, mô hình sẽ thực sự mô tả hình ảnh của bạn thay vì báo lỗi 400.
Mẹo chuyên nghiệp và cách phòng tránh
Chuỗi Base64 nổi tiếng là khá rắc rối. Nếu mã của bạn vẫn thất bại, bản thân chuỗi đó có thể bị hỏng hoặc thiếu phần đệm (padding).
Tôi thường sử dụng Base64 Encoder của ToolCraft để gỡ lỗi các vấn đề này. Bạn có thể tải lên hình ảnh của mình một cách thủ công và so sánh chuỗi đầu ra với những gì tập lệnh Python của bạn đang tạo ra. Nó chạy hoàn toàn trong trình duyệt của bạn, vì vậy hình ảnh của bạn vẫn được giữ riêng tư.
Hãy lưu ý những hạn chế kỹ thuật sau:
- Độ nở 33%: Mã hóa Base64 làm tăng kích thước tệp khoảng 33%. Nếu hình ảnh gốc của bạn là 18MB, chuỗi được mã hóa sẽ vượt quá giới hạn 20MB của OpenAI.
- Độ chính xác của MIME: Khớp tiền tố với tệp của bạn. Sử dụng
image/pngcho tệp PNG vàimage/webpcho tệp WebP. - An toàn URL: Nếu bạn quyết định sử dụng URL web thay vì Base64, hãy sử dụng URL Encoder của ToolCraft để đảm bảo các ký tự đặc biệt trong liên kết không làm hỏng yêu cầu API.

