開始在 Swift 應用程式中使用 Gemini API

本教學課程說明如何使用 Google AI Swift SDK 直接從 Swift 應用程式存取 Gemini API。如果您不想直接與 REST API 或伺服器端程式碼 (例如 Python) 搭配使用,以存取 Swift 應用程式中的 Gemini 模型,則可使用這個 SDK。

在本教學課程中,您將瞭解如何執行下列操作:

此外,本教學課程包含進階用途的相關章節 (例如計算符記),以及控管內容產生功能的選項。

必要條件

本教學課程假設您已熟悉使用 Xcode 開發 Swift 應用程式。

如要完成本教學課程,請確保您的開發環境和 Swift 應用程式符合下列需求:

  • Xcode 15.0 或更高
  • Swift 應用程式必須指定 iOS 15 以上版本或 macOS 12 以上版本。

設定專案

呼叫 Gemini API 之前,您需要設定 Xcode 專案,包括設定 API 金鑰、將 SDK 套件新增至 Xcode 專案,以及初始化模型。

設定 API 金鑰

如要使用 Gemini API,您必須具備 API 金鑰。如果您還沒有金鑰 請在 Google AI Studio 中建立金鑰

取得 API 金鑰

保護 API 金鑰安全

強烈建議您「不要」將 API 金鑰登錄到版本管控系統中。另一種替代方法是將其儲存在 GenerativeAI-Info.plist 檔案中,然後從 .plist 檔案中讀取 API 金鑰。請務必將這個 .plist 檔案放在應用程式的根資料夾,並從版本管控中排除。

您也可以查看範例應用程式,瞭解如何將 API 金鑰儲存在 .plist 檔案中。

本教學課程中的所有程式碼片段假設您您正在從這個隨選資源 .plist 檔案存取 API 金鑰。

將 SDK 套件新增至專案

如要在自己的 Swift 應用程式中使用 Gemini API,請將 GoogleGenerativeAI 套件新增至應用程式:

  1. 在 Xcode 中,在專案導覽器中的專案上按一下滑鼠右鍵。

  2. 選取內容選單中的「Add Packages」

  3. 在「Add Packages」對話方塊中,將套件網址貼到搜尋列中:

    https://github.com/google/generative-ai-swift
    
  4. 按一下「Add Package」。Xcode 現在會在專案中新增 GoogleGenerativeAI 套件。

初始化生成式模型

您必須先初始化生成式模型,才能呼叫任何 API 呼叫。

  1. 匯入 GoogleGenerativeAI 模組:

    import GoogleGenerativeAI
    
  2. 初始化生成式模型:

    // Access your API key from your on-demand resource .plist file
    // (see "Set up your API key" above)
    let model = GenerativeModel(name: "MODEL_NAME", apiKey: APIKey.default)
    

指定模型時,請注意下列事項:

  • 使用特定用途專屬的模型 (例如,gemini-pro-vision 適用於多模態輸入)。在本指南中,每個實作項目的操作說明都會列出每個用途的建議模型。

實作常見用途

現在專案已設定完成,您可以使用 Gemini API 來實作不同的使用案例:

根據純文字產生文字

如果提示輸入內容只包含文字,請使用 gemini-pro 模型與 generateContent 方法,產生文字輸出:

import GoogleGenerativeAI

// For text-only input, use the gemini-pro model
// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(name: "gemini-pro", apiKey: APIKey.default)

let prompt = "Write a story about a magic backpack."
let response = try await model.generateContent(prompt)
if let text = response.text {
  print(text)
}

依據文字和圖片輸入產生文字 (多模態)

Gemini 提供多模態模型 (gemini-pro-vision),因此您可以同時輸入文字和圖片。請務必詳閱提示的圖片規定

如果提示輸入內容包含文字和圖片,請使用 gemini-pro-vision 模型搭配 generateContent 方法產生文字輸出:

import GoogleGenerativeAI

// For text-and-image input (multimodal), use the gemini-pro-vision model
// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(name: "gemini-pro-vision", apiKey: APIKey.default)

let image1 = UIImage(...)
let image2 = UIImage(...)

let prompt = "What's different between these pictures?"

let response = try await model.generateContent(prompt, image1, image2)
if let text = response.text {
  print(text)
}

建立多輪對話 (即時通訊)

只要使用 Gemini,就能跨輪建立形式不限的對話。這個 SDK 可藉由管理對話狀態來簡化程序,因此與 generateContent 不同,您不必自行儲存對話記錄。

如要建構多輪對話 (例如即時通訊),請使用 gemini-pro 模型,並呼叫 startChat() 來初始化即時通訊。接著使用 sendMessage() 傳送新使用者訊息,這樣訊息和回應也會附加到即時通訊記錄中。

與對話中的內容相關聯的 role 有兩種可能的選項:

  • user:提供提示的角色。這個值是 sendMessage 呼叫的預設值。

  • model:提供回應的角色。使用現有的 history 呼叫 startChat() 時,可以使用這個角色。

import GoogleGenerativeAI

let config = GenerationConfig(
  maxOutputTokens: 100
)

// For text-only input, use the gemini-pro model
// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(
  name: "gemini-pro",
  apiKey: APIKey.default,
  generationConfig: config
)

let history = [
  ModelContent(role: "user", parts: "Hello, I have 2 dogs in my house."),
  ModelContent(role: "model", parts: "Great to meet you. What would you like to know?"),
]

// Initialize the chat
let chat = model.startChat(history: history)
let response = try await chat.sendMessage("How many paws are in my house?")
if let text = response.text {
  print(text)
}

使用串流功能享受更便捷的互動體驗

根據預設,模型會在完成整個產生程序後傳回回應。您不必等待整個結果,就能以串流方式處理部分結果,藉此加快互動速度。

以下範例說明如何使用 generateContentStream 方法實作串流,透過文字和圖片輸入提示產生文字。

import GoogleGenerativeAI

// For text-and-image input (multimodal), use the gemini-pro-vision model
// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(name: "gemini-pro-vision", apiKey: APIKey.default)

let image1 = UIImage(named: "")!
let image2 = UIImage(named: "")!

let prompt = "What's different between these pictures?"
var fullResponse = ""
let contentStream = model.generateContentStream(prompt, image1, image2)
for try await chunk in contentStream {
  if let text = chunk.text {
    print(text)
    fullResponse += text
  }
}
print(fullResponse)

您可以透過類似的方法執行純文字輸入和即時通訊用途。

// Use streaming with text-only input
let contentStream = model.generateContentStream(prompt)
// Use streaming with multi-turn conversations (like chat)
let responseStream = chat.sendMessageStream(message)

實作進階用途

本教學課程前一節所述的常見用途,可協助您熟悉使用 Gemini API。本節說明部分可能更進階的用途。

函式呼叫

函式呼叫可讓您更輕鬆地從生成式模型中取得結構化資料輸出。接著,您可以使用這些輸出內容呼叫其他 API,並將相關回應資料傳回模型。換句話說,函式呼叫可協助您將生成式模型連結至外部系統,以便生成內容的最新正確資訊。詳情請參閱函式呼叫教學課程

計算符記

使用長提示時,建議先計算符記再傳送任何內容給模型。以下範例說明如何將 countTokens() 用於各種用途:

// For text-only input
let response = try await model.countTokens("Why is the sky blue?")
print(response.totalTokens)
// For text-and-image input (multi-modal)
let response = try await model.countTokens(prompt, image1, image2)
print(response.totalTokens)
// For multi-turn conversations (like chat)
let chat = model.startChat()
let history = chat.history
let message = ModelContent(role: "user", "Why is the sky blue?")
let contents = history + [message]
let response = try await model.countTokens(contents)
print(response.totalTokens)

控管內容產生功能的選項

您可以透過設定模型參數和安全設定來控制內容產生作業。

設定模型參數

您傳送至模型的每個提示都含有參數值,用來控制模型生成回覆的方式。模型可能會為不同參數值產生不同的結果。進一步瞭解模型參數。設定會在模型執行個體的生命週期內保留。

let config = GenerationConfig(
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
  maxOutputTokens: 200,
  stopSequences: ["red"]
)

// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(
  name: "MODEL_NAME",
  apiKey: APIKey.default,
  generationConfig: config
)

使用安全性設定

您可以使用安全性設定,調整取得可能有害回應的機率。根據預設,安全設定會在所有維度中封鎖中度和/或極有可能為不安全的內容。進一步瞭解安全設定

以下說明如何設定一項安全性設定:

// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(
  name: "MODEL_NAME",
  apiKey: APIKey.default,
  safetySettings: [
    SafetySetting(harmCategory: .harassment, threshold: .blockOnlyHigh)
  ]
)

您也可以設定多項安全性設定:

let harassmentSafety = SafetySetting(harmCategory: .harassment, threshold: .blockOnlyHigh)
let hateSpeechSafety = SafetySetting(harmCategory: .hateSpeech, threshold: .blockMediumAndAbove)

// Access your API key from your on-demand resource .plist file (see "Set up your API key" above)
let model = GenerativeModel(
  name: "MODEL_NAME",
  apiKey: APIKey.default,
    safetySettings: [harassmentSafety, hateSpeechSafety]
)

後續步驟

  • 提示設計是指建立提示,從語言模型中提取所需回應的程序。編寫結構周全的提示,是確保語言模型提供準確優質回覆的關鍵。瞭解提示撰寫的最佳做法

  • Gemini 提供多種模型變化版本,以滿足不同用途的需求,例如輸入類型和複雜度、聊天或其他對話方塊語言工作的實作,以及大小限制。瞭解可用的 Gemini 模式

  • Gemini 提供要求提高頻率限制的選項。Genmini Pro 模型的頻率限制為每分鐘 60 次 (RPM)。