Руководство по AI Edge RAG для Android

SDK AI Edge RAG предоставляет основные компоненты для построения конвейера генерации дополненной информации (RAG) с использованием API вывода LLM. Конвейер RAG предоставляет LLM доступ к предоставленным пользователем данным, которые могут включать обновленную, конфиденциальную или специфичную для предметной области информацию. Благодаря дополнительным возможностям поиска информации в RAG, LLM могут генерировать более точные и контекстно-ориентированные ответы для конкретных сценариев использования.

В этом руководстве описана базовая реализация примера приложения с использованием API LLM Inference и SDK AI Edge RAG. Основное внимание уделяется построению конвейера RAG. Более подробную информацию об использовании API LLM Inference см. в руководстве по LLM Inference для Android .

Полный пример приложения можно найти на GitHub . Для начала соберите приложение, прочтите предоставленные пользователем данные ( sample_context.txt ) и задайте LLM вопросы, касающиеся информации в текстовом файле.

Запустите пример приложения

В этом руководстве представлен пример базового приложения для генерации текста с помощью RAG для Android. Вы можете использовать этот пример в качестве отправной точки для своего собственного приложения для Android или обратиться к нему при модификации существующего приложения.

Приложение оптимизировано для высокопроизводительных устройств, таких как Pixel 8, Pixel 9, S23 и S24. Подключите устройство Android к вашей рабочей станции и убедитесь, что у вас установлена ​​актуальная версия Android Studio. Для получения дополнительной информации см. руководство по настройке Android .

Скачайте код приложения

Следующие инструкции показывают, как создать локальную копию примера кода с помощью инструмента командной строки git.

Клонируйте репозиторий Git, используя следующую команду:

git clone https://github.com/google-ai-edge/ai-edge-apis

После создания локальной версии примера кода вы можете импортировать проект в Android Studio и запустить приложение.

Скачать модель

Пример приложения настроен на использование Gemma-3 1B . Gemma-3 1B является частью семейства облегченных, современных открытых моделей Gemma, созданных на основе тех же исследований и технологий, что и модели Gemini. Модель содержит 1B параметров и открытые веса.

Скачать Gemma-3 1B

После загрузки модели Gemma-3 1B с сайта Hugging Face, загрузите её на своё устройство:

cd ~/Downloads
tar -xvzf gemma3-1b-it-int4.tar.gz
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task

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

Настройте встраиваемый модуль.

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

Данное демонстрационное приложение разработано для работы с двумя векторными представлениями: Gemini и Gecko.

Настройка с помощью Gecko embedder

По умолчанию демонстрационное приложение настроено на использование встраивателя Gecko ( GeckoEmbeddingModel ) и запускает модель полностью на устройстве.

Скачать Gecko 110m-en

Модель Gecko embedder доступна в виде чисел с плавающей запятой и квантованных моделей, с несколькими версиями для разных длин последовательностей. Для получения дополнительной информации см. карточку модели Gecko .

Технические характеристики модели можно найти в имени файла модели. Например:

  • Gecko_256_f32.tflite : Модель чисел с плавающей запятой, поддерживающая последовательности до 256 токенов.
  • Gecko_1024_quant.tflite : Квантованная модель, поддерживающая последовательности до 1024 токенов.

Длина последовательности — это максимальный размер фрагмента, который может встроить модель. Например, если модели Gecko_256_f32.tflite передается фрагмент, превышающий длину последовательности, модель встроит первые 256 токенов и обрежет оставшуюся часть фрагмента.

Загрузите модель токенизатора ( sentencepiece.model ) и встраиватель Gecko на ваше устройство:

adb push sentencepiece.model /data/local/tmp/sentencepiece.model
adb push Gecko_256_f32.tflite /data/local/tmp/gecko.tflite

Модель встраивания совместима как с центральным процессором (CPU), так и с графическим процессором (GPU). По умолчанию демонстрационное приложение настроено на извлечение встраиваний с помощью модели Gecko на графическом процессоре.

companion object {
  ...
  private const val USE_GPU_FOR_EMBEDDINGS = true
}

Настройка с помощью Gemini Embedder

Gemini Embedder ( GeminiEmbedder ) создает встраивания с использованием API Gemini Cloud. Для запуска приложения требуется ключ API Google Gemini, который можно получить на странице настройки API Google Gemini.

Получите ключ API Gemini в Google AI Studio.

Добавьте свой API-ключ Gemini и установите COMPUTE_EMBEDDINGS_LOCALLY в значение false в файле RagPipeline.kt :

companion object {
  ...
  private const val COMPUTE_EMBEDDINGS_LOCALLY = false
  private const val GEMINI_API_KEY = "<API_KEY>"
}

Как это работает

В этом разделе представлена ​​более подробная информация о компонентах конвейера RAG приложения. Большую часть кода можно посмотреть на сайте RagPipeline.kt .

Зависимости

RAG SDK использует библиотеку com.google.ai.edge.localagents:localagents-rag . Добавьте эту зависимость в файл build.gradle вашего Android-приложения:

dependencies {
    ...
    implementation("com.google.ai.edge.localagents:localagents-rag:0.1.0")
    implementation("com.google.mediapipe:tasks-genai:0.10.22")
}

Данные, предоставленные пользователем

Пользовательские данные в приложении представляют собой текстовый файл с именем sample_context.txt , который хранится в каталоге assets . Приложение берет фрагменты текстового файла, создает векторные представления этих фрагментов и использует эти представления при генерации выходного текста.

Следующий фрагмент кода можно найти в файле MainActivity.kt :

class MainActivity : ComponentActivity() {
  lateinit var chatViewModel: ChatViewModel
...
    chatViewModel.memorizeChunks("sample_context.txt")
...
}

Пошаговое изложение

Для простоты файл sample_context.txt содержит теги <chunk_splitter> , которые используются в демонстрационном приложении для создания фрагментов. Затем для каждого фрагмента создаются эмбеддинги. В производственных приложениях размер фрагментов является ключевым фактором. Если фрагмент слишком большой, вектор не содержит достаточной специфичности, чтобы быть полезным; а если он слишком маленький, он не содержит достаточного контекста.

В примере приложения обработка фрагментов данных осуществляется с помощью функции memorizeChunks в файле RagPipeline.kt .

Встраивание

Приложение предлагает два способа встраивания текста:

  • Gecko embedder : Извлечение локальных (на устройстве) текстовых вложений с помощью модели Gecko.
  • Gemini Embedder : Облачное извлечение текстовых встраиваний с использованием API Generative Language Cloud.

В примере приложения выбор эмбеддера зависит от того, планирует ли пользователь вычислять эмбеддинги локально или через Google Cloud. Следующий фрагмент кода можно найти в файле RagPipeline.kt :

private val embedder: Embedder<String> = if (COMPUTE_EMBEDDINGS_LOCALLY) {
  GeckoEmbeddingModel(
    GECKO_MODEL_PATH,
    Optional.of(TOKENIZER_MODEL_PATH),
    USE_GPU_FOR_EMBEDDINGS,
    )
  } else {
    GeminiEmbedder(
      GEMINI_EMBEDDING_MODEL,
      GEMINI_API_KEY
      )
  }

База данных

В демонстрационном приложении для хранения текстовых векторных представлений используется SQLite ( SqliteVectorStore ). Для непостоянного хранения векторных данных можно также использовать базу данных DefaultVectorStore .

Следующий фрагмент кода можно найти в файле RagPipeline.kt :

private val config = ChainConfig.create(
    mediaPipeLanguageModel, PromptBuilder(QA_PROMPT_TEMPLATE1),
    DefaultSemanticTextMemory(
        SqliteVectorStore(768), embedder
    )
)

В тестовом приложении размерность встраивания установлена ​​равной 768, что соответствует длине каждого вектора в базе данных векторов.

Цепь

RAG SDK предоставляет цепочки, которые объединяют несколько компонентов RAG в единый конвейер. Вы можете использовать цепочки для организации моделей получения и обработки данных. API основан на интерфейсе Chain .

В примере приложения используется цепочка извлечения и вывода . Следующий фрагмент кода можно найти в файле RagPipeline.kt :

private val retrievalAndInferenceChain = RetrievalAndInferenceChain(config)

Эта цепочка запускается, когда модель генерирует ответы:

suspend fun generateResponse(
    prompt: String,
    callback: AsyncProgressListener<LanguageModelResponse>?
): String =
    coroutineScope {
        val retrievalRequest =
            RetrievalRequest.create(
                prompt,
                RetrievalConfig.create(2, 0.0f, TaskType.QUESTION_ANSWERING)
            )
        retrievalAndInferenceChain.invoke(retrievalRequest, callback).await().text
    }