راه حل قطب نما

با هوش مصنوعی Generative یک برنامه برنامه ریزی سفر با نیروی کارگزار بسازید

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

برنامه های زیبا و مجهز به هوش مصنوعی برای موبایل و وب بسازید

می‌توانید از Flutter و Firebase Genkit برای ساخت اپلیکیشن‌های چند پلتفرمی استفاده کنید که می‌توانند به‌طور یکپارچه با هوش مصنوعی ادغام شوند.
می‌توانید از Genkit استفاده کنید تا برنامه‌تان را قادر کنید تا داده‌های LLM را به‌طور مطمئن با تعریف طرحی که می‌تواند خروجی LLM را تأیید کند، مصرف کند. در Flutter، می‌توانید از Dart برای سریال‌سازی درخواست استفاده کنید و پاسخ را برای مطابقت با طرح Genkit با استفاده از درخواست‌های استاندارد HTTP غیر سریالی کنید.
با IDX، می‌توانید بدون نیاز به نصب نرم‌افزار، یک برنامه Flutter ایجاد کنید. این امکان توسعه و آزمایش برنامه اندروید و برنامه وب خود را در مرورگر فراهم می کند.
Firebase Data Connect یک سرویس پایگاه داده رابطه‌ای برای برنامه‌های تلفن همراه و وب است که به شما امکان می‌دهد با استفاده از یک پایگاه داده PostgreSQL کاملاً مدیریت شده توسط Cloud SQL بسازید و مقیاس‌بندی کنید. این طرحواره ایمن و مدیریت پرس و جو و جهش را با استفاده از GraphQL فراهم می کند که به خوبی با Firebase Authentication ادغام می شود. Data Connect شامل پشتیبانی SDK برای اندروید و وب Kotlin است.

با Firebase Genkit یک عامل بسازید

عامل از یک چارچوب هماهنگ سازی هوش مصنوعی برای دریافت ورودی کاربر و تولید پاسخ استفاده می کند.
---
model: googleai/gemini-1.5-flash-latest
config:
  temperature: 1.0
  safetySettings:
    - category: HARM_CATEGORY_HATE_SPEECH
      threshold: BLOCK_LOW_AND_ABOVE
    - category: HARM_CATEGORY_DANGEROUS_CONTENT
      threshold: BLOCK_ONLY_HIGH
    - category: HARM_CATEGORY_HARASSMENT
      threshold: BLOCK_LOW_AND_ABOVE
    - category: HARM_CATEGORY_SEXUALLY_EXPLICIT
      threshold: BLOCK_LOW_AND_ABOVE
input:
  schema:
    request: string, The users request for where they want to travel to.
    place: string, The place that closely represents the users request.
    placeDescription: string, A description of that place.
    activities(array, a stringify list of activities that can be found at the specified place): string
    restaurants?(array, a stringify list of all the restaurants found at that location): string
output:
  schema:
    place: string, The place the user is traveling to.
    itineraryName: string, a catchy itinerary name that encapsulates the spirit of the trip and includes the place name
    startDate: string, the start date of the trip
    endDate: string, the end date of the trip
    tags(array, relevant tags for the trip): string
    itinerary(array):
      day: number
      date: string
      planForDay(array):
        activityRef: string, the reference value for the activity - this comes from the available activities JSON. If no value is present use a ref value of restaurant.
        activityTitle: string, a catchy title for the activity
        activityDesc: string, a six word description of the activity
        photoUri?: string, set the photo uri value for restaurants only.
        googleMapsUri?: string, if this is a restaurant include the googleMapsUri
---

Generate an itinerary for a tourist planning on traveling to the location specified based in their request.
If there is something that does not exist within the list of activities, do not include it in your answer.
Feel free to relate the activitiy to the request in a meaningful way.
In the plan for day array, put activities as a travel brouchure might do.
Come up with a catchy name for the itinerary.

Pick three activities per day, minimum of three day trip unless otherwise specified in the request.

Output schema should not include the properties type or object.

Pick a date after 2024-05-14 but before 2024-12-31.

The output date must be in the format year-month-day.

Give each activity a unique title and description.

Limit activity descriptions to 6 words.

If no restaurants are supplied, do not recommend any restaurants to eat at.

{{#if restaurants}}
Find a restaurant to eat at each day.

Include a restaurant to visit in the itinerary for each day from the available restaurants.
The restaurant should be the only activity with a photoUri.
The photoUri for the restaurant should be from the photoUri property from the restaurant array.
If there are no restaurants to pick from, do not include it in the list.

The photoUri from the restaurantFinder should be in the format of places/${placeId}/photos/${photoId}

Each restaurant should be unique to the overall itinerary.
Each restaurant must contain a photoUri in their output JSON schema.
Each restaurant must also include  an activitiyRef, activityTitle, and activityDesc in their output
{{/if}}
Output must be in JSON format.

REQUEST : {{request}}
PLACE : {{place}}
PLACE DESCRIPTION : {{placeDescription}}
AVAILABLE ACTIVITIES : {{activities}}
RESTAURANTS : {{restaurants}}
هنگام کار با هوش مصنوعی مولد، مهم است که اعلان‌های مؤثر ایجاد کنید تا مدل پاسخ‌های با کیفیت بالا را ارائه دهد. Firebase Genkit افزونه Dotprompt و قالب متنی را برای کمک به شما در نوشتن و سازماندهی اعلان‌های هوش مصنوعی تولیدی خود ارائه می‌کند. فرمت درخواست، طرحواره ورودی و خروجی، مدل و پیکربندی را در یک فایل واحد محصور می کند.

مثال کد زیر یک فایل Dotprompt را نشان می دهد که در برنامه سفر استفاده می شود. این طرح بر اساس اطلاعاتی است که کاربر هنگام توصیف سفر رویایی خود ارائه می دهد.
Dotprompt بر اساس این فرض طراحی شده است که دستورات کد هستند. شما درخواست‌های خود را در فایل‌هایی با فرمت خاص به نام فایل‌های dotprompt می‌نویسید و نگهداری می‌کنید، تغییرات آن‌ها را با استفاده از سیستم کنترل نسخه مشابهی که برای کد خود استفاده می‌کنید، ردیابی می‌کنید، و آنها را همراه با کدی که مدل‌های هوش مصنوعی تولیدی شما را فراخوانی می‌کند، مستقر می‌کنید.
جریان ها توابعی هستند که به شدت تایپ شده، قابل پخش، قابل فراخوانی محلی و از راه دور و کاملاً قابل مشاهده هستند. Firebase Genkit یک رابط خط فرمان و UI توسعه دهنده برای کار با جریان ها، مانند جریان های در حال اجرا یا اشکال زدایی ارائه می دهد.
import {defineTool} from '@genkit-ai/ai/tool';
...
{
  name: 'restaurantFinder',
  description: `Used when needing to find a restaurant based on a users location.
  The location should be used to find nearby restaurants to a place. You can also
  selectively find restaurants based on the users preferences, but you should default
  to 'Local' if there are no indications of restaurant types in the users request.
  `,
  inputSchema: z.object({
    place: z.string(),
    typeOfRestaurant: z.string().optional() }),
    outputSchema: z.unknown(),
},
...
async (input) => {
  if (input.typeOfRestaurant == undefined) {
    input.typeOfRestaurant = "Local";
  }
  const geocodeEndpoint = "https://places.googleapis.com/v1/places:searchText";
  const textQuery = {textQuery: `${input.typeOfRestaurant} restaurants in ${input.place}`};

  const  response = await axios.post(
    geocodeEndpoint,
    JSON.stringify(textQuery),
    {
      headers: {
        "Content-Type": "application/json",
        "X-Goog-Api-Key": MAPS_API_KEY,
        "X-Goog-FieldMask": "places.displayName,places.formattedAddress,places.priceLevel,places.photos.name,places.editorialSummary,places.googleMapsUri"
      }
    }
  );
  console.log(response.data);
  let data = (response.data as PlaceResponse);
  for(let i = 0; i < data.places.length; i++) {
    if (data.places[i].photos) {
      data.places[i].photos = [data.places[i].photos[0]];
    }
  }
  return data as PlaceResponse;
}
می توانید از فراخوانی تابع در Genkit برای گسترش عملکرد عامل استفاده کنید تا نماینده بتواند پاسخ ها را بیشتر اصلاح کند و کارهای اضافی را تکمیل کند. اپلیکیشن سفر ابزاری را تعریف می کند که می تواند اطلاعات رستوران را از API Places بر اساس سفر مورد نظر کاربر برگرداند. این کد از Zod برای تعریف طرحواره ورودی و خروجی استفاده می کند تا نتایج پرس و جو اعتبار سنجی شود.
...
export const textRefinement = defineFlow(
{
  name: 'textRefinement',
  inputSchema: z.string(),
  outputSchema: z.unknown(),
},
async (userRequest) => {
  const refinementPrompt = await prompt('textRefinement')
  const result = await refinementPrompt.generate({
      input: {
          request: userRequest
      },
  });
  return result.output();
});
برای کمک به ارائه تجربه جستجوی مناسب‌تر به کاربران، پس از اینکه کاربر سفر رویایی خود را توصیف می‌کند، Gemini بر اساس اعلان‌هایی که برنامه سفر ارائه می‌کند، تعیین می‌کند که آیا اطلاعات بیشتری مورد نیاز است یا خیر، و اگر فکر می‌کند به اطلاعات بیشتری نیاز است به برنامه سیگنال می‌دهد. سپس برنامه آن اطلاعات را از کاربر درخواست می کند و آن را به درخواست موجود در باطن اضافه می کند.
import 'package:http:http.dart' as http;
...
Future<List<Trip>> generateTrips(String description, List<Image> images) async {
  final uri = Uri.parse('.../generateTrips');
  final request = http.MultipartRequest('POST', uri);
  request.fields['description'] = description;
  request.files.add(http.MultipartFile.fromData(
      images.name, images.bytes,
      contentType: MediaType('image', 'png'),
  ));
  var response = await request.send();
  if (response.statusCode == 200) {
      final body = await response.body.text();
      final items = jsonDecode(body) as List<dynamic>;
      return items.map(Trip.fromJson).toList();
  }
  ...
  import { imagen2, geminiProVision } from '@genkit-ai/vertexai';
  import { generate } from '@genkit-ai/ai';

  const imageResult = await generate({
    model: imagen2,
    prompt: 'Generate an image of a very specific historical time and place.',
  });
  const generatedImage = imageResult.media();

  const descriptionResult = await generate({
    model: geminiProVision,
    prompt: [
      {
        text: 'What is the historical time and place represented in this picture?',
      },
      { media: generatedImage },
    ],
  });
  console.log(descriptionResult.text());
  }
اپلیکیشن سفر از کاربر می خواهد که سفر رویایی خود را با استفاده از ورودی متن یا با زدن دکمه میکروفون برای فعال کردن گفتار به نوشتار تعریف کند. کاربر همچنین می تواند به صورت اختیاری تصاویر را آپلود کند.

این برنامه از بسته Dart از pub.dev برای ادغام با قابلیت های گفتار به متن بومی برای هر پلتفرم استفاده می کند و از Gemini API در داخل Firebase Genkit برای مدیریت ورودی های چندوجهی مانند تصاویر یا ویدیوها استفاده می کند. Gemini API از نسل افزوده شده بازیابی (RAG) برای بازگرداندن مجموعه ای از سفرهای پیشنهادی با استفاده از Firebase Data Connect و جاسازی‌ها برای انجام جستجوی نزدیکترین همسایه استفاده می‌کند.

برنامه خود را برای تولید مقیاس کنید

میزبانی Firebase با چارچوب های وب مدرن محبوب از جمله Flutter ادغام می شود. با استفاده از میزبانی Firebase و توابع ابری برای Firebase با این چارچوب‌ها، می‌توانید برنامه‌ها و ریزسرویس‌ها را در محیط فریمورک دلخواه خود توسعه دهید و سپس آنها را در یک محیط سرور مدیریت شده و امن مستقر کنید. قبل از رفتن به تولید، امنیت و عملکرد همه خدمات در برنامه خود را درک کنید. برای اطلاعات بیشتر به چک لیست راه اندازی Firebase مراجعه کنید.
برنامه سفر از هوش مصنوعی گوگل برای تکرار سریع داده های آزمایشی استفاده می کند و برای برنامه هایی با حداقل موارد استفاده از هوش مصنوعی که نیازی به مقیاس بندی ندارند، انتخاب خوبی است. Vertex AI سهمیه بالاتری برای کمک به مقیاس برنامه های تولید و سیاست های حفظ حریم خصوصی قوی تر برای محافظت از داده های کاربر دارد. Genkit دارای عملکرد داخلی برای تعویض آسان مدل ها است، بنابراین نیازی به بازنویسی درخواست ها یا تماس های API خود ندارید.