Создание системы обработки избыточных данных в реальном времени с использованием Gemini 3 Flash и AlloyDB.

1. Обзор

В этом практическом занятии вы создадите Neighbor Loop, приложение для устойчивого обмена излишками ресурсов, которое рассматривает интеллект как полноправного участника уровня данных.

Интеграция Gemini 3.0 Flash и AlloyDB AI позволит вам выйти за рамки простого хранения данных и перейти к интеллектуальному анализу непосредственно в базе данных. Вы научитесь выполнять многомодальный анализ элементов и семантическое обнаружение прямо в SQL, устраняя «налог на ИИ», связанный с задержками и раздуванием архитектуры.

1da27e0c4d9a33e0.jpeg

Что вы построите

Высокопроизводительное веб-приложение с функцией "подбор совпадений по свайпу" для обмена излишками товаров и услуг внутри сообщества.

Что вы узнаете

  • Создание кластера и экземпляра AlloyDB в один клик: как настроить кластер и экземпляр, предназначенные для рабочих нагрузок ИИ.
  • Встраивание данных в базу данных: генерация векторов text-embedding-005 непосредственно в операторах INSERT.
  • Мультимодальное мышление: использование Gemini 3.0 Flash для «просмотра» элементов и автоматического создания остроумных биографий в стиле сайтов знакомств.
  • Семантическое обнаружение: выполнение логических «проверок на соответствие» внутри SQL-запросов с использованием функции ai.if() для фильтрации результатов на основе контекста, а не только математических вычислений.

Архитектура

Метод Neighbor Loop позволяет обойти традиционные узкие места на уровне приложений. Вместо извлечения данных для их обработки мы используем:

  1. AlloyDB AI: для генерации и хранения векторов в режиме реального времени.
  2. Google Cloud Storage: для хранения изображений.
  3. Gemini 3.0 Flash: Для выполнения вычислений с точностью до долей секунды на основе данных изображений и текста непосредственно через SQL.
  4. Cloud Run: Для размещения легковесного бэкенда на Flask, работающего в одном файле.

Требования

  • Браузер, например Chrome или Firefox .
  • Проект Google Cloud с включенной функцией выставления счетов.
  • Базовые знания SQL и Python.

2. Прежде чем начать

Создать проект

  1. В консоли Google Cloud на странице выбора проекта выберите или создайте проект Google Cloud.
  2. Убедитесь, что для вашего облачного проекта включена функция выставления счетов. Узнайте, как проверить, включена ли функция выставления счетов для проекта .
  1. Вы будете использовать Cloud Shell — среду командной строки, работающую в Google Cloud. Нажмите «Активировать Cloud Shell» в верхней части консоли Google Cloud.

Изображение кнопки «Активировать Cloud Shell»

  1. После подключения к Cloud Shell необходимо проверить, прошли ли вы аутентификацию и установлен ли идентификатор вашего проекта, используя следующую команду:
gcloud auth list
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте.
gcloud config list project
  1. Если ваш проект не задан, используйте следующую команду для его установки:
gcloud config set project <YOUR_PROJECT_ID>
  1. Включите необходимые API: перейдите по ссылке и включите API.

В качестве альтернативы можно использовать команду gcloud. Для получения информации о командах gcloud и их использовании обратитесь к документации .

Подводные камни и устранение неполадок

Синдром «Проекта-призрака»

Вы выполнили команду gcloud config set project , но в консоли отображается другой проект. Проверьте идентификатор проекта в выпадающем списке в левом верхнем углу!

Баррикада Биллинга

Вы активировали проект, но забыли указать платежный аккаунт. AlloyDB — высокопроизводительный движок; он не запустится, если «топливо» (платежный бак) пуст.

Задержка распространения API

Вы нажали «Включить API», но в командной строке по-прежнему отображается сообщение Service Not Enabled . Подождите 60 секунд. Облаку нужно время, чтобы активировать свои нейроны.

Квота Квагс

Если вы используете совершенно новую пробную учетную запись, вы можете столкнуться с региональной квотой на экземпляры AlloyDB. Если us-central1 не работает, попробуйте us-east1 .

«Скрытый» сервисный агент

Иногда агенту службы AlloyDB автоматически не предоставляется роль aiplatform.user . Если ваши SQL-запросы не могут взаимодействовать с Gemini в дальнейшем, обычно в этом причина.

3. Настройка базы данных

В этой лабораторной работе мы будем использовать AlloyDB в качестве базы данных для тестовых данных. Она использует кластеры для хранения всех ресурсов, таких как базы данных и журналы. Каждый кластер имеет основной экземпляр , который обеспечивает точку доступа к данным. Таблицы будут содержать сами данные.

Давайте создадим кластер AlloyDB, экземпляр и таблицу, куда будет загружен тестовый набор данных.

  1. Нажмите на кнопку или скопируйте ссылку ниже в браузер, где вы авторизованы в Google Cloud Console.

  1. После завершения этого шага репозиторий будет клонирован в ваш локальный редактор CloudShell, и вы сможете запустить приведенную ниже команду, указав папку проекта (важно убедиться, что вы находитесь в каталоге проекта):
sh run.sh
  1. Теперь воспользуйтесь пользовательским интерфейсом (щелкните ссылку в терминале или щелкните ссылку «предварительный просмотр в веб-браузере» в терминале).
  2. Введите данные для идентификатора проекта, названия кластера и экземпляра, чтобы начать работу.
  3. Пока прокручиваются логи, выпейте кофе, а подробнее о том, как это всё происходит за кулисами, вы можете прочитать здесь.

Подводные камни и устранение неполадок

Проблема «терпения»

Кластеры баз данных — это ресурсоемкая инфраструктура. Если вы обновите страницу или завершите сессию Cloud Shell, потому что она «зависла», вы можете получить «фантомный» экземпляр, который будет частично выделен и его невозможно будет удалить без ручного вмешательства.

Региональное несоответствие

Если вы включили API в регионе us-central1 , но пытаетесь развернуть кластер в регионе asia-south1 , вы можете столкнуться с проблемами квот или задержками в предоставлении прав доступа к учетной записи службы. Используйте один регион для всей тестовой среды!

Скопления зомби

Если вы ранее использовали это же имя для кластера и не удалили его, скрипт может сообщить, что имя кластера уже существует. Имена кластеров должны быть уникальными в рамках одного проекта.

Таймаут облачной оболочки

Если ваш перерыв на кофе длится 30 минут, Cloud Shell может перейти в спящий режим и отключить процесс sh run.sh Поэтому оставьте вкладку активной!

4. Предоставление схемы

После запуска кластера и экземпляра AlloyDB перейдите в редактор SQL AlloyDB Studio, чтобы включить расширения AI и настроить схему.

1e3ac974b18a8113.png

Возможно, вам потребуется дождаться завершения создания экземпляра. После этого войдите в AlloyDB, используя учетные данные, которые вы создали при создании кластера. Для аутентификации в PostgreSQL используйте следующие данные:

  • Имя пользователя: " postgres "
  • База данных: " postgres "
  • Пароль: " alloydb " (или тот, который вы указали при создании учетной записи)

После успешной аутентификации в AlloyDB Studio команды SQL вводятся в редакторе. Вы можете добавить несколько окон редактора, используя значок плюса справа от последнего окна.

28cb9a8b6aa0789f.png

Команды для AlloyDB будут вводиться в окнах редактора, используя при необходимости параметры «Выполнить», «Форматировать» и «Очистить».

Включить расширения

Для создания этого приложения мы будем использовать расширения pgvector и google_ml_integration . Расширение pgvector позволяет хранить и искать векторные представления. Расширение google_ml_integration предоставляет функции, которые вы используете для доступа к конечным точкам прогнозирования Vertex AI и получения прогнозов в формате SQL. Включите эти расширения, выполнив следующие DDL-скрипты:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

Создайте таблицу

В AlloyDB Studio можно создать таблицу, используя приведенный ниже оператор DDL:

-- Items Table (The "Profile" you swipe on)
CREATE TABLE items (
   item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   owner_id UUID,
   provider_name TEXT,
   provider_phone TEXT,
   title TEXT,
   bio TEXT,
   category TEXT,
   image_url TEXT,
   item_vector VECTOR(768),
   status TEXT DEFAULT 'available',
   created_at TIMESTAMP DEFAULT NOW()
);

-- Swipes Table (The Interaction)
CREATE TABLE swipes (
   swipe_id SERIAL PRIMARY KEY,
   swiper_id UUID,
   item_id UUID REFERENCES items(item_id),
   direction TEXT CHECK (direction IN ('left', 'right')),
   is_match BOOLEAN DEFAULT FALSE,
   created_at TIMESTAMP DEFAULT NOW()
);

Столбец item_vector позволит хранить векторные значения текста.

Предоставить разрешение

Выполните указанное ниже выражение, чтобы предоставить права на выполнение функции "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Предоставьте учетной записи службы AlloyDB роль пользователя Vertex AI.

В консоли Google Cloud IAM предоставьте учетной записи службы AlloyDB (которая выглядит следующим образом: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) доступ к роли "Пользователь Vertex AI". В поле PROJECT_NUMBER будет указан номер вашего проекта.

В качестве альтернативы вы можете выполнить следующую команду в терминале Cloud Shell:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

Зарегистрируйте модель Gemini 3 Flash в AlloyDB.

Выполните приведенный ниже SQL-запрос в редакторе запросов AlloyDB.

CALL google_ml.create_model(
   model_id => 'gemini-3-flash-preview',
   model_request_url => 'https://aiplatform.googleapis.com/v1/projects/<<YOUR_PROJECT_ID>>/locations/global/publishers/google/models/gemini-3-flash-preview:generateContent',
   model_qualified_name => 'gemini-3-flash-preview',
   model_provider => 'google',
   model_type => 'llm',
   model_auth_type => 'alloydb_service_agent_iam'
);
--replace <<YOUR_PROJECT_ID>> with your project id.

Подводные камни и устранение неполадок

Цикл «Забвения паролей»

Если вы использовали настройку "в один клик" и не помните свой пароль, перейдите на страницу основной информации об экземпляре в консоли и нажмите "Изменить", чтобы сбросить пароль postgres .

Ошибка "Расширение не найдено"

Если CREATE EXTENSION завершается с ошибкой, это часто происходит потому, что экземпляр все еще находится в состоянии «Обслуживание» или «Обновление» после первоначального создания. Проверьте, завершен ли этап создания экземпляра, и при необходимости подождите несколько секунд.

Разрыв в распространении IAM

Вы выполнили команду gcloud IAM, но CALL SQL по-прежнему завершается ошибкой доступа. Изменения в IAM могут потребовать некоторого времени для распространения по сети Google. Сделайте глубокий вдох.

Несоответствие размерности вектора

Таблица items настроена на VECTOR(768) . Если вы позже попытаетесь использовать другую модель (например, модель с размерами 1536), ваши вставки приведут к сбою. Используйте text-embedding-005 .

Опечатка в идентификаторе проекта

Если в вызове функции create_model вы оставите скобки « » или неправильно введете идентификатор проекта, регистрация модели будет выглядеть успешной, но завершится ошибкой при первом же фактическом запросе. Дважды проверьте свою строку!

5. Хранилище изображений (Google Cloud Storage)

Для хранения фотографий наших излишков товаров мы используем хранилище GCS. В целях данного демонстрационного приложения нам необходимо, чтобы изображения были общедоступны и мгновенно отображались на наших считывающих картах.

  1. Создание хранилища: Создайте новое хранилище в вашем проекте GCP (например, neighborloop-images), предпочтительно в том же регионе, что и ваша база данных и приложение.
  2. Настройка публичного доступа: * Перейдите на вкладку «Разрешения» в настройках хранилища.
  3. Добавьте субъект allUsers .
  4. Назначьте роль « Просмотрщик объектов хранилища» (чтобы все могли видеть фотографии) и роль « Создатель объектов хранилища» (для целей загрузки демонстрационных файлов).

Альтернативный вариант (служебная учетная запись): Если вы предпочитаете не использовать публичный доступ, убедитесь, что служебной учетной записи вашего приложения предоставлен полный доступ к AlloyDB и необходимые роли хранилища для безопасного управления объектами.

Подводные камни и устранение неполадок

Региональный перетаскивание

Если ваша база данных находится в регионе us-central1 , а хранилище — в europe-west1 , вы буквально замедляете работу ИИ. "Проверка атмосферы" происходит быстро, но загрузка изображения для пользовательского интерфейса будет происходить медленно. Держите их в одном регионе!

Уникальность названия категории

Имена сегментов (bucket names) представляют собой глобальное пространство имен. Если вы попытаетесь присвоить своему сегменту имя neighborloop-images , скорее всего, оно уже занято кем-то другим. Если создание имени не удастся, добавьте случайный суффикс.

Путаница между «создателем» и «зрителем»

Путаница с «Создателем» и «Просмотрщиком»: если вы добавите только «Просмотрщика», ваше приложение будет аварийно завершать работу, когда пользователь попытается добавить новый элемент, поскольку у него нет разрешения на запись в файл. Для этой конкретной демонстрационной конфигурации вам нужны оба параметра.

6. Давайте создадим приложение.

Клонируйте этот репозиторий в свой проект, и давайте разберемся.

  1. Чтобы клонировать этот проект, в терминале Cloud Shell (в корневом каталоге или в любом другом месте, где вы хотите его создать) выполните следующую команду:
git clone https://github.com/AbiramiSukumaran/neighbor-loop

Это должно создать проект, и вы можете проверить это в редакторе Cloud Shell.

53a398aff6ba7d5b.png

  1. Как получить ключ API Gemini
  2. Посетите Google AI Studio: перейдите по адресу aistudio.google.com .
  3. Вход в систему: Используйте ту же учетную запись Google, которую вы используете для своего проекта Google Cloud.
  4. Создать ключ API:
  5. В левой боковой панели нажмите «Получить ключ API».
  6. Нажмите кнопку «Создать ключ API в новом проекте».
  7. Скопируйте ключ: После генерации ключа нажмите значок копирования.
  8. Теперь установите переменные среды в файле .env.
GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>
DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<HOST_IP>>:<<PORT>>/postgres
GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Замените значения для заполнителей <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

Подводные камни и устранение неполадок

Путаница с несколькими учетными записями

Если вы вошли в несколько учетных записей Google (личную и рабочую), AI Studio может по умолчанию использовать не ту. Проверьте аватар в правом верхнем углу, чтобы убедиться, что он соответствует вашей учетной записи проекта GCP.

Ограничение по квоте "бесплатного уровня"

Если вы используете бесплатный тариф, действуют ограничения по количеству запросов в минуту (RPM). Если вы будете слишком быстро «проводить пальцем» по экрану в Neighbor Loop, вы можете получить ошибку 429 Too Many Requests . Не торопитесь!

Защита от утечки ключей

Если вы случайно git commit файл .env с указанным ключом, всегда добавляйте .env в файл .gitignore .

"Тайм-аут соединения" недействителен.

Вы использовали частный IP-адрес в файле .env, но пытаетесь подключиться извне VPC (например, с локального компьютера). Частные IP-адреса доступны только внутри сети Google Cloud. Переключитесь на публичный IP-адрес!

Порт 5432 Предположение

Хотя 5432 — это стандартный порт PostgreSQL, AlloyDB иногда требует настройки определенных портов, если вы используете прокси-сервер аутентификации. Для этой лабораторной работы убедитесь, что вы добавляете :5432 в конец строки с адресами хоста.

Привратник «Авторизованных сетей»

Даже если у вас есть публичный IP-адрес, AlloyDB откажет в подключении, если вы не добавили IP-адрес машины, на которой запущен код, в белый список. Решение: В настройках экземпляра AlloyDB добавьте 0.0.0.0/0 (только для временного тестирования !) или ваш конкретный IP-адрес в список авторизованных сетей.

Сбой установления соединения SSL/TLS

AlloyDB предпочитает защищенные соединения. Если в вашем DATABASE_URL неправильно указан драйвер (например, используется pg8000 ), рукопожатие может завершиться неудачей без уведомления, что приведет к стандартной ошибке «База данных недоступна».

Обмен "Основной пул против пула чтения"

Если вы случайно скопируете IP-адрес пула чтения вместо IP-адреса основного экземпляра, ваше приложение будет работать для поиска элементов, но завершится с ошибкой "Только для чтения" при попытке вывести список новых элементов. Всегда используйте IP-адрес основного экземпляра для операций записи.

7. Давайте проверим код.

«Профиль знакомств» для ваших вещей

c2c543562cc9b353.png

Когда пользователь загружает фотографию товара, ему не нужно писать длинное описание. Я использую Gemini 3 Flash, чтобы "увидеть" товар и написать описание за него.

В административной панели пользователь просто указывает заголовок и фотографию. Gemini обрабатывает всё остальное:

prompt = """
You are a witty community manager for NeighborLoop.
Analyze this surplus item and return JSON:
{
   "bio": "First-person witty dating-style profile bio for the product, not longer than 2 lines",
   "category": "One-word category",
   "tags": ["tag1", "tag2"]
}
"""
response = genai_client.models.generate_content(
   model="gemini-3-flash-preview",
   contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"), prompt],
   config=types.GenerateContentConfig(response_mime_type="application/json")
)

21f871a1b549efcf.png

Встраивание данных в базу данных в реальном времени

aa783a459f1b02da.png

Одна из самых крутых особенностей AlloyDB — это возможность генерировать эмбеддинги, не выходя из контекста SQL. Вместо того чтобы вызывать модель эмбеддинга в Python и отправлять вектор обратно в базу данных, я делаю все это одним оператором INSERT, используя функцию embedding():

INSERT INTO items (owner_id, provider_name, provider_phone, title, bio, category, image_url, status, item_vector)
VALUES (
   :owner, :name, :phone, :title, :bio, :cat, :url, 'available',
   embedding('text-embedding-005', :title || ' ' || :bio)::vector
)

Это гарантирует, что каждый товар будет доступен для поиска по его назначению в момент публикации. И обратите внимание, что это та часть, которая описывает функцию «составления списка товаров» в приложении Neighbor Loop.

Скриншот функции добавления списка товаров

Расширенный векторный поиск и интеллектуальная фильтрация с Gemini 3.0

Стандартный поиск по ключевым словам имеет ограничения. Если вы ищете «что-нибудь, чтобы починить мой стул», традиционная база данных может ничего не выдать, если слово «стул» отсутствует в заголовке. Neighbor Loop решает эту проблему с помощью расширенного векторного поиска AlloyDB AI.

Используя расширение pgvector и оптимизированное хранилище AlloyDB, мы можем выполнять чрезвычайно быстрый поиск сходства. Но настоящая «магия» происходит, когда мы объединяем векторную близость с логикой на основе LLM.

AlloyDB AI позволяет нам вызывать такие модели, как Gemini, непосредственно в наших SQL-запросах. Это означает, что мы можем выполнить семантическое обнаружение, включающее логическую «проверку на корректность» с помощью функции ai.if():

SELECT item_id, title, bio, category, image_url,
      1 - (item_vector <=> embedding('text-embedding-005', :query)::vector) as score
FROM items
WHERE status = 'available'
 AND item_vector IS NOT NULL
 AND ai.if(
       prompt => 'Does this text: "' || bio ||'" match the user request: "' ||  :query || '", at least 60%? "',
       model_id => 'gemini-3-flash-preview'
     ) 
ORDER BY score DESC
LIMIT 5

Этот запрос представляет собой серьёзный архитектурный сдвиг: мы переносим логику в данные. Вместо того чтобы извлекать тысячи результатов в код приложения для их фильтрации, Gemini 3 Flash выполняет «проверку на соответствие» внутри механизма базы данных. Это снижает задержку, уменьшает затраты на исходящий трафик и гарантирует, что результаты не просто математически похожи, но и контекстно релевантны.

Скриншот функции семантического поиска

Цикл "Проведите пальцем для совпадения"

Пользовательский интерфейс представляет собой классическую колоду карт.

Проведите пальцем влево: Отменить.

Проведите пальцем вправо: Совпадение!

Скриншот функции «Свайп для сопоставления»

При свайпе вправо бэкэнд записывает взаимодействие в нашу таблицу свайпов и помечает товар как соответствующий. Фронтенд мгновенно запускает модальное окно с контактной информацией поставщика, чтобы вы могли договориться о самовывозе.

8. Давайте развернем его в Cloud Run.

  1. Разверните проект в Cloud Run, выполнив следующую команду в терминале Cloud Shell, куда клонирован проект, и убедитесь, что вы находитесь в корневой папке проекта .

Выполните следующую команду в терминале Cloud Shell:

gcloud beta run deploy neighbor-loop \
   --source . \
   --region=us-central1 \
   --network=<<YOUR_NETWORK_NAME>> \
   --subnet=<<YOUR_SUBNET_NAME>> \
   --allow-unauthenticated \
   --vpc-egress=all-traffic \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:<<PORT>>/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Замените значения для заполнителей <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>

После завершения выполнения команды она выведет URL-адрес сервиса. Скопируйте его.

  1. Предоставьте учетной записи службы Cloud Run роль клиента AlloyDB. Это позволит вашему бессерверному приложению безопасно подключаться к базе данных через туннель.

Выполните следующую команду в терминале Cloud Shell:

# 1. Get your Project ID and Project Number
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# 2. Grant the AlloyDB Client role
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/alloydb.client"

Теперь используйте URL-адрес сервиса (конечная точка Cloud Run, которую вы скопировали ранее) и протестируйте приложение. Загрузите фотографию старого электроинструмента, и Gemini сделает все остальное!

Подводные камни и устранение неполадок

Цикл "Редактирование не удалось"

Если развертывание завершилось успешно, но URL-адрес выдает 500 Internal Server Error , проверьте журналы! Обычно это происходит из-за отсутствия переменной среды (например, опечатки в DATABASE_URL ) или из-за отсутствия у учетной записи службы Cloud Run прав на чтение из вашего хранилища GCS.

Роль "тени" в системе IAM

Даже если у вас есть разрешение на развертывание, учетной записи службы Cloud Run (обычно [project-number]-compute@developer.gserviceaccount.com ) необходима роль AlloyDB Client для фактического установления соединения с базой данных.

9. Устранение неполадок высокого уровня

b6cdd3785d5461a9.jpeg

10. Демонстрация

Вы сможете использовать свою конечную точку для проведения тестов.

Но в демонстрационных целях, на несколько дней, вы можете поэкспериментировать с этим:

11. Уборка

После завершения этой лабораторной работы не забудьте удалить кластер и экземпляр AlloyDB.

Это должно привести к очистке кластера вместе с его экземплярами.

12. Поздравляем!

Вы успешно создали приложение Neighbor Loop для устойчивых сообществ с помощью Google Cloud. Перенеся логику встраивания и Flash AI Gemini 3 в AlloyDB , приложение работает невероятно быстро (в зависимости от настроек развертывания), а код отличается исключительной чистотой. Мы храним не просто данные — мы храним намерения .

Сочетание скорости Gemini 3 Flash и оптимизированной векторной обработки AlloyDB — это поистине новый рубеж для платформ, управляемых сообществом.