Пользователь: /home/naeel/MED/recipe/PLAN/recipe1.png - пример рецепта /home/naeel/MED/recipe/PLAN/gemini.md - то что жемини советует надо - план создания приложения для андроида, которое 1. будет вычленять прямоукльник с датой рецепта и прямоугольник с названиями/дозировками лекарств и отправлять выделенное на сервер для дальнейшей обработки 2. после обработки сервер перешлёт обратно в приложение распознынне данные, которое приложение выведет на экран на место рукописного текста пример - как гугл переводчик в режиме распознавания ФИО ДР пациента не должны быть копированы, их прямоугольник не доолжен выделяться. или - выделяться но явно показываться что не используется, заблюрены или как то иначе план - коротко, без воды, понятно, НИКАКОГО КОДА, кодить будут агенты, от тебя - архитектурные идеи, что гового из библиотек можно использовать, что - писать самим задание понятно ? Ассистент: Задание понятно. Изучил рецепт и план Gemini. Готовлю архитектурный план. Ассистент: --- ## План: Android-приложение распознавания рецепта **Суть:** снимок бланка → выделение зон → OCR на сервере → наложение текста поверх рукописного (AR-режим). Зона ФИО/ДР — визуально заблюрена, на сервер не отправляется. --- ### Архитектура (4 слоя) ``` Camera → [Document Scanner] → aligned bitmap ↓ [Zone Detector] ←— ML Kit Text Recognition ↓ PATIENT | DATE | MEDICATIONS | OTHER ↓blur ↓ ↓ не отправляется POST /api/v1/recognize ↓ [Server OCR] ↓ JSON {date, medications[]} ↓ [AR Overlay Renderer] ``` --- ### Клиент — Android / Kotlin / Compose **Готовые библиотеки:** - `ML Kit Document Scanner` — захват + перспективная коррекция бланка - `ML Kit Text Recognition v2` — определение bounding boxes зон - `Ktor Client` — HTTP + kotlinx.serialization - `Jetpack Compose + Material 3` — UI - `Coil Compose` — отображение bitmap **Писать самим:** - **Zone Classifier** — эвристика: y-позиция блока + ключевые слова ("Rp.", "Ф.И.О.", "Дата рождения") - **Privacy Masking** — Compose Canvas: blur overlay на PATIENT-зоне - **AR Overlay Renderer** — Compose Canvas с наложением текста поверх изображения --- ### Сервер — Python / FastAPI **Готовые:** - `FastAPI + pydantic` — API - `Google Cloud Vision API` или `Azure Computer Vision` — OCR рукописи - `Tesseract 5 + LSTM` — self-hosted альтернатива **Писать самим:** - Обёртка OCR API - Парсер структуры лекарств --- ### Фазы 1. Capture + Alignment 2. Zone Detection + Privacy 3. Server OCR 4. AR Overlay --- Пользователь: надо учитывать что это - названия лекарств то есть ограниченный набор слов Ассистент: Важное замечание. Это даёт два преимущества: 1. На сервере — нормализация через справочник. 2. В промпте LLM — контекст ограниченного словаря. 3. В Zone Classifier — дополнительные сигналы вроде `Rp.`, `Tab.`, `мг`, `мл`. Результат должен нормализоваться по справочнику лекарственных средств, например через `rapidfuzz` и локальную SQLite-копию ГРЛС. Низкая уверенность помечается как `uncertain: true` и показывается пользователю для проверки. Пользователь: - `gpt-oss-120b` Ассистент: `gpt-oss-120b` — модель на GitHub Models / Azure AI Foundry с OpenAI-совместимым API. В серверной части вместо отдельного OCR API и дополнительного парсера можно использовать один вызов Vision LLM, если конкретный endpoint принимает изображения. Пользователь: 120 billions наврное это ознавает Ассистент: Да, скорее всего «120B» означает 120 миллиардов параметров. Уточните: это конкретная модель, которая уже у вас развёрнута, или планируете деплоить? И это Vision-модель, принимающая изображения? Пользователь: - `gpt-oss-120b` Ассистент: Хорошо. Вот финальный обновлённый план: ## План: Android-приложение распознавания рецепта **Суть:** снимок бланка → выделение зон → Vision LLM на сервере → AR-наложение распознанного текста. Зона ФИО/ДР — заблюрена, на сервер не отправляется. ### Архитектура ``` Camera → [ML Kit Document Scanner] → aligned bitmap ↓ [ML Kit Text Recognition v2] ↓ [Zone Classifier] / | \\ PATIENT DATE MEDICATIONS (blur, ↓ ↓ не шлём) POST /api/v1/recognize ↓ [FastAPI + gpt-oss-120b] один Vision LLM запрос → JSON {date, medications[]} ↓ [AR Overlay Renderer] ``` ### Клиент — Android / Kotlin / Compose **Готовые:** - ML Kit Document Scanner - ML Kit Text Recognition v2 - Ktor Client + kotlinx.serialization - Jetpack Compose + Material 3 + Coil Compose **Писать самим:** - Zone Classifier для нескольких форм бланков - Form Detector - Privacy Masking - AR Overlay Renderer ### Сервер — Python / FastAPI **Готовые:** - FastAPI + pydantic - openai Python SDK для gpt-oss-120b **Писать самим:** - LLM-промпт с возвратом строго JSON - Валидация ответа pydantic - Retry при невалидном JSON - Нормализация названий лекарств по справочнику ГРЛС ### Протокол Request `POST /api/v1/recognize`: ``` zones: [ { type: "DATE", image: "" }, { type: "MEDICATIONS", image: "" } ] ``` Response: ``` { date: "12.03.2025", medications: [ { name: "Амоксициллин", raw: "Амоксицил", uncertain: false, dose: "500 мг", instructions: "3 р/день" } ] } ``` ### Фазы 1. Capture 2. Zone Detection + Privacy 3. Server LLM OCR 4. AR Overlay ### Ограниченный набор названий лекарств Названия лекарств нужно проверять по справочнику, а не принимать ответ LLM без проверки. Рекомендуется хранить локальную SQLite-копию ГРЛС: МНН, торговые названия, формы выпуска и дозировки. Для сопоставления использовать `rapidfuzz`; при низком совпадении возвращать `uncertain: true`. Нельзя автоматически подменять сомнительное название без показа пользователю и возможности исправления.