Samouczek: pierwsze kroki z interfejsem Gemini API


Zobacz w Google AI Uruchom w Google Colab Wyświetl źródło na GitHubie

W tym krótkim wprowadzeniu pokazujemy, jak korzystać z pakietu SDK Pythona na potrzeby interfejsu Gemini API, co zapewnia dostęp do dużych modeli językowych Google Gemini. Z tego krótkiego wprowadzenia dowiesz się, jak:

  1. Aby korzystać z Gemini, skonfiguruj środowisko programistyczne i dostęp do interfejsów API.
  2. Generuj odpowiedzi tekstowe na podstawie wpisywanych tekstów.
  3. Generuj odpowiedzi tekstowe na podstawie multimodalnych danych wejściowych (tekstowych i graficznych).
  4. Używaj Gemini do rozmów wieloetapowych (czatu).
  5. Użyj wektorów dystrybucyjnych dla dużych modeli językowych.

Wymagania wstępne

Możesz uruchomić to krótkie wprowadzenie w Google Colab, która spowoduje uruchomienie notatnika bezpośrednio w przeglądarce i nie wymaga dodatkowej konfiguracji środowiska.

Aby wykonać to krótkie wprowadzenie lokalnie, możesz też sprawdzić, czy Twoje środowisko programistyczne spełnia te wymagania:

  • Python 3.9 lub nowszy
  • Instalacja pakietu jupyter do uruchamiania notatnika.

Konfiguracja

Zainstaluj pakiet SDK Pythona

Pakiet SDK Pythona dla interfejsu Gemini API znajduje się w pakiecie google-generativeai. Zainstaluj zależność za pomocą narzędzia pip:

pip install -q -U google-generativeai

Importowanie pakietów

Zaimportuj niezbędne pakiety.

import pathlib
import textwrap

import google.generativeai as genai

from IPython.display import display
from IPython.display import Markdown


def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
# Used to securely store your API key
from google.colab import userdata

Skonfiguruj klucz interfejsu API

Aby korzystać z interfejsu Gemini API, musisz najpierw uzyskać klucz interfejsu API. Jeśli nie masz jeszcze klucza, utwórz go jednym kliknięciem w Google AI Studio.

Uzyskiwanie klucza interfejsu API

W Colab dodaj klucz do menedżera obiektów tajnych w sekcji „🔑” w panelu po lewej stronie. Nadaj mu nazwę GOOGLE_API_KEY.

Przekaż klucz interfejsu API do pakietu SDK. Można to zrobić na dwa sposoby:

  • Umieść klucz w zmiennej środowiskowej GOOGLE_API_KEY (pakiet SDK automatycznie go stamtąd zabierze).
  • Przekaż klucz do: genai.configure(api_key=...)
# Or use `os.getenv('GOOGLE_API_KEY')` to fetch an environment variable.
GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')

genai.configure(api_key=GOOGLE_API_KEY)

Wyświetlanie listy modeli

Teraz możesz już wywołać interfejs Gemini API. Użyj operatora list_models, aby zobaczyć dostępne modele Gemini:

  • gemini-1.5-flash: nasz najszybszy multimodalny model
  • gemini-1.5-pro: nasz najbardziej zaawansowany i inteligentny model wielomodalny
for m in genai.list_models():
  if 'generateContent' in m.supported_generation_methods:
    print(m.name)

Generuj tekst na podstawie wprowadzonych danych tekstowych

W przypadku promptów zawierających tylko tekst użyj modelu Gemini 1.5 lub Gemini 1.0 Pro:

model = genai.GenerativeModel('gemini-1.5-flash')

Metoda generate_content obsługuje wiele różnych przypadków użycia, w tym czat wieloetapowy i wielomodalne wprowadzanie danych, w zależności od obsługi danego modelu. Dostępne modele obsługują tylko tekst i obrazy jako dane wejściowe, a tekst jako dane wyjściowe.

W najprostszym przypadku możesz przekazać ciąg promptu do metody GenerativeModel.generate_content:

%%time
response = model.generate_content("What is the meaning of life?")
CPU times: user 110 ms, sys: 12.3 ms, total: 123 ms
Wall time: 8.25 s

W prostych przypadkach wystarczy akcesor response.text. Aby wyświetlić sformatowany tekst Markdown, użyj funkcji to_markdown:

to_markdown(response.text)

Pytanie o cel życia wprawia ludzi w zrozumienie na przestrzeni wieków, kultur i kontynentów. Mimo że nie ma powszechnego uznania, wpłynęło na to wiele pomysłów, a reakcja często zależy od indywidualnych koncepcji, przekonań i doświadczeń życiowych.

  1. Szczęście i dobre samopoczucie: wiele osób uważa, że celem życia jest osiąganie szczęścia i dobrego samopoczucia. Może to obejmować znajdowanie zajęcia, które dają radość, nawiązywanie bliskich relacji, dbanie o zdrowie fizyczne i psychiczne oraz realizowanie osobistych celów i zainteresowań.

  2. Słuszny wkład: niektórzy uważają, że celem życia jest skrzywdzenie światu. Może to obejmować wykonywanie zawodu z korzyścią dla innych, angażowanie się w działania na rzecz wolontariatu lub organizacji charytatywnych, tworzenie sztuki lub literatury albo tworzenie wynalazków.

  3. Samorealizacja i rozwój osobisty:dążenie do samorealizacji i rozwoju osobistego to kolejny typowy cel życiowy. Wiąże się to z nauką nowych umiejętności, przekraczaniem granic, pokonywaniem osobistych przeszkód i rozwojem człowieka.

  4. Zachowanie etyczne i moralne: niektórzy uważają, że celem życia jest zachowanie etyczne i moralne. Może to obejmować przestrzeganie własnych zasad moralnych, wykonywanie odpowiednich czynności nawet w trudnych sytuacjach i dążenie do zmiany świata na lepsze.

  5. Spełnienie duchowe: dla niektórych cel życia jest związany z wierzeniami duchowymi lub religijnymi. Może to oznaczać poszukiwanie więzi z osobami o większej sile, wykonywanie rytuałów religijnych lub przestrzeganie nauk duchowych.

  6. Ciesz się pełnią życia: niektórzy uważają, że celem życia jest doświadczanie wszystkiego, co ma do zaoferowania. Wymaga to podróżowania, próbowania nowych rzeczy, podejmowania ryzyka i przyjmowania nowych kontaktów.

  7. dziedzictwo i wpływ: inni uważają, że celem życia jest zostawienie trwałego dziedzictwa i wpływu na świat. Może to być np. osiągnięcie czegoś wartościowego, zapamiętanie czyjegoś wkładu albo inspirowanie i motywowanie innych.

  8. Odnalezienie równowagi i harmonii: dla niektórych celem życia jest znalezienie równowagi i harmonii we wszystkich aspektach życia. Może to wymagać pogodzenia osobistych, zawodowych i społecznych obowiązków, poszukiwania wewnętrznego spokoju i zadowolenia oraz żyć zgodnie z swoimi wartościami i przekonaniami.

Ostatecznie sens życia jest osobistą podróżą, a różne osoby mogą odkryć swój unikalny cel przez doświadczenia, refleksje i interakcje z otaczającym je światem.

Jeśli interfejs API nie zwrócił wyniku, użyj GenerateContentResponse.prompt_feedback, aby sprawdzić, czy połączenie nie zostało zablokowane ze względu na problemy z bezpieczeństwem związane z tym promptem.

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

Gemini może wygenerować wiele możliwych odpowiedzi na 1 prompt. Te możliwe odpowiedzi noszą nazwę candidates – możesz je przejrzeć, aby wybrać najbardziej odpowiednią.

Wyświetl propozycje odpowiedzi w polu GenerateContentResponse.candidates:

response.candidates
[content {
  parts {
    text: "The query of life\'s purpose has perplexed people across centuries, cultures, and continents. While there is no universally recognized response, many ideas have been put forth, and the response is frequently dependent on individual ideas, beliefs, and life experiences.\n\n1. **Happiness and Well-being:** Many individuals believe that the goal of life is to attain personal happiness and well-being. This might entail locating pursuits that provide joy, establishing significant connections, caring for one\'s physical and mental health, and pursuing personal goals and interests.\n\n2. **Meaningful Contribution:** Some believe that the purpose of life is to make a meaningful contribution to the world. This might entail pursuing a profession that benefits others, engaging in volunteer or charitable activities, generating art or literature, or inventing.\n\n3. **Self-realization and Personal Growth:** The pursuit of self-realization and personal development is another common goal in life. This might entail learning new skills, pushing one\'s boundaries, confronting personal obstacles, and evolving as a person.\n\n4. **Ethical and Moral Behavior:** Some believe that the goal of life is to act ethically and morally. This might entail adhering to one\'s moral principles, doing the right thing even when it is difficult, and attempting to make the world a better place.\n\n5. **Spiritual Fulfillment:** For some, the purpose of life is connected to spiritual or religious beliefs. This might entail seeking a connection with a higher power, practicing religious rituals, or following spiritual teachings.\n\n6. **Experiencing Life to the Fullest:** Some individuals believe that the goal of life is to experience all that it has to offer. This might entail traveling, trying new things, taking risks, and embracing new encounters.\n\n7. **Legacy and Impact:** Others believe that the purpose of life is to leave a lasting legacy and impact on the world. This might entail accomplishing something noteworthy, being remembered for one\'s contributions, or inspiring and motivating others.\n\n8. **Finding Balance and Harmony:** For some, the purpose of life is to find balance and harmony in all aspects of their lives. This might entail juggling personal, professional, and social obligations, seeking inner peace and contentment, and living a life that is in accordance with one\'s values and beliefs.\n\nUltimately, the meaning of life is a personal journey, and different individuals may discover their own unique purpose through their experiences, reflections, and interactions with the world around them."
  }
  role: "model"
}
finish_reason: STOP
index: 0
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}
]

Domyślnie model zwraca odpowiedź po zakończeniu całego procesu generowania. Możesz też strumieniować odpowiedź w trakcie jej generowania – model będzie zwracać jej fragmenty, gdy tylko zostaną wygenerowane.

Aby strumieniować odpowiedzi, użyj funkcji GenerativeModel.generate_content(..., stream=True).

%%time
response = model.generate_content("What is the meaning of life?", stream=True)
CPU times: user 102 ms, sys: 25.1 ms, total: 128 ms
Wall time: 7.94 s
for chunk in response:
  print(chunk.text)
  print("_"*80)
The query of life's purpose has perplexed people across centuries, cultures, and
________________________________________________________________________________
 continents. While there is no universally recognized response, many ideas have been put forth, and the response is frequently dependent on individual ideas, beliefs, and life experiences
________________________________________________________________________________
.

1. **Happiness and Well-being:** Many individuals believe that the goal of life is to attain personal happiness and well-being. This might entail locating pursuits that provide joy, establishing significant connections, caring for one's physical and mental health, and pursuing personal goals and aspirations.

2. **Meaning
________________________________________________________________________________
ful Contribution:** Some believe that the purpose of life is to make a meaningful contribution to the world. This might entail pursuing a profession that benefits others, engaging in volunteer or charitable activities, generating art or literature, or inventing.

3. **Self-realization and Personal Growth:** The pursuit of self-realization and personal development is another common goal in life. This might entail learning new skills, exploring one's interests and abilities, overcoming obstacles, and becoming the best version of oneself.

4. **Connection and Relationships:** For many individuals, the purpose of life is found in their relationships with others. This might entail building
________________________________________________________________________________
 strong bonds with family and friends, fostering a sense of community, and contributing to the well-being of those around them.

5. **Spiritual Fulfillment:** For those with religious or spiritual beliefs, the purpose of life may be centered on seeking spiritual fulfillment or enlightenment. This might entail following religious teachings, engaging in spiritual practices, or seeking a deeper understanding of the divine.

6. **Experiencing the Journey:** Some believe that the purpose of life is simply to experience the journey itself, with all its joys and sorrows. This perspective emphasizes embracing the present moment, appreciating life's experiences, and finding meaning in the act of living itself.

7. **Legacy and Impact:** For others, the goal of life is to leave a lasting legacy or impact on the world. This might entail making a significant contribution to a particular field, leaving a positive mark on future generations, or creating something that will be remembered and cherished long after one's lifetime.

Ultimately, the meaning of life is a personal and subjective question, and there is no single, universally accepted answer. It is about discovering what brings you fulfillment, purpose, and meaning in your own life, and living in accordance with those values.
________________________________________________________________________________

Podczas strumieniowania niektóre atrybuty odpowiedzi są niedostępne, dopóki nie wykonasz iteracji wszystkich fragmentów odpowiedzi. Można to sprawdzić poniżej:

response = model.generate_content("What is the meaning of life?", stream=True)

Działa atrybut prompt_feedback:

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

Atrybuty takie jak text nie:

try:
  response.text
except Exception as e:
  print(f'{type(e).__name__}: {e}')
IncompleteIterationError: Please let the response complete iteration before accessing the final accumulated
attributes (or call `response.resolve()`)

Generuj tekst na podstawie wprowadzanych obrazów i tekstu

Gemini udostępnia różne modele, które obsługują multimodalne dane wejściowe (modele Gemini 1.5 i Gemini 1.0 Pro Vision), dzięki czemu możesz wpisywać zarówno tekst, jak i obrazy. Zapoznaj się z wymaganiami dotyczącymi obrazów w promptach.

Jeśli dane wejściowe promptu zawierają zarówno tekst, jak i obrazy, do wygenerowania danych wyjściowych tekstowych użyj modelu Gemini 1.5 lub Gemini 1.0 Pro Vision z metodą GenerativeModel.generate_content:

Dodajmy obraz:

curl -o image.jpg https://t0.gstatic.com/licensed-image?q=tbn:ANd9GcQ_Kevbk21QBRy-PgB4kQpS79brbmmEG7m3VOTShAn4PecDU5H5UxrJxE3Dw1JiaG17V88QIol19-3TM2wCHw
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  405k  100  405k    0     0  6982k      0 --:--:-- --:--:-- --:--:-- 7106k
import PIL.Image

img = PIL.Image.open('image.jpg')
img

png

Użyj modelu Gemini 1.5 i przekaż obraz do modelu za pomocą funkcji generate_content.

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(img)

to_markdown(response.text)

Miski z kurczakiem Teriyaki z brązowym ryżem, pieczonymi brokułami i papryką.

Aby w prompcie umieścić zarówno tekst, jak i obrazy, przekaż listę zawierającą ciągi znaków i obrazy:

response = model.generate_content(["Write a short, engaging blog post based on this picture. It should include a description of the meal in the photo and talk about my journey meal prepping.", img], stream=True)
response.resolve()
to_markdown(response.text)

Przygotowywanie posiłków to świetny sposób na zaoszczędzenie czasu i pieniędzy, a także może pomóc w zdrowym odżywianiu. To świetny przykład zdrowego i pysznego posiłku, który można łatwo przygotować z wyprzedzeniem.

Ten posiłek składa się z brązowego ryżu, pieczonych warzyw i kurczaka teriyaki. Brązowy ryż to pełnoziarniste ziarno zawierające dużo błonnika i składników odżywczych. Pieczone warzywa to świetny sposób na uzyskanie dziennej dawki witamin i minerałów. Kurczak teriyaki to odtłuszczone źródło białka pełne smaku.

Danie można przygotować z wyprzedzeniem. Wystarczy, że ugotujesz brązowy ryż, upiecz warzywa i ugotujesz kurczaka teriyaki. Następnie podziel posiłek do osobnych pojemników i przechowuj je w lodówce. Aby zjeść, chwyć pojemnik i podgrzewaj go.

To doskonały wybór dla zapracowanych osób, które szukają zdrowych i pysznych sposobów na jedzenie. To także doskonały posiłek dla osób, które starają się schudnąć lub utrzymać zdrową wagę.

Jeśli szukasz zdrowego i pysznego posiłku, który można z łatwością przygotować z wyprzedzeniem, ten posiłek będzie doskonałym rozwiązaniem. Spróbuj już dziś!

Rozmowy na czacie

Gemini umożliwia swobodne rozmowy w wielu fazach. Klasa ChatSession upraszcza ten proces, zarządzając stanem rozmowy, więc w przeciwieństwie do generate_content nie musisz zapisywać historii rozmowy w postaci listy.

Zainicjuj czat:

model = genai.GenerativeModel('gemini-1.5-flash')
chat = model.start_chat(history=[])
chat
<google.generativeai.generative_models.ChatSession at 0x7b7b68250100>

Metoda ChatSession.send_message zwraca ten sam typ GenerateContentResponse co GenerativeModel.generate_content. Zostanie też dołączona Twoja wiadomość i odpowiedź do historii czatu:

response = chat.send_message("In one sentence, explain how a computer works to a young child.")
to_markdown(response.text)

Komputer jest jak bardzo inteligentny komputer, który rozumie nasze instrukcje i wykonuje je, pomaga nam w pracy, a nawet gra z nami w gry.

chat.history
[parts {
   text: "In one sentence, explain how a computer works to a young child."
 }
 role: "user",
 parts {
   text: "A computer is like a very smart machine that can understand and follow our instructions, help us with our work, and even play games with us!"
 }
 role: "model"]

Możesz nadal wysyłać wiadomości, aby kontynuować rozmowę. Aby transmitować czat, użyj argumentu stream=True:

response = chat.send_message("Okay, how about a more detailed explanation to a high schooler?", stream=True)

for chunk in response:
  print(chunk.text)
  print("_"*80)
A computer works by following instructions, called a program, which tells it what to
________________________________________________________________________________
 do. These instructions are written in a special language that the computer can understand, and they are stored in the computer's memory. The computer's processor
________________________________________________________________________________
, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program's logic. The results of these calculations and decisions are then displayed on the computer's screen or stored in memory for later use.

To give you a simple analogy, imagine a computer as a
________________________________________________________________________________
 chef following a recipe. The recipe is like the program, and the chef's actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).

In summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results.
________________________________________________________________________________

Obiekty genai.protos.Content zawierają listę obiektów genai.protos.Part, z których każdy zawiera tekst (ciąg znaków) lub dane wbudowane (genai.protos.Blob), gdzie obiekt blob zawiera dane binarne i obiekt mime_type. Historia czatu jest dostępna w postaci listy obiektów genai.protos.Content w ChatSession.history:

for message in chat.history:
  display(to_markdown(f'**{message.role}**: {message.parts[0].text}'))

użytkownik: wyjaśnij w jednym zdaniu, jak działa komputer z dzieckiem.

model: komputer jest jak bardzo inteligentna maszyna, która rozumie nasze instrukcje i stosuje się do nich, pomaga nam w pracy, a nawet gra z nami w gry.

user: Bardziej szczegółowe wyjaśnienie dla liceum?

model: komputer działa zgodnie z instrukcjami. Jest to tzw. program, który informuje go, co ma się stać. Są one napisane w specjalnym języku, który jest zrozumiały dla komputera, i są przechowywane w jego pamięci. Procesor komputera odczytuje instrukcje z pamięci i wykonuje je, wykonując obliczenia i podejmując decyzje w oparciu o logikę programu. Wyniki tych obliczeń i decyzji są następnie wyświetlane na ekranie komputera lub zapisywane w pamięci do późniejszego użycia.

Aby uzyskać prostą analogię, wyobraź sobie komputer jako szefa kuchni trzymającego się według przepisu. Przepis jest taki sam jak program, a działania szefa kuchni są zgodne z instrukcjami wyświetlanymi przez komputer. Kucharz odczytuje przepis (program) i wykonuje różne działania, takie jak zbieranie składników (pobieranie danych z pamięci), mieszanie ich ze sobą (wykonanie obliczeń) i gotowanie (przetwarzanie danych). Ostatnie danie (produkty) jest wyświetlane na talerzu (na ekranie komputera).

Podsumowując, komputer polega na wykonaniu serii instrukcji zapisanych w pamięci podręcznej, aby wykonywać obliczenia, podejmować decyzje oraz wyświetlać lub przechowywać wyniki.

Policz tokeny

Duże modele językowe mają okno kontekstu, a długość kontekstu jest często mierzona w postaci liczby tokenów. Za pomocą interfejsu Gemini API możesz określić liczbę tokenów na dowolny obiekt genai.protos.Content. W najprostszym przypadku możesz przekazać ciąg zapytania do metody GenerativeModel.count_tokens w ten sposób:

model.count_tokens("What is the meaning of life?")
total_tokens: 7

W podobny sposób możesz sprawdzić token_count dla ChatSession:

model.count_tokens(chat.history)
total_tokens: 501

Użyj wektorów dystrybucyjnych

Umieszczanie to technika używana do przedstawiania informacji w postaci listy liczb zmiennoprzecinkowych w tablicy. W Gemini możesz reprezentować tekst (słowa, zdania i bloki tekstu) w formie wektorowej, co ułatwia porównywanie reprezentacji właściwościowych i kontrastowanie. Na przykład 2 teksty o podobnej tematyce lub uczuciach powinny mieć podobne osadzenia, które można rozpoznać za pomocą technik porównywania matematycznego, takich jak podobieństwo cosinusowe. Więcej informacji o tym, jak i dlaczego warto używać reprezentacji właściwościowych, znajdziesz w przewodniku po umieszczaniu na stronie.

Do generowania wektorów dystrybucyjnych użyj metody embed_content. Ta metoda obsługuje umieszczanie w przypadku tych zadań (task_type):

Typ zadania Opis
RETRIEVAL_QUERY Określa, że podany tekst jest zapytaniem w ustawieniu wyszukiwania/pobierania.
RETRIEVAL_DOCUMENT Określa, że podany tekst jest dokumentem w ustawieniu wyszukiwania/pobierania. Użycie tego typu zadań wymaga title.
SEMANTIC_SIMILARITY Określa podany tekst, który będzie używany do semantycznego podobieństwa tekstu (STS).
KLASYFIKACJA Określa, że do klasyfikacji będą używane wektory dystrybucyjne.
KLASTRY Określa, że wektory dystrybucyjne będą używane do grupowania.

Poniżej znajduje się instrukcja, jak umieścić pojedynczy ciąg znaków na potrzeby pobierania dokumentu:

result = genai.embed_content(
    model="models/embedding-001",
    content="What is the meaning of life?",
    task_type="retrieval_document",
    title="Embedding of single string")

# 1 input > 1 vector output
print(str(result['embedding'])[:50], '... TRIMMED]')
[-0.003216741, -0.013358698, -0.017649598, -0.0091 ... TRIMMED]

Aby obsługiwać grupy ciągów tekstowych, przekaż listę ciągów znaków w funkcji content:

result = genai.embed_content(
    model="models/embedding-001",
    content=[
      'What is the meaning of life?',
      'How much wood would a woodchuck chuck?',
      'How does the brain work?'],
    task_type="retrieval_document",
    title="Embedding of list of strings")

# A list of inputs > A list of vectors output
for v in result['embedding']:
  print(str(v)[:50], '... TRIMMED ...')
[0.0040260437, 0.004124458, -0.014209415, -0.00183 ... TRIMMED ...
[-0.004049845, -0.0075574904, -0.0073463684, -0.03 ... TRIMMED ...
[0.025310587, -0.0080734305, -0.029902633, 0.01160 ... TRIMMED ...

Funkcja genai.embed_content akceptuje proste ciągi znaków (lub listy), ale w rzeczywistości opiera się na typie genai.protos.Content (np. GenerativeModel.generate_content). Obiekty genai.protos.Content są głównymi jednostkami rozmowy w interfejsie API.

Obiekt genai.protos.Content jest multimodalny, ale metoda embed_content obsługuje tylko wektory dystrybucyjne tekstu. Taki projekt daje interfejsowi API możliwość rozszerzenia go na obiekty multimodalne.

response.candidates[0].content
parts {
  text: "A computer works by following instructions, called a program, which tells it what to do. These instructions are written in a special language that the computer can understand, and they are stored in the computer\'s memory. The computer\'s processor, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program\'s logic. The results of these calculations and decisions are then displayed on the computer\'s screen or stored in memory for later use.\n\nTo give you a simple analogy, imagine a computer as a chef following a recipe. The recipe is like the program, and the chef\'s actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).\n\nIn summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results."
}
role: "model"
result = genai.embed_content(
    model = 'models/embedding-001',
    content = response.candidates[0].content)

# 1 input > 1 vector output
print(str(result['embedding'])[:50], '... TRIMMED ...')
[-0.013921871, -0.03504407, -0.0051786783, 0.03113 ... TRIMMED ...

Historia czatu zawiera też listę obiektów genai.protos.Content, które możesz przekazać bezpośrednio do funkcji embed_content:

chat.history
[parts {
   text: "In one sentence, explain how a computer works to a young child."
 }
 role: "user",
 parts {
   text: "A computer is like a very smart machine that can understand and follow our instructions, help us with our work, and even play games with us!"
 }
 role: "model",
 parts {
   text: "Okay, how about a more detailed explanation to a high schooler?"
 }
 role: "user",
 parts {
   text: "A computer works by following instructions, called a program, which tells it what to do. These instructions are written in a special language that the computer can understand, and they are stored in the computer\'s memory. The computer\'s processor, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program\'s logic. The results of these calculations and decisions are then displayed on the computer\'s screen or stored in memory for later use.\n\nTo give you a simple analogy, imagine a computer as a chef following a recipe. The recipe is like the program, and the chef\'s actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).\n\nIn summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results."
 }
 role: "model"]
result = genai.embed_content(
    model = 'models/embedding-001',
    content = chat.history)

# 1 input > 1 vector output
for i,v in enumerate(result['embedding']):
  print(str(v)[:50], '... TRIMMED...')
[-0.014632266, -0.042202696, -0.015757175, 0.01548 ... TRIMMED...
[-0.010979066, -0.024494737, 0.0092659835, 0.00803 ... TRIMMED...
[-0.010055617, -0.07208932, -0.00011750793, -0.023 ... TRIMMED...
[-0.013921871, -0.03504407, -0.0051786783, 0.03113 ... TRIMMED...

Zaawansowane przypadki użycia

W kolejnych sekcjach omawiamy zaawansowane przypadki użycia i szczegóły niższego poziomu pakietu SDK Pythona dla interfejsu Gemini API.

Ustawienia bezpieczeństwa

Argument safety_settings umożliwia skonfigurowanie tego, co model blokuje i zezwala na blokowanie zarówno w promptach, jak i odpowiedziach. Domyślnie ustawienia bezpieczeństwa blokują treści o średnim lub wysokim prawdopodobieństwie, że mogą być niebezpieczne we wszystkich wymiarach. Dowiedz się więcej o ustawieniach bezpieczeństwa.

Wpisz budzący podejrzenie prompt i uruchom model z domyślnymi ustawieniami zabezpieczeń. Nie wyświetli on żadnych propozycji:

response = model.generate_content('[Questionable prompt here]')
response.candidates
[content {
  parts {
    text: "I\'m sorry, but this prompt involves a sensitive topic and I\'m not allowed to generate responses that are potentially harmful or inappropriate."
  }
  role: "model"
}
finish_reason: STOP
index: 0
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}
]

prompt_feedback poinformuje Cię, który filtr bezpieczeństwa zablokował prośbę:

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

Teraz wyślij ten sam prompt do modelu z nowo skonfigurowanymi ustawieniami zabezpieczeń. Możesz otrzymać odpowiedź.

response = model.generate_content('[Questionable prompt here]',
                                  safety_settings={'HARASSMENT':'block_none'})
response.text

Pamiętaj też, że każda kandydat ma własną właściwość safety_ratings, na wypadek gdyby prośba została zaakceptowana, ale poszczególne odpowiedzi nie przejdą kontroli bezpieczeństwa.

Kodowanie wiadomości

W poprzednich sekcjach korzystaliśmy z pakietu SDK, aby ułatwić wysyłanie promptów do interfejsu API. Ta sekcja zawiera w pełni wpisany tekst odpowiednik poprzedniego przykładu, dzięki czemu możesz lepiej poznać szczegóły niższego poziomu dotyczące kodowania wiadomości przez pakiet SDK.

Podstawą pakietu SDK Pythona jest biblioteka klienta google.ai.generativelanguage:

Pakiet SDK próbuje przekonwertować wiadomość na obiekt genai.protos.Content zawierający listę obiektów genai.protos.Part, z których każdy zawiera:

  1. a text (ciąg znaków)
  2. inline_data (genai.protos.Blob), gdzie obiekt blob zawiera binarne data i mime_type.

Możesz też przekazywać dowolne z tych zajęć w postaci słownika.

Pełny odpowiednik poprzedniego przykładu to:

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(
    genai.protos.Content(
        parts = [
            genai.protos.Part(text="Write a short, engaging blog post based on this picture."),
            genai.protos.Part(
                inline_data=genai.protos.Blob(
                    mime_type='image/jpeg',
                    data=pathlib.Path('image.jpg').read_bytes()
                )
            ),
        ],
    ),
    stream=True)
response.resolve()

to_markdown(response.text[:100] + "... [TRIMMED] ...")

Przygotowywanie posiłków to świetny sposób na zaoszczędzenie czasu i pieniędzy, a także może pomóc w zdrowym odżywianiu. Autor: ... [TRIMMED] ...

Rozmowy wieloetapowe

Widoczna wcześniej klasa genai.ChatSession może obsługiwać wiele przypadków użycia, ale przyjmuje pewne założenia. Jeśli Twój przypadek użycia nie pasuje do tej implementacji czatu, pamiętaj, że genai.ChatSession to tylko otoka wokół GenerativeModel.generate_content. Oprócz żądań pojedynczych może obsługiwać rozmowy wieloetapowe.

Poszczególne wiadomości są obiektami genai.protos.Content lub zgodnymi słownikami (jak opisano w poprzednich sekcjach). Ponieważ wiadomość jest dostępna w słowniku, wymagane są klucze role i parts. role w wątku może być usługą user, która odpowiada za prompty, lub funkcją model, która udziela odpowiedzi.

Przekaż listę obiektów genai.protos.Content. Zostanie on potraktowany jako czat wieloetapowy:

model = genai.GenerativeModel('gemini-1.5-flash')

messages = [
    {'role':'user',
     'parts': ["Briefly explain how a computer works to a young child."]}
]
response = model.generate_content(messages)

to_markdown(response.text)

Wyobraź sobie, że komputer to naprawdę mądry przyjaciel, który może pomóc Ci w wielu rzeczach. Komputer ma tak samo jak mózg, czyli procesor. To jak szef komputera, który mówi mu, co ma robić.

Wewnątrz komputera jest specjalne miejsce o nazwie „pamięć” – pełni ono rolę wielkiego pudełka na dane. Zapamiętuje wszystkie polecenia, które mu powiesz, np. otwarcie gry czy odtworzenie filmu.

Gdy naciskasz przyciski na klawiaturze lub klikasz elementy na ekranie za pomocą myszy, wysyłasz wiadomości do komputera. Komunikaty te przechodzą przez specjalne przewody, zwane kablami, do procesora.

Procesor odczytuje wiadomości i informuje komputer, co ma zrobić. Może otwierać programy, wyświetlać zdjęcia, a nawet odtwarzać muzykę.

Wszystkie elementy, które widzisz na ekranie, są tworzone przez kartę graficzną, która jest jak magiczny artysta działający w komputerze. Przetwarza instrukcje procesora i przekształca je w kolorowe zdjęcia i filmy.

Aby zapisywać ulubione gry, filmy czy zdjęcia, komputer używa specjalnej przestrzeni dyskowej zwanej dyskiem twardym. To jak ogromna biblioteka, w której komputer chroni wszystkie Twoje cenne rzeczy.

Z kolei gdy chcesz połączyć się z internetem, by zagrać ze znajomymi lub obejrzeć śmieszne filmy, komputer używa tzw. karty sieciowej, by wysyłać i odbierać wiadomości za pośrednictwem kabli internetowych lub sygnałów Wi-Fi.

Procesor, pamięć, karta graficzna, dysk twardy i karta sieciowa – tak samo jak mózg pomaga w nauce i graniu, sprawiają, że Twój komputer jest niezwykle mądrem przyjacielem i pomaga Ci robić niesamowite rzeczy.

Aby kontynuować rozmowę, dodaj odpowiedź i kolejną wiadomość.

messages.append({'role':'model',
                 'parts':[response.text]})

messages.append({'role':'user',
                 'parts':["Okay, how about a more detailed explanation to a high school student?"]})

response = model.generate_content(messages)

to_markdown(response.text)

Głównie komputer to komputer, który można zaprogramować do wykonywania zestawu instrukcji. Składa się z kilku podstawowych komponentów, które służą do przetwarzania, przechowywania i wyświetlania informacji:

1. Procesor (CPU): Mózg komputera. – Wykonuje instrukcje i wykonuje obliczenia. – prędkość mierzona w gigahercach (GHz). – Więcej GHz zwykle oznacza szybsze przetwarzanie.

2. Pamięć (RAM): – tymczasowa pamięć masowa na przetwarzane dane. - Instrukcje i dane przechowywane na czas działania programu. – mierzone w gigabajtach (GB). – Więcej GB pamięci RAM umożliwia jednoczesne działanie większej liczby programów.

3. Pamięć (HDD/SSD): – trwałe przechowywanie danych. – Przechowuje system operacyjny, programy i pliki użytkowników. – mierzone w gigabajtach (GB) lub terabajtach (TB). – Dyski twarde (HDD) są tradycyjne, wolniejsze i tańsze. – Dyski SSD są nowsze, szybsze i droższe.

4. Karta graficzna (GPU): – przetwarza i wyświetla obrazy. - Niezbędne przy grach, edycji filmów i innych zadaniach z dużą ilością grafiki. - Mierzona w pamięci RAM wideo (VRAM) i szybkości zegara.

5. Płyta główna: – łączy wszystkie komponenty. – Udostępnia funkcje i ścieżki komunikacyjne.

6. Urządzenia wejściowe/wyjściowe: – użytkownicy mogą korzystać z komputera. - Przykłady: klawiatura, mysz, monitor, drukarka.

7. System operacyjny: – oprogramowanie, które zarządza zasobami komputera. – Ma interfejs użytkownika i podstawowe funkcje. – Przykłady: Windows, macOS, Linux.

Po uruchomieniu programu na komputerze:

  1. Instrukcje programu są wczytywane z pamięci masowej.
  2. Procesor odczytuje instrukcje z pamięci i wykonuje je pojedynczo.
  3. Jeśli instrukcja obejmuje obliczenia, procesor je wykonuje przy użyciu jednostki arytmetycznej (AU).
  4. Jeśli instrukcja obejmuje dane, procesor odczytuje dane lub zapisuje je w pamięci.
  5. Wyniki obliczeń lub operacji na danych są przechowywane w pamięci.
  6. Jeśli program musi wyświetlić coś na ekranie, wysyła niezbędne dane do karty graficznej.
  7. Karta graficzna przetwarza dane i wysyła je do monitora, który je wyświetla.

Ten proces jest kontynuowany, dopóki program nie ukończy zadania lub nie zamknie go przez użytkownika.

Konfiguracja generowania

Argument generation_config umożliwia zmianę parametrów generowania. Każdy prompt, który wysyłasz do modelu, zawiera wartości parametrów, które kontrolują sposób generowania odpowiedzi przez model.

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(
    'Tell me a story about a magic backpack.',
    generation_config=genai.types.GenerationConfig(
        # Only one candidate for now.
        candidate_count=1,
        stop_sequences=['x'],
        max_output_tokens=20,
        temperature=1.0)
)
text = response.text

if response.candidates[0].finish_reason.name == "MAX_TOKENS":
    text += '...'

to_markdown(text)

Dawno, dawno temu w małym miasteczku pośród zielonych wzgórz mieszkała dziewczynka...

Co dalej

  • Projektowanie promptów to proces tworzenia promptów, które wywołują pożądaną odpowiedź od modeli językowych. Pisanie dobrze uporządkowanych promptów to kluczowy element zapewniania dokładnych i wysokiej jakości odpowiedzi z modelu językowego. Poznaj sprawdzone metody pisania promptów.
  • Gemini oferuje kilka wersji modelu, które spełniają różne potrzeby dotyczące na przykład typów danych wejściowych i złożoności, implementacji czatu lub innych zadań związanych z językiem okna dialogowego czy ograniczeń rozmiaru. Dowiedz się więcej o dostępnych modelach Gemini.
  • Gemini oferuje opcje wysyłania próśb o zwiększenie limitu stawek. Limit szybkości dla modeli Gemini-Pro to 60 żądań na minutę (RPM).