فراخوانی تابع، دریافت خروجی داده های ساختاریافته از مدل های تولیدی را برای شما آسان تر می کند. سپس می توانید از این خروجی ها برای فراخوانی API های دیگر و برگرداندن داده های پاسخ مربوطه به مدل استفاده کنید. به عبارت دیگر، فراخوانی تابع به شما کمک می کند تا مدل های تولیدی را به سیستم های خارجی متصل کنید تا محتوای تولید شده شامل به روزترین و دقیق ترین اطلاعات باشد.
می توانید مدل های Gemini را با توضیحاتی در مورد عملکردها ارائه دهید. اینها توابعی هستند که شما به زبان برنامه خود می نویسید (یعنی توابع Google Cloud نیستند). مدل ممکن است از شما بخواهد که یک تابع را فراخوانی کنید و نتیجه را برای کمک به مدل در رسیدگی به درخواست شما ارسال کنید.
اگر قبلاً این کار را نکردهاید، برای کسب اطلاعات بیشتر ، مقدمه فراخوانی تابع را بررسی کنید.
پروژه خود را تنظیم کنید
قبل از فراخوانی Gemini API، باید پروژه Xcode خود را راهاندازی کنید، که شامل تنظیم کلید API، افزودن بسته SDK به پروژه Xcode و مقداردهی اولیه مدل است.
برای استفاده از Gemini API، به یک کلید API نیاز دارید. اگر قبلاً یکی ندارید، یک کلید در Google AI Studio ایجاد کنید.
کلید API خود را ایمن کنید
اکیداً توصیه می شود که یک کلید API را در سیستم کنترل نسخه خود بررسی نکنید . یک گزینه جایگزین این است که آن را در یک فایل GenerativeAI-Info.plist
ذخیره کنید و سپس کلید API را از فایل .plist
بخوانید. مطمئن شوید که این فایل .plist
را در پوشه ریشه برنامه خود قرار داده و آن را از کنترل نسخه حذف کنید.
enum APIKey {
// Fetch the API key from `GenerativeAI-Info.plist`
static var `default`: String {
guard let filePath = Bundle.main.path(forResource: "GenerativeAI-Info", ofType: "plist")
else {
fatalError("Couldn't find file 'GenerativeAI-Info.plist'.")
}
let plist = NSDictionary(contentsOfFile: filePath)
guard let value = plist?.object(forKey: "API_KEY") as? String else {
fatalError("Couldn't find key 'API_KEY' in 'GenerativeAI-Info.plist'.")
}
if value.starts(with: "_") {
fatalError(
"Follow the instructions at https://ai.google.dev/tutorials/setup to get an API key."
)
}
return value
}
}
همچنین میتوانید برنامه نمونه را مرور کنید تا یاد بگیرید چگونه کلید API خود را در یک فایل .plist
. ذخیره کنید.
این آموزش فرض میکند که شما به کلید API خود از این فایل .plist
منبع درخواستی دسترسی دارید.
برای استفاده از Gemini API در برنامه Swift خود، بسته GoogleGenerativeAI
را به برنامه خود اضافه کنید:
در Xcode، روی پروژه خود در ناوبر پروژه کلیک راست کنید.
از منوی زمینه گزینه Add Packages را انتخاب کنید.
در گفتگوی Add Packages ، URL بسته را در نوار جستجو جایگذاری کنید:
https://github.com/google/generative-ai-swift
روی افزودن بسته کلیک کنید. اکنون Xcode بسته
GoogleGenerativeAI
را به پروژه شما اضافه می کند.
قبل از اینکه بتوانید هر گونه تماس API را برقرار کنید، باید مدل تولیدی را مقداردهی اولیه کنید. این مقدار اولیه اولیه است. بعداً در این آموزش، آن را برای فراخوانی تابع به روز خواهید کرد.
ماژول
GoogleGenerativeAI
را وارد کنید:import GoogleGenerativeAI
مدل مولد را راه اندازی کنید:
// Access your API key from your on-demand resource .plist file // (see "Set up your API key" above) // Use a model that supports function calling, like Gemini 1.0 Pro. // See "Supported models" in the "Introduction to function calling" page. let model = GenerativeModel(name: "MODEL_NAME", apiKey: APIKey.default)
یک تماس تابع تنظیم کنید
برای این آموزش، مدل را با یک API مبادله ارز فرضی که از پارامترهای زیر پشتیبانی میکند تعامل خواهید داشت:
پارامتر | تایپ کنید | ضروری | شرح |
---|---|---|---|
currencyFrom | رشته | آره | ارز برای تبدیل |
currencyTo | رشته | آره | ارز برای تبدیل |
نمونه درخواست API
{
"currencyFrom": "USD",
"currencyTo": "SEK"
}
نمونه پاسخ API
{
"base": "USD",
"rates": {"SEK": 0.091}
}
مرحله 1 : تابعی را ایجاد کنید که درخواست API را ایجاد می کند
اگر قبلاً این کار را نکردهاید، با ایجاد تابعی که درخواست API را ایجاد میکند، شروع کنید.
برای اهداف نمایشی در این آموزش، به جای ارسال یک درخواست API واقعی، مقادیر کدگذاری شده را با همان قالبی که یک API واقعی برمی گرداند، برمی گردانید.
func makeAPIRequest(currencyFrom: String,
currencyTo: String) -> JSONObject {
// This hypothetical API returns a JSON such as:
// {"base":"USD","rates":{"SEK": 0.091}}
return [
"base": .string(currencyFrom),
"rates": .object([currencyTo: .number(0.091)]),
]
}
مرحله 2 : یک اعلان تابع ایجاد کنید
اعلان تابعی را ایجاد کنید که به مدل مولد منتقل می کنید (مرحله بعدی این آموزش).
تا جایی که ممکن است جزئیات را در توضیحات تابع و پارامتر بگنجانید. مدل مولد از این اطلاعات برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامترهای فراخوانی تابع را ارائه کند، استفاده می کند.
let getExchangeRate = FunctionDeclaration(
name: "getExchangeRate",
description: "Get the exchange rate for currencies between countries",
parameters: [
"currencyFrom": Schema(
type: .string,
description: "The currency to convert from."
),
"currencyTo": Schema(
type: .string,
description: "The currency to convert to."
),
],
requiredParameters: ["currencyFrom", "currencyTo"]
)
مرحله 3 : اعلان تابع را در طول اولیه سازی مدل مشخص کنید
اعلان تابع را هنگام مقداردهی اولیه مدل مولد با تنظیم پارامتر tools
مدل مشخص کنید:
// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
let generativeModel = GenerativeModel(
name: "gemini-1.0-pro",
apiKey: apiKey,
// Specify the function declaration.
tools: [Tool(functionDeclarations: [getExchangeRate])]
)
مرحله 4 : یک فراخوانی تابع ایجاد کنید
اکنون می توانید مدل را با تابع تعریف شده درخواست کنید.
روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت است، زیرا فراخوانی های تابع به خوبی در ساختار چند نوبتی چت قرار می گیرند.
let chat = generativeModel.startChat()
let prompt = "How much is 50 US dollars worth in Swedish krona?"
// Send the message to the generative model
let response1 = try await chat.sendMessage(prompt)
// Check if the model responded with a function call
guard let functionCall = response1.functionCalls.first else {
fatalError("Model did not respond with a function call.")
}
// Print an error if the returned function was not declared
guard functionCall.name == "getExchangeRate" else {
fatalError("Unexpected function called: \(functionCall.name)")
}
// Verify that the names and types of the parameters match the declaration
guard case let .string(currencyFrom) = functionCall.args["currencyFrom"] else {
fatalError("Missing argument: currencyFrom")
}
guard case let .string(currencyTo) = functionCall.args["currencyTo"] else {
fatalError("Missing argument: currencyTo")
}
// Call the hypothetical API
let apiResponse = makeAPIRequest(currencyFrom: currencyFrom, currencyTo: currencyTo)
// Send the API response back to the model so it can generate a text response that can be
// displayed to the user.
let response = try await chat.sendMessage([ModelContent(
role: "function",
parts: [.functionResponse(FunctionResponse(
name: functionCall.name,
response: apiResponse
))]
)])
// Log the text response.
guard let modelResponse = response.text else {
fatalError("Model did not respond with text.")
}
print(modelResponse)