Gemini APIを使う

Gemini API: Quickstart with Pythonに従って、Pythonパッケージを

pip install google-generativeai

でインストールすれば、

import google.generativeai as genai

で使えるようになる。

Google AI StudioのAPI keysで「Create API key in new project」を選んでAPIキーを発行してもらう。キーは

export GOOGLE_API_KEY="..."

のようにして環境変数としておくと勝手に使ってもらえるが、うまくいかなければ

genai.configure(api_key="...")

で指定する。

list(genai.list_models())

と打ち込めば、使えるモデルが一覧できる。例:

[Model(name='models/chat-bison-001',
       base_model_id='',
       version='001',
       display_name='PaLM 2 Chat (Legacy)',
       description='A legacy text-only model optimized for chat conversations',
       input_token_limit=4096,
       output_token_limit=1024,
       supported_generation_methods=['generateMessage', 'countMessageTokens'],
       temperature=0.25,
       top_p=0.95,
       top_k=40),
 Model(name='models/text-bison-001',
       base_model_id='',
       version='001',
       display_name='PaLM 2 (Legacy)',
       description='A legacy model that understands text and generates text as an output',
       input_token_limit=8196,
       output_token_limit=1024,
       supported_generation_methods=['generateText', 'countTextTokens', 'createTunedTextModel'],
       temperature=0.7,
       top_p=0.95,
       top_k=40),
 Model(name='models/embedding-gecko-001',
       base_model_id='',
       version='001',
       display_name='Embedding Gecko',
       description='Obtain a distributed representation of a text.',
       input_token_limit=1024,
       output_token_limit=1,
       supported_generation_methods=['embedText', 'countTextTokens'],
       temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/gemini-1.0-pro',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro',
       description='The best model for scaling across a wide range of tasks',
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       top_p=1.0,
       top_k=1),
 Model(name='models/gemini-1.0-pro-001',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro 001 (Tuning)',
       description=('The best model for scaling across a wide range of tasks. This is a stable '
                    'model that supports tuning.'),
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'],
       temperature=0.9,
       top_p=1.0,
       top_k=1),
 Model(name='models/gemini-1.0-pro-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Latest',
       description=('The best model for scaling across a wide range of tasks. This is the latest '
                    'model.'),
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       top_p=1.0,
       top_k=1),
 Model(name='models/gemini-1.0-pro-vision-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Vision',
       description='The best image understanding model to handle a broad range of applications',
       input_token_limit=12288,
       output_token_limit=4096,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.4,
       top_p=1.0,
       top_k=32),
 Model(name='models/gemini-1.5-pro-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Pro',
       description='Mid-size multimodal model that supports up to 1 million tokens',
       input_token_limit=1048576,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       top_p=0.95,
       top_k=None),
 Model(name='models/gemini-pro',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro',
       description='The best model for scaling across a wide range of tasks',
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       top_p=1.0,
       top_k=1),
 Model(name='models/gemini-pro-vision',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Vision',
       description='The best image understanding model to handle a broad range of applications',
       input_token_limit=12288,
       output_token_limit=4096,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.4,
       top_p=1.0,
       top_k=32),
 Model(name='models/embedding-001',
       base_model_id='',
       version='001',
       display_name='Embedding 001',
       description='Obtain a distributed representation of a text.',
       input_token_limit=2048,
       output_token_limit=1,
       supported_generation_methods=['embedContent'],
       temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/text-embedding-004',
       base_model_id='',
       version='004',
       display_name='Text Embedding 004',
       description='Obtain a distributed representation of a text.',
       input_token_limit=2048,
       output_token_limit=1,
       supported_generation_methods=['embedContent'],
       temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/aqa',
       base_model_id='',
       version='001',
       display_name='Model that performs Attributed Question Answering.',
       description=('Model trained to return answers to questions that are grounded in provided '
                    'sources, along with estimating answerable probability.'),
       input_token_limit=7168,
       output_token_limit=1024,
       supported_generation_methods=['generateAnswer'],
       temperature=0.2,
       top_p=1.0,
       top_k=40)]

models/ は省略できるようだ。'gemini-1.5-pro-latest' を使って何か聞いてみよう:

model = genai.GenerativeModel('gemini-1.5-pro-latest')

response = model.generate_content("What is the meaning of life?")
print(response.text)

もし検閲に引っかかるようなら response.prompt_feedback を表示してみれば詳細がわかる。

上の方法では一つしか質問できない。会話は、次のようにする。

model = genai.GenerativeModel('gemini-1.5-pro-latest')

chat = model.start_chat(history=[])
response = chat.send_message("What is your knowledge cutoff?")
print(response.text)
response = chat.send_message("What are reputable news sources?")
print(response.text)
...

会話全体は chat.history で参照できる。

for h in chat.history:
    print(f"[{h.role}]\n{h.parts[0].text}")

温度(ランダムさの度合い)などを指定することもできる:

config = genai.GenerationConfig(temperature=0)
model = genai.GenerativeModel('gemini-1.5-pro-latest',
                              generation_config=config)