Wróć do ścieżek
Moduł 4

Szacowanie kalorii — dajemy modelowi oczy

Twój chatbot umie już rozmawiać — teraz nauczy się patrzeć. Zbudujemy pełną aplikację, a jej najważniejsze elementy omówimy w tym rozdziale. Może brzmi to jak wymagający projekt, ale szybko zobaczysz, że podstawy są prostsze, niż się wydaje. Najważniejszą zmianą będzie przekazywanie zdjęć do modelu — sam mechanizm komunikacji z AI już znasz. Stworzymy serce aplikacji cal.py, które później będziesz mógł samodzielnie rozwijać.

Dajemy modelowi oczy

Konstrukcję naszej aplikacji zaczniemy od zastanowienia się, czego właściwie potrzebujemy. Chcemy, aby modele za pomocą API analizowały przekazane im zdjęcia. Musimy więc sprawdzić, w jaki sposób twórcy API oczekują, że będą one przesyłane.

W przypadku Anthropic schemat wysyłania przedstawiono na poniższym diagramie. TextBlock już znamy i używaliśmy go nie raz – służy on do przesyłania wiadomości tekstowych. Dochodzi nam jednak nowy element – ImageBlock, który jest pojemnikiem na zdjęcie przesyłane do modelu.

Zdj. 1 Schemat podawania wielu bloków różnych typów do modelu.

Jak więc teraz wysłać zdjęcie do modelu w takim bloku? Wiesz może, że na dysku zdjęcie jest tylko zbiorem bajtów informacji. API musi więc dostać je w formie, którą będzie w stanie zinterpretować. Mamy tutaj trzy sposoby przekazania obrazu do modelu.

  • URL — gdy zdjęcie jest publicznie dostępne, wystarczy podać jego adres;
  • Files API — wgranie zdjęcia na serwery Anthropica, skąd model może je pobrać;
  • Base64 — wysłanie zdjęcia bezpośrednio z naszego urządzenia. Tym zajmiemy się w tym pokoju.

Wybieramy opcje trzecią, więc musimy najpierw przedstawić je w formie wygodnej do transportu — czyli w Base64. Takie kodowanie przedstawia zdjęcie za pomocą uniwersalnych znaków, nie tracąc przy tym żadnej informacji. Kosztem jest ok. 33% większy rozmiar danych — dlatego przy dużych plikach warto rozważyć Files API.

Poniżej znajduje się skrypt kodujący nasze zdjęcie oraz określający jego typ MIME. Warto zwrócić uwagę na użyte biblioteki: base64 oodpowiada za zakodowanie danych binarnych obrazu do formatu tekstowego Base64, który możemy przesłać w żądaniu API. mimetypes — nie jest konieczna, ale może być pomocna — pozwala ustalić typ pliku na podstawie jego rozszerzenia (jako argument podajemy oczywiście ścieżkę do naszego zdjęcia). Mimo że korzystamy z ImageBlock, API nie odgadnie za nas formatu — to naszym zadaniem jest wskazać typ MIME zgodny z przekazywanym plikiem.

import base64
import mimetypes

path = "img/img.png"

with open(path, "rb") as f:
    image_bytes = base64.standard_b64encode(f.read()).decode('utf-8')

kind, _ = mimetypes.guess_type(path)

print(kind, image_bytes)
image/png iVBORw0KGgoAAAANSUhEUgAABYAAAAMACAYAAACdMcPMAABFs2NhQlgAAEWzanVtYgAAAB5qdW1kYzJwYQARA [...]

Sam się przekonaj i odpowiedz jaki media_type miałby plik z rozszerzeniem.jpg?

Zaloguj się, aby czytać dalej

To tylko początek modułu. Załóż darmowe konto lub zaloguj się, aby mieć dostęp do bezpłatnych modułów.