Chuyển đến nội dung chính

Tầm nhìn tác vụ (Agentic Vision) trong Gemini 3: Hướng dẫn thực hành

Tìm hiểu cách dùng agentic vision trong Gemini 3 Flash với Python. Bốn ví dụ cho thấy vòng lặp Think, Act, Observe cắt, chú thích và trích xuất dữ liệu từ ảnh như thế nào.
· 11 phút đọc

Khám phá cùng AI

Bạn gửi một hình ảnh tới API thị giác để nhờ đọc một nhãn giá nhỏ. Kết quả trả về tự tin nhưng sai. Tình huống tương tự khi đếm vật thể trong một bức ảnh lộn xộn: mô hình liếc qua toàn bộ ảnh một lần và đoán ra một con số lệch hẳn.

Gemini 3 Flash xử lý theo cách khác. Khi bật thực thi mã, nó có thể viết và chạy Python ngay giữa phản hồi để cắt, phóng to và chú thích ảnh trước khi đưa ra câu trả lời. Google gọi đây là agentic vision và báo cáo mức cải thiện chất lượng 5–10% trên các thước đo thị giác.

Hướng dẫn này đi qua bốn ví dụ với độ khó tăng dần: đọc chữ nhỏ trên kệ hàng tạp hóa, lấy tên đồ uống từ thực đơn quán bar thiếu sáng, đếm đồng xu rải rác và trích xuất dữ liệu bảng để vẽ biểu đồ.

Agentic Vision là gì? Vòng lặp "Think, Act, Observe"

Ý tưởng khá đơn giản. Khi bật thực thi mã, Gemini 3 có thể dừng giữa phản hồi, viết và chạy Python trong sandbox, xem những gì mã tạo ra và quyết định bước tiếp theo. 

Với các tác vụ thị giác, điều này thường có nghĩa là mô hình đang cắt các vùng của ảnh, phóng to, vẽ khung giới hạn hoặc điều chỉnh độ tương phản để kéo ra các chi tiết không nhìn thấy ở độ phân giải gốc.

Quá trình này diễn ra như một vòng lặp ba giai đoạn.

Trong giai đoạn Think, mô hình xem xét những gì nó có (ảnh gốc, hoặc phiên bản đã cắt hay chú thích) và lập kế hoạch bước kế tiếp. Nó có thể quyết định nhãn giá quá nhỏ để đọc và cần được cắt ra rồi phóng to.

Act biến kế hoạch đó thành Python. Sandbox có sẵn 43 thư viện (PIL, OpenCV, matplotlib, và nhiều hơn nữa), nên mô hình có thể viết bất kỳ mã xử lý ảnh cần thiết nào.

Sau khi mã chạy, Observe khép vòng lặp. Đầu ra (ảnh mới, văn bản in ra, giá trị tính toán) quay lại làm ngữ cảnh. Từ đó, mô hình hoặc trả lời hoặc lặp lại vòng nữa.

Một lần gọi API có thể lặp vòng này nhiều lần. Ở các ví dụ phía trước, bạn sẽ thấy nó cắt bảy vùng trên kệ chỉ trong một yêu cầu. Ở ví dụ khác, nó trích xuất dữ liệu bảng vào pandas DataFrame và tạo biểu đồ cột, tất cả trong một lần gọi. 

Nếu khái niệm vòng lặp agentic còn mới với bạn, lộ trình AI Agent Fundamentals của DataCamp có phần trình bày chi tiết.

Hạn chế và giới hạn

  • Thực thi mã và gọi hàm tùy chỉnh không thể dùng trong cùng một yêu cầu.
  • Tài liệu của Google cảnh báo rằng thực thi mã có thể làm giảm hiệu năng trên các tác vụ phi thị giác. Chỉ bật khi tác vụ hưởng lợi từ thao tác ảnh.
  • Phân đoạn ở mức điểm ảnh (mặt nạ, đường biên) không thuộc agentic vision và vẫn ở Gemini 2.5.
  • Đôi khi mô hình bỏ qua thực thi mã nếu một lần nhìn là đủ. Theo thiết kế, không phải lỗi.

Thiết lập môi trường cho Agentic Vision

Lấy khóa API từ ai.google.dev và lưu dưới tên GOOGLE_API_KEY trong môi trường của bạn hoặc tệp .env. Sau đó cài SDK và các thư viện ảnh:

pip install google-genai python-dotenv Pillow matplotlib opencv-python

Bắt đầu bằng cách tạo client:

from google import genai
from google.genai import types
from dotenv import load_dotenv
 
load_dotenv()
 
client = genai.Client(
    http_options=types.HttpOptions(timeout=600_000)
)
MODEL = "gemini-3-flash-preview"

Tham số timeout=600_000 rất quan trọng. Các cuộc gọi agentic vision gồm nhiều vòng sinh mã và thực thi trong sandbox, và một yêu cầu có thể mất khoảng bốn phút. 

Thời gian chờ mặc định của httpx sẽ ngắt kết nối từ lâu trước đó, để lại một ReadTimeout im lặng và bạn không biết chuyện gì đã xảy ra.

Tiếp theo, thiết lập cấu hình agentic:

agentic_config = types.GenerateContentConfig(
    tools=[types.Tool(code_execution=types.ToolCodeExecution())],
	thinking_config=types.ThinkingConfig(
    	thinking_level="HIGH",
    	include_thoughts=True
	),
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_HIGH,
)

tools là công tắc bật thực thi mã. Nó cung cấp cho mô hình một môi trường Python sandbox với 43 thư viện (numpy, pandas, PIL, matplotlib, OpenCV và nhiều hơn nữa). Mỗi khối mã có 30 giây để chạy và sandbox sẽ thử lại tối đa 5 lần khi gặp lỗi.

thinking_level="HIGH" cho mô hình thêm không gian để lập kế hoạch trước khi viết mã. Với công việc thị giác nhiều bước, điều này tạo khác biệt rõ rệt. Thiết lập include_thoughts=True sẽ hiển thị phần suy luận trong các phần phản hồi, hữu ích để gỡ lỗi.

media_resolution đặt số token ảnh đầu vào nhận được trước khi vòng lặp bắt đầu. MEDIA_RESOLUTION_HIGH là mặc định tốt. Bạn có thể đẩy lên MEDIA_RESOLUTION_ULTRA_HIGH cho ảnh rất dày đặc hoặc giảm xuống MEDIA_RESOLUTION_LOW khi tốc độ quan trọng hơn chi tiết.

Thiết lập tương tự hoạt động trên Vertex AI với thay đổi tối thiểu. Để có hướng dẫn tổng quan hơn về Gemini 3 API ngoài mảng thị giác, xem bài hướng dẫn đi kèm.

Agentic Vision trong Gemini 3: Đọc chi tiết nhỏ bằng cắt và phóng to

Ảnh dưới đây là kệ hàng tạp hóa ở Đức với ba hàng sản phẩm. Nhãn giá nằm dọc mép mỗi kệ, và một thông báo "Liebe Kunden" (Kính gửi quý khách) ở gần đáy. Nếu tự phóng to, bạn có thể đọc được, nhưng chúng đủ nhỏ để khi nhìn toàn ảnh, mô hình phải quyết định phần nào đọc được và phần nào không.

Phân tích phản hồi nhiều phần

Phản hồi agentic không phải là một khối văn bản đơn. Chúng đến dưới dạng danh sách các phần: suy nghĩ, mã mô hình viết, kết quả thực thi, ảnh sinh ra và câu trả lời cuối. Trình trợ giúp này đi qua chúng:

def print_response(response, show_thoughts=False):
	for part in response.candidates[0].content.parts:
    	if part.thought and show_thoughts:
        	print("[THINK]", part.text[:500])
    	elif part.executable_code:
        	print("[CODE]")
        	print(part.executable_code.code)
    	elif part.code_execution_result:
        	print(f"[RESULT] ({part.code_execution_result.outcome})")
            print(part.code_execution_result.output)
    	elif part.inline_data:
        	print(f"[IMAGE] {part.inline_data.mime_type}, "
                  f"{len(part.inline_data.data):,} bytes")
    	elif part.text:
        	print("[ANSWER]", part.text)

Mọi ví dụ trong hướng dẫn này đều dùng cùng hàm, nên hãy định nghĩa một lần và tái sử dụng.

Giờ hãy nạp ảnh kệ hàng và viết prompt yêu cầu mô hình đọc biển báo và liệt kê mọi sản phẩm với giá của chúng.

from pathlib import Path
 
image_path = Path("images/grocery_shelf.jpg")
image_part = types.Part.from_bytes(
	data=image_path.read_bytes(), mime_type="image/jpeg"
)
 
prompt = (
	"Read the 'Liebe Kunden' sign at the bottom of the shelf. "
	"What does it say? Also list all visible product names "
	"and their prices from the shelf labels."
)

Chạy thử trước khi bật thực thi mã:

standard_config = types.GenerateContentConfig(
    media_resolution=types.MediaResolution.MEDIA_RESOLUTION_HIGH,
)
 
standard_response = client.models.generate_content(
	model=MODEL,
	contents=[image_part, prompt],
	config=standard_config,
)
print_response(standard_response)

Đây là phiên bản rút gọn của đầu ra:

[ANSWER] Based on the image provided, here is the information requested:
 
### The 'Liebe Kunden' Sign
> "Dear Customers, unfortunately, we must inform you that due to
> increased demand, we cannot currently offer all products..."
 
### Product Names and Prices (from shelf labels)
 
**Top Row Labels:**
*   Uncle Ben's Express Reis Mexi-Scharf 250g: 1,69
*   Uncle Ben's Express Reis Griechisch 250g: 1,69
*   Uncle Ben's Express Reis Curry 250g: 1,69
*   Channa Masala 300g (partially obscured): 2,49
*   (Label obscured): 2,49
*   (Label obscured): 1,29
*   (Label obscured): 0,99
...
 
**Second Row Labels:**
*   Uncle Ben's Express Reis Chili con Carne 250g: 2,49
*   Uncle Ben's Spitzen-Langkorn Reis 10 Min 500g: 1,79
*   (Label obscured): 2,99
*   (Label obscured): 2,79
...

Bản dịch biển báo là chính xác, và mô hình đọc được các nhãn Uncle Ben's mà nó nhận ra. Nhưng khoảng một phần ba mục là "(Label obscured)" và các thương hiệu như Oryza, Reis-fit và Reiskugeln hoàn toàn không xuất hiện.

Giờ dùng cùng prompt nhưng với cấu hình agentic:

agentic_response = client.models.generate_content(
	model=MODEL,
	contents=[image_part, prompt],
	config=agentic_config,
)
print_response(agentic_response, show_thoughts=True)

Cấu trúc đầu ra khác hẳn. Thay vì một [ANSWER] duy nhất, nó đi qua toàn bộ vòng Think/Act/Observe:

[THINK] Okay, so the primary goal here is twofold: First, I need to
decipher that "Liebe Kunden" sign down there. Then, I need to build a
comprehensive list of what's on this shelf...
 
[CODE]
import PIL.Image
 
img = PIL.Image.open('input_file_0.jpeg')
width, height = img.size
 
crops = [
	{'box_2d': [630, 447, 887, 559], 'label': 'liebe_kunden_sign'},
	{'box_2d': [80, 40, 240, 560], 'label': 'shelf1_left'},
	{'box_2d': [190, 550, 310, 980], 'label': 'shelf1_right'},
	{'box_2d': [400, 0, 480, 450], 'label': 'shelf2_left'},
	{'box_2d': [410, 450, 480, 1000], 'label': 'shelf2_right'},
	{'box_2d': [630, 130, 760, 460], 'label': 'shelf3_left'},
	{'box_2d': [550, 600, 660, 990], 'label': 'shelf3_right'},
]
# ... crops and saves each region
 
[IMAGE] image/png, 135,953 bytes
[IMAGE] image/png, 90,395 bytes
[IMAGE] image/png, 125,816 bytes
[IMAGE] image/png, 102,288 bytes
[IMAGE] image/png, 173,606 bytes
[IMAGE] image/png, 283,263 bytes
[IMAGE] image/png, 100,522 bytes

Bảy vùng cắt mà mô hình tạo ra:

Title: Gemini 3 agentic vision crop of Liebe Kunden customer notice on grocery shelf - Description: Gemini 3 agentic vision crop of Liebe Kunden customer notice on grocery shelf

Title: Agentic vision crop of top shelf left section showing Uncle Ben's rice products - Description: Agentic vision crop of top shelf left section showing Uncle Ben's rice products

Title: Agentic vision crop of top shelf right section showing Reiskugeln and curry products - Description: Agentic vision crop of top shelf right section showing Reiskugeln and curry products

Title: Agentic vision crop of middle shelf left section with rice products and price labels - Description: Agentic vision crop of middle shelf left section with rice products and price labels

Title: Agentic vision crop of middle shelf right section showing Oryza rice products - Description: Agentic vision crop of middle shelf right section showing Oryza rice products

Title: Agentic vision crop of bottom shelf left section with Uncle Ben's 1kg bags - Description: Agentic vision crop of bottom shelf left section with Uncle Ben's 1kg bags

Title: Agentic vision crop of bottom shelf right section showing Reis-fit products - Description: Agentic vision crop of bottom shelf right section showing Reis-fit products

Sau khi quan sát các vùng cắt đó, mô hình đưa ra câu trả lời đầy đủ:

[ANSWER]
**Top Shelf (Left to Right):**
*   Uncle Ben's Express Reis Mexi. Scharf 250g: 1,69 €
*   Channa Masala 285g: 2,49 €
*   Madras Curry 285g: 2,49 €
*   Steam Basmati Reis Kochbeutel 250g: 1,99 €
*   Reiskugeln Pur 4x2 St: 1,99 €
...
 
**Middle Shelf (Left to Right):**
*   Uncle Ben's Express Reis Chili con Carne 250g: 2,49 €
*   Oryza Langkorn & Wildreis 500g Kochbeutel: 2,99 €
*   Oryza Basmati & Wildreis 500g Kochbeutel: 2,79 €
*   Oryza Jasmin Reis 500g Kochbeutel: 2,79 €
...
 
**Bottom Shelf (Left to Right):**
*   Uncle Ben's Natur Reis 10-Min. Kochbeutel 1kg: 3,69 €
*   Reis-fit 10 Minuten Natur-Reis 500g: 1,89 €
*   Reis-fit Langkorn & Wildreis 500g: 1,89 €
...

Đầu ra đầy đủ chưa rút gọn cho cả hai lần gọi có trong gist này.

Phản hồi agentic đọc được hơn 30 sản phẩm trên cả ba kệ. Những mặt hàng Oryza, Reis-fit, Madras Curry, Reiskugeln và Steam Basmati mà thị giác tiêu chuẩn gắn nhãn "(obscured)" đều xuất hiện với tên và giá.

Sự khác biệt không nằm ở chuyện hoang tưởng so với chính xác; thị giác tiêu chuẩn trung thực về những gì nó không đọc được. Agentic vision đơn giản là không chấp nhận giới hạn đó và phóng to cho đến khi đọc được.

Prompt cũng đóng vai trò ở đây. Yêu cầu mô hình "liệt kê tất cả tên sản phẩm nhìn thấy và giá của chúng" đặt ra một ngưỡng đầy đủ, thúc đẩy nó tiến tới cắt ảnh.

Một prompt mơ hồ như "mô tả bức ảnh này" có khả năng sẽ tạo ra câu trả lời một lượt ngay cả khi đã bật thực thi mã, vì mô hình không thấy lý do để đi xa hơn.

Đọc xuyên qua môi trường thiếu sáng và vật cản

Ảnh này là thực đơn quán bar ở Brazil chụp trong điều kiện ánh sáng yếu. Ba tấm kính liệt kê đồ uống bằng chữ vàng, nhưng đèn thả che khuất một phần bảng bên trái, bảng bên phải hầu như khuất ở mép khung hình và phản chiếu trên kính loang khắp bề mặt.

Prompt không nhắc đến độ sáng, cắt ảnh hay kỹ thuật cụ thể nào. Nó chỉ yêu cầu nội dung:

image_path = Path("images/bar_menu.jpg")
image_part = types.Part.from_bytes(
	data=image_path.read_bytes(), mime_type="image/jpeg"
)
 
prompt = (
	"Read every drink listed on this menu board, including the ones "
	"partially hidden behind the lamps and on the side panels. For "
	"each drink, give me the name and beer style."
)

Thị giác tiêu chuẩn đọc được bảng ở giữa sáng rõ mà không gặp khó, lấy ra tám loại bia từ mục "FRUTADAS" và bốn từ "CHOPP." Nhưng bảng bên trái thì như sau:

[ANSWER]
### Left Panel (Partially visible)
*   **[Unreadable] LAGER** | [Style unreadable]
*   **RED LAGER** | [Style unreadable]
*   **[Unreadable] LAGER** | [Style unreadable]
*   **[Unreadable]GER** | [Style unreadable]
*   **HONKERS ALE** | [Style unreadable]
*   **[Unreadable]SELLE** | [Style unreadable]

Sáu mục, phần lớn tên không đọc được và tất cả đều thiếu kiểu bia. Mô hình thấy có chữ nhưng không phân giải nổi.

Cuộc gọi agentic chạy hai vòng mã. Đầu tiên, nó cắt cả ba bảng:

[CODE]
middle_panel = [200, 320, 950, 780]
left_panel = [200, 0, 950, 260]
right_panel = [200, 840, 700, 1000]
# ... crops and saves each region

image10.png

Sau khi quan sát các vùng cắt đó, mô hình quyết định bảng trái và phải cần phóng to thêm. Nó chạy vòng hai:

[CODE]
left_panel_top = [100, 0, 500, 250]
left_panel_bottom = [500, 0, 980, 250]
right_panel_top = [100, 800, 600, 1000]

image1.png

Với mức phóng to bổ sung đó, mô hình khôi phục được các tên mà thị giác tiêu chuẩn gắn nhãn không đọc được: Amber Lager, Honkers Ale (Goose Island) và Demoiselle (Colorado) từ bảng trái, cùng Wals Dubbel, Tripel, Quadrupel và Petroleum từ bảng phải. Nó cũng nhận diện tiêu đề bảng trái là "MISTURAS" và bảng phải là "ALCOÓLICAS."

Prompt không hề nói "cắt các bảng" hay "phóng vào vùng tối." Nó yêu cầu tên đồ uống và kiểu bia, và mô hình suy ngược từ mục tiêu đó. 

Điểm khác biệt với kệ hàng tạp hóa là lượt thứ hai. Sau vòng cắt đầu tiên, mô hình nhìn lại những gì có, quyết định bảng trái và phải vẫn khó đọc, rồi tự chạy thêm vòng phóng to chặt hơn mà không cần được yêu cầu. 

Vòng lặp tự sửa sai. 

Đó là lợi ích của việc để mở phương pháp: mô hình không chỉ tiền xử lý một lần, mà lặp lại cho đến khi kết quả đạt ngưỡng do prompt đặt ra.

Đếm và chú thích với Agentic Vision trong Gemini 3

Trường hợp thực đơn quán bar hiệu quả vì prompt để mở phương pháp và mô hình tự tìm ra cách làm. Không phải lúc nào cũng vậy. Đôi khi mô hình cần chỉ dẫn rõ ràng về công cụ phải dùng, và ví dụ tiếp theo cho thấy ranh giới đó ở đâu.

Ảnh dưới đây có các đồng xu rải rác trên bàn và một bìa đen. Một số chồng lên nhau, vài cái bị che khuất một phần, và sự pha trộn đồng màu đồng và bạc khiến rất dễ bỏ sót.

image18.png

Một cách tiếp cận hợp lý đầu tiên là yêu cầu mô hình chú thích từng đồng xu để nó có thể đếm từ chính dấu đánh dấu của mình. Tài liệu của Google xác nhận agentic vision có thể vẽ khung giới hạn và nhãn trực tiếp lên ảnh bằng PIL và OpenCV trong sandbox. Vậy nên:

image_path = Path("images/coins.jpg")
image_part = types.Part.from_bytes(
	data=image_path.read_bytes(), mime_type="image/jpeg"
)
 
prompt_v1 = (
	"Count every coin in this image. Draw a bounding box or circle "
	"around each one and number them. Check for overlapping or "
	"partially hidden coins. Give me the final count."
)
 
response_v1 = client.models.generate_content(
	model=MODEL,
	contents=[image_part, prompt_v1],
	config=agentic_config,
)
print_response(response_v1, show_thoughts=True)

Mô hình cắt năm vùng, phân tích từng vùng và trả về tổng số 34. Nhưng hãy xem định dạng câu trả lời:

[ANSWER] Final Count: 34 coins in total.
 
[
  {"box_2d": [387, 175, 451, 236], "label": "1"},
  {"box_2d": [356, 196, 407, 248], "label": "2"},
  {"box_2d": [319, 231, 375, 274], "label": "3"},
  ...
]

Nó trả về tọa độ khung giới hạn dưới dạng JSON thay vì vẽ lên ảnh. Prompt nói "draw" (vẽ), nhưng mô hình hiểu như một tác vụ mô tả và đưa ra văn bản có cấu trúc.

Tài liệu thực thi mã gợi ý lý do: "Trong khi mô hình tự động xử lý việc phóng to cho các chi tiết nhỏ, bạn nên hướng dẫn rõ ràng dùng mã cho các tác vụ khác." Từ "draw" đủ mơ hồ để mô hình chọn con đường chỉ-văn-bản. 

Mô tả tác vụ theo ngôn ngữ mã bạn muốn nó chạy sẽ loại bỏ mơ hồ đó:

prompt_v2 = (
	"Count every coin in this image. Use Python to draw a numbered "
	"bounding box on the image around each coin you find. Check for "
	"overlapping or partially hidden coins. After annotating, give "
	"me the final count."
)
 
response_v2 = client.models.generate_content(
	model=MODEL,
	contents=[image_part, prompt_v2],
	config=agentic_config,
)
print_response(response_v2, show_thoughts=True)

Lần này, mô hình viết mã vẽ thực sự:

[CODE]
import PIL.Image
import PIL.ImageDraw
 
img = PIL.Image.open('input_file_0.jpeg')
width, height = img.size
 
coins = [
	[383, 175, 452, 227], [352, 196, 411, 255], ...  # 34 total
]
 
draw = PIL.ImageDraw.Draw(img)
for i, coin in enumerate(coins):
	ymin, xmin, ymax, xmax = coin
	left, top, right, bottom = (xmin*width/1000, ymin*height/1000,
                                 xmax*width/1000, ymax*height/1000)
	draw.rectangle([left, top, right, bottom], outline='red', width=3)
	draw.text((left, top), str(i + 1), fill='red')
 
[RESULT] (Outcome.OUTCOME_OK)
Total coins detected: 34
 
[IMAGE] image/png, 3,685,043 bytes
 
[ANSWER] I have identified and counted a total of 34 coins.

image13.png

Mỗi đồng xu được vạch khung đỏ và gắn số. Con số thực tế là 35 hoặc 36, tùy cách bạn đánh giá hai đồng chồng nhau gần đáy khung. 

Mô hình cho ra 34, bỏ sót một hoặc hai đồng trong cụm đó. Nhưng chú thích đóng vai trò như sổ tay trực quan: thay vì một con số bạn phải tin, bạn có một hiện vật có thể kiểm chứng, so từng khung một.

Đầu ra đầy đủ chưa rút gọn cho cả hai lần gọi có trong gist này.

Trích xuất nhiều bước và vẽ biểu đồ

Các ví dụ trước liên quan mỗi lần một tác vụ chính (đọc văn bản, đếm vật thể). Lần này xâu chuỗi nhiều tác vụ: cắt một bảng từ ảnh, trích số liệu vào DataFrame và tạo biểu đồ. Ảnh là một bảng thuế kiểu IRS được chụp trên bàn với máy tính tay.

image5.png

Prompt mô tả toàn bộ quy trình trong một mạch:

image_path = Path("images/data_table.jpg")
image_part = types.Part.from_bytes(
	data=image_path.read_bytes(), mime_type="image/jpeg"
)
 
prompt = (
	"Crop and zoom into the table in this image. Extract the first "
	"10 rows of data into a structured format. Identify the column "
	"headers. Then create a bar chart comparing the values in the "
	"numeric columns for those 10 rows. Summarize which row has the "
	"highest and lowest values."
)
 
response = client.models.generate_content(
	model=MODEL,
	contents=[image_part, prompt],
	config=agentic_config,
)
print_response(response, show_thoughts=True)

Mô hình chạy bốn vòng mã để đi từ toàn ảnh đến biểu đồ hoàn chỉnh. Ba vòng đầu là phóng to dần: nó cắt bảng "Single or Married Filing Separately", rồi tiêu đề cột, rồi 10 hàng dữ liệu đầu tiên, tạo ra năm ảnh trung gian. Đây là lần cắt đầu tiên khi nó cô lập bảng:

Title: Gemini 3 agentic vision first crop isolating the Single Filing tax table region - Description: Gemini 3 agentic vision first crop isolating the Single Filing tax table region

Đến vòng bốn, nó đã đọc đủ chi tiết để trích số liệu. Nó dựng một pandas DataFrame, in bảng và tạo biểu đồ cột nhóm trong một khối mã:

[CODE]
import matplotlib.pyplot as plt
import pandas as pd
 
data = [
	{"Higher Paying Job Wage": "$0 - 9,999",
 	"$0 - 9,999": 0, "$10,000 - 19,999": 940,
 	"$20,000 - 29,999": 1020, "$30,000 - 39,999": 1020},
	...  # 10 rows total
]
 
df = pd.DataFrame(data)
df.set_index("Higher Paying Job Wage").plot(kind='bar', figsize=(12, 6))
plt.title('Tax Table: Single or Married Filing Separately')
plt.ylabel('Tax Amount')
plt.savefig('tax_bar_chart.png')

Bảng đã trích xuất:

Higher Paying Job Wage

$0 - 9,999

$10,000 - 19,999

$20,000 - 29,999

$30,000 - 39,999

$0 - 9,999

$0

$940

$1,020

$1,020

$10,000 - 19,999

$940

$1,540

$1,620

$2,020

$20,000 - 29,999

$1,020

$1,620

$2,100

$3,100

$30,000 - 39,999

$1,020

$2,020

$3,100

$4,100

$40,000 - 59,999

$1,870

$3,470

$4,550

$5,550

$60,000 - 79,999

$1,870

$3,470

$4,690

$5,890

$80,000 - 99,999

$2,000

$3,810

$5,090

$6,290

$100,000 - 124,999

$2,040

$3,840

$5,120

$6,320

$125,000 - 149,999

$2,040

$3,840

$5,120

$6,910

$150,000 - 174,999

$2,220

$4,830

$6,910

$8,910

Và biểu đồ cột được tạo:

Title: Bar chart generated by Gemini 3 agentic vision comparing tax amounts across wage brackets - Description: Bar chart generated by Gemini 3 agentic vision comparing tax amounts across wage brackets

Đầu ra đầy đủ chưa rút gọn có trong gist này.

Một lần gọi API đã tạo ra DataFrame có cấu trúc, bản tóm tắt với hàng lớn nhất/nhỏ nhất và một biểu đồ cột sẵn sàng xuất bản. Prompt liệt kê bốn việc (cắt, trích xuất, vẽ, tóm tắt), và mô hình coi mỗi việc là một giai đoạn trong pipeline nơi đầu ra của bước này cấp cho bước kế tiếp. 

Các ví dụ trước dùng vòng lặp để tinh chỉnh một thao tác (cắt tốt hơn, chú thích tốt hơn). Ví dụ này cho thấy vòng lặp xâu chuỗi các thao tác khác nhau, mỗi thao tác xây dựng dựa trên kết quả vòng trước.

Kết luận

Agentic vision biến một lần gọi API thành vòng phản hồi, nơi mô hình viết mã, xem những gì nó tạo ra và quyết định bước tiếp theo. 

Ví dụ kệ hàng tạp hóa cho thấy mẫu cơ bản: cắt những vùng quá nhỏ để đọc, rồi trả lời từ phiên bản đã phóng to. Thực đơn quán bar bổ sung một chiều cạnh thứ hai, nơi mô hình chạy một vòng cắt, quyết định chưa đủ, rồi tự phóng sâu hơn vào các vùng khó. 

Với ảnh đồng xu, chú thích biến một phép đoán thành hiện vật có thể kiểm tra. Bảng thuế xâu chuỗi bốn thao tác riêng (cắt, trích, tính, vẽ) trong một yêu cầu.

Mỗi ví dụ cũng hé lộ điều gì đó về cách viết prompt. Đặt ngưỡng đầy đủ ("liệt kê tất cả sản phẩm") thúc đẩy mô hình hướng đến triệt để. Để mở phương pháp cho phép nó chọn con đường tiền xử lý của riêng mình. 

Nhưng các động từ mơ hồ như "draw" đôi khi đẩy nó đi sai hướng, và chuyển sang "Use Python to draw" đã khắc phục. 

Mẫu chung: mô tả những gì bạn muốn tạo ra, cụ thể về công cụ khi tác vụ mơ hồ và để vòng lặp lo phần còn lại.

Toàn bộ mã trong hướng dẫn này chạy với gemini-3-flash-preview và SDK google-genai. Nếu bạn muốn đào sâu, khóa học Introduction to AI Agents của DataCamp đề cập mẫu vòng lặp đứng sau tất cả điều này.

Agentic Vision trong Gemini 3: Câu hỏi thường gặp

Agentic vision trong Gemini 3 Flash là gì?

Agentic vision là tính năng cho phép Gemini 3 Flash viết và chạy mã Python giữa phản hồi để thao tác hình ảnh trước khi trả lời. Nó dùng vòng lặp Think, Act, Observe để cắt, phóng, chú thích và tăng cường hình ảnh trong môi trường sandbox, tất cả trong một lần gọi API.

Làm thế nào bật agentic vision trong Gemini API?

Thêm công cụ thực thi mã vào GenerateContentConfig: tools=[types.Tool(code_execution=types.ToolCodeExecution())]. Điều này cấp cho mô hình quyền truy cập vào môi trường Python sandbox với 43 thư viện cài sẵn, gồm PIL, OpenCV và matplotlib.

Vì sao mô hình bỏ qua thực thi mã ngay cả khi đã bật?

Mô hình chỉ viết mã khi nó quyết định rằng một lần nhìn ảnh là chưa đủ. Nếu có thể trả lời tự tin từ độ phân giải gốc, nó sẽ bỏ qua đường thực thi mã. Đây là hành vi theo thiết kế và đã được Google ghi nhận.

Sự khác nhau giữa "draw" và "Use Python to draw" trong prompt là gì?

Việc nói "draw" (vẽ) là mơ hồ và mô hình có thể trả về mô tả văn bản hoặc tọa độ JSON thay vì ảnh thực tế. Thêm cụm "Use Python to draw" (Dùng Python để vẽ) cho mô hình biết cần viết mã có thể chạy để tạo đầu ra trực quan, từ đó kích hoạt đường thực thi mã một cách ổn định.

Tôi có thể kết hợp agentic vision với gọi hàm tùy chỉnh không?

Không. Thực thi mã và gọi hàm tùy chỉnh không thể dùng trong cùng một yêu cầu API. Nếu quy trình làm việc của bạn cần cả hai, bạn phải tách thành các lần gọi riêng.

Bexruz (Bex) Tuychiev

Tác giả

Bexruz (Bex) Tuychiev

Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn. 

Chủ đề

Liên quan