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

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

В этом руководстве описывается базовая реализация примера приложения с использованием API вывода LLM и SDK AI Edge RAG. В руководстве основное внимание уделено построению конвейера RAG. Подробнее об использовании API вывода LLM см. в руководстве LLM Inference for 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 и открытые веса.

Скачать Джемма-3 1Б

После загрузки 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

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

Download 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

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

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

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

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

Получите ключ 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
    }