logo
Loading...

Google Gemini API key 調用 - 生成式AI從No-Code到Low-Code開發與應用四部曲 - Cupoy

Prerequisite 對 Gemini 有興趣的同學, 可以先一起看google deepmin對Gemini出的技術報告和宣傳影片,上課時再帶大家一起讀: 技術報告:Gemini: A Fam...

Prerequisite 對 Gemini 有興趣的同學, 可以先一起看google deepmin對Gemini出的技術報告和宣傳影片,上課時再帶大家一起讀: 技術報告:Gemini: A Family of Highly Capable Multimodal Models 影片: Gemini API key 這篇快速入門指南展示了如何使用 Gemini API 的 Python SDK,讓您可以存取 Google 的 Gemini 大型語言模型。在這個快速入門中,您將學習如何: 設定您的開發環境和 API 存取權限,以使用 Gemini。 從文本輸入生成文本回應。 從多模態輸入(文本和圖像)生成文本回應。 使用 Gemini 進行多回合對話(聊天)。 使用大型語言模型的嵌入功能。 先決條件 您可以在 Google Colab 中執行這個快速入門,直接在瀏覽器中運行此筆記本,不需要額外配置環境。或者,若要在本地完成此快速入門,請確保您的開發環境符合以下要求: Python 3.9+ 安裝 jupyter 以運行筆記本。 安裝 安裝 Python SDK Gemini API 的 Python SDK 包含在 google-generativeai 包中。使用 pip 安裝依賴項: !pip install -q -U google-generativeai 導入包 導入必要的包。 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)) # 用於安全存儲您的 API 鑰匙 from google.colab import userdata 設定您的 API 鑰匙 在使用 Gemini API 之前,您首先需要獲得一個 API 鑰匙。如果您還沒有,可以在 Google AI Studio 中一鍵創建鑰匙。 在 Colab 中,將鑰匙添加到左側面板中的密碼管理器中。給它命名為 GOOGLE_API_KEY。 一旦擁有 API 鑰匙,就可以將它傳遞給 SDK 了。 或使用 os.getenv('GOOGLE_API_KEY') 來獲取一個環境變量。 GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY) 列出模型 現在您已經準備好調用 Gemini API 了。使用 list_models 來查看可用的 Gemini 模型: gemini-pro:優化用於僅文本提示。 gemini-pro-vision:優化用於文本和圖像提示。 for m in genai.list_models():  if 'generateContent' in m.supported_generation_methods:    print(m.name) 注意: 要獲得有關可用模型的詳細信息,包括它們的功能和限制,請參見 Gemini 模型。如果您需要請求 提高速率限制,Gemini-Pro 模型的速率限制為每分鐘 60 次請求(RPM)。 genai 包還支持 PaLM 系列模型,但只有 Gemini 模型支持 generateContent 方法的通用、多模態功能。 從文本輸入生成文本 對於僅文本提示,使用 gemini-pro 模型: model = genai.GenerativeModel('gemini-pro') generate_content 方法可以處理各種用例,包括多回合聊天和多模態輸入,這取決於底層模型支持什麼。可用的模型僅支持文本和圖像作為輸入,並且文本作為輸出。在最簡單的情況下,您可以將提示字符串傳遞給 GenerativeModel.generate_content 方法: # Commented out IPython magic to ensure Python compatibility. # %%time # response = model.generate_content("What is the meaning of life?") 在簡單的情況下,response.text 存取器就是您需要的全部。要顯示格式化的 Markdown 文本,請使用 to_markdown 函數: to_markdown(response.text) 如果 API 未能返回結果,請使用 GenerateContentRespose.prompt_feedback 查看是否由於安全考慮而阻止了提示。 Gemini 可以為單一提示生成多個可能的回應。這些可能的回應稱為 candidates,您可以審查它們以選擇最合適的回應作為回應。 使用 GenerateContentResponse.candidates 查看回應候選者: response.candidates 默認情況下,模型在完成整個生成過程後返回一個回應。您也可以流式傳輸回應,模型將在生成回應的各個塊時立即返回它們。 要流式傳輸回應,請使用 GenerativeModel.generate_content(..., stream=True)。 # Commented out IPython magic to ensure Python compatibility. # %%time # response = model.generate_content("What is the meaning of life?", stream=True) for chunk in response:  print(chunk.text)  print("_"*80) 當流式傳輸時,某些回應屬性在您遍歷完所有回應塊之前是不可用的。這在下面展示了: response = model.generate_content("What is the meaning of life?", stream=True) prompt_feedback 屬性有效: response.prompt_feedback 但像 GenerateContentResponse.text 這樣的屬性則不行: try:  response.text except Exception as e:  print(f'{type(e).__name__}: {e}') 從圖像和文本輸入生成文本 Gemini 提供了一個多模態模型 (gemini-pro-vision),它接受文本和圖像作為輸入。GenerativeModel.generate_content API 設計用於處理多模態提示,並返回文本輸出。 讓我們包含一個圖像: !curl -o image.jpg import PIL.Image img = PIL.Image.open('image.jpg') img 使用 gemini-pro-vision 模型並將圖像傳遞給模型與 generate_content。 model = genai.GenerativeModel('gemini-pro-vision') response = model.generate_content(img) to_markdown(response.text) 要在提示中提供文本和圖像,請傳遞包含字符串和圖像的列表: 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) 聊天對話 Gemini 允許您進行自由形式的多回合對話。ChatSession 類簡化了過程,通過管理對話的狀態,與 generate_content 不同,您不必存儲對話歷史作為列表。 初始化聊天 model = genai.GenerativeModel('gemini-pro') chat = model.start_chat(history=[]) chat 注意 視覺模型 gemini-pro-vision 未針對多回合聊天進行優化。 ChatSession.send_message 方法返回與 GenerativeModel.generate_content 相同的 GenerateContentResponse 類型。它還將您的消息和回應追加到聊天歷史中: response = chat.send_message("In one sentence, explain how a computer works to a young child.") to_markdown(response.text) chat.history 您可以繼續發送消息以繼續對話。使用 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) glm.Content 對象包含一個 glm.Part 對象的列表,每個對象都包含文本(字符串)或 inline_data(glm.Blob),其中 blob 包含二進制數據和 mime_type。聊天歷史作為 ChatSession.history 中的 glm.Content 對象列表可用: for message in chat.history:  display(to_markdown(f'**{message.role}**: {message.parts[0].text}')) 計算tokens 大型語言模型有一個上下文窗口,上下文長度通常以 令牌數量 來衡量。使用 Gemini API,您可以確定任何 glm.Content 對象的令牌數量。在最簡單的情況下,您可以將查詢字符串傳遞給 GenerativeModel.count_tokens 方法,如下所示: model.count_tokens("What is the meaning of life?") 同樣,您可以檢查 token_count 以獲取您的 ChatSession: model.count_tokens(chat.history) 使用嵌入 嵌入 是一種技術,用於將信息表示為數組中的一系列浮點數。使用 Gemini,您可以將文本(單詞、句子和文本塊)以向量化形式表示,使得更容易比較和對比嵌入。例如,兩個共享相似主題或情感的文本應該具有相似的嵌入,可以通過余弦相似度等數學比較技術來識別。有關如何以及為什麼使用嵌入的更多信息,請參閱 嵌入指南。 使用 embed_content 方法生成嵌入。該方法處理以下任務(task_type)的嵌入: | RETRIVAL_QUERY | 指定給定的文本是搜索/檢索設置中的查詢。 || RETRIVAL_DOCUMENT | 指定給定的文本事搜索/ | 檢索設置中的文檔。使用此任務類型需要一個 title。 SEMANTIC_SIMILARITY | 指定給定的文本將用於語義文本相似性(STS)。 CLASSIFICATION | 指定嵌入將用於分類。 CLUSTERING | 指定嵌入將用於聚類。 以下為單個字符串生成文檔檢索的嵌入: 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個輸入 > 1個向量輸出 print(str(result['embedding'])[:50], '... TRIMMED]') 注意 retrieval_document 任務類型是唯一接受標題的任務。 要處理字符串批次,請在 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") # 一個輸入列表 > 一個向量列表輸出 for v in result['embedding']:  print(str(v)[:50], '... TRIMMED ...') 雖然 genai.embed_content 函數接受簡單的字符串或字符串列表,但它實際上是圍繞 glm.Content 類型構建的(如 GenerativeModel.generate_content)。glm.Content 對象是 API 中對話的主要單位。 雖然 glm.Content 對象是多模態的,但 embed_content 方法僅支持文本嵌入。這種設計給了 API 可能性 擴展到多模態嵌入。 response.candidates[0].content result = genai.embed_content(    model = 'models/embedding-001',    content = response.candidates[0].content) # 1個輸入 > 1個向量輸出 print(str(result['embedding'])[:50], '... TRIMMED ...') 同樣,聊天歷史包含一個 glm.Content 對象列表,您可以直接將其傳遞給 embed_content 函數:chat.history result = genai.embed_content(    model = 'models/embedding-001',    content = chat.history) # 1個輸入 > 1個向量輸出 for i,v in enumerate(result['embedding']):  print(str(v)[:50], '... TRIMMED...') 高級用例 以下部分討論了 Gemini API 的 Python SDK 的高級用例和底層細節。 安全設置 safety_settings 參數允許您配置模型在提示和回應中阻止和允許的內容。默認情況下,安全設置會阻止所有維度中具有中等和/或高概率的不安全內容。了解更多關於 安全設置。 輸入一個可疑的提示,並使用默認的安全設置運行模型,它將不會返回任何候選者: response = model.generate_content('[Questionable prompt here]') response.candidates prompt_feedback 會告訴您哪個安全過濾器阻止了提示: response.prompt_feedback 現在使用新配置的安全設置提供相同的提示給模型,您可能會得到一個回應。 response = model.generate_content('[Questionable prompt here]',                                  safety_settings={'HARASSMENT':'block_none'}) response.text 也請注意,每個候選者都有自己的 safety_ratings,以防提示通過但個別回應未通過安全檢查。 編碼消息 前面的部分依賴於 SDK,使您能夠輕鬆地將提示發送到 API。本節提供了與前面示例等效的完全類型示例,以便您更好地了解有關 SDK 如何編碼消息的底層細節。SDK 的底層是 google.ai.generativelanguage 客戶端庫: import google.ai.generativelanguage as glm SDK 嘗試將您的消息轉換為 glm.Content 對象,該對象包含一個 glm.Part 對象列表,每個對象都包含: 文本(字符串) inline_data(glm.Blob),其中 blob 包含二進制 data 和 mime_type。 您還可以將這些類作為等效字典傳遞。注意:唯一接受的 mime 類型是一些圖像類型,image/*。因此,前面示例的完全類型等效為: model = genai.GenerativeModel('gemini-pro-vision') response = model.generate_content(    glm.Content(        parts = [            glm.Part(text="Write a short, engaging blog post based on this picture."),            glm.Part(                inline_data=glm.Blob(                    mime_type='image/jpeg',                    data=pathlib.Path('image.jpg').read_bytes()                )            ),        ],    ),    stream=True) response.resolve() to_markdown(response.text[:100] + "... [TRIMMED] ...") 多回合對話 雖然之前顯示的 genai.ChatSession 類可以處理許多用例,但它確實做了一些假設。如果您的用例不適合這種聊天實現,請記住 genai.ChatSession 只是 GenerativeModel.generate_content 的一個封裝。除了單個請求外,它還可以處理多回合對話。 個別消息是 glm.Content 對象或兼容字典,如前面的部分所見。作為字典,消息需要 role 和 parts 鍵。對話中的 role 可以是 user,提供提示,或 model,提供回應。將一個 glm.Content 對象列表傳遞,它將被視為多回合聊天: model = genai.GenerativeModel('gemini-pro') messages = [    {'role':'user',     'parts': ["Briefly explain how a computer works to a young child."]} ] response = model.generate_content(messages) to_markdown(response.text) 要繼續對話,添加回應和另一條消息。注意:對於多回合對話,您需要在每次請求時發送整個對話歷史。API 是 無狀態 的。 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) 生成配置 generation_config 參數允許您修改生成參數。您發送給模型的每個提示都包含控制模型如何生成回應的參數值。 model = genai.GenerativeModel('gemini-pro') response = model.generate_content(    'Tell me a story about a magic backpack.',    generation_config=genai.types.GenerationConfig(        # 現在僅一個候選者。        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) 下一步 提示設計是創建能從語言模型中引出所需回應的提示的過程。編寫結構良好的提示是確保從語言模型獲得準確、高質量回應的重要部分。了解有關 提示寫作 的最佳實踐。 Gemini 提供了多種模型變體,以滿足不同用例的需求,如輸入類型和復雜性、聊天或其他對話語言任務的實現以及大小限制。了解有關可用的 Gemini 模型。 Gemini 提供了請求 提高速率限制 的選項。Gemini-Pro 模型的速率限制為每分鐘 60 次請求(RPM)。