Компасное решение
Создайте приложение для планирования поездок на базе агентов с помощью генеративного искусственного интеллекта.
Архитектура приложения
На следующей диаграмме показан общий обзор того, как можно объединить лучшие в своем классе службы разработчиков Google для создания приложений на основе искусственного интеллекта.
Создавайте красивые приложения на базе искусственного интеллекта для мобильных устройств и Интернета.
Вы можете использовать Flutter и Firebase Genkit для создания многоплатформенных приложений, которые могут легко интегрироваться с ИИ.
Легко вызывайте Firebase Genkit из приложения Flutter.
Вы можете использовать Genkit, чтобы ваше приложение могло уверенно получать данные из LLM, определив схему, которая может проверять выходные данные LLM. Во Flutter вы можете использовать Dart для сериализации запроса и десериализации ответа в соответствии со схемой Genkit, используя стандартные HTTP-запросы.
Начните работу с Flutter в IDX
С IDX вы можете создать приложение Flutter без необходимости устанавливать какое-либо программное обеспечение. Это позволяет разрабатывать и тестировать приложение для Android и веб-приложение в браузере.
Подключите свою базу данных с помощью Firebase Data Connect
Firebase Data Connect — это сервис реляционной базы данных для мобильных и веб-приложений, который позволяет создавать и масштабировать с помощью полностью управляемой базы данных PostgreSQL на базе Cloud SQL. Он обеспечивает безопасную схему, а также управление запросами и мутациями с помощью GraphQL, который хорошо интегрируется с аутентификацией Firebase. Data Connect включает поддержку SDK для Kotlin Android и Интернета.
Создайте агент с помощью 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.
При работе с генеративным ИИ важно создавать эффективные подсказки, чтобы модель возвращала качественные ответы. Firebase Genkit предоставляет плагин Dotprompt и текстовый формат, которые помогут вам писать и организовывать генеративные подсказки ИИ. Этот формат инкапсулирует приглашение, схему ввода и вывода, модель и конфигурацию в одном файле.
В следующем примере кода показан файл Dotprompt, используемый в приложении для путешествий. Схема основана на информации, которую пользователь предоставляет, когда описывает путешествие своей мечты.
В следующем примере кода показан файл Dotprompt, используемый в приложении для путешествий. Схема основана на информации, которую пользователь предоставляет, когда описывает путешествие своей мечты.
Подсказка
Dotprompt разработан на основе предположения, что подсказки — это код. Вы пишете и поддерживаете свои подсказки в файлах специального формата, называемых файлами dotprompt, отслеживаете изменения в них, используя ту же систему контроля версий, которую вы используете для своего кода, и развертываете их вместе с кодом, который вызывает ваши генеративные модели ИИ.
Потоки
Потоки — это функции, которые являются строго типизированными, потоковыми, вызываемыми локально и удаленно и полностью наблюдаемыми. Firebase Genkit предоставляет интерфейс командной строки и пользовательский интерфейс разработчика для работы с потоками, например запуска или отладки потоков.
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, чтобы расширить функциональность агента, чтобы агент мог дополнительно уточнять ответы и выполнять дополнительные задачи. Приложение для путешествий определяет инструмент, который может возвращать информацию о ресторане из Places API в зависимости от желаемой поездки пользователя. Код использует 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 для интеграции с собственными возможностями преобразования речи в текст для каждой платформы и использует API Gemini внутри Firebase Genkit для обработки мультимодальных входных данных, таких как изображения или видео. API Gemini использует генерацию с расширенным поиском (RAG) для возврата набора предлагаемых поездок с помощью Firebase Data Connect и внедрений для выполнения поиска ближайшего соседа .
Приложение использует пакет Dart от pub.dev для интеграции с собственными возможностями преобразования речи в текст для каждой платформы и использует API Gemini внутри Firebase Genkit для обработки мультимодальных входных данных, таких как изображения или видео. API Gemini использует генерацию с расширенным поиском (RAG) для возврата набора предлагаемых поездок с помощью Firebase Data Connect и внедрений для выполнения поиска ближайшего соседа .
Масштабируйте свое приложение для производства
Следуйте производственным рекомендациям для всех ваших облачных сервисов.
Хостинг Firebase интегрируется с популярными современными веб-фреймворками, включая Flutter. Используя хостинг Firebase и облачные функции для Firebase с этими платформами, вы можете разрабатывать приложения и микросервисы в предпочитаемой вами среде платформы, а затем развертывать их в управляемой, безопасной серверной среде. Прежде чем приступить к работе, изучите безопасность и производительность всех сервисов вашего приложения. Дополнительную информацию см. в контрольном списке запуска Firebase.
Vertex AI
Приложение для путешествий использует искусственный интеллект Google для быстрой обработки тестовых данных и является хорошим выбором для приложений с минимальными вариантами использования искусственного интеллекта, которые не требуют масштабирования. Vertex AI имеет более высокую квоту для масштабирования производственных приложений и более строгую политику конфиденциальности для защиты пользовательских данных. Genkit имеет встроенные функции для легкого переключения моделей, поэтому вам не нужно переписывать запросы или вызовы API.