فراخوانی عملکرد با استفاده از Gemini API، تماس تابع با استفاده از Gemini API


مدل های مولد در حل بسیاری از مشکلات قدرتمند هستند. با این حال، آنها با محدودیت هایی مانند:

  • آنها پس از آموزش منجمد می شوند و منجر به دانش قدیمی می شوند.
  • آنها نمی توانند داده های خارجی را پرس و جو یا تغییر دهند.

فراخوانی تابع می تواند به شما در غلبه بر برخی از این محدودیت ها کمک کند. فراخوانی تابع گاهی اوقات به عنوان استفاده از ابزار نامیده می شود زیرا به مدل اجازه می دهد تا از ابزارهای خارجی مانند API ها و توابع برای تولید پاسخ نهایی خود استفاده کند.

می‌توانید در اسناد Google Cloud درباره فراخوانی تابع ، از جمله فهرست مفیدی از موارد استفاده برای فراخوانی تابع، اطلاعات بیشتری کسب کنید.

حالت فراخوانی تابع توسط همه مدل‌های Gemini (به جز مدل‌های Gemini 1.0 ) پشتیبانی می‌شود.

این راهنما به شما نشان می‌دهد که چگونه می‌توانید یک تنظیم فراخوانی تابع شبیه به مثالی که در بخش اصلی بعدی این صفحه توضیح داده شد، پیاده‌سازی کنید. در سطح بالا، در اینجا مراحل تنظیم فراخوانی تابع در برنامه شما آمده است:

  1. تابعی بنویسید که بتواند اطلاعاتی را که برای تولید پاسخ نهایی به مدل نیاز دارد ارائه دهد (مثلاً تابع می تواند یک API خارجی را فراخوانی کند).

  2. یک اعلان تابع ایجاد کنید که تابع و پارامترهای آن را توصیف کند.

  3. اعلان تابع را در زمان اولیه سازی مدل ارائه دهید تا مدل بداند در صورت نیاز چگونه می تواند از تابع استفاده کند.

  4. برنامه خود را طوری تنظیم کنید که مدل بتواند اطلاعات مورد نیاز را برای فراخوانی عملکرد برنامه شما ارسال کند.

  5. پاسخ تابع را به مدل برگردانید تا مدل بتواند پاسخ نهایی خود را ایجاد کند.

پرش به اجرای کد

نمای کلی یک مثال فراخوانی تابع

هنگامی که درخواستی را برای مدل ارسال می‌کنید، می‌توانید مجموعه‌ای از «ابزارها» (مانند توابع) را نیز به مدل ارائه دهید که می‌تواند برای تولید پاسخ نهایی خود از آنها استفاده کند. برای استفاده از این توابع و فراخوانی آنها ("تماس عملکرد")، مدل و برنامه شما باید اطلاعات را پشت سر هم به یکدیگر منتقل کنند، بنابراین روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت چند نوبتی است.

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? .

مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. می‌توانید از فراخوانی تابع برای دادن مسیری به مدل Gemini برای آن API و اطلاعات آب و هوای آن استفاده کنید.

ابتدا، یک تابع fetchWeather در برنامه خود می نویسید که با این API فرضی خارجی، که دارای ورودی و خروجی است، تعامل دارد:

پارامتر تایپ کنید مورد نیاز توضیحات
ورودی
location شیء بله نام شهر و ایالت آن که آب و هوا را برای آن بدست آورید.
فقط شهرهای ایالات متحده پشتیبانی می شوند. همیشه باید یک شی تودرتو از city و state باشد.
date رشته بله تاریخ واکشی آب و هوا (همیشه باید در قالب YYYY-MM-DD باشد).
خروجی
temperature عدد صحیح بله دما (بر حسب فارنهایت)
chancePrecipitation رشته بله احتمال بارندگی (به صورت درصد بیان می شود)
cloudConditions رشته بله شرایط ابری (یکی از clear ، partlyCloudy ، mostlyCloudy ، cloudy )

هنگام راه اندازی مدل، به مدل می گویید که این تابع fetchWeather وجود دارد و چگونه می توان از آن برای پردازش درخواست های دریافتی در صورت نیاز استفاده کرد. این "اعلام عملکرد" ​​نامیده می شود. مدل به طور مستقیم تابع را فراخوانی نمی کند. در عوض، همانطور که مدل در حال پردازش درخواست ورودی است، تصمیم می گیرد که آیا تابع fetchWeather می تواند به آن کمک کند تا به درخواست پاسخ دهد یا خیر. اگر مدل تصمیم بگیرد که این تابع واقعاً می تواند مفید باشد، مدل داده های ساختاری ایجاد می کند که به برنامه شما کمک می کند تا تابع را فراخوانی کند .

دوباره به درخواست دریافتی نگاه کنید: What was the weather in Boston on October 17, 2024? . احتمالاً مدل تصمیم می‌گیرد که تابع fetchWeather می‌تواند به آن در تولید پاسخ کمک کند. این مدل به پارامترهای ورودی مورد نیاز برای fetchWeather نگاه می‌کند و سپس داده‌های ورودی ساخت‌یافته را برای تابعی که تقریباً شبیه این است تولید می‌کند:

{
  functionName: fetchWeather,
  location: {
    city: Boston,
    state: Massachusetts  // the model can infer the state from the prompt
  },
  date: 2024-10-17
}

مدل این داده های ورودی ساخت یافته را به برنامه شما ارسال می کند تا برنامه شما بتواند تابع fetchWeather را فراخوانی کند. وقتی برنامه شما شرایط آب و هوایی را از API دریافت می کند، اطلاعات را به مدل منتقل می کند. این اطلاعات آب و هوا به مدل اجازه می دهد تا پردازش نهایی خود را تکمیل کند و پاسخ خود را به درخواست اولیه What was the weather in Boston on October 17, 2024?

این مدل ممکن است پاسخ نهایی به زبان طبیعی را ارائه دهد، مانند: On October 17, 2024, in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

نمودار نشان می دهد که چگونه فراخوانی تابع شامل تعامل مدل با یک تابع در برنامه شما می شود

فراخوانی تابع را پیاده سازی کنید

قبل از شروع

اگر قبلاً این کار را نکرده‌اید، راهنمای شروع را کامل کنید، که نحوه راه‌اندازی پروژه Firebase را توضیح می‌دهد، برنامه خود را به Firebase متصل کنید، SDK را اضافه کنید، سرویس Vertex AI را راه‌اندازی کنید، و یک نمونه GenerativeModel ایجاد کنید.

مراحل باقی‌مانده در این راهنما به شما نشان می‌دهد که چگونه یک تنظیم فراخوانی تابع شبیه به گردش کار شرح داده شده در مثال فراخوانی اجمالی یک تابع را اجرا کنید (به بخش بالای این صفحه مراجعه کنید).

می توانید نمونه کد کامل را برای مثال فراخوانی این تابع در ادامه این صفحه مشاهده کنید.

مرحله 1 : تابع را بنویسید

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? . مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. مثال در این راهنما بر این API خارجی فرضی تکیه دارد.

تابعی را در برنامه خود بنویسید که با API خارجی فرضی تعامل داشته باشد و اطلاعاتی را که برای ایجاد درخواست نهایی نیاز دارد در اختیار مدل قرار دهد. در این مثال آب و هوا، یک تابع fetchWeather خواهد بود که با این API خارجی فرضی تماس برقرار می کند.

// This function calls a hypothetical external API that returns
// a collection of weather information for a given location on a given date.
func fetchWeather(city: String, state: String, date: String) -> JSONObject {

  // TODO(developer): Write a standard function that would call an external weather API.

  // For demo purposes, this hypothetical response is hardcoded here in the expected format.
  return [
    "temperature": .number(38),
    "chancePrecipitation": .string("56%"),
    "cloudConditions": .string("partlyCloudy"),
  ]
}

مرحله 2 : یک اعلان تابع ایجاد کنید

اعلان تابعی را ایجاد کنید که بعداً به مدل ارائه خواهید کرد (مرحله بعدی این راهنما).

در بیانیه خود، تا حد امکان جزئیات بیشتری را در توضیحات مربوط به تابع و پارامترهای آن درج کنید.

مدل از اطلاعات موجود در اعلان تابع برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامتر را برای فراخوانی واقعی تابع ارائه کند، استفاده می کند. برای نحوه انتخاب مدل از میان توابع و همچنین نحوه کنترل آن انتخاب ، رفتارها و گزینه های اضافی را در ادامه این صفحه ببینید.

در مورد طرحی که ارائه می کنید به موارد زیر توجه کنید:

  • شما باید اعلان‌های تابع را در قالب طرحی ارائه دهید که با طرحواره OpenAPI سازگار باشد. Vertex AI پشتیبانی محدودی از طرح OpenAPI ارائه می دهد.

    • ویژگی های زیر پشتیبانی می شوند: type ، nullable ، required ، format ، description ، properties ، items ، enum .

    • ویژگی‌های زیر پشتیبانی نمی‌شوند : default ، optional ، maximum ، oneOf .

  • به‌طور پیش‌فرض، برای Vertex AI در Firebase SDK، همه فیلدها ضروری در نظر گرفته می‌شوند مگر اینکه آنها را به‌عنوان اختیاری در آرایه optionalProperties مشخص کنید. برای این فیلدهای اختیاری، مدل می تواند فیلدها را پر کند یا آنها را رد کند. توجه داشته باشید که این برخلاف رفتار پیش‌فرض برای Vertex AI Gemini API است.

برای بهترین شیوه‌های مربوط به اعلامیه‌های عملکرد، از جمله نکاتی برای نام‌ها و توضیحات، به بهترین شیوه‌ها در اسناد Google Cloud مراجعه کنید.

در اینجا نحوه نوشتن یک اعلان تابع آورده شده است:

let fetchWeatherTool = FunctionDeclaration(
  name: "fetchWeather",
  description: "Get the weather conditions for a specific city on a specific date.",
  parameters: [
    "location": .object(
      properties: [
        "city": .string(description: "The city of the location."),
        "state": .string(description: "The US state of the location."),
      ],
      description: """
      The name of the city and its state for which to get the weather. Only cities in the
      USA are supported.
      """
    ),
    "date": .string(
      description: """
      The date for which to get the weather. Date must be in the format: YYYY-MM-DD.
      """
    ),
  ]
)

مرحله 3 : اعلان تابع را در طول اولیه سازی مدل ارائه دهید

حداکثر تعداد اعلان‌های تابعی که می‌توانید همراه با درخواست ارائه کنید 128 است. برای نحوه انتخاب مدل از میان توابع و همچنین نحوه کنترل آن انتخاب (با استفاده از یک toolConfig برای تنظیم حالت فراخوانی تابع ) به رفتارها و گزینه‌های دیگر در این صفحه مراجعه کنید.

import FirebaseVertexAI

// Initialize the Vertex AI service and the generative model.
let model = VertexAI.vertexAI().generativeModel(
  modelName: "gemini-2.0-flash",
  // Provide the function declaration to the model.
  tools: [.functionDeclarations([fetchWeatherTool])]
)

نحوه انتخاب یک مدل و به صورت اختیاری مکان مناسب برای مورد استفاده و برنامه خود را بیاموزید.

مرحله 4 : تابع را برای فراخوانی API خارجی فراخوانی کنید

اگر مدل تصمیم بگیرد که تابع fetchWeather واقعاً می‌تواند به آن کمک کند تا پاسخ نهایی را ایجاد کند، برنامه شما باید با استفاده از داده‌های ورودی ساخت‌یافته ارائه‌شده توسط مدل، تماس واقعی را با آن تابع برقرار کند.

از آنجایی که اطلاعات باید بین مدل و برنامه به عقب و جلو منتقل شود، روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت چند نوبتی است.

قطعه کد زیر نشان می دهد که چگونه به برنامه شما گفته می شود که مدل می خواهد از تابع fetchWeather استفاده کند. همچنین نشان می دهد که مدل مقادیر پارامتر ورودی لازم را برای فراخوانی تابع (و API خارجی زیرین آن) ارائه کرده است.

در این مثال، درخواست دریافتی حاوی این پیام بود What was the weather in Boston on October 17, 2024? . از این دستور، مدل پارامترهای ورودی مورد نیاز تابع fetchWeather را استنباط کرد (یعنی city ، state و date ).

let chat = model.startChat()
let prompt = "What was the weather in Boston on October 17, 2024?"

// Send the user's question (the prompt) to the model using multi-turn chat.
let response = try await chat.sendMessage(prompt)

var functionResponses = [FunctionResponsePart]()

// When the model responds with one or more function calls, invoke the function(s).
for functionCall in response.functionCalls {
  if functionCall.name == "fetchWeather" {
    // TODO(developer): Handle invalid arguments.
    guard case let .object(location) = functionCall.args["location"] else { fatalError() }
    guard case let .string(city) = location["city"] else { fatalError() }
    guard case let .string(state) = location["state"] else { fatalError() }
    guard case let .string(date) = functionCall.args["date"] else { fatalError() }

    functionResponses.append(FunctionResponsePart(
      name: functionCall.name,
      // Forward the structured input data prepared by the model
      // to the hypothetical external API.
      response: fetchWeather(city: city, state: state, date: date)
    ))
  }
  // TODO(developer): Handle other potential function calls, if any.
}

مرحله 5 : خروجی تابع را در اختیار مدل قرار دهید تا پاسخ نهایی را ایجاد کند

پس از اینکه تابع fetchWeather اطلاعات آب و هوا را برگرداند، برنامه شما باید آن را به مدل ارسال کند.

سپس، مدل پردازش نهایی خود را انجام می دهد و یک پاسخ نهایی به زبان طبیعی را ایجاد می کند: On October 17, 2024 in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

// Send the response(s) from the function back to the model
// so that the model can use it to generate its final response.
let finalResponse = try await chat.sendMessage(
  [ModelContent(role: "function", parts: functionResponses)]
)

// Log the text response.
print(finalResponse.text ?? "No text in response.")

رفتارها و گزینه های اضافی

در اینجا برخی از رفتارهای اضافی برای فراخوانی تابع وجود دارد که باید آنها را در کد خود جای دهید و گزینه هایی که می توانید کنترل کنید.

ممکن است مدل بخواهد دوباره یک تابع یا تابع دیگری را فراخوانی کند.

اگر پاسخ از یک فراخوانی تابع برای مدل برای ایجاد پاسخ نهایی کافی نباشد، آنگاه ممکن است مدل درخواست یک فراخوانی تابع اضافی یا درخواست فراخوانی به یک تابع کاملاً متفاوت کند. مورد دوم تنها در صورتی می تواند اتفاق بیفتد که شما بیش از یک تابع به مدل در لیست اعلان تابع خود ارائه دهید.

برنامه شما باید شرایطی را در نظر بگیرد که مدل ممکن است برای فراخوانی عملکرد اضافی درخواست کند.

ممکن است مدل بخواهد چند تابع را همزمان فراخوانی کند.

شما می توانید تا 128 تابع را در لیست اعلان عملکرد خود به مدل ارائه دهید. با توجه به این موضوع، مدل ممکن است تصمیم بگیرد که چندین تابع برای کمک به تولید پاسخ نهایی خود مورد نیاز است. و ممکن است تصمیم بگیرد که برخی از این توابع را همزمان فراخوانی کند - این فراخوانی تابع موازی نامیده می شود.

برنامه شما باید شرایطی را در نظر بگیرد که مدل ممکن است چندین عملکرد را همزمان بخواهد و برنامه شما باید همه پاسخ‌ها را از توابع به مدل ارائه دهد.

شما می توانید کنترل کنید که چگونه و آیا مدل می تواند درخواست فراخوانی توابع را داشته باشد.

شما می توانید محدودیت هایی را در مورد اینکه مدل چگونه و آیا باید از اعلان های تابع ارائه شده استفاده کند، قرار دهید. این را تنظیم حالت فراخوانی تابع می نامند. در اینجا چند نمونه آورده شده است:

  • به جای اینکه به مدل اجازه دهید بین پاسخ فوری زبان طبیعی و فراخوانی تابع یکی را انتخاب کند، می توانید آن را مجبور کنید همیشه از فراخوانی تابع استفاده کند. این فراخوانی تابع اجباری نامیده می شود.

  • اگر چند اعلان تابع ارائه می کنید، می توانید مدل را به استفاده از زیرمجموعه ای از توابع ارائه شده محدود کنید.

شما این محدودیت ها (یا حالت ها) را با افزودن یک پیکربندی ابزار ( toolConfig ) به همراه اعلانات و اعلان های تابع پیاده سازی می کنید. در پیکربندی ابزار، می توانید یکی از حالت های زیر را مشخص کنید. مفیدترین حالت ANY است.

حالت توضیحات
AUTO رفتار مدل پیش فرض مدل تصمیم می گیرد که از فراخوانی تابع یا پاسخ زبان طبیعی استفاده کند.
ANY مدل باید از فراخوانی تابع استفاده کند ("فراخوانی تابع اجباری"). برای محدود کردن مدل به زیرمجموعه ای از توابع، نام تابع مجاز را در allowedFunctionNames مشخص کنید.
NONE مدل نباید از فراخوانی تابع استفاده کند. این رفتار معادل یک درخواست مدل بدون هیچ گونه اعلان تابع مرتبط است.

چه کار دیگری می توانید انجام دهید؟

قابلیت های دیگر را امتحان کنید

یاد بگیرید چگونه تولید محتوا را کنترل کنید

همچنین می‌توانید با استفاده از Vertex AI Studio ، دستورات و پیکربندی‌های مدل را آزمایش کنید.

درباره مدل های پشتیبانی شده بیشتر بدانید

در مورد مدل های موجود برای موارد استفاده مختلف و سهمیه ها و قیمت آنها اطلاعات کسب کنید.


درباره تجربه خود با Vertex AI در Firebase بازخورد بدهید


،


مدل های مولد در حل بسیاری از مشکلات قدرتمند هستند. با این حال، آنها با محدودیت هایی مانند:

  • آنها پس از آموزش منجمد می شوند و منجر به دانش قدیمی می شوند.
  • آنها نمی توانند داده های خارجی را پرس و جو یا تغییر دهند.

فراخوانی تابع می تواند به شما در غلبه بر برخی از این محدودیت ها کمک کند. فراخوانی تابع گاهی اوقات به عنوان استفاده از ابزار نامیده می شود زیرا به مدل اجازه می دهد تا از ابزارهای خارجی مانند API ها و توابع برای تولید پاسخ نهایی خود استفاده کند.

می‌توانید در اسناد Google Cloud درباره فراخوانی تابع ، از جمله فهرست مفیدی از موارد استفاده برای فراخوانی تابع، اطلاعات بیشتری کسب کنید.

حالت فراخوانی تابع توسط همه مدل‌های Gemini (به جز مدل‌های Gemini 1.0 ) پشتیبانی می‌شود.

این راهنما به شما نشان می‌دهد که چگونه می‌توانید یک تنظیم فراخوانی تابع شبیه به مثالی که در بخش اصلی بعدی این صفحه توضیح داده شد، پیاده‌سازی کنید. در سطح بالا، در اینجا مراحل تنظیم فراخوانی تابع در برنامه شما آمده است:

  1. تابعی بنویسید که بتواند اطلاعاتی را که برای تولید پاسخ نهایی به مدل نیاز دارد ارائه دهد (مثلاً تابع می تواند یک API خارجی را فراخوانی کند).

  2. یک اعلان تابع ایجاد کنید که تابع و پارامترهای آن را توصیف کند.

  3. اعلان تابع را در زمان اولیه سازی مدل ارائه دهید تا مدل بداند در صورت نیاز چگونه می تواند از تابع استفاده کند.

  4. برنامه خود را طوری تنظیم کنید که مدل بتواند اطلاعات مورد نیاز را برای فراخوانی عملکرد برنامه شما ارسال کند.

  5. پاسخ تابع را به مدل برگردانید تا مدل بتواند پاسخ نهایی خود را ایجاد کند.

پرش به اجرای کد

نمای کلی یک مثال فراخوانی تابع

هنگامی که درخواستی را برای مدل ارسال می‌کنید، می‌توانید مجموعه‌ای از «ابزارها» (مانند توابع) را نیز به مدل ارائه دهید که می‌تواند برای تولید پاسخ نهایی خود از آنها استفاده کند. برای استفاده از این توابع و فراخوانی آنها ("تماس عملکرد")، مدل و برنامه شما باید اطلاعات را پشت سر هم به یکدیگر منتقل کنند، بنابراین روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت چند نوبتی است.

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? .

مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. می‌توانید از فراخوانی تابع برای دادن مسیری به مدل Gemini برای آن API و اطلاعات آب و هوای آن استفاده کنید.

ابتدا، یک تابع fetchWeather در برنامه خود می نویسید که با این API فرضی خارجی، که دارای ورودی و خروجی است، تعامل دارد:

پارامتر تایپ کنید مورد نیاز توضیحات
ورودی
location شیء بله نام شهر و ایالت آن که آب و هوا را برای آن بدست آورید.
فقط شهرهای ایالات متحده پشتیبانی می شوند. همیشه باید یک شی تودرتو از city و state باشد.
date رشته بله تاریخ واکشی آب و هوا (همیشه باید در قالب YYYY-MM-DD باشد).
خروجی
temperature عدد صحیح بله دما (بر حسب فارنهایت)
chancePrecipitation رشته بله احتمال بارندگی (به صورت درصد بیان می شود)
cloudConditions رشته بله شرایط ابری (یکی از clear ، partlyCloudy ، mostlyCloudy ، cloudy )

هنگام راه اندازی مدل، به مدل می گویید که این تابع fetchWeather وجود دارد و چگونه می توان از آن برای پردازش درخواست های دریافتی در صورت نیاز استفاده کرد. این "اعلام عملکرد" ​​نامیده می شود. مدل به طور مستقیم تابع را فراخوانی نمی کند. در عوض، همانطور که مدل در حال پردازش درخواست ورودی است، تصمیم می گیرد که آیا تابع fetchWeather می تواند به آن کمک کند تا به درخواست پاسخ دهد یا خیر. اگر مدل تصمیم بگیرد که این تابع واقعاً می تواند مفید باشد، مدل داده های ساختاری ایجاد می کند که به برنامه شما کمک می کند تا تابع را فراخوانی کند .

دوباره به درخواست دریافتی نگاه کنید: What was the weather in Boston on October 17, 2024? . احتمالاً مدل تصمیم می‌گیرد که تابع fetchWeather می‌تواند به آن در تولید پاسخ کمک کند. این مدل به پارامترهای ورودی مورد نیاز برای fetchWeather نگاه می‌کند و سپس داده‌های ورودی ساخت‌یافته را برای تابعی که تقریباً شبیه این است تولید می‌کند:

{
  functionName: fetchWeather,
  location: {
    city: Boston,
    state: Massachusetts  // the model can infer the state from the prompt
  },
  date: 2024-10-17
}

مدل این داده های ورودی ساخت یافته را به برنامه شما ارسال می کند تا برنامه شما بتواند تابع fetchWeather را فراخوانی کند. وقتی برنامه شما شرایط آب و هوایی را از API دریافت می کند، اطلاعات را به مدل منتقل می کند. این اطلاعات آب و هوا به مدل اجازه می دهد تا پردازش نهایی خود را تکمیل کند و پاسخ خود را به درخواست اولیه What was the weather in Boston on October 17, 2024?

این مدل ممکن است پاسخ نهایی به زبان طبیعی را ارائه دهد، مانند: On October 17, 2024, in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

نمودار نشان می دهد که چگونه فراخوانی تابع شامل تعامل مدل با یک تابع در برنامه شما می شود

فراخوانی تابع را پیاده سازی کنید

قبل از شروع

اگر قبلاً این کار را نکرده‌اید، راهنمای شروع را کامل کنید، که نحوه راه‌اندازی پروژه Firebase را توضیح می‌دهد، برنامه خود را به Firebase متصل کنید، SDK را اضافه کنید، سرویس Vertex AI را راه‌اندازی کنید، و یک نمونه GenerativeModel ایجاد کنید.

مراحل باقی‌مانده در این راهنما به شما نشان می‌دهد که چگونه یک تنظیم فراخوانی تابع شبیه به گردش کار شرح داده شده در مثال فراخوانی اجمالی یک تابع را اجرا کنید (به بخش بالای این صفحه مراجعه کنید).

می توانید نمونه کد کامل را برای مثال فراخوانی این تابع در ادامه این صفحه مشاهده کنید.

مرحله 1 : تابع را بنویسید

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? . مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. مثال در این راهنما بر این API خارجی فرضی تکیه دارد.

تابعی را در برنامه خود بنویسید که با API خارجی فرضی تعامل داشته باشد و اطلاعاتی را که برای ایجاد درخواست نهایی نیاز دارد در اختیار مدل قرار دهد. در این مثال آب و هوا، یک تابع fetchWeather خواهد بود که با این API خارجی فرضی تماس برقرار می کند.

// This function calls a hypothetical external API that returns
// a collection of weather information for a given location on a given date.
func fetchWeather(city: String, state: String, date: String) -> JSONObject {

  // TODO(developer): Write a standard function that would call an external weather API.

  // For demo purposes, this hypothetical response is hardcoded here in the expected format.
  return [
    "temperature": .number(38),
    "chancePrecipitation": .string("56%"),
    "cloudConditions": .string("partlyCloudy"),
  ]
}

مرحله 2 : یک اعلان تابع ایجاد کنید

اعلان تابعی را ایجاد کنید که بعداً به مدل ارائه خواهید کرد (مرحله بعدی این راهنما).

در بیانیه خود، تا حد امکان جزئیات بیشتری را در توضیحات مربوط به تابع و پارامترهای آن درج کنید.

مدل از اطلاعات موجود در اعلان تابع برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامتر را برای فراخوانی واقعی تابع ارائه کند، استفاده می کند. برای نحوه انتخاب مدل از میان توابع و همچنین نحوه کنترل آن انتخاب ، رفتارها و گزینه های اضافی را در ادامه این صفحه ببینید.

در مورد طرحی که ارائه می کنید به موارد زیر توجه کنید:

  • شما باید اعلان‌های تابع را در قالب طرحی ارائه دهید که با طرحواره OpenAPI سازگار باشد. Vertex AI پشتیبانی محدودی از طرح OpenAPI ارائه می دهد.

    • ویژگی های زیر پشتیبانی می شوند: type ، nullable ، required ، format ، description ، properties ، items ، enum .

    • ویژگی‌های زیر پشتیبانی نمی‌شوند : default ، optional ، maximum ، oneOf .

  • به‌طور پیش‌فرض، برای Vertex AI در Firebase SDK، همه فیلدها ضروری در نظر گرفته می‌شوند مگر اینکه آنها را به‌عنوان اختیاری در آرایه optionalProperties مشخص کنید. برای این فیلدهای اختیاری، مدل می تواند فیلدها را پر کند یا آنها را رد کند. توجه داشته باشید که این برخلاف رفتار پیش‌فرض برای Vertex AI Gemini API است.

برای بهترین شیوه‌های مربوط به اعلامیه‌های عملکرد، از جمله نکاتی برای نام‌ها و توضیحات، به بهترین شیوه‌ها در اسناد Google Cloud مراجعه کنید.

در اینجا نحوه نوشتن یک اعلان تابع آورده شده است:

let fetchWeatherTool = FunctionDeclaration(
  name: "fetchWeather",
  description: "Get the weather conditions for a specific city on a specific date.",
  parameters: [
    "location": .object(
      properties: [
        "city": .string(description: "The city of the location."),
        "state": .string(description: "The US state of the location."),
      ],
      description: """
      The name of the city and its state for which to get the weather. Only cities in the
      USA are supported.
      """
    ),
    "date": .string(
      description: """
      The date for which to get the weather. Date must be in the format: YYYY-MM-DD.
      """
    ),
  ]
)

مرحله 3 : اعلان تابع را در طول اولیه سازی مدل ارائه دهید

حداکثر تعداد اعلان‌های تابعی که می‌توانید همراه با درخواست ارائه کنید 128 است. برای نحوه انتخاب مدل از میان توابع و همچنین نحوه کنترل آن انتخاب (با استفاده از یک toolConfig برای تنظیم حالت فراخوانی تابع ) به رفتارها و گزینه‌های دیگر در این صفحه مراجعه کنید.

import FirebaseVertexAI

// Initialize the Vertex AI service and the generative model.
let model = VertexAI.vertexAI().generativeModel(
  modelName: "gemini-2.0-flash",
  // Provide the function declaration to the model.
  tools: [.functionDeclarations([fetchWeatherTool])]
)

نحوه انتخاب یک مدل و به صورت اختیاری مکان مناسب برای مورد استفاده و برنامه خود را بیاموزید.

مرحله 4 : تابع را برای فراخوانی API خارجی فراخوانی کنید

اگر مدل تصمیم بگیرد که تابع fetchWeather واقعاً می‌تواند به آن کمک کند تا پاسخ نهایی را ایجاد کند، برنامه شما باید با استفاده از داده‌های ورودی ساخت‌یافته ارائه‌شده توسط مدل، تماس واقعی را با آن تابع برقرار کند.

از آنجایی که اطلاعات باید بین مدل و برنامه به عقب و جلو منتقل شود، روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت چند نوبتی است.

قطعه کد زیر نشان می دهد که چگونه به برنامه شما گفته می شود که مدل می خواهد از تابع fetchWeather استفاده کند. همچنین نشان می دهد که مدل مقادیر پارامتر ورودی لازم را برای فراخوانی تابع (و API خارجی زیرین آن) ارائه کرده است.

در این مثال، درخواست دریافتی حاوی این پیام بود What was the weather in Boston on October 17, 2024? . از این دستور، مدل پارامترهای ورودی مورد نیاز تابع fetchWeather را استنباط کرد (یعنی city ، state و date ).

let chat = model.startChat()
let prompt = "What was the weather in Boston on October 17, 2024?"

// Send the user's question (the prompt) to the model using multi-turn chat.
let response = try await chat.sendMessage(prompt)

var functionResponses = [FunctionResponsePart]()

// When the model responds with one or more function calls, invoke the function(s).
for functionCall in response.functionCalls {
  if functionCall.name == "fetchWeather" {
    // TODO(developer): Handle invalid arguments.
    guard case let .object(location) = functionCall.args["location"] else { fatalError() }
    guard case let .string(city) = location["city"] else { fatalError() }
    guard case let .string(state) = location["state"] else { fatalError() }
    guard case let .string(date) = functionCall.args["date"] else { fatalError() }

    functionResponses.append(FunctionResponsePart(
      name: functionCall.name,
      // Forward the structured input data prepared by the model
      // to the hypothetical external API.
      response: fetchWeather(city: city, state: state, date: date)
    ))
  }
  // TODO(developer): Handle other potential function calls, if any.
}

مرحله 5 : خروجی تابع را در اختیار مدل قرار دهید تا پاسخ نهایی را ایجاد کند

پس از اینکه تابع fetchWeather اطلاعات آب و هوا را برگرداند، برنامه شما باید آن را به مدل ارسال کند.

سپس، مدل پردازش نهایی خود را انجام می دهد و یک پاسخ نهایی به زبان طبیعی را ایجاد می کند: On October 17, 2024 in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

// Send the response(s) from the function back to the model
// so that the model can use it to generate its final response.
let finalResponse = try await chat.sendMessage(
  [ModelContent(role: "function", parts: functionResponses)]
)

// Log the text response.
print(finalResponse.text ?? "No text in response.")

رفتارها و گزینه های اضافی

در اینجا برخی از رفتارهای اضافی برای فراخوانی تابع وجود دارد که باید آنها را در کد خود جای دهید و گزینه هایی که می توانید کنترل کنید.

ممکن است مدل بخواهد دوباره یک تابع یا تابع دیگری را فراخوانی کند.

اگر پاسخ از یک فراخوانی تابع برای مدل برای ایجاد پاسخ نهایی کافی نباشد، آنگاه ممکن است مدل درخواست یک فراخوانی تابع اضافی یا درخواست فراخوانی به یک تابع کاملاً متفاوت کند. مورد دوم تنها در صورتی می تواند اتفاق بیفتد که شما بیش از یک تابع به مدل در لیست اعلان تابع خود ارائه دهید.

برنامه شما باید شرایطی را در نظر بگیرد که مدل ممکن است برای فراخوانی عملکرد اضافی درخواست کند.

ممکن است مدل بخواهد چند تابع را همزمان فراخوانی کند.

شما می توانید تا 128 تابع را در لیست اعلان عملکرد خود به مدل ارائه دهید. با توجه به این موضوع، مدل ممکن است تصمیم بگیرد که چندین تابع برای کمک به تولید پاسخ نهایی خود مورد نیاز است. و ممکن است تصمیم بگیرد که برخی از این توابع را همزمان فراخوانی کند - این فراخوانی تابع موازی نامیده می شود.

برنامه شما باید شرایطی را در نظر بگیرد که مدل ممکن است چندین عملکرد را همزمان بخواهد و برنامه شما باید همه پاسخ‌ها را از توابع به مدل ارائه دهد.

شما می توانید کنترل کنید که چگونه و آیا مدل می تواند درخواست فراخوانی توابع را داشته باشد.

شما می توانید محدودیت هایی را در مورد اینکه مدل چگونه و آیا باید از اعلان های تابع ارائه شده استفاده کند، قرار دهید. این را تنظیم حالت فراخوانی تابع می نامند. در اینجا چند نمونه آورده شده است:

  • به جای اینکه به مدل اجازه دهید بین پاسخ فوری زبان طبیعی و فراخوانی تابع یکی را انتخاب کند، می توانید آن را مجبور کنید همیشه از فراخوانی تابع استفاده کند. این فراخوانی تابع اجباری نامیده می شود.

  • اگر چند اعلان تابع ارائه می کنید، می توانید مدل را به استفاده از زیرمجموعه ای از توابع ارائه شده محدود کنید.

شما این محدودیت ها (یا حالت ها) را با افزودن یک پیکربندی ابزار ( toolConfig ) به همراه اعلانات و اعلان های تابع پیاده سازی می کنید. در پیکربندی ابزار، می توانید یکی از حالت های زیر را مشخص کنید. مفیدترین حالت ANY است.

حالت توضیحات
AUTO رفتار مدل پیش فرض مدل تصمیم می گیرد که از فراخوانی تابع یا پاسخ زبان طبیعی استفاده کند.
ANY مدل باید از فراخوانی تابع استفاده کند ("فراخوانی تابع اجباری"). برای محدود کردن مدل به زیرمجموعه ای از توابع، نام تابع مجاز را در allowedFunctionNames مشخص کنید.
NONE مدل نباید از فراخوانی تابع استفاده کند. این رفتار معادل یک درخواست مدل بدون هیچ گونه اعلان تابع مرتبط است.

چه کار دیگری می توانید انجام دهید؟

قابلیت های دیگر را امتحان کنید

یاد بگیرید چگونه تولید محتوا را کنترل کنید

همچنین می‌توانید با استفاده از Vertex AI Studio ، دستورات و پیکربندی‌های مدل را آزمایش کنید.

درباره مدل های پشتیبانی شده بیشتر بدانید

در مورد مدل های موجود برای موارد استفاده مختلف و سهمیه ها و قیمت آنها اطلاعات کسب کنید.


درباره تجربه خود با Vertex AI در Firebase بازخورد بدهید


،


مدل های مولد در حل بسیاری از مشکلات قدرتمند هستند. با این حال، آنها با محدودیت هایی مانند:

  • آنها پس از آموزش منجمد می شوند و منجر به دانش قدیمی می شوند.
  • آنها نمی توانند داده های خارجی را پرس و جو یا تغییر دهند.

فراخوانی تابع می تواند به شما در غلبه بر برخی از این محدودیت ها کمک کند. فراخوانی تابع گاهی اوقات به عنوان استفاده از ابزار نامیده می شود زیرا به مدل اجازه می دهد تا از ابزارهای خارجی مانند API ها و توابع برای تولید پاسخ نهایی خود استفاده کند.

می‌توانید در اسناد Google Cloud درباره فراخوانی تابع ، از جمله فهرست مفیدی از موارد استفاده برای فراخوانی تابع، اطلاعات بیشتری کسب کنید.

حالت فراخوانی تابع توسط همه مدل‌های Gemini (به جز مدل‌های Gemini 1.0 ) پشتیبانی می‌شود.

این راهنما به شما نشان می‌دهد که چگونه می‌توانید یک تنظیم فراخوانی تابع شبیه به مثالی که در بخش اصلی بعدی این صفحه توضیح داده شد، پیاده‌سازی کنید. در سطح بالا، در اینجا مراحل تنظیم فراخوانی تابع در برنامه شما آمده است:

  1. تابعی بنویسید که بتواند اطلاعاتی را که برای تولید پاسخ نهایی به مدل نیاز دارد ارائه دهد (مثلاً تابع می تواند یک API خارجی را فراخوانی کند).

  2. یک اعلان تابع ایجاد کنید که تابع و پارامترهای آن را توصیف کند.

  3. اعلان تابع را در زمان اولیه سازی مدل ارائه دهید تا مدل بداند در صورت نیاز چگونه می تواند از تابع استفاده کند.

  4. برنامه خود را طوری تنظیم کنید که مدل بتواند اطلاعات مورد نیاز را برای فراخوانی عملکرد برنامه شما ارسال کند.

  5. پاسخ تابع را به مدل برگردانید تا مدل بتواند پاسخ نهایی خود را ایجاد کند.

پرش به اجرای کد

نمای کلی یک مثال فراخوانی تابع

هنگامی که درخواستی را برای مدل ارسال می‌کنید، می‌توانید مجموعه‌ای از «ابزارها» (مانند توابع) را نیز به مدل ارائه دهید که می‌تواند برای تولید پاسخ نهایی خود از آنها استفاده کند. برای استفاده از این توابع و فراخوانی آنها ("تماس عملکرد")، مدل و برنامه شما باید اطلاعات را پشت سر هم به یکدیگر منتقل کنند، بنابراین روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت چند نوبتی است.

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? .

مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. می‌توانید از فراخوانی تابع برای دادن مسیری به مدل Gemini برای آن API و اطلاعات آب و هوای آن استفاده کنید.

ابتدا، یک تابع fetchWeather در برنامه خود می نویسید که با این API فرضی خارجی، که دارای ورودی و خروجی است، تعامل دارد:

پارامتر تایپ کنید مورد نیاز توضیحات
ورودی
location شیء بله نام شهر و ایالت آن که آب و هوا را برای آن بدست آورید.
فقط شهرهای ایالات متحده پشتیبانی می شوند. همیشه باید یک شی تودرتو از city و state باشد.
date رشته بله تاریخ واکشی آب و هوا (همیشه باید در قالب YYYY-MM-DD باشد).
خروجی
temperature عدد صحیح بله دما (بر حسب فارنهایت)
chancePrecipitation رشته بله احتمال بارندگی (به صورت درصد بیان می شود)
cloudConditions رشته بله شرایط ابری (یکی از clear ، partlyCloudy ، mostlyCloudy ، cloudy )

هنگام راه اندازی مدل، به مدل می گویید که این تابع fetchWeather وجود دارد و چگونه می توان از آن برای پردازش درخواست های دریافتی در صورت نیاز استفاده کرد. این "اعلام عملکرد" ​​نامیده می شود. مدل به طور مستقیم تابع را فراخوانی نمی کند. در عوض، همانطور که مدل در حال پردازش درخواست ورودی است، تصمیم می گیرد که آیا تابع fetchWeather می تواند به آن کمک کند تا به درخواست پاسخ دهد یا خیر. اگر مدل تصمیم بگیرد که این تابع واقعاً می تواند مفید باشد، مدل داده های ساختاری ایجاد می کند که به برنامه شما کمک می کند تا تابع را فراخوانی کند .

دوباره به درخواست دریافتی نگاه کنید: What was the weather in Boston on October 17, 2024? . احتمالاً مدل تصمیم می‌گیرد که تابع fetchWeather می‌تواند به آن در تولید پاسخ کمک کند. این مدل به پارامترهای ورودی مورد نیاز برای fetchWeather نگاه می‌کند و سپس داده‌های ورودی ساخت‌یافته را برای تابعی که تقریباً شبیه این است تولید می‌کند:

{
  functionName: fetchWeather,
  location: {
    city: Boston,
    state: Massachusetts  // the model can infer the state from the prompt
  },
  date: 2024-10-17
}

مدل این داده های ورودی ساخت یافته را به برنامه شما ارسال می کند تا برنامه شما بتواند تابع fetchWeather را فراخوانی کند. وقتی برنامه شما شرایط آب و هوایی را از API دریافت می کند، اطلاعات را به مدل منتقل می کند. این اطلاعات آب و هوا به مدل اجازه می دهد تا پردازش نهایی خود را تکمیل کند و پاسخ خود را به درخواست اولیه What was the weather in Boston on October 17, 2024?

این مدل ممکن است پاسخ نهایی به زبان طبیعی را ارائه دهد، مانند: On October 17, 2024, in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

نمودار نشان می دهد که چگونه فراخوانی تابع شامل تعامل مدل با یک تابع در برنامه شما می شود

فراخوانی تابع را پیاده سازی کنید

قبل از شروع

اگر قبلاً این کار را نکرده‌اید، راهنمای شروع را کامل کنید، که نحوه راه‌اندازی پروژه Firebase را توضیح می‌دهد، برنامه خود را به Firebase متصل کنید، SDK را اضافه کنید، سرویس Vertex AI را راه‌اندازی کنید، و یک نمونه GenerativeModel ایجاد کنید.

مراحل باقی‌مانده در این راهنما به شما نشان می‌دهد که چگونه یک تنظیم فراخوانی تابع شبیه به گردش کار شرح داده شده در مثال فراخوانی اجمالی یک تابع را اجرا کنید (به بخش بالای این صفحه مراجعه کنید).

می توانید نمونه کد کامل را برای مثال فراخوانی این تابع در ادامه این صفحه مشاهده کنید.

مرحله 1 : تابع را بنویسید

تصور کنید برنامه ای دارید که در آن کاربر می تواند پیامی مانند: What was the weather in Boston on October 17, 2024? . مدل های Gemini ممکن است این اطلاعات آب و هوا را ندانند. با این حال، تصور کنید که یک API خدمات هواشناسی خارجی را می شناسید که می تواند آن را ارائه دهد. مثال در این راهنما بر این API خارجی فرضی تکیه دارد.

تابعی را در برنامه خود بنویسید که با API خارجی فرضی تعامل داشته باشد و اطلاعاتی را که برای ایجاد درخواست نهایی نیاز دارد در اختیار مدل قرار دهد. در این مثال آب و هوا، یک تابع fetchWeather خواهد بود که با این API خارجی فرضی تماس برقرار می کند.

// This function calls a hypothetical external API that returns
// a collection of weather information for a given location on a given date.
func fetchWeather(city: String, state: String, date: String) -> JSONObject {

  // TODO(developer): Write a standard function that would call an external weather API.

  // For demo purposes, this hypothetical response is hardcoded here in the expected format.
  return [
    "temperature": .number(38),
    "chancePrecipitation": .string("56%"),
    "cloudConditions": .string("partlyCloudy"),
  ]
}

مرحله 2 : یک اعلان تابع ایجاد کنید

اعلامیه عملکردی را که بعداً به مدل ارائه می دهید (مرحله بعدی این راهنما) ایجاد کنید.

در بیانیه خود ، هرچه بیشتر جزئیات را در توضیحات مربوط به عملکرد و پارامترهای آن درج کنید.

این مدل از اطلاعات موجود در اعلامیه عملکرد استفاده می کند تا تعیین کند کدام عملکرد را انتخاب می کند و چگونه می توان مقادیر پارامتر را برای تماس واقعی به عملکرد ارائه داد. رفتارها و گزینه های اضافی را بعداً در این صفحه مشاهده کنید که چگونه مدل ممکن است از جمله عملکردها را انتخاب کند ، و همچنین چگونه می توانید آن انتخاب را کنترل کنید.

در مورد طرح ارائه شده به موارد زیر توجه داشته باشید:

  • شما باید اعلامیه های عملکردی را در قالب طرحواره ای ارائه دهید که با طرح OpenAPI سازگار باشد. Vertex AI پشتیبانی محدودی از طرح OpenAPI ارائه می دهد.

    • ویژگی های زیر پشتیبانی می شوند: type ، nullable ، required ، format ، description ، properties ، items ، enum .

    • ویژگی های زیر پشتیبانی نمی شوند: default ، optional ، maximum ، oneOf .

  • به طور پیش فرض ، برای Vertex AI در SDK های Firebase ، تمام زمینه ها مورد نیاز در نظر گرفته می شوند ، مگر اینکه آنها را به عنوان اختیاری در یک آرایه optionalProperties مشخص کنید. برای این زمینه های اختیاری ، مدل می تواند زمینه ها را جمع کند یا از آنها پرش کند. توجه داشته باشید که این بر خلاف رفتار پیش فرض برای API vertex ai gemini است.

برای بهترین شیوه های مربوط به اعلامیه های عملکرد ، از جمله نکاتی برای نام و توضیحات ، به بهترین روشها در مستندات Google Cloud مراجعه کنید.

در اینجا چگونه می توانید یک اعلامیه عملکرد بنویسید:

let fetchWeatherTool = FunctionDeclaration(
  name: "fetchWeather",
  description: "Get the weather conditions for a specific city on a specific date.",
  parameters: [
    "location": .object(
      properties: [
        "city": .string(description: "The city of the location."),
        "state": .string(description: "The US state of the location."),
      ],
      description: """
      The name of the city and its state for which to get the weather. Only cities in the
      USA are supported.
      """
    ),
    "date": .string(
      description: """
      The date for which to get the weather. Date must be in the format: YYYY-MM-DD.
      """
    ),
  ]
)

مرحله 3 : اعلامیه عملکرد را در حین اولیه سازی مدل ارائه دهید

حداکثر تعداد اعلامیه های عملکردی که می توانید با درخواست ارائه دهید 128 است. رفتارها و گزینه های دیگری را بعداً در این صفحه مشاهده کنید که چگونه مدل ممکن است از جمله توابع را انتخاب کند ، و همچنین چگونه می توانید آن انتخاب را کنترل کنید (با استفاده از یک toolConfig برای تنظیم حالت فراخوانی عملکرد ).

import FirebaseVertexAI

// Initialize the Vertex AI service and the generative model.
let model = VertexAI.vertexAI().generativeModel(
  modelName: "gemini-2.0-flash",
  // Provide the function declaration to the model.
  tools: [.functionDeclarations([fetchWeatherTool])]
)

بیاموزید که چگونه یک مدل را انتخاب کنید و به صورت اختیاری مکانی مناسب برای مورد و برنامه استفاده خود باشید.

مرحله 4 : برای فراخوانی از API خارجی ، از این تابع تماس بگیرید

اگر مدل تصمیم بگیرد که عملکرد fetchWeather می تواند به آن کمک کند تا پاسخ نهایی را ایجاد کند ، برنامه شما باید با استفاده از داده های ورودی ساختاری ارائه شده توسط مدل ، تماس واقعی را به آن تابع انجام دهد.

از آنجا که باید اطلاعات بین مدل و برنامه به عقب و جلو منتقل شود ، روش توصیه شده برای استفاده از عملکرد فراخوانی از طریق رابط چت چند نوبت است.

قطعه کد زیر نشان می دهد که چگونه برنامه شما گفته می شود که این مدل می خواهد از عملکرد fetchWeather استفاده کند. همچنین نشان می دهد که این مدل مقادیر پارامتر ورودی لازم را برای تماس عملکرد (و API خارجی اساسی آن) ارائه داده است.

در این مثال ، درخواست دریافتی حاوی سریع است What was the weather in Boston on October 17, 2024? . از این سریع ، مدل پارامترهای ورودی را که توسط عملکرد fetchWeather مورد نیاز است استنباط کرد (یعنی city ، state و date ).

let chat = model.startChat()
let prompt = "What was the weather in Boston on October 17, 2024?"

// Send the user's question (the prompt) to the model using multi-turn chat.
let response = try await chat.sendMessage(prompt)

var functionResponses = [FunctionResponsePart]()

// When the model responds with one or more function calls, invoke the function(s).
for functionCall in response.functionCalls {
  if functionCall.name == "fetchWeather" {
    // TODO(developer): Handle invalid arguments.
    guard case let .object(location) = functionCall.args["location"] else { fatalError() }
    guard case let .string(city) = location["city"] else { fatalError() }
    guard case let .string(state) = location["state"] else { fatalError() }
    guard case let .string(date) = functionCall.args["date"] else { fatalError() }

    functionResponses.append(FunctionResponsePart(
      name: functionCall.name,
      // Forward the structured input data prepared by the model
      // to the hypothetical external API.
      response: fetchWeather(city: city, state: state, date: date)
    ))
  }
  // TODO(developer): Handle other potential function calls, if any.
}

مرحله 5 : برای تولید پاسخ نهایی ، خروجی عملکرد را به مدل ارائه دهید

پس از بازگشت عملکرد fetchWeather اطلاعات آب و هوا ، برنامه شما باید آن را به مدل منتقل کند.

سپس ، این مدل پردازش نهایی خود را انجام می دهد و یک پاسخ نهایی به زبان طبیعی مانند: On October 17, 2024 in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

// Send the response(s) from the function back to the model
// so that the model can use it to generate its final response.
let finalResponse = try await chat.sendMessage(
  [ModelContent(role: "function", parts: functionResponses)]
)

// Log the text response.
print(finalResponse.text ?? "No text in response.")

رفتارها و گزینه های اضافی

در اینجا برخی از رفتارهای اضافی برای فراخوانی عملکردی که شما باید در کد و گزینه های خود قرار دهید که می توانید کنترل کنید ، آورده شده است.

ممکن است مدل بخواهد دوباره یک عملکرد یا عملکرد دیگری را فراخوانی کند.

اگر پاسخ از یک تماس عملکردی برای تولید مدل برای تولید پاسخ نهایی خود کافی نباشد ، ممکن است مدل یک تماس عملکرد اضافی بخواهد ، یا از یک عملکرد کاملاً متفاوت درخواست کند. مورد دوم فقط در صورتی اتفاق می افتد که بیش از یک عملکرد را در لیست اعلامیه عملکرد خود ارائه دهید.

برنامه شما باید در آن قرار بگیرد که مدل ممکن است تماس های عملکردی اضافی را درخواست کند.

ممکن است مدل بخواهد همزمان چندین کارکرد را فراخوانی کند.

می توانید حداکثر 128 کارکرد را در لیست اعلامیه عملکرد خود به مدل ارائه دهید. با توجه به این ، مدل ممکن است تصمیم بگیرد که چندین کارکرد برای کمک به تولید پاسخ نهایی خود مورد نیاز است. و ممکن است تصمیم بگیرد که به طور همزمان برخی از این کارکردها را فراخوانی کند - به این فراخوانی عملکرد موازی گفته می شود.

برنامه شما باید در نظر بگیرد که این مدل ممکن است چندین کارکرد را در همان زمان اجرا کند و برنامه شما باید تمام پاسخ های مربوط به توابع را به مدل ارائه دهد.

شما می توانید کنترل کنید که چگونه و اگر مدل می تواند از توابع تماس بگیرد.

شما می توانید برخی از محدودیت ها را در مورد چگونگی و اینکه آیا مدل باید از اعلامیه های عملکرد ارائه شده استفاده کند ، قرار دهید. به این حالت تنظیم حالت فراخوانی تابع گفته می شود. در اینجا چند نمونه آورده شده است:

  • به جای اینکه به مدل اجازه دهید بین یک پاسخ فوری زبان طبیعی و یک تماس عملکردی انتخاب کند ، می توانید آن را وادار کنید که همیشه از تماس های عملکردی استفاده کند. به این فراخوانی تابع تابش گفته می شود.

  • اگر اعلامیه های مختلفی را ارائه می دهید ، می توانید مدل را فقط با استفاده از زیر مجموعه ای از توابع ارائه شده محدود کنید.

شما این محدودیت ها (یا حالت ها) را با اضافه کردن پیکربندی ابزار ( toolConfig ) به همراه اعلامیه های سریع و عملکرد پیاده سازی می کنید. در پیکربندی ابزار می توانید یکی از حالت های زیر را مشخص کنید. مفیدترین حالت ANY است.

حالت توضیحات
AUTO رفتار مدل پیش فرض. این مدل تصمیم می گیرد که از یک تماس عملکردی یا پاسخ به زبان طبیعی استفاده کند.
ANY مدل باید از تماسهای عملکردی ("فراخوانی تابع اجباری") استفاده کند. برای محدود کردن مدل به زیر مجموعه توابع ، نام عملکرد مجاز را در allowedFunctionNames مشخص کنید.
NONE مدل نباید از تماس های عملکردی استفاده کند. این رفتار معادل یک درخواست مدل و بدون هیچ گونه اعلامیه عملکرد مرتبط است.

چه کار دیگری می توانید انجام دهید؟

قابلیت های دیگر را امتحان کنید

بیاموزید که چگونه تولید محتوا را کنترل کنید

همچنین می توانید با استفاده از استودیوی Vertex AI ، با پیکربندی ها و تنظیمات مدل آزمایش کنید.

در مورد مدل های پشتیبانی شده بیشتر بدانید

در مورد مدل های موجود برای موارد مختلف استفاده و سهمیه و قیمت گذاری آنها بیاموزید.


در مورد تجربه خود در مورد Vertex AI در Firebase بازخورد دهید


،


مدل های تولیدی در حل بسیاری از مشکلات قدرتمند هستند. با این حال ، آنها محدودیت هایی مانند:

  • آنها پس از آموزش منجمد می شوند و منجر به دانش بی حسی می شوند.
  • آنها نمی توانند داده های خارجی را پرس و جو یا اصلاح کنند.

تماس عملکرد می تواند به شما در غلبه بر برخی از این محدودیت ها کمک کند. تماس با عملکرد گاهی اوقات به عنوان استفاده از ابزار گفته می شود زیرا به یک مدل اجازه می دهد تا از ابزارهای خارجی مانند API و توابع برای تولید پاسخ نهایی خود استفاده کند.

شما می توانید در مورد عملکرد فراخوانی در مستندات Google Cloud ، از جمله لیست مفیدی از موارد استفاده برای تماس با عملکرد ، اطلاعات بیشتری کسب کنید.

حالت فراخوانی عملکرد توسط تمام مدل های جمینی پشتیبانی می شود (به جز مدل های Gemini 1.0 ).

این راهنما به شما نشان می دهد که چگونه می توانید یک تنظیم تماس عملکردی مشابه با مثال شرح داده شده در بخش اصلی بعدی این صفحه را پیاده سازی کنید. در سطح بالا ، در اینجا مراحل تنظیم تماس با عملکرد در برنامه شما آورده شده است:

  1. تابعی را بنویسید که می تواند اطلاعاتی را در اختیار شما قرار دهد که نیاز به تولید پاسخ نهایی خود دارد (برای مثال ، عملکرد می تواند یک API خارجی را صدا کند).

  2. یک اعلامیه عملکردی ایجاد کنید که عملکرد و پارامترهای آن را توصیف می کند.

  3. بیانیه عملکرد را در حین اولیه سازی مدل ارائه دهید تا مدل در صورت لزوم چگونه می تواند از عملکرد استفاده کند.

  4. برنامه خود را تنظیم کنید تا مدل بتواند اطلاعات مورد نیاز برنامه شما را برای تماس با عملکرد ارسال کند.

  5. پاسخ عملکرد را به مدل منتقل کنید تا مدل بتواند پاسخ نهایی خود را ایجاد کند.

پرش به اجرای کد

نمای کلی از مثال فراخوانی عملکرد

هنگامی که درخواستی را به مدل ارسال می کنید ، می توانید مجموعه ای از "ابزارها" (مانند توابع) را که می تواند برای تولید پاسخ نهایی خود از آن استفاده کند ، ارائه دهید. برای استفاده از این توابع و تماس با آنها ("تماس با عملکرد") ، مدل و برنامه شما باید اطلاعات را به عقب و جلو به یکدیگر منتقل کنند ، بنابراین روش توصیه شده برای استفاده از تماس با عملکرد از طریق رابط چت چند نوری است.

تصور کنید که شما برنامه ای دارید که کاربر بتواند سریعاً وارد آن شود: What was the weather in Boston on October 17, 2024? .

مدل های جمینی ممکن است این اطلاعات آب و هوایی را ندانند. با این حال ، تصور کنید که شما از API سرویس هواشناسی خارجی می دانید که می تواند آن را ارائه دهد. شما می توانید از Function Calling استفاده کنید تا به مدل Gemini مسیری برای آن API و اطلاعات آب و هوایی آن بپردازید.

ابتدا ، شما یک تابع fetchWeather در برنامه خود می نویسید که با این API خارجی فرضی که دارای این ورودی و خروجی است ، در تعامل است:

پارامتر تایپ کنید مورد نیاز توضیحات
ورودی
location شیء بله نام شهر و ایالت آن برای رسیدن به آب و هوا.
فقط شهرهای ایالات متحده پشتیبانی می شوند. همیشه باید یک هدف تو در تو در city و state باشد.
date رشته بله تاریخ برای واکشی هوا (همیشه باید در قالب YYYY-MM-DD باشد).
خروجی
temperature عدد صحیح بله دما (در فارنهایت)
chancePrecipitation رشته بله احتمال بارش (به عنوان درصد بیان شده است)
cloudConditions رشته بله شرایط ابری (یکی از clear ، partlyCloudy ، mostlyCloudy ، cloudy )

هنگام اولیه سازی مدل ، به مدل می گویید که این عملکرد fetchWeather وجود دارد و چگونه می توان در صورت لزوم برای پردازش درخواست های دریافتی استفاده کرد. به این "اعلامیه عملکرد" ​​گفته می شود. مدل عملکرد را مستقیماً فراخوانی نمی کند. در عوض ، همانطور که مدل در حال پردازش درخواست ورودی است ، تصمیم می گیرد که آیا عملکرد fetchWeather می تواند به پاسخ به درخواست کمک کند. اگر مدل تصمیم بگیرد که عملکرد در واقع می تواند مفید باشد ، مدل داده های ساختاری را تولید می کند که به برنامه شما کمک می کند تا عملکرد را فراخوانی کند .

دوباره به درخواست ورودی نگاه کنید: What was the weather in Boston on October 17, 2024? . این مدل به احتمال زیاد تصمیم می گیرد که عملکرد fetchWeather می تواند به تولید پاسخی کمک کند. این مدل به این نگاه می کند که پارامترهای ورودی برای fetchWeather مورد نیاز است و سپس داده های ورودی ساختاری را برای عملکردی که تقریباً شبیه این است تولید می کند:

{
  functionName: fetchWeather,
  location: {
    city: Boston,
    state: Massachusetts  // the model can infer the state from the prompt
  },
  date: 2024-10-17
}

این مدل این داده های ورودی ساختاری را به برنامه شما منتقل می کند تا برنامه شما بتواند با عملکرد fetchWeather تماس بگیرد. هنگامی که برنامه شما شرایط آب و هوایی را از API دریافت می کند ، اطلاعات را به همراه مدل منتقل می کند. این اطلاعات آب و هوایی به مدل اجازه می دهد تا پردازش نهایی خود را تکمیل کند و پاسخ خود را به درخواست اولیه از What was the weather in Boston on October 17, 2024?

این مدل ممکن است پاسخ نهایی به زبان طبیعی مانند: On October 17, 2024, in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

نمودار نشان می دهد که چگونه فراخوانی عملکرد شامل مدل تعامل با یک عملکرد در برنامه شما است

اجرای فراخوانی

قبل از شروع

اگر قبلاً این کار را نکرده اید ، راهنمای شروع کار را تکمیل کنید ، که نحوه تنظیم پروژه Firebase خود را توصیف می کند ، برنامه خود را به Firebase وصل کنید ، SDK را اضافه کنید ، سرویس Vertex AI را اولیه کنید و یک نمونه GenerativeModel ایجاد کنید.

مراحل باقیمانده در این راهنما به شما نشان می دهد که چگونه می توانید یک تنظیم تماس عملکردی مشابه با گردش کار شرح داده شده در نمای کلی از یک مثال فراخوانی عملکرد را پیاده سازی کنید (به بخش برتر این صفحه مراجعه کنید).

بعداً در این صفحه می توانید نمونه کد کامل را برای این مثال فراخوانی عملکرد مشاهده کنید.

مرحله 1 : عملکرد را بنویسید

تصور کنید که شما برنامه ای دارید که کاربر بتواند سریعاً وارد آن شود: What was the weather in Boston on October 17, 2024? . مدل های جمینی ممکن است این اطلاعات آب و هوایی را ندانند. با این حال ، تصور کنید که شما از API سرویس هواشناسی خارجی می دانید که می تواند آن را ارائه دهد. مثال در این راهنما به این API خارجی فرضی متکی است.

عملکردی را در برنامه خود بنویسید که با API خارجی فرضی تعامل داشته باشد و اطلاعات مورد نیاز برای تولید درخواست نهایی خود را در اختیار مدل قرار دهید. در این مثال آب و هوایی ، این یک عملکرد fetchWeather خواهد بود که تماس این API خارجی فرضی را ایجاد می کند.

// This function calls a hypothetical external API that returns
// a collection of weather information for a given location on a given date.
func fetchWeather(city: String, state: String, date: String) -> JSONObject {

  // TODO(developer): Write a standard function that would call an external weather API.

  // For demo purposes, this hypothetical response is hardcoded here in the expected format.
  return [
    "temperature": .number(38),
    "chancePrecipitation": .string("56%"),
    "cloudConditions": .string("partlyCloudy"),
  ]
}

مرحله 2 : یک اعلامیه عملکرد ایجاد کنید

اعلامیه عملکردی را که بعداً به مدل ارائه می دهید (مرحله بعدی این راهنما) ایجاد کنید.

در بیانیه خود ، هرچه بیشتر جزئیات را در توضیحات مربوط به عملکرد و پارامترهای آن درج کنید.

این مدل از اطلاعات موجود در اعلامیه عملکرد استفاده می کند تا تعیین کند کدام عملکرد را انتخاب می کند و چگونه می توان مقادیر پارامتر را برای تماس واقعی به عملکرد ارائه داد. رفتارها و گزینه های اضافی را بعداً در این صفحه مشاهده کنید که چگونه مدل ممکن است از جمله عملکردها را انتخاب کند ، و همچنین چگونه می توانید آن انتخاب را کنترل کنید.

در مورد طرح ارائه شده به موارد زیر توجه داشته باشید:

  • شما باید اعلامیه های عملکردی را در قالب طرحواره ای ارائه دهید که با طرح OpenAPI سازگار باشد. Vertex AI پشتیبانی محدودی از طرح OpenAPI ارائه می دهد.

    • ویژگی های زیر پشتیبانی می شوند: type ، nullable ، required ، format ، description ، properties ، items ، enum .

    • ویژگی های زیر پشتیبانی نمی شوند: default ، optional ، maximum ، oneOf .

  • به طور پیش فرض ، برای Vertex AI در SDK های Firebase ، تمام زمینه ها مورد نیاز در نظر گرفته می شوند ، مگر اینکه آنها را به عنوان اختیاری در یک آرایه optionalProperties مشخص کنید. برای این زمینه های اختیاری ، مدل می تواند زمینه ها را جمع کند یا از آنها پرش کند. توجه داشته باشید که این بر خلاف رفتار پیش فرض برای API vertex ai gemini است.

برای بهترین شیوه های مربوط به اعلامیه های عملکرد ، از جمله نکاتی برای نام و توضیحات ، به بهترین روشها در مستندات Google Cloud مراجعه کنید.

در اینجا چگونه می توانید یک اعلامیه عملکرد بنویسید:

let fetchWeatherTool = FunctionDeclaration(
  name: "fetchWeather",
  description: "Get the weather conditions for a specific city on a specific date.",
  parameters: [
    "location": .object(
      properties: [
        "city": .string(description: "The city of the location."),
        "state": .string(description: "The US state of the location."),
      ],
      description: """
      The name of the city and its state for which to get the weather. Only cities in the
      USA are supported.
      """
    ),
    "date": .string(
      description: """
      The date for which to get the weather. Date must be in the format: YYYY-MM-DD.
      """
    ),
  ]
)

مرحله 3 : اعلامیه عملکرد را در حین اولیه سازی مدل ارائه دهید

حداکثر تعداد اعلامیه های عملکردی که می توانید با درخواست ارائه دهید 128 است. رفتارها و گزینه های دیگری را بعداً در این صفحه مشاهده کنید که چگونه مدل ممکن است از جمله توابع را انتخاب کند ، و همچنین چگونه می توانید آن انتخاب را کنترل کنید (با استفاده از یک toolConfig برای تنظیم حالت فراخوانی عملکرد ).

import FirebaseVertexAI

// Initialize the Vertex AI service and the generative model.
let model = VertexAI.vertexAI().generativeModel(
  modelName: "gemini-2.0-flash",
  // Provide the function declaration to the model.
  tools: [.functionDeclarations([fetchWeatherTool])]
)

بیاموزید که چگونه یک مدل را انتخاب کنید و به صورت اختیاری مکانی مناسب برای مورد و برنامه استفاده خود باشید.

مرحله 4 : برای فراخوانی از API خارجی ، از این تابع تماس بگیرید

اگر مدل تصمیم بگیرد که عملکرد fetchWeather می تواند به آن کمک کند تا پاسخ نهایی را ایجاد کند ، برنامه شما باید با استفاده از داده های ورودی ساختاری ارائه شده توسط مدل ، تماس واقعی را به آن تابع انجام دهد.

از آنجا که باید اطلاعات بین مدل و برنامه به عقب و جلو منتقل شود ، روش توصیه شده برای استفاده از عملکرد فراخوانی از طریق رابط چت چند نوبت است.

قطعه کد زیر نشان می دهد که چگونه برنامه شما گفته می شود که این مدل می خواهد از عملکرد fetchWeather استفاده کند. همچنین نشان می دهد که این مدل مقادیر پارامتر ورودی لازم را برای تماس عملکرد (و API خارجی اساسی آن) ارائه داده است.

در این مثال ، درخواست دریافتی حاوی سریع است What was the weather in Boston on October 17, 2024? . از این سریع ، مدل پارامترهای ورودی را که توسط عملکرد fetchWeather مورد نیاز است استنباط کرد (یعنی city ، state و date ).

let chat = model.startChat()
let prompt = "What was the weather in Boston on October 17, 2024?"

// Send the user's question (the prompt) to the model using multi-turn chat.
let response = try await chat.sendMessage(prompt)

var functionResponses = [FunctionResponsePart]()

// When the model responds with one or more function calls, invoke the function(s).
for functionCall in response.functionCalls {
  if functionCall.name == "fetchWeather" {
    // TODO(developer): Handle invalid arguments.
    guard case let .object(location) = functionCall.args["location"] else { fatalError() }
    guard case let .string(city) = location["city"] else { fatalError() }
    guard case let .string(state) = location["state"] else { fatalError() }
    guard case let .string(date) = functionCall.args["date"] else { fatalError() }

    functionResponses.append(FunctionResponsePart(
      name: functionCall.name,
      // Forward the structured input data prepared by the model
      // to the hypothetical external API.
      response: fetchWeather(city: city, state: state, date: date)
    ))
  }
  // TODO(developer): Handle other potential function calls, if any.
}

مرحله 5 : برای تولید پاسخ نهایی ، خروجی عملکرد را به مدل ارائه دهید

پس از بازگشت عملکرد fetchWeather اطلاعات آب و هوا ، برنامه شما باید آن را به مدل منتقل کند.

سپس ، این مدل پردازش نهایی خود را انجام می دهد و یک پاسخ نهایی به زبان طبیعی مانند: On October 17, 2024 in Boston, it was 38 degrees Fahrenheit with partly cloudy skies.

// Send the response(s) from the function back to the model
// so that the model can use it to generate its final response.
let finalResponse = try await chat.sendMessage(
  [ModelContent(role: "function", parts: functionResponses)]
)

// Log the text response.
print(finalResponse.text ?? "No text in response.")

رفتارها و گزینه های اضافی

در اینجا برخی از رفتارهای اضافی برای فراخوانی عملکردی که شما باید در کد و گزینه های خود قرار دهید که می توانید کنترل کنید ، آورده شده است.

ممکن است مدل بخواهد دوباره یک عملکرد یا عملکرد دیگری را فراخوانی کند.

اگر پاسخ از یک تماس عملکردی برای تولید مدل برای تولید پاسخ نهایی خود کافی نباشد ، ممکن است مدل یک تماس عملکرد اضافی بخواهد ، یا از یک عملکرد کاملاً متفاوت درخواست کند. مورد دوم فقط در صورتی اتفاق می افتد که بیش از یک عملکرد را در لیست اعلامیه عملکرد خود ارائه دهید.

برنامه شما باید در آن قرار بگیرد که مدل ممکن است تماس های عملکردی اضافی را درخواست کند.

ممکن است مدل بخواهد همزمان چندین کارکرد را فراخوانی کند.

می توانید حداکثر 128 کارکرد را در لیست اعلامیه عملکرد خود به مدل ارائه دهید. با توجه به این ، مدل ممکن است تصمیم بگیرد که چندین کارکرد برای کمک به تولید پاسخ نهایی خود مورد نیاز است. و ممکن است تصمیم بگیرد که به طور همزمان برخی از این کارکردها را فراخوانی کند - به این فراخوانی عملکرد موازی گفته می شود.

برنامه شما باید در نظر بگیرد که این مدل ممکن است چندین کارکرد را در همان زمان اجرا کند و برنامه شما باید تمام پاسخ های مربوط به توابع را به مدل ارائه دهد.

شما می توانید کنترل کنید که چگونه و اگر مدل می تواند از توابع تماس بگیرد.

شما می توانید برخی از محدودیت ها را در مورد چگونگی و اینکه آیا مدل باید از اعلامیه های عملکرد ارائه شده استفاده کند ، قرار دهید. به این حالت تنظیم حالت فراخوانی تابع گفته می شود. در اینجا چند نمونه آورده شده است:

  • به جای اینکه به مدل اجازه دهید بین یک پاسخ فوری زبان طبیعی و یک تماس عملکردی انتخاب کند ، می توانید آن را وادار کنید که همیشه از تماس های عملکردی استفاده کند. به این فراخوانی تابع تابش گفته می شود.

  • اگر اعلامیه های مختلفی را ارائه می دهید ، می توانید مدل را فقط با استفاده از زیر مجموعه ای از توابع ارائه شده محدود کنید.

شما این محدودیت ها (یا حالت ها) را با اضافه کردن پیکربندی ابزار ( toolConfig ) به همراه اعلامیه های سریع و عملکرد پیاده سازی می کنید. در پیکربندی ابزار می توانید یکی از حالت های زیر را مشخص کنید. مفیدترین حالت ANY است.

حالت توضیحات
AUTO رفتار مدل پیش فرض. این مدل تصمیم می گیرد که از یک تماس عملکردی یا پاسخ به زبان طبیعی استفاده کند.
ANY مدل باید از تماسهای عملکردی ("فراخوانی تابع اجباری") استفاده کند. برای محدود کردن مدل به زیر مجموعه توابع ، نام عملکرد مجاز را در allowedFunctionNames مشخص کنید.
NONE مدل نباید از تماس های عملکردی استفاده کند. این رفتار معادل یک درخواست مدل و بدون هیچ گونه اعلامیه عملکرد مرتبط است.

چه کار دیگری می توانید انجام دهید؟

قابلیت های دیگر را امتحان کنید

بیاموزید که چگونه تولید محتوا را کنترل کنید

همچنین می توانید با استفاده از استودیوی Vertex AI ، با پیکربندی ها و تنظیمات مدل آزمایش کنید.

در مورد مدل های پشتیبانی شده بیشتر بدانید

در مورد مدل های موجود برای موارد مختلف استفاده و سهمیه و قیمت گذاری آنها بیاموزید.


در مورد تجربه خود در مورد Vertex AI در Firebase بازخورد دهید