{"product_id":"best-practices-cho-vision-tối-ưu-hinh-ảnh-gửi-claude","title":"Best Practices cho Vision — Tối ưu hình ảnh gửi Claude","description":"\n\u003cp\u003eGửi ảnh lên Claude thì dễ — nhưng để \u003cstrong\u003ekhai thác tối đa khả năng Vision\u003c\/strong\u003e đòi hỏi hiểu một số nguyên tắc quan trọng. Bài viết này tổng hợp best practices chính thức từ Anthropic để bạn có được kết quả tốt nhất với chi phí và thời gian thấp nhất.\u003c\/p\u003e\n\n\u003ch2\u003eNguyên tắc 1: Đặt ảnh trước, câu hỏi sau\u003c\/h2\u003e\n\n\u003cp\u003eThứ tự ảnh và text trong \u003ccode\u003econtent\u003c\/code\u003e array \u003cstrong\u003equan trọng hơn bạn nghĩ\u003c\/strong\u003e. Anthropic khuyến nghị: đặt ảnh trước câu hỏi, không phải ngược lại.\u003c\/p\u003e\n\n\u003ch3\u003eCách sai — câu hỏi trước, ảnh sau\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# KHONG TOT: Claude doc cau hoi truoc khi thay anh\ncontent = [\n    {\"type\": \"text\", \"text\": \"Hang hoa nao trong anh nay bi hong?\"},\n    {\"type\": \"image\", \"source\": {\"type\": \"base64\", ...}},\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eCách đúng — ảnh trước, câu hỏi sau\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# TOT HON: Claude thay anh truoc khi doc cau hoi\ncontent = [\n    {\"type\": \"image\", \"source\": {\"type\": \"base64\", ...}},\n    {\"type\": \"text\", \"text\": \"Hang hoa nao trong anh nay bi hong?\"},\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003cp\u003eLý do: Claude xử lý context theo thứ tự. Khi thấy ảnh trước, nó đã có hình ảnh mental model rõ ràng khi đọc câu hỏi — tương tự như con người đọc câu hỏi sau khi đã quan sát đối tượng.\u003c\/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eNgoại lệ:\u003c\/strong\u003e Với multi-image và nhiều câu hỏi phức tạp, đặt instruction ngắn ở đầu, rồi ảnh + câu hỏi tương ứng xen kẽ nhau có thể hiệu quả hơn.\u003c\/p\u003e\n\n\u003ch2\u003eNguyên tắc 2: Độ phân giải — không cần quá cao\u003c\/h2\u003e\n\n\u003cp\u003eNhiều người nghĩ ảnh càng lớn càng tốt. Thực tế phức tạp hơn:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eKích thước ảnh\u003c\/th\u003e\n\u003cth\u003eTokens tiêu thụ\u003c\/th\u003e\n\u003cth\u003ePhù hợp cho\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003e512 x 512\u003c\/td\u003e\n\u003ctd\u003e~340 tokens\u003c\/td\u003e\n\u003ctd\u003eNhận diện đối tượng đơn giản\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003e1024 x 1024\u003c\/td\u003e\n\u003ctd\u003e~1300 tokens\u003c\/td\u003e\n\u003ctd\u003ePhân tích tổng quát\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003e2048 x 2048\u003c\/td\u003e\n\u003ctd\u003e~5000 tokens\u003c\/td\u003e\n\u003ctd\u003eĐọc text nhỏ, chi tiết tinh vi\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003e4096 x 4096\u003c\/td\u003e\n\u003ctd\u003e~19000 tokens\u003c\/td\u003e\n\u003ctd\u003eTài liệu pháp lý, bản vẽ kỹ thuật\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eQuy tắc thực tế:\u003c\/strong\u003e\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003eNhận diện đối tượng, phân loại ảnh: \u003cstrong\u003e512-1024px\u003c\/strong\u003e là đủ\u003c\/li\u003e\n  \u003cli\u003eĐọc text in trên tài liệu: \u003cstrong\u003e1024-2048px\u003c\/strong\u003e\n\u003c\/li\u003e\n  \u003cli\u003eĐọc chữ nhỏ, bản vẽ chi tiết: \u003cstrong\u003e2048px trở lên\u003c\/strong\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eTự động resize trước khi gửi\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003efrom PIL import Image\nimport io, base64\n\ndef prepare_image(\n    path: str,\n    max_dim: int = 1568,\n    quality: int = 85\n) -\u0026gt; tuple:\n    \"\"\"\n    Chuan bi anh de gui cho Claude.\n    Tra ve (base64_string, media_type).\n    \"\"\"\n    with Image.open(path) as img:\n        # Giu RGBA neu co, neu khong chuyen RGB\n        if img.mode not in (\"RGB\", \"RGBA\"):\n            img = img.convert(\"RGB\")\n\n        # Chi resize neu qua lon\n        if max(img.width, img.height) \u0026gt; max_dim:\n            img.thumbnail((max_dim, max_dim), Image.LANCZOS)\n\n        # Luu vao buffer\n        fmt = \"PNG\" if img.mode == \"RGBA\" else \"JPEG\"\n        media_type = \"image\/png\" if fmt == \"PNG\" else \"image\/jpeg\"\n        buf = io.BytesIO()\n        img.save(buf, format=fmt, quality=quality)\n        data = base64.standard_b64encode(buf.getvalue()).decode()\n\n    return data, media_type\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNguyên tắc 3: Prompt engineering cho Vision\u003c\/h2\u003e\n\n\u003cp\u003ePrompting cho vision tasks khác với text-only tasks. Dưới đây là các pattern hiệu quả nhất:\u003c\/p\u003e\n\n\u003ch3\u003ePattern 1: Specify output format\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Thay vi: \"Mo ta anh nay\"\n# Hay dung: Xac dinh ro format ban muon\nprompt = \"\"\"Phan tich bieu do doanh thu nay va tra loi theo format:\n\nTIEU DE BIEU DO: [tieu de]\nLOAI BIEU DO: [bar\/line\/pie\/etc]\nTONG HOP DU LIEU:\n- [diem du lieu 1]\n- [diem du lieu 2]\nXU HUONG CHINH: [nhan xet]\"\"\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePattern 2: Role assignment\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Gan vai tro giup Claude tap trung dung expertise\nsystem = \"\"\"Ban la chuyen gia kiem tra chat luong san pham.\nNhiem vu cua ban la phat hien loi, vet xay xuoc, va van de\ntren san pham duoc chup hinh.\"\"\"\n\nuser_prompt = \"Kiem tra anh san pham nay va liet ke tat ca loi phat hien duoc.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePattern 3: Ask for uncertainty\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# Yeu cau Claude bao cao khi khong chac chan\nprompt = \"\"\"Phan tich van ban trong hinh anh nay.\nNeu co phan nao kho doc hoac khong ro rang,\nhay danh dau ro rang voi [KHONG RO] thay vi doan.\nDo chinh xac quan trong hon do day du.\"\"\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNguyên tắc 4: Multi-image analysis\u003c\/h2\u003e\n\n\u003cp\u003eClaude xử lý tốt nhiều ảnh cùng lúc — tối đa 20 ảnh mỗi request. Đây là cách tổ chức hiệu quả:\u003c\/p\u003e\n\n\u003ch3\u003eSo sánh hai ảnh\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003edef compare_images(before_path: str, after_path: str) -\u0026gt; str:\n    \"\"\"So sanh anh truoc va sau.\"\"\"\n    before_data, before_type = prepare_image(before_path)\n    after_data, after_type = prepare_image(after_path)\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=1024,\n        messages=[\n            {\n                \"role\": \"user\",\n                \"content\": [\n                    {\"type\": \"text\", \"text\": \"ANH TRUOC:\"},\n                    {\"type\": \"image\", \"source\": {\"type\": \"base64\",\n                        \"media_type\": before_type, \"data\": before_data}},\n                    {\"type\": \"text\", \"text\": \"ANH SAU:\"},\n                    {\"type\": \"image\", \"source\": {\"type\": \"base64\",\n                        \"media_type\": after_type, \"data\": after_data}},\n                    {\"type\": \"text\", \"text\": \"Liet ke tat ca su thay doi giua hai anh.\"},\n                ],\n            }\n        ],\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eXử lý batch nhiều ảnh\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003edef analyze_product_catalog(image_paths: list) -\u0026gt; list:\n    \"\"\"Phan tich nhieu san pham cung luc.\"\"\"\n    # Chuan bi tat ca anh\n    content = []\n    for i, path in enumerate(image_paths):\n        data, media_type = prepare_image(path)\n        content.append({\n            \"type\": \"text\",\n            \"text\": f\"San pham {i+1}:\"\n        })\n        content.append({\n            \"type\": \"image\",\n            \"source\": {\"type\": \"base64\", \"media_type\": media_type, \"data\": data}\n        })\n\n    content.append({\n        \"type\": \"text\",\n        \"text\": \"\"\"Voi moi san pham, hay cho biet:\n        - Ten\/mo ta ngan\n        - Tinh trang (tot\/trung binh\/kem)\n        - Cac diem noi bat\n        Tra ve dang JSON array.\"\"\"\n    })\n\n    client = anthropic.Anthropic()\n    message = client.messages.create(\n        model=\"claude-opus-4-5\",\n        max_tokens=2048,\n        messages=[{\"role\": \"user\", \"content\": content}],\n    )\n    return message.content[0].text\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNguyên tắc 5: Chọn model phù hợp\u003c\/h2\u003e\n\n\u003cp\u003eKhông phải lúc nào cũng cần dùng model mạnh nhất. Chọn model dựa trên độ phức tạp của task:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n\u003cth\u003eModel\u003c\/th\u003e\n\u003cth\u003ePhù hợp cho\u003c\/th\u003e\n\u003cth\u003eChi phí tương đối\u003c\/th\u003e\n\u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n\u003ctd\u003eclaude-haiku-4-5\u003c\/td\u003e\n\u003ctd\u003ePhân loại ảnh đơn giản, OCR cơ bản, batch processing\u003c\/td\u003e\n\u003ctd\u003eThấp nhất\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eclaude-sonnet-4-5\u003c\/td\u003e\n\u003ctd\u003ePhân tích chi tiết, so sánh ảnh, tài liệu phức tạp\u003c\/td\u003e\n\u003ctd\u003eTrung bình\u003c\/td\u003e\n\u003c\/tr\u003e\n    \u003ctr\u003e\n\u003ctd\u003eclaude-opus-4-5\u003c\/td\u003e\n\u003ctd\u003eReasoning phức tạp, tài liệu pháp lý, bản vẽ kỹ thuật\u003c\/td\u003e\n\u003ctd\u003eCao nhất\u003c\/td\u003e\n\u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003e\u003cstrong\u003eTip tiết kiệm chi phí:\u003c\/strong\u003e Dùng Haiku để pre-filter — phân loại ảnh có liên quan không, rồi chỉ gửi ảnh liên quan cho Sonnet\/Opus phân tích sâu.\u003c\/p\u003e\n\n\u003cpre\u003e\u003ccode\u003edef smart_analyze(image_path: str) -\u0026gt; str:\n    \"\"\"\n    Dung Haiku de filter truoc,\n    chi dung Opus khi can thiet.\n    \"\"\"\n    data, media_type = prepare_image(image_path)\n\n    # Buoc 1: Haiku check xem co gi dang phan tich\n    haiku_client = anthropic.Anthropic()\n    check = haiku_client.messages.create(\n        model=\"claude-haiku-4-5\",\n        max_tokens=50,\n        messages=[{\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"image\", \"source\": {\"type\": \"base64\",\n                    \"media_type\": media_type, \"data\": data}},\n                {\"type\": \"text\", \"text\": \"Anh nay co chua van ban, bieu do, hoac thong tin quan trong khong? Chi tra loi YES hoac NO.\"}\n            ]\n        }]\n    )\n\n    if \"YES\" in check.content[0].text.upper():\n        # Buoc 2: Opus phan tich sau\n        detail = haiku_client.messages.create(\n            model=\"claude-opus-4-5\",\n            max_tokens=2048,\n            messages=[{\n                \"role\": \"user\",\n                \"content\": [\n                    {\"type\": \"image\", \"source\": {\"type\": \"base64\",\n                        \"media_type\": media_type, \"data\": data}},\n                    {\"type\": \"text\", \"text\": \"Phan tich chi tiet noi dung trong anh nay.\"}\n                ]\n            }]\n        )\n        return detail.content[0].text\n    else:\n        return \"Anh khong chua thong tin can phan tich.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003ePitfalls phổ biến cần tránh\u003c\/h2\u003e\n\n\u003ch3\u003ePitfall 1: Hỏi quá nhiều thứ trong một prompt\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# XAU: Qua nhieu yeu cau, kho tra loi chinh xac\n\"Mo ta anh, tim tat ca loi, so sanh voi anh truoc, tinh toan kich thuoc, va du bao gia tri\"\n\n# TOT: Mot nhiem vu ro rang\n\"Liet ke cac loi nhin thay duoc trong san pham, theo thu tu muc do nghiem trong.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePitfall 2: Không nói rõ context\u003c\/h3\u003e\n\n\u003cpre\u003e\u003ccode\u003e# XAU: Thieu context\n\"Co gi sai khong?\"\n\n# TOT: Co context ro rang\n\"Day la anh X-quang phoi cua benh nhan 45 tuoi.\nHay mo ta nhung bat thuong co the nhin thay.\nLuu y: Toi la ky thuat vien y te, khong phai bac si.\"\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003ePitfall 3: Gửi ảnh mờ hoặc bị cắt\u003c\/h3\u003e\n\n\u003cp\u003eClaude không thể tạo ra thông tin không có trong ảnh. Nếu ảnh bị mờ hoặc bị cắt mất phần quan trọng, kết quả sẽ không chính xác. Luôn kiểm tra chất lượng ảnh trước khi gửi.\u003c\/p\u003e\n\n\u003ch3\u003ePitfall 4: Dùng ảnh quá nhỏ cho text recognition\u003c\/h3\u003e\n\n\u003cp\u003eChữ nhỏ trong ảnh 300x300 sẽ rất khó đọc — dù với con người hay AI. Đảm bảo ảnh đủ độ phân giải cho nội dung cần đọc.\u003c\/p\u003e\n\n\u003ch2\u003eTổng kết Best Practices\u003c\/h2\u003e\n\n\u003col\u003e\n  \u003cli\u003e\n\u003cstrong\u003eĐặt ảnh trước text\u003c\/strong\u003e trong content array\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eResize ảnh phù hợp\u003c\/strong\u003e với task — đừng gửi ảnh 4K khi chỉ cần nhận diện đối tượng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eViết prompt rõ ràng\u003c\/strong\u003e — specify format, role, và mức độ chi tiết mong muốn\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eChọn model phù hợp\u003c\/strong\u003e — Haiku cho batch đơn giản, Opus cho reasoning phức tạp\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eYêu cầu Claude báo cáo uncertainty\u003c\/strong\u003e thay vì đoán mò\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eKiểm tra chất lượng ảnh\u003c\/strong\u003e trước khi gửi\u003c\/li\u003e\n\u003c\/ol\u003e\n\n\u003cp\u003eTiếp theo, xem \u003ca href=\"\/en\/collections\/nang-cao\"\u003eCrop Tool Pattern\u003c\/a\u003e để cho Claude khả năng zoom vào vùng chi tiết khi cần phân tích sâu hơn.\u003c\/p\u003e\n\n\u003chr\u003e\n\u003ch3\u003eBài viết liên quan\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/b%E1%BA%AFt-d%E1%BA%A7u-v%E1%BB%9Bi-claude-vision-g%E1%BB%ADi-hinh-%E1%BA%A3nh-qua-api\"\u003eBắt đầu với Claude Vision — Gửi hình ảnh qua API\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/chief-of-staff-agent-di%E1%BB%81u-ph%E1%BB%91i-multi-agent-v%E1%BB%9Bi-claude-sdk\"\u003eChief of Staff Agent — Điều phối multi-agent với Claude SDK\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/context-compaction-t%E1%BB%B1-d%E1%BB%99ng-nen-context-cho-conversations-dai\"\u003eContext Compaction — Tự động nén context cho conversations dài\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/building-effective-agents-v%E1%BB%9Bi-claude-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-ki%E1%BA%BFn-truc\"\u003eBuilding Effective Agents với Claude — Hướng dẫn kiến trúc\u003c\/a\u003e\u003c\/li\u003e\n\u003cli\u003e\u003ca href=\"\/en\/products\/claude-cho-data-kham-pha-dataset-m%E1%BB%9Bi\"\u003eClaude cho Data: Khám phá dataset mới\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47721833332948,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/best-practices-cho-vision-t_i-_u-hinh-_nh-g_i-claude_0788202b-e7ae-4745-97e9-f4ad2fb4e48a.jpg?v=1774521738","url":"https:\/\/claude.vn\/en\/products\/best-practices-cho-vision-t%e1%bb%91i-%c6%b0u-hinh-%e1%ba%a3nh-g%e1%bb%adi-claude","provider":"CLAUDE.VN","version":"1.0","type":"link"}