Задача
Новый симптом, изменённая доза, обещание прислать анализы — эти детали остаются в памяти или в разрозненных заметках. Перед следующим звонком врачу нужно вспомнить, что говорил именно этот пациент, и быть уверенным, что это действительно было сказано.
Сценарий вырос из разговоров с практикующим врачом: анкеты перед приёмом не сработали, а настоящим источником информации были сами звонки. Пересказа недостаточно: в медицине неподтверждённое утверждение хуже, чем отсутствие ответа.
Объём первой версии
- Вошло
- Два синтетических пациента по два звонка. Хронология и проверенная сводка по каждому. Вопросы по всей истории или по одному звонку. Ответы со ссылками на доказательства, исходная реплика в контексте и аудио с этого места.
- Не вошло
- Реальные данные пациентов, телефония и загрузка записей, распознавание речи на лету, подсказки по диагнозу и лечению, поиск сразу по нескольким пациентам.
Что сделано
- ГраницыВопрос ограничен выбранным пациентом и, если выбран, одним звонком. Поиска по нескольким пациентам нет.
- ПоискИщутся только расшифровки этого пациента; каждое доказательство — реплика со спикером и временем начала и конца.
- ОтветМодель отвечает только по найденным репликам, ссылается на них и прямо говорит, если ответа в звонках нет. Ставить диагнозы и давать советы ей запрещено.
- Проверка ссылокДо показа сервер проверяет, что каждая ссылка относится к нужному пациенту и звонку и к репликам, найденным для этого вопроса.
- ДоказательствоКлик по ссылке открывает реплику в контексте и запускает запись с этого момента.
Сводка по пациенту на первом экране подготовлена заранее и проверена по хешам — это не живая генерация: формат виден сразу, без риска показать выдуманный факт.
Моя роль
- Сделано мной
- Продуктовая постановка, модель доказательств, поиск и проверка ссылок, API и интерфейс, синтетический датасет, развёртывание и эксплуатация.
- С AI-агентами
- Реализация — с AI-агентами по моим решениям; ревью кода, тесты и релизы — мои.
- Медицинская экспертиза
- Сценарий сложился в обсуждениях с практикующим врачом.
Ключевые решения
- Два пациента по два звонка
- Одна длинная история показала бы память, но не изоляцию. Два пациента показывают и то, как факты меняются со временем, и то, что в ответ никогда не попадают данные другого пациента.
- Ссылки проверяет сервер, а не модель
- Модель ссылается короткими метками; сервер сопоставляет их со списком найденных для запроса реплик и отклоняет всё, что выходит за пациента, звонок или выборку.
- Источник — целая реплика
- Ответ ссылается на целую реплику со спикером и временем, а не произвольный кусок текста: врач всегда видит, кто это сказал, и может послушать.
- Платная модель с жёсткими лимитами
- Когда бесплатный доступ к модели перестал отвечать, демо перешло на платный — с ограничением цены, длины ответа и размера промпта. Резервная модель подготовлена, но выключена: на смысловой проверке она приводила приветствия как доказательство того, что факта нет.
Проверка
- Проверка поиска нашла верные доказательства для 19 из 19 тестовых вопросов — без результатов по другому пациенту.
- В сравнении моделей 6 из 6 ответов пришли с корректными ссылками.
- Более 100 тестов бэкенда и десятки тестов фронтенда и развёртывания.
- Браузерные проверки рабочего демо на компьютере и телефоне: каждая ссылка открывает нужную реплику и момент записи.
Статус
Публичное демо работает на medrecall.inin.ceo с сентября 2026 года как отдельный небольшой сервис. Отдельная пилотная версия для реальных записей в разработке; с реальными данными пациентов она не использовалась.
Технологии
- Фронтенд
- Nuxt, Vue, TypeScript
- API
- Python, FastAPI, потоковый вывод (SSE)
- Поиск
- Нарезка LlamaIndex, эмбеддинги bge-m3, небольшой файловый индекс по каждому пациенту
- AI
- Один потоковый вызов LLM через OpenRouter на вопрос, с лимитами цены и размера
- Данные
- Синтетические звонки как реплики со спикером и временем; каталог с проверкой хешей
- Инфраструктура
- Docker Compose, контейнеры только для чтения с жёсткими лимитами памяти