Đầu vào đa phương thức
Đầu vào đa phương thức cho phép các mô hình xử lý không chỉ văn bản mà còn cả hình ảnh, âm thanh và các dạng nội dung khác. RouteAPI hỗ trợ truyền nội dung đa phương thức trên cả /v1/chat/completions (định dạng OpenAI) và /v1/messages (định dạng Claude), đồng thời tự động xử lý chuyển đổi định dạng giữa các giao thức upstream khác nhau.
1. Tổng quan về đa phương thức
Phần tiêu đề “1. Tổng quan về đa phương thức”Các loại phương thức được hỗ trợ
Phần tiêu đề “Các loại phương thức được hỗ trợ”| Loại phương thức | Mô tả |
|---|---|
| Hình ảnh (Vision) | Các định dạng PNG, JPEG, WebP, GIF để hiểu hình ảnh, OCR, phân tích biểu đồ |
| Âm thanh (Audio) | Một số mô hình hỗ trợ đầu vào âm thanh để hiểu giọng nói, phiên âm, v.v. |
| Video | Một số mô hình hỗ trợ đầu vào khung hình video bằng cách chia video thành chuỗi khung hình chính |
Hiện tại, hỗ trợ đầu vào hình ảnh là phổ biến nhất, hầu hết tất cả các mô hình thị giác chính thống đều hỗ trợ. Đầu vào âm thanh và video phụ thuộc vào khả năng cụ thể của mô hình.
Các mô hình thị giác được hỗ trợ
Phần tiêu đề “Các mô hình thị giác được hỗ trợ”Các mô hình sau hỗ trợ đầu vào hình ảnh (danh sách không đầy đủ):
| Họ mô hình | ID mô hình điển hình |
|---|---|
| OpenAI GPT-4 Vision | gpt-4o, gpt-4-turbo, gpt-5.5 |
| Claude Vision | claude-sonnet-4-5, claude-opus-4-5 |
| Gemini Vision | gemini-2.0-flash, gemini-2.5-pro |
| Azure OpenAI | azure-gpt-4o |
Trước tiên hãy dùng endpoint danh sách mô hình để xác nhận mô hình có khả dụng trong tài khoản của bạn:
curl https://api.routeapi.ai/v1/models \ -H "Authorization: Bearer $ROUTEAPI_KEY"Endpoint này không trả về trường biểu thị khả năng nhận đầu vào hình ảnh. Hãy xác nhận mô hình có hỗ trợ thị giác hay không qua tài liệu của nhà cung cấp, hoặc bằng một request thực tế có kèm hình ảnh.
2. Cơ bản về đầu vào hình ảnh
Phần tiêu đề “2. Cơ bản về đầu vào hình ảnh”Các định dạng hình ảnh được hỗ trợ
Phần tiêu đề “Các định dạng hình ảnh được hỗ trợ”| Định dạng | MIME Type | Mô tả |
|---|---|---|
| PNG | image/png | Định dạng không mất dữ liệu, phù hợp cho ảnh chụp màn hình và biểu đồ |
| JPEG | image/jpeg | Nén mất dữ liệu, phù hợp cho ảnh |
| WebP | image/webp | Định dạng hiện đại với kích thước nhỏ và chất lượng cao |
| GIF | image/gif | Định dạng không động (chỉ sử dụng khung hình đầu tiên) |
Giới hạn kích thước hình ảnh
Phần tiêu đề “Giới hạn kích thước hình ảnh”Các mô hình khác nhau có giới hạn kích thước hình ảnh khác nhau. Khuyến nghị chung:
| Mục giới hạn | Giá trị khuyến nghị | Mô tả |
|---|---|---|
| Kích thước hình ảnh đơn | < 20 MB | Hình ảnh rất lớn làm tăng thời gian xử lý và chi phí |
| Độ phân giải hình ảnh | Cạnh dài ≤ 2048px | Độ phân giải cao sẽ được tự động thu nhỏ hoặc xử lý theo khối |
| Sau khi mã hóa Base64 | < 32 MB | Tổng kích thước yêu cầu bị giới hạn bởi dịch vụ upstream |
Khuyến nghị nén hình ảnh trước khi tải lên, giảm độ phân giải trong khi đảm bảo khả năng đọc được để giảm cả thời gian truyền và chi phí token.
Độ phân giải và cân nhắc chi phí
Phần tiêu đề “Độ phân giải và cân nhắc chi phí”Hình ảnh được chuyển đổi thành token để tính phí. Hình ảnh độ phân giải cao tiêu thụ nhiều token hơn văn bản rất nhiều:
- Chế độ độ phân giải thấp (như
detail: "low"của OpenAI): Cố định khoảng 85 token/hình ảnh. - Chế độ độ phân giải cao (như
detail: "high"): Chia theo kích thước hình ảnh; một hình ảnh 2048×2048 có thể tiêu thụ 800-1500 token.
Trong môi trường production, chọn chế độ độ phân giải dựa trên nhu cầu thực tế. Sử dụng chế độ low khi không cần nhận diện chi tiết.
3. Phương pháp truyền hình ảnh
Phần tiêu đề “3. Phương pháp truyền hình ảnh”Hình ảnh có thể được truyền theo hai cách: URL và mã hóa Base64.
Phương pháp URL
Phần tiêu đề “Phương pháp URL”Truyền một URL hình ảnh có thể truy cập công khai để dịch vụ mô hình upstream tải về:
Ưu điểm:
- Kích thước yêu cầu nhỏ, không sử dụng băng thông tải lên của bạn.
- Phù hợp cho hình ảnh đã được lưu trữ trên CDN.
Nhược điểm:
- Hình ảnh phải có thể truy cập công khai; IP của dịch vụ upstream phải có thể truy cập được.
- Nếu tải hình ảnh thất bại (vấn đề mạng, xác thực, liên kết hết hạn), yêu cầu sẽ báo lỗi.
Trường hợp sử dụng: Hình ảnh đã có trên các host hình ảnh công khai hoặc CDN, không cần tải lên tạm thời.
Phương pháp mã hóa Base64
Phần tiêu đề “Phương pháp mã hóa Base64”Đọc hình ảnh dưới dạng dữ liệu nhị phân, mã hóa bằng Base64 và nhúng trực tiếp vào yêu cầu:
Ưu điểm:
- Không cần URL có thể truy cập công khai, phù hợp cho hình ảnh riêng tư.
- Yêu cầu tự chứa, không phụ thuộc vào tính khả dụng của dịch vụ bên ngoài.
Nhược điểm:
- Mã hóa Base64 làm tăng kích thước dữ liệu khoảng 33%.
- Kích thước yêu cầu lớn, thời gian tải lên lâu hơn.
Trường hợp sử dụng: Hình ảnh riêng tư do người dùng tải lên, tệp cục bộ, ảnh chụp màn hình tạm thời không có URL công khai.
So sánh hai phương pháp
Phần tiêu đề “So sánh hai phương pháp”| So sánh | Phương pháp URL | Phương pháp Base64 |
|---|---|---|
| Kích thước yêu cầu | Nhỏ (chỉ chuỗi URL) | Lớn (Base64 ~1.33× tệp gốc) |
| Tốc độ tải lên | Nhanh | Chậm |
| Khả năng truy cập hình ảnh | Phải có thể truy cập công khai | Không có yêu cầu, hình ảnh riêng tư OK |
| Phụ thuộc bên ngoài | Phụ thuộc vào máy chủ hình ảnh và tải upstream | Không có phụ thuộc bên ngoài |
| Trường hợp sử dụng | Host hình ảnh công khai, CDN | Tải lên người dùng, tệp cục bộ |
4. Đầu vào hình ảnh định dạng OpenAI
Phần tiêu đề “4. Đầu vào hình ảnh định dạng OpenAI”Trong /v1/chat/completions, hình ảnh được truyền qua mảng content, trong đó mỗi phần tử là một khối nội dung được phân biệt bởi type cho văn bản và hình ảnh.
Cấu trúc mảng content
Phần tiêu đề “Cấu trúc mảng content”content có thể là chuỗi (văn bản thuần) hoặc mảng (đa phương thức):
{ "role": "user", "content": [ { "type": "text", "text": "Có gì trong hình ảnh này?" }, { "type": "image_url", "image_url": { "url": "https://example.com/image.jpg" } } ]}Cấu trúc image_url
Phần tiêu đề “Cấu trúc image_url”Các trường của khối nội dung image_url:
| Trường | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
type | string | Có | Cố định là "image_url" |
image_url.url | string | Có | URL hình ảnh hoặc Data URI Base64 |
image_url.detail | string | Không | Chế độ độ phân giải: "low", "high", "auto" (mặc định) |
Tham số detail
Phần tiêu đề “Tham số detail”detail kiểm soát độ phân giải xử lý hình ảnh và chi phí:
| Giá trị | Hành vi | Tiêu thụ token |
|---|---|---|
"low" | Chế độ độ phân giải thấp, hình ảnh được thu nhỏ xuống kích thước cố định (ví dụ: 512×512) | Cố định khoảng 85 token |
"high" | Chế độ độ phân giải cao, hình ảnh được xử lý theo khối, giữ lại chi tiết | Theo số lượng khối, thường hàng trăm đến hàng nghìn token |
"auto" | Mô hình tự động chọn (mặc định) | Phụ thuộc vào chiến lược mô hình |
Ví dụ về sự khác biệt chi phí:
- Một ảnh chụp màn hình đơn giản với
"low"có thể chỉ cần 85 token (~$0.0001). - Cùng một hình ảnh với
"high"có thể tiêu thụ 800 token (~$0.001).
Đối với các tình huống không cần nhận diện chữ nhỏ hoặc chi tiết (như “đây là con vật gì” hoặc “màu chủ đề của giao diện là gì”), "low" là đủ. Chỉ sử dụng "high" khi cần OCR, đọc giá trị biểu đồ hoặc nhận diện đối tượng nhỏ.
Ví dụ đầy đủ về phương pháp URL
Phần tiêu đề “Ví dụ đầy đủ về phương pháp URL”{ "model": "gpt-4o", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg", "detail": "high" } }, { "type": "text", "text": "Mô tả nội dung của hình ảnh này" } ] } ]}Ví dụ đầy đủ về phương pháp Base64
Phần tiêu đề “Ví dụ đầy đủ về phương pháp Base64”Base64 yêu cầu định dạng Data URI: data:<mime_type>;base64,<encoded_data>.
{ "model": "gpt-4o", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD..." } }, { "type": "text", "text": "Có văn bản gì trong hình ảnh này?" } ] } ]}Lưu ý rằng chuỗi Base64 có thể rất dài; ví dụ trên đã được cắt bớt. Trong sử dụng thực tế, mã hóa hoàn chỉnh có thể từ vài trăm KB đến vài MB.
5. Đầu vào hình ảnh định dạng Claude
Phần tiêu đề “5. Đầu vào hình ảnh định dạng Claude”Trong /v1/messages, hình ảnh được truyền qua các khối loại image trong mảng content, với cấu trúc khác biệt đáng kể so với định dạng OpenAI.
Cấu trúc mảng content
Phần tiêu đề “Cấu trúc mảng content”{ "role": "user", "content": [ { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "/9j/4AAQSkZJRgABAQEAYABgAAD..." } }, { "type": "text", "text": "Mô tả hình ảnh này" } ]}Cấu trúc source
Phần tiêu đề “Cấu trúc source”Trường source chỉ định nguồn hình ảnh theo hai cách:
Phương pháp Base64
Phần tiêu đề “Phương pháp Base64”| Trường | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
type | string | Có | Cố định là "base64" |
media_type | string | Có | Loại MIME, như image/jpeg, image/png |
data | string | Có | Dữ liệu hình ảnh được mã hóa Base64 (không có tiền tố data:) |
Lưu ý rằng Base64 của định dạng Claude không cần tiền tố Data URI; truyền trực tiếp chuỗi được mã hóa.
{ "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" }}Phương pháp URL
Phần tiêu đề “Phương pháp URL”| Trường | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
type | string | Có | Cố định là "url" |
url | string | Có | URL hình ảnh có thể truy cập công khai |
{ "type": "image", "source": { "type": "url", "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" }}Ví dụ yêu cầu đầy đủ
Phần tiêu đề “Ví dụ yêu cầu đầy đủ”{ "model": "claude-sonnet-4-5", "max_tokens": 1024, "messages": [ { "role": "user", "content": [ { "type": "image", "source": { "type": "url", "url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg" } }, { "type": "text", "text": "Đây là con côn trùng gì?" } ] } ]}6. Đầu vào hình ảnh định dạng Gemini
Phần tiêu đề “6. Đầu vào hình ảnh định dạng Gemini”Định dạng gốc của Gemini sử dụng mảng parts thay vì content, với cấu trúc khá khác biệt. RouteAPI xử lý chuyển đổi nội bộ, vì vậy khi gọi các mô hình Gemini sử dụng định dạng OpenAI hoặc Claude, bạn không cần lo lắng về chi tiết định dạng gốc. Sau đây chỉ để tham khảo.
Mảng parts
Phần tiêu đề “Mảng parts”{ "contents": [ { "role": "user", "parts": [ { "text": "Mô tả hình ảnh này" }, { "inlineData": { "mimeType": "image/jpeg", "data": "/9j/4AAQSkZJRg..." } } ] } ]}inlineData (Base64)
Phần tiêu đề “inlineData (Base64)”| Trường | Mô tả |
|---|---|
inlineData.mimeType | Loại MIME |
inlineData.data | Dữ liệu được mã hóa Base64 |
fileData (URI)
Phần tiêu đề “fileData (URI)”Gemini cũng hỗ trợ tham chiếu tệp đã tải lên dịch vụ Google qua URI tệp:
{ "fileData": { "mimeType": "image/jpeg", "fileUri": "gs://bucket-name/path/to/image.jpg" }}Trong thực tế, khi gọi các mô hình Gemini qua RouteAPI, sử dụng định dạng OpenAI hoặc Claude; RouteAPI sẽ tự động chuyển đổi.
7. Đầu vào nhiều hình ảnh
Phần tiêu đề “7. Đầu vào nhiều hình ảnh”Tất cả các mô hình thị giác chính thống đều hỗ trợ truyền nhiều hình ảnh trong một yêu cầu duy nhất.
Nhiều hình ảnh trong một yêu cầu
Phần tiêu đề “Nhiều hình ảnh trong một yêu cầu”Đặt nhiều khối hình ảnh trong mảng content / parts:
Định dạng OpenAI:
{ "role": "user", "content": [ { "type": "text", "text": "So sánh sự khác biệt giữa hai hình ảnh này" }, { "type": "image_url", "image_url": { "url": "https://example.com/image1.jpg" } }, { "type": "image_url", "image_url": { "url": "https://example.com/image2.jpg" } } ]}Định dạng Claude:
{ "role": "user", "content": [ { "type": "text", "text": "Điểm tương đồng và khác biệt giữa hai hình ảnh này là gì?" }, { "type": "image", "source": { "type": "url", "url": "https://example.com/before.jpg" } }, { "type": "image", "source": { "type": "url", "url": "https://example.com/after.jpg" } } ]}Thứ tự và tham chiếu hình ảnh
Phần tiêu đề “Thứ tự và tham chiếu hình ảnh”Mô hình hiểu hình ảnh theo thứ tự mảng. Nếu văn bản tham chiếu đến “hình ảnh đầu tiên” hoặc “hình ảnh thứ hai”, mô hình sẽ tương ứng theo thứ tự xuất hiện. Khuyến nghị đặt văn bản giải thích trước hoặc sau tất cả hình ảnh, không xen kẽ giữa chúng, để ngữ nghĩa rõ ràng hơn:
{ "content": [ { "type": "text", "text": "Hình đầu tiên là ảnh chụp màn hình giao diện người dùng, hình thứ hai là bản thiết kế. Vui lòng so sánh sự khác biệt và đưa ra đề xuất sửa đổi." }, { "type": "image_url", "image_url": { "url": "..." } }, { "type": "image_url", "image_url": { "url": "..." } } ]}Kết hợp với văn bản
Phần tiêu đề “Kết hợp với văn bản”Bạn cũng có thể xen kẽ văn bản và hình ảnh để giải thích từng bước:
{ "content": [ { "type": "text", "text": "Đây là giao diện gốc:" }, { "type": "image_url", "image_url": { "url": "https://example.com/old.jpg" } }, { "type": "text", "text": "Đây là giao diện được cải thiện:" }, { "type": "image_url", "image_url": { "url": "https://example.com/new.jpg" } }, { "type": "text", "text": "Vui lòng tóm tắt các cải tiến." } ]}Hiệu quả thực tế phụ thuộc vào khả năng hiểu thứ tự khối nội dung của mô hình; các mô hình thị giác chính thống thường có thể xử lý điều này một cách chính xác.
8. Đầu vào âm thanh
Phần tiêu đề “8. Đầu vào âm thanh”Một số mô hình hỗ trợ đầu vào âm thanh để hiểu giọng nói, phiên âm, phân tích cảm xúc, v.v. Hỗ trợ hiện tại ít phổ biến hơn hình ảnh.
Các định dạng âm thanh được hỗ trợ
Phần tiêu đề “Các định dạng âm thanh được hỗ trợ”Phụ thuộc vào các mô hình cụ thể, các định dạng phổ biến bao gồm:
- WAV (
audio/wav) - MP3 (
audio/mpeg) - OGG (
audio/ogg) - FLAC (
audio/flac)
Phương pháp truyền âm thanh
Phần tiêu đề “Phương pháp truyền âm thanh”Giống như hình ảnh, âm thanh hỗ trợ cả hai phương pháp URL và Base64. Ví dụ định dạng OpenAI (giả sử mô hình hỗ trợ):
{ "role": "user", "content": [ { "type": "input_audio", "input_audio": { "data": "<base64-encoded-audio>", "format": "wav" } }, { "type": "text", "text": "Phiên âm đoạn âm thanh này và tóm tắt các điểm chính" } ]}Tên trường và cấu trúc thực tế phụ thuộc vào giao thức mô hình. Trước khi sử dụng, hãy tham khảo tài liệu của mô hình đã chọn hoặc xác minh trường supports_audio_input qua endpoint danh sách mô hình.
9. Ví dụ ứng dụng đầy đủ
Phần tiêu đề “9. Ví dụ ứng dụng đầy đủ”Các ví dụ sau đây cho thấy triển khai đầu đến cuối của việc hiểu hình ảnh bằng curl, Python và Node.js.
Hiểu và mô tả hình ảnh
Phần tiêu đề “Hiểu và mô tả hình ảnh”Cho một hình ảnh và yêu cầu mô hình mô tả nội dung của nó.
curl (định dạng OpenAI, phương pháp URL):
curl https://api.routeapi.ai/v1/chat/completions \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg" } }, { "type": "text", "text": "Mô tả chi tiết nội dung và không khí của hình ảnh này" } ] } ] }'Python (OpenAI SDK, phương pháp Base64):
import base64import osfrom openai import OpenAI
client = OpenAI( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai/v1",)
# Đọc hình ảnh cục bộ và mã hóa thành Base64with open("image.jpg", "rb") as f: image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create( model="gpt-4o", messages=[ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{image_data}" }, }, {"type": "text", "text": "Có gì trong hình ảnh này?"}, ], } ],)
print(response.choices[0].message.content)Node.js (gói openai, phương pháp URL):
import OpenAI from 'openai';
const client = new OpenAI({ apiKey: process.env.ROUTEAPI_KEY, baseURL: 'https://api.routeapi.ai/v1',});
const response = await client.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'user', content: [ { type: 'image_url', image_url: { url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg', }, }, { type: 'text', text: 'Tóm tắt chủ đề của hình ảnh này trong một câu' }, ], }, ],});
console.log(response.choices[0].message.content);Phân tích biểu đồ và trực quan hóa dữ liệu
Phần tiêu đề “Phân tích biểu đồ và trực quan hóa dữ liệu”Tải lên ảnh chụp màn hình biểu đồ và yêu cầu mô hình đọc dữ liệu và phân tích:
Python (định dạng Claude, Base64):
import base64import osfrom anthropic import Anthropic
client = Anthropic( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai",)
with open("chart.png", "rb") as f: image_data = base64.b64encode(f.read()).decode("utf-8")
message = client.messages.create( model="claude-sonnet-4-5", max_tokens=1024, messages=[ { "role": "user", "content": [ { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": image_data, }, }, { "type": "text", "text": "Biểu đồ này cho thấy xu hướng gì? Vui lòng trích xuất các điểm dữ liệu chính và cung cấp phân tích.", }, ], } ],)
print(message.content[0].text)Trích xuất văn bản OCR
Phần tiêu đề “Trích xuất văn bản OCR”Trích xuất nội dung văn bản từ ảnh chụp màn hình hoặc ảnh:
curl (định dạng OpenAI, độ phân giải cao):
curl https://api.routeapi.ai/v1/chat/completions \ -H "Authorization: Bearer $ROUTEAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [ { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": "https://example.com/document.jpg", "detail": "high" } }, { "type": "text", "text": "Trích xuất tất cả văn bản trong hình ảnh, duy trì định dạng và cấu trúc gốc" } ] } ] }'Đối với các tình huống OCR, sử dụng "detail": "high" để đảm bảo độ chính xác nhận diện, đặc biệt là cho chữ nhỏ hoặc văn bản dày đặc.
Phân tích so sánh nhiều hình ảnh
Phần tiêu đề “Phân tích so sánh nhiều hình ảnh”So sánh sự khác biệt giữa hai hoặc nhiều hình ảnh:
Python (định dạng OpenAI, nhiều hình ảnh):
from openai import OpenAIimport os
client = OpenAI( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai/v1",)
response = client.chat.completions.create( model="gpt-5.5", messages=[ { "role": "user", "content": [ { "type": "text", "text": "So sánh hai hình ảnh sau và tìm 5 điểm khác biệt chính giữa chúng:", }, { "type": "image_url", "image_url": {"url": "https://example.com/before.jpg"}, }, { "type": "image_url", "image_url": {"url": "https://example.com/after.jpg"}, }, ], } ],)
print(response.choices[0].message.content)Cuộc trò chuyện kết hợp hình ảnh-văn bản
Phần tiêu đề “Cuộc trò chuyện kết hợp hình ảnh-văn bản”Kết hợp hình ảnh và văn bản trong các cuộc trò chuyện nhiều lượt:
from openai import OpenAIimport os
client = OpenAI( api_key=os.environ["ROUTEAPI_KEY"], base_url="https://api.routeapi.ai/v1",)
messages = [ { "role": "user", "content": [ { "type": "image_url", "image_url": {"url": "https://example.com/product.jpg"}, }, {"type": "text", "text": "Các đặc điểm chính của sản phẩm này là gì?"}, ], }]
response = client.chat.completions.create(model="gpt-4o", messages=messages)messages.append(response.choices[0].message)print("Lượt đầu tiên:", response.choices[0].message.content)
# Tiếp tục đặt câu hỏi (văn bản thuần)messages.append({"role": "user", "content": "Nó phù hợp với loại người dùng nào?"})response = client.chat.completions.create(model="gpt-4o", messages=messages)print("Lượt thứ hai:", response.choices[0].message.content)Hình ảnh chỉ cần được truyền một lần trong lượt đầu tiên; trong các lượt tiếp theo, mô hình sẽ nhớ nội dung hình ảnh (trong cửa sổ ngữ cảnh) mà không cần tải lại.
10. Các thực hành tốt nhất
Phần tiêu đề “10. Các thực hành tốt nhất”Tối ưu hóa hình ảnh
Phần tiêu đề “Tối ưu hóa hình ảnh”Thực hiện tối ưu hóa cần thiết trước khi tải lên hình ảnh để giảm chi phí và cải thiện tốc độ phản hồi:
| Tối ưu hóa | Khuyến nghị |
|---|---|
| Kích thước | Giữ cạnh dài trong vòng 2048px trừ khi thực sự cần nhận diện nhiều chi tiết hơn |
| Định dạng | Sử dụng PNG cho ảnh chụp màn hình và biểu đồ, JPEG cho ảnh, WebP cho nén tối đa |
| Nén | Chất lượng JPEG 80-90% là đủ, sự khác biệt trực quan tối thiểu nhưng kích thước giảm đáng kể |
| Cắt xén | Loại bỏ các vùng không liên quan (khoảng trắng lớn, hình mờ, viền), chỉ giữ nội dung chính |
Đừng nén hình ảnh đến mức không thể nhận diện để tiết kiệm token; nếu mô hình không thể nhận diện, thực ra là lãng phí.
Cân nhắc chi phí
Phần tiêu đề “Cân nhắc chi phí”Chi phí đầu vào đa phương thức chủ yếu đến từ hình ảnh:
| Tình huống | Tiêu thụ token điển hình | Ước tính chi phí (GPT-4o) |
|---|---|---|
Hình ảnh độ phân giải thấp (detail: "low") | ~85 token | $0.0001 |
Hình ảnh nhỏ độ phân giải cao (500×500, detail: "high") | ~200 token | $0.0003 |
Hình ảnh lớn độ phân giải cao (2000×2000, detail: "high") | ~800 token | $0.0012 |
Nhiều hình ảnh độ phân giải cao (5 hình ảnh, detail: "high") | ~4000 token | $0.006 |
Tỷ giá cụ thể phụ thuộc vào mô hình đã chọn; trên đây chỉ là ví dụ. Khuyến nghị cho production:
- Mặc định sử dụng
detail: "auto"hoặc"low", để mô hình hoặc nhu cầu người dùng xác định độ phân giải. - Chỉ sử dụng
"high"khi rõ ràng cần nhận diện chi tiết (OCR, dữ liệu biểu đồ, phát hiện đối tượng nhỏ). - Ghi lại mức sử dụng token cho mỗi yêu cầu (trường
usagecủa phản hồi) để xác định các bất thường về chi phí.
Xử lý lỗi
Phần tiêu đề “Xử lý lỗi”Đầu vào đa phương thức đưa ra các điểm thất bại bổ sung cần xử lý có mục tiêu:
Định dạng hình ảnh không được hỗ trợ
Phần tiêu đề “Định dạng hình ảnh không được hỗ trợ”{ "error": { "message": "Unsupported image format", "type": "invalid_request_error" }}Giải pháp: Xác nhận loại MIME đúng hoặc chuyển đổi sang PNG/JPEG.
Hình ảnh quá lớn
Phần tiêu đề “Hình ảnh quá lớn”{ "error": { "message": "Image size exceeds limit", "type": "invalid_request_error" }}Giải pháp: Nén hình ảnh hoặc giảm độ phân giải và thử lại.
URL không thể truy cập
Phần tiêu đề “URL không thể truy cập”{ "error": { "message": "Failed to fetch image from URL", "type": "invalid_request_error" }}Giải pháp:
- Xác nhận URL có thể truy cập công khai không cần xác thực.
- Kiểm tra xem IP của dịch vụ upstream có thể truy cập URL đó không (tường lửa, hạn chế địa lý).
- Chuyển sang phương pháp Base64 để tránh phụ thuộc vào dịch vụ bên ngoài.
Giải mã Base64 thất bại
Phần tiêu đề “Giải mã Base64 thất bại”{ "error": { "message": "Invalid base64 encoding", "type": "invalid_request_error" }}Giải pháp: Kiểm tra xem mã hóa Base64 có đầy đủ và định dạng có đúng không (định dạng OpenAI cần tiền tố data:, định dạng Claude không cần).
Bảo mật
Phần tiêu đề “Bảo mật”| Rủi ro | Biện pháp bảo vệ |
|---|---|
| Rò rỉ URL hình ảnh | Đảm bảo URL trỏ đến hình ảnh không chứa thông tin nhạy cảm hoặc sử dụng liên kết tạm thời được xác thực |
| Tấn công kích thước Base64 | Giới hạn giới hạn kích thước tải lên hình ảnh của người dùng (ví dụ: 20 MB) để ngăn chặn yêu cầu quá lớn |
| Tấn công injection | Không nối trực tiếp URL hình ảnh do người dùng tải lên vào lệnh hệ thống hoặc SQL |
| Ảo giác mô hình | Kết quả hiểu hình ảnh có thể không chính xác; các tình huống rủi ro cao (y tế, pháp lý, tài chính) cần xem xét của con người |
Lưu ý về khả năng tương thích
Phần tiêu đề “Lưu ý về khả năng tương thích”- Khả năng thị giác, định dạng hình ảnh được hỗ trợ và số lượng hình ảnh tối đa phụ thuộc vào mô hình đã chọn; kiểm tra và xác minh trước khi production.
- Tham số
detailchỉ có ý nghĩa trong định dạng OpenAI; định dạng Claude không có tham số tương ứng. - Các mô hình khác nhau có chiến lược xử lý độ phân giải khác nhau; cùng một hình ảnh có thể tiêu thụ token rất khác nhau trên các mô hình khác nhau.
- Trong phản hồi streaming, kết quả xử lý nội dung hình ảnh thường được trả về một lần sớm hoặc muộn trong luồng, không phải streaming từng ký tự.
- Ghi lại request ID, model ID, mã trạng thái và mức sử dụng token cho mỗi yêu cầu để dễ dàng khắc phục sự cố về chi phí và chất lượng. Xem Lỗi và gỡ lỗi để biết chi tiết.