Samouczek: pierwsze kroki z interfejsem Gemini API


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

Z tego krótkiego wprowadzenia dowiesz się, jak używać pakietu SDK Pythona w interfejsie Gemini API. Dzięki temu masz dostęp do dużych modeli językowych Gemini (Google). Z tego krótkiego wprowadzenia dowiesz się, jak:

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

Wymagania wstępne

Możesz uruchomić to krótkie wprowadzenie w Google Colab, który uruchamia ten notatnik bezpośrednio w przeglądarce i nie wymaga dodatkowej konfiguracji środowiska.

Możesz też przeprowadzić to krótkie wprowadzenie lokalnie, upewniając się, że Twoje środowisko programistyczne spełnia te wymagania:

  • Python w wersji 3.9 lub nowszej
  • Instalacja programu jupyter w celu uruchomienia notatnika.

Konfiguracja

Zainstaluj pakiet SDK Pythona

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

pip install -q -U google-generativeai

Importuj pakiety

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 móc korzystać z Gemini API, musisz najpierw uzyskać klucz 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. Nazwij go GOOGLE_API_KEY.

Po uzyskaniu klucza interfejsu API przekaż go do pakietu SDK. Można to zrobić na dwa sposoby:

  • Umieść ten klucz w zmiennej środowiskowej GOOGLE_API_KEY (pakiet SDK automatycznie go stamtąd pobierze).
  • Przekaż klucz urządzeniu 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 wywołać interfejs Gemini API. Użyj pola list_models, aby wyświetlić dostępne modele Gemini:

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

Generowanie tekstu na podstawie danych wejściowych

W przypadku promptów tekstowych użyj modelu Gemini 1.5 lub Gemini 1.0 Pro:

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

Metoda generate_content sprawdzi się w różnych przypadkach użycia, w tym w czacie wieloetapowym i w trybie multimodalnym w zależności od tego, co obsługuje model bazowy. Dostępne modele obsługują tylko tekst i obrazy jako dane wejściowe oraz 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 budziło wątpliwości ludzi na przestrzeni wieków, kultur i kontynentów. Chociaż nie ma powszechnie uznawanej odpowiedzi, przedstawiono wiele pomysłów, a reakcja często zależy od indywidualnych idei, przekonań i doświadczeń życiowych.

  1. Radość i dobre samopoczucie: wiele osób uważa, że celem życia jest osiągnięcie osobistego szczęścia i dobrego samopoczucia. Może to obejmować znajdowanie poszukiwań, które są źródłem radości, nawiązywanie bliskich więzi, dbanie o zdrowie fizyczne i psychiczne oraz osiąganie osobistych celów i zainteresowań.

  2. Znaczący wkład: niektórzy uważają, że celem życia jest wniesienie istotnego wkładu w świat. Może to obejmować wykonywanie zawodu korzystnego dla innych, angażowanie się w wolontariat lub działalność charytatywną, tworzenie sztuki lub literatury albo wymyślanie.

  3. Samorealizacja i rozwój osobisty: dążenie do samorealizacji i rozwoju osobistego to kolejny typowy cel w życiu. Może to wymagać nauki nowych umiejętności, przekraczania własnych barier, pokonywania osobistych przeszkód i rozwijania się jako człowiek.

  4. Etyczne i moralne zachowanie: niektórzy uważają, że celem życia jest etyczne i moralne postępowanie. Może to wymagać przestrzegania własnych zasad moralnych, podejmowania odpowiednich działań nawet w trudnych sytuacjach i prób zmieniania świata na lepsze.

  5. Duchowe spełnienie: dla niektórych cel życia jest powiązany z przekonaniami duchowymi lub religijnymi. Może to obejmować poszukiwanie więzi z większą mocą, praktykowanie religijnych rytuałów lub postępowanie z nauką duchową.

  6. Doświadczanie pełni życia: niektórzy uważają, że celem życia jest doświadczanie wszystkiego, co ma do zaoferowania. Mogą obejmować podróżowanie, próbowanie nowych rzeczy, podejmowanie ryzyka i nawiązywanie nowych kontaktów.

  7. Dziedzictwo i wpływ: inni uważają, że celem życia jest pozostawienie trwałego dziedzictwa i wpływ na świat. Może to obejmować zrobienie czegoś godnego uwagi, zapamiętanie czyjegoś wkładu albo inspirowanie i motywowanie innych.

  8. Znajdowanie równowagi i harmonii: dla niektórych celem życie jest znalezienie równowagi i harmonii we wszystkich aspektach życia. Może to wymagać żonglowania obowiązkami osobistymi, zawodowymi i społecznymi, poszukiwania wewnętrznego spokoju i zadowolenia oraz prowadzenia życia zgodnego z własnymi wartościami i przekonaniami.

Ostatecznie sens życia to osobista podróż, a różne osoby mogą odkryć własny, unikalny cel przez swoje doświadczenia, refleksje i interakcje z otaczającym je światem.

Jeśli interfejs API nie zwrócił wyniku, użyj metody GenerateContentResponse.prompt_feedback, aby sprawdzić, czy dostęp został zablokowany ze względu na problemy z bezpieczeństwem promptu.

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ą odpowiedź.

Wyświetl kandydaci odpowiedzi za pomocą narzędzia 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ż transmitować odpowiedź podczas jej generowania – model zwróci jej fragmenty zaraz po ich wygenerowaniu.

Aby przesyłać odpowiedzi strumieniowo, 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 strumieniowego przesyłania danych niektóre atrybuty odpowiedzi są niedostępne, dopóki nie wykonasz iteracji wszystkich fragmentów odpowiedzi. Oto przykład:

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

Atrybut prompt_feedback działa:

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 danych wejściowych z obrazem i tekstem

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

Jeśli prompt zawiera zarówno tekst, jak i obrazy, do wygenerowania tekstu wyjściowego użyj Gemini 1.5 z metodą GenerativeModel.generate_content:

Dołączmy 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)

Dania z kurczaka teriyaki z brązowym ryżem, pieczonymi brokułami i paprykami.

Aby podać w prompcie zarówno tekst, jak i obrazy, przekaż listę zawierającą ciągi 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 na zdrowe odżywianie. To świetny przykład zdrowego i pysznego posiłku, który można łatwo przygotować wcześniej.

To danie składa się z brązowego ryżu, pieczonych warzyw i kurczaka teriyaki. Brązowy ryż to pełne zboża bogate w błonnik i składniki odżywcze. Pieczone warzywa to świetny sposób na dostarczanie codziennej dawki witamin i minerałów. Z kolei teriyaki z kurczaka to bogate źródło białka o bogatym smaku.

Ten posiłek można przygotować z wyprzedzeniem. Wystarczy ugotować brązowy ryż, upiec warzywa i przygotować kurczaka teriyaki. Następnie podziel posiłek na kilka pojemników i przechowuj je w lodówce. Aby coś zjeść, po prostu bierz pojemnik i podgrzej go.

To doskonały wybór dla zapracowanych osób, które szukają zdrowego i smacznego jedzenia. Jest to również wspaniał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 łatwo przygotować wcześniej, to jest doskonały wybór. Spróbuj już dziś!

Rozmowy na czacie

Gemini umożliwia swobodne prowadzenie rozmów na różnych etapach. Zajęcia w ChatSession upraszczają ten proces, zarządzając stanem rozmowy, więc w przeciwieństwie do generate_content nie musisz zapisywać historii rozmowy w formie 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. Twoja wiadomość i odpowiedź są też dodawane 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 inteligentna maszyna, która rozumie i wykonuje nasze instrukcje, 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"]

Aby kontynuować rozmowę, możesz nadal wysyłać wiadomości. Aby przesyłać strumieniowo 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 element inline_data (genai.protos.Blob), gdzie blob zawiera dane binarne i obiekt mime_type. Historia czatu jest dostępna jako lista 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 młodym dzieckiem.

model: Komputer jest jak bardzo inteligentna maszyna, która rozumie i wykonuje nasze instrukcje, pomaga nam w pracy, a nawet gra z nami w gry.

user: A może bardziej szczegółowe wyjaśnienie dla liceum?

model: komputer działa na podstawie instrukcji zwanych programem. Instrukcje są napisane w specjalnym języku zrozumiałym dla komputera i są przechowywane w jego pamięci. Procesor lub procesor komputera, odczytuje instrukcje z pamięci i przeprowadza je, wykonując obliczenia i podejmując decyzje na podstawie logiki programu. Wyniki tych obliczeń i decyzji są następnie wyświetlane na ekranie komputera lub zapisywane w pamięci do późniejszego wykorzystania.

Wyobraź sobie prostą analogię, wyobraź sobie, że komputer jest szefem kuchni przestrzegającym określonego przepisu. Przepis jest jak program, a działania szefa kuchni – instrukcje, które wykonuje komputer. Szef odczytuje przepis (program) i wykonuje różne działania, takie jak zebranie składników (pobieranie danych z pamięci), mieszanie ich (obliczenia) i gotowanie (przetwarzanie danych). Ostatnie danie (dane wyjściowe) jest podawane na talerzu (ekranie komputera).

Podsumowując, komputer wykonuje szereg instrukcji przechowywanych w pamięci, aby wykonywać obliczenia, podejmować decyzje i wyświetlać lub przechowywać wyniki.

Policz tokeny

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

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

Możesz też sprawdzić token_count dla: ChatSession:

model.count_tokens(chat.history)
total_tokens: 501

Korzystanie z wektorów dystrybucyjnych

Umieszczanie to technika używana do przedstawiania informacji w postaci listy liczb zmiennoprzecinkowych w tablicy. Za pomocą Gemini możesz przedstawiać tekst (słowa, zdania i bloki tekstu) w postaci wektorowej, co ułatwia porównywanie reprezentacji właściwościowych. Na przykład 2 teksty o podobnej tematyce lub odczuciach powinny mieć podobne reprezentacje właściwościowe, które można zidentyfikować za pomocą technik porównań matematycznych, takich jak podobieństwo cosinusowe. Więcej informacji o tym, jak i dlaczego warto korzystać z reprezentacji właściwościowych, znajdziesz w przewodniku dotyczącym reprezentacji właściwościowych.

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

Typ zadania Opis
RETRIEVAL_QUERY Określa, że dany tekst jest zapytaniem w ustawieniach wyszukiwania/pobierania.
RETRIEVAL_DOCUMENT Określa, że dany tekst jest dokumentem w ustawieniu wyszukiwania/pobierania. Użycie tego typu zadania wymaga: title.
SEMANTIC_SIMILARITY Określa, który tekst będzie używany na potrzeby funkcji podobieństwo semantycznego (STS).
KLASYFIKACJA Określa, że wektory dystrybucyjne będą używane do klasyfikacji.
KLASTEROWANIE Określa, że wektory dystrybucyjne będą używane do grupowania.

To spowoduje wygenerowanie wektora dystrybucyjnego dla pojedynczego ciągu tekstowego 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ć partie ciągów znaków, przekaż listę ciągów w 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 lub listy ciągów znaków, ale w rzeczywistości opiera się na typie genai.protos.Content (np. GenerativeModel.generate_content). Obiekty genai.protos.Content to podstawowe jednostki w wątku w interfejsie API.

Obiekt genai.protos.Content jest multimodalny, a metoda embed_content obsługuje tylko wektory dystrybucyjne tekstu. Taka konstrukcja zapewnia interfejsowi API możliwość rozwijania się na wektory dystrybucyjne 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 ...

Podobnie historia czatu zawiera 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 poniższych 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 pozwala określić, co model blokuje i na które zezwala w promptach i odpowiedziach. Domyślnie ustawienia bezpieczeństwa blokują treści, które o średnim stopniu lub wysokim prawdopodobieństwie mogą być niebezpieczne, we wszystkich wymiarach. Dowiedz się więcej o ustawieniach bezpieczeństwa.

Wpisz wątpliwy prompt i uruchom model z domyślnymi ustawieniami zabezpieczeń – nie zwróci on żadnych kandydatów:

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 prześ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żdy kandydat ma własne safety_ratings na wypadek, gdyby prośba została zaliczona, ale poszczególne odpowiedzi nie przejdą kontroli bezpieczeństwa.

Kodowanie wiadomości

Poprzednie sekcje polegały na pakiecie SDK, aby ułatwić Ci wysyłanie promptów do interfejsu API. Ta sekcja zawiera pełny typowy odpowiednik poprzedniego przykładu, dzięki czemu lepiej zrozumiesz szczegóły niższego poziomu dotyczące sposobu kodowania wiadomości przez pakiet SDK.

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

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

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

Można również przekazać dowolną z tych klas jako równoważny słownik.

Tak więc 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 na zdrowe odżywianie. Przez ... [WYRÓŻNIONY] ...

Rozmowy wieloetapowe

Pokazana 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 kod GenerativeModel.generate_content. Może też obsługiwać rozmowy wieloetapowe, a nie tylko pojedyncze żądania.

Pojedyncze wiadomości to obiekty genai.protos.Content lub zgodne słowniki (jak w poprzednich sekcjach). Jako słownik wiadomość wymaga kluczy role i parts. Pole role w wątku może być polem user (wyświetlającym prompty) lub model (do dodawania odpowiedzi).

Po przesłaniu listy genai.protos.Content obiektu będzie on traktowany 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 komputer jako naprawdę inteligentnego przyjaciela, który może Ci pomóc w wielu sprawach. Komputer ma mózg i umożliwia myślenie i uczenie się. To jak szef komputera, który każe mu, co ma robić.

W komputerze znajduje się szczególne miejsce o nazwie „pamięć”, które przypomina duże pudełko na dane. Zapamiętuje wszystkie Twoje polecenia, takie jak otwieranie gier czy oglądanie filmów.

Naciśnięcie przycisków na klawiaturze lub klikanie elementów na ekranie za pomocą myszy powoduje wysłanie wiadomości do komputera. Komunikaty te są przesyłane do procesora specjalnymi przewodami (nazywanymi kablami).

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

Wszystko, co widzisz na ekranie, jest tworzone przez kartę graficzną, która jest jak magiczny artysta działający w komputerze. Na podstawie instrukcji procesora przekształca je w kolorowe zdjęcia i filmy.

Aby zapisywać ulubione gry, filmy i zdjęcia, komputer używa specjalnego miejsca na dysku twardego. To jak ogromna biblioteka, w której komputer może bezpiecznie przechowywać wszystkie cenne rzeczy.

A gdy chcesz połączyć się z internetem, aby pograć ze znajomymi lub obejrzeć śmieszny film, komputer używa czegoś, co nazywamy kartą sieciową, do wysyłania i odbierania wiadomości za pomocą kabli internetowych lub sygnałów Wi-Fi.

Tak jak mózg pomaga w nauce i rozgrywce, procesor, pamięć, karta graficzna, dysk twardy i karta sieciowa komputera współpracują ze sobą, aby można było robić z komputerem 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)

Zasadniczo komputer to maszyna, którą można zaprogramować tak, aby wykonała zestaw instrukcji. Składa się z kilku istotnych komponentów, które współdziałają przy przetwarzaniu, przechowywaniu i wyświetlaniu 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 do przetwarzania danych. - Zapisuje instrukcje i dane podczas działania programu. – mierzone w gigabajtach (GB). - Więcej GB pamięci RAM umożliwia równoczesne działanie większej liczby programów.

3. Pamięć (HDD/SSD): – trwałe miejsce na dane. – Przechowuje system operacyjny, programy i pliki użytkowników. – Ilość jest mierzona 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ędny do grania, edytowania filmów i innych zadań wymagających dużej mocy graficznej. – Ta wartość jest mierzona w ramach pamięci RAM (VRAM) i prędkości zegara.

5. Płyta główna: – umożliwia połączenie wszystkich komponentów. – zapewnia kanały zasilania i komunikację.

6. Urządzenia wejściowe/wyjściowe (I/O): – umożliwiają użytkownikowi interakcję z komputerem. – Przykłady: klawiatura, mysz, monitor, drukarka.

7. System operacyjny: oprogramowanie do zarządzania zasobami komputera. – Zawiera interfejs użytkownika i podstawowe funkcje. – Przykłady: Windows, macOS, Linux.

Po uruchomieniu programu na komputerze:

  1. Instrukcje programu są wczytywane z nośnika do pamięci.
  2. Procesor odczytuje instrukcje z pamięci i wykonuje je pojedynczo.
  3. Jeśli instrukcja obejmuje obliczenia, procesor wykonuje je, używając swojej jednostki arytmetycznej (ALU).
  4. Jeśli instrukcja obejmuje dane, procesor odczytuje lub zapisuje w pamięci.
  5. Wyniki obliczeń lub manipulacji danymi 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 trwa, dopóki program nie zakończy zadania lub użytkownik go nie zakończy.

Konfiguracja generowania

Argument generation_config umożliwia zmianę parametrów generowania. Każdy prompt wysyłany 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 otoczonym bujnymi zielonymi wzgórzami żyła pewna dziewczynka o imieniu...

Co dalej

  • Projektowanie to proces tworzenia promptów, które wywołują pożądaną odpowiedź z modeli językowych. Tworzenie dobrze uporządkowanych promptów jest kluczowym elementem zapewniania dokładnych, wysokiej jakości odpowiedzi na podstawie modelu językowego. Poznaj sprawdzone metody pisania promptów.
  • Gemini oferuje kilka wersji modelu dostosowanych do różnych przypadków użycia, takich jak typy danych wejściowych i złożoność, implementacje dla zadań związanych z czatem lub innymi językami dialogów oraz ograniczenia rozmiaru. Dowiedz się więcej o dostępnych modelach Gemini.