Thiết lập API GPT-Image-1
Mô hình ảnh GPT mới được bảo vệ, nghĩa là cần thêm các bước xác minh để có thể sử dụng. Phần này sẽ hướng dẫn cách thiết lập API. Nếu bạn đã có khóa API, có thể bỏ qua bước đầu tiên.
Bước 1: Tạo khóa API
Bước đầu tiên là tạo khóa API. Ta có thể tạo bằng cách đăng nhập vào nền tảng của họ và đi đến trang API keys. Sau đó, nhấp nút "Create new secret key".
Sau khi tạo khóa, hãy tạo tệp tên .env và sao chép khóa theo định dạng sau:
OPENAI_API_KEY=<paste_your_api_key_here>
Bước 2: Xác minh tổ chức của bạn
Điểm khác biệt lớn với các mô hình OpenAI khác là dùng API ảnh GPT yêu cầu xác minh tổ chức. Lý do là GPT-Image-1 có thể tạo ảnh chân thực và chi tiết, làm dấy lên lo ngại về khả năng lạm dụng như tạo deepfake hoặc nội dung không phù hợp. Bằng cách xác minh tổ chức, OpenAI có thể giám sát việc sử dụng và thực thi chính sách an toàn tốt hơn.
Bạn có thể xác minh tổ chức ngay cả khi không có công ty. Tuy nhiên, lưu ý quy trình này yêu cầu cung cấp giấy tờ tùy thân do chính phủ cấp và hoàn tất xác minh khuôn mặt.
Để thực hiện xác minh, hãy truy cập tab general trong nền tảng OpenAI API và nhấp nút trong phần "Verifications".
Quy trình do bên thứ ba thực hiện, gồm:
- Tải lên ảnh của giấy tờ định danh.
- Dùng camera trên thiết bị di động để xác minh danh tính khớp với giấy tờ đã cung cấp.
Quy trình chỉ mất vài phút để hoàn tất và khoảng 15 phút để xử lý.
Thiết lập Python
Trong bài hướng dẫn này, chúng ta sẽ cài các gói Python sau:
openai: Gói chính thức của OpenAI cho phép tương tác với API của họ.dotenv: Gói Python giúp tải an toàn khóa API từ tệp.envmà ta đã tạo ở trên.
Ta có thể cài đặt bằng lệnh:
pip install openai dotenv
Tạo ảnh đầu tiên với GPT-Image-1
Hãy xem cách tạo một ảnh với gpt-image-1. Tạo một tệp Python mới, ví dụ generate_image.py, trong cùng thư mục với tệp .env.
Sau đó, import các gói cần thiết:
# Import the packages
from openai import OpenAI
from dotenv import load_dotenv
import os
import base64
import time
Lưu ý os và base64 là gói tích hợp sẵn của Python, không cần cài đặt.
Tiếp theo, ta tải khóa API và khởi tạo client OpenAI:
# Load the API key
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# Initialize the OpenAI client
client = OpenAI(api_key=api_key)
Sau đó, yêu cầu người dùng nhập prompt văn bản bằng hàm tích hợp input() và gửi yêu cầu tạo ảnh tới API:
# Ask the user to input a prompt in the terminal
print("What do you want to generate?")
prompt = input("> ")
print("Generating image...")
# Send the prompt to the API
img = client.images.generate(
model="gpt-image-1",
prompt=prompt,
background="auto",
n=1,
quality="high",
size="1024x1024",
output_format="png",
moderation="auto",
)
Cuối cùng, lưu ảnh đã tạo vào tệp:
# Save the image into a file
image_bytes = base64.b64decode(img.data[0].b64_json)
with open(f"output_{int(time.time())}.png", "wb") as f:
f.write(image_bytes)
Bạn có thể xem toàn bộ script tại đây. Để chạy script, dùng lệnh:
python generate_image.py
Ví dụ kèm đầu ra như sau:

Các tham số của GPT-Image-1
Phần này mô tả các tham số quan trọng nhất của mô hình gpt-image-1:
prompt: Hướng dẫn bằng văn bản mô tả hình ảnh bạn muốn mô hình tạo.background: Loại nền cho ảnh. Phải là một trong"transparent","opaque"hoặc"auto". Mặc định là"auto", mô hình sẽ quyết định loại nền phù hợp dựa trên nội dung. Lưu ý ảnh JPEG không hỗ trợ nền trong suốt.n: Số lượng ảnh cần tạo. Phải từ 1 đến 10.quality: Chất lượng ảnh tạo ra. Phải là một trong"high","medium"hoặc"low", mặc định là"high".size: Kích thước ảnh tính theo pixel. Phải là một trong"1024x1024"(vuông),"1536x1024"(ngang),"1024x1536"(dọc).output_format: Định dạng ảnh. Phải là một trong"png","jpeg"hoặc"webp". Mặc định là"png".moderation: Mức kiểm duyệt nội dung. Hoặc"low"cho bộ lọc ít hạn chế hơn, hoặc"auto"(mặc định).
Chúng ta đã điểm qua các tham số quan trọng nhất của gpt-image-1. Để biết thêm chi tiết và danh sách đầy đủ tham số, hãy xem tài liệu API chính thức.
Tác động của tham số quality
Dưới đây là so sánh song song các ảnh tạo từ cùng một prompt với chất lượng khác nhau:

Ta thấy chú mèo đầu tiên (chất lượng thấp nhất) có một số lỗi quanh mắt, và ảnh trở nên chân thực hơn rõ rệt khi chất lượng tăng lên.
Đây là một ví dụ khác với phong cách hoạt hình:

Trong trường hợp này, chất lượng cao hơn cũng cho ảnh trau chuốt hơn. Tuy nhiên, theo tôi, điều này ít quan trọng hơn với nội dung không nhằm tái hiện hiện thực.
Hãy nhớ rằng chất lượng càng cao, chi phí và thời gian tính toán càng tăng, nên bạn nên tìm điểm cân bằng phù hợp tùy tình huống sử dụng. Tôi khuyên thử các tham số từ thấp đến cao để tìm giá trị tối thiểu cho kết quả chấp nhận được với từng trường hợp.
Tham số background
Trong các thử nghiệm của tôi, mô hình phần lớn bỏ qua tham số này. Dưới đây là các ví dụ cạnh nhau khi tôi thay đổi tham số background và hướng dẫn về độ trong suốt trong prompt:

Ở ví dụ đầu, tham số độ trong suốt bị bỏ qua. Ở ví dụ thứ hai, tôi thêm hướng dẫn về độ trong suốt vào prompt và kết quả khá hơn chút. Ở ví dụ cuối, tôi yêu cầu nền đục nhưng lại chỉ định muốn một nhãn dán trong prompt và nhận về nền trong suốt.
Tôi vẫn khuyên đặt tham số phù hợp với mong muốn, nhưng cũng hãy nêu rõ kết quả mong muốn trong prompt để củng cố.
Chỉnh sửa hình ảnh với GPT-Image-1
Như đã nói ở phần mở đầu, phần thú vị nhất của GPT-Image-1 là khả năng chỉnh sửa ảnh. Hãy bắt đầu bằng cách học cách yêu cầu nó chỉnh sửa và sau đó khám phá một vài trường hợp sử dụng.
Để chỉnh sửa ảnh, phần lớn mã có thể tái sử dụng. Điểm khác là thay vì dùng hàm client.images.generate(), ta dùng hàm client.images.edit().
Ví dụ như sau:
img = client.images.edit(
model="gpt-image-1",
image=[
open("my-image.jpg", "rb"),
],
prompt=prompt,
n=1,
quality="high",
size="1024x1536",
)
Tham số mới là image. Đây là danh sách các ảnh đầu vào để chỉnh sửa. Ở đây, ta chỉ cung cấp một ảnh tên my-image.jpg nằm cùng thư mục với script.
Ví dụ chỉnh sửa một bức ảnh của tôi bằng GPT-Image-1:

Lưu ý vì ảnh gốc có tỷ lệ dọc, tôi dùng kích thước dọc 1024x1536. Tuy nhiên, đây không phải cùng tỷ lệ với ảnh gốc. Ngay cả ở chế độ chỉnh sửa, mô hình chỉ có thể xuất ảnh ở ba kích thước đã nêu ở trên.
Toàn bộ script chỉnh sửa có tại đây.
Sử dụng mask
Chế độ chỉnh sửa cung cấp tham số mask để chỉ định các vùng cần chỉnh sửa. Mask phải là ảnh PNG tối đa 4 MB và cùng kích thước với ảnh. Các vùng có độ trong suốt 100% là vùng GPT-Image-1 được phép chỉnh sửa.
Ta cung cấp mask tương tự như ảnh, ngoại trừ việc không dùng danh sách trong trường hợp này:
img = client.images.edit(
model="gpt-image-1",
image=[
open(sys.argv[1], "rb"),
],
# We provide the mask like this
mask=open("mask.png", "rb"),
prompt=prompt,
n=1,
quality="high",
size="1536x1024",
)
Tuy nhiên, khi tôi thử nghiệm, nó không hoạt động tốt, và tôi thấy có nhiều báo cáo trực tuyến gặp vấn đề tương tự.
Ví dụ như sau:

Tôi cũng thử dùng để thêm yếu tố tại vị trí cụ thể, nhưng kết quả không ổn định. Tương tự tham số background khi tạo ảnh, tôi thấy mô tả rõ mong muốn trong prompt cho kết quả tốt nhất.
Sử dụng nhiều ảnh
Mô hình có thể xử lý và kết hợp nhiều ảnh cùng lúc. Ở ví dụ dưới, ta dùng nó để tạo poster marketing kết hợp ảnh của ba loại đồ uống riêng lẻ này:

Ta cung cấp ba ảnh dưới dạng danh sách trong tham số image, như sau:
prompt = """
Create a vibrant and eye-catching marketing poster to
promote the cold drinks offerings at our coffee shop.
"""
img = client.images.edit(
model="gpt-image-1",
# We can provide multiple images at once
image=[
open("latte.png", "rb"),
open("americano.png", "rb"),
open("icetea.png", "rb"),
],
prompt=prompt,
size="1536x1024",
)
Và đây là kết quả:

Giá của GPT-Image-1
Chi phí tạo ảnh được tính dựa trên:
- Số token trong prompt văn bản.
- Số token trong các ảnh đầu vào.
- Số token trong ảnh đầu ra.

Đôi khi khó hình dung các chi phí này vì ta không biết một ảnh gồm bao nhiêu token.
Do kích thước ảnh đầu ra đã biết, ta cũng biết số token cần thiết cho mỗi kích thước, nên có thể đưa ra giá trị chính xác cho giá token ảnh đầu ra (phần đắt nhất):

Mức giá này phụ thuộc vào chất lượng và kích thước ảnh. Xem chi tiết tại trang giá GPT-Image-1.
Khi ta tạo ảnh, API sẽ trả về số token đã dùng, vì vậy có thể kết hợp với thông tin trên để biết chính xác chi phí.
Ta có thể hiển thị số token dùng bằng cách in trường usage của kết quả:
img = client.images.generate(
model="gpt-image-1",
prompt=prompt,
background="transparent",
n=1,
quality="medium",
size="1024x1024",
moderation="auto",
output_format="png",
)
# Add this to see the usage
print("Prompt tokens:", img.usage.input_tokens_details.text_tokens)
print("Input images tokens:", img.usage.input_tokens_details.image_tokens)
print("Output image tokens:", img.usage.output_tokens)
Đầu ra:
Prompt tokens: 8
Input images tokens: 0
Output image tokens: 272
Kết luận
Bất chấp một vài điểm hạn chế của API, như mask và độ trong suốt còn chưa đủ ổn định, mô hình có thể thực thi chính xác cao các hướng dẫn trong prompt.
Tôi nghĩ mô hình này mở ra rất nhiều khả năng để xây dựng ứng dụng. Trong bài này, ta đã học những điều cơ bản để sử dụng. Dưới đây là vài ý tưởng bạn có thể khám phá thêm dựa trên những gì đã học:
- Tối ưu quy trình chuyển ảnh chụp đồ ăn bằng điện thoại thành ảnh ẩm thực đẹp mắt để nhà hàng dùng trong thực đơn.
- Dựa trên ảnh bạn bè hoặc selfie, tạo bộ sticker thể hiện nhiều cảm xúc để dùng trong các ứng dụng chat.
- Tạo công cụ, dựa trên mô tả các cảnh riêng lẻ, ghép thành một dải truyện tranh từ các cảnh đó.

Vài tuần trước, ChatGPT lan truyền mạnh mẽ nhờ mô hình tạo ảnh mới. Đây là mô hình tốt nhất mà tôi từng thấy. Khả năng chỉnh sửa hình ảnh của nó tạo nên khác biệt: độ chính xác rất cao, giúp hiện thực hóa ý tưởng cực kỳ dễ dàng. Các mô hình khác cũng làm được, nhưng không đạt mức độ chính xác tương tự.
Tạo ảnh trong giao diện của họ rất dễ, vì ta chỉ cần cung cấp prompt văn bản. Tuy nhiên, với tư cách lập trình viên, tôi nóng lòng chờ nó có mặt trên API để có thể tương tác bằng lập trình. Ngày đó cuối cùng đã đến, và tôi viết bài này để hướng dẫn bạn sử dụng bằng Python.
Nếu bạn chỉ quan tâm đến cách dùng trong giao diện chat, trước đây tôi đã viết hướng dẫn tạo ảnh bằng GPT-4o với tám ví dụ thực tiễn. Bạn cũng có thể xem bài viết cập nhật của chúng tôi về ChatGPT Images mới, sử dụng mô hình GPT-Image-1.5.