Реалізація AI-конспектування тексту у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-конспектування тексту у мобільному додатку
Простий
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація AI-конспектирування тексту в мобільному додатку

Конспектирування — задача на перший погляд проста: дати LLM довгий текст, отримати короткий виклад. На практиці текст може бути в 10 раз довший від контекстного вікна, приходити частинами (з потокового джерела), або вимагати структурованого виводу, а не просто абзаців.

Довгі документи: chunking та map-reduce суммаризація

gpt-4o підтримує 128k токенів контексту, але гонити туди весь документ дорого та повільно. Стандартний паттерн — map-reduce:

  1. Розбиваємо документ на чанки по 2000–3000 токенів із перекриттям ~200 токенів
  2. Суммаризуємо кожний чанк незалежно (map)
  3. Суммаризуємо список суммаризацій у фінальний конспект (reduce)
// iOS
func summarizeDocument(_ text: String) async throws -> String {
    let chunks = chunkText(text, maxTokens: 2500, overlap: 200)

    // Паралельна суммаризація чанків
    let partialSummaries = try await withThrowingTaskGroup(of: String.self) { group in
        for chunk in chunks {
            group.addTask { try await self.summarizeChunk(chunk) }
        }
        var results = [String]()
        for try await result in group { results.append(result) }
        return results
    }

    // Фінальний reduce
    let combined = partialSummaries.joined(separator: "\n\n")
    return try await summarizeChunk(combined, isFinal: true)
}

func chunkText(_ text: String, maxTokens: Int, overlap: Int) -> [String] {
    // ~4 символи = 1 токен для англійського тексту (приблизно)
    let chunkSize = maxTokens * 3
    let overlapSize = overlap * 3

    var chunks = [String]()
    var start = text.startIndex
    while start < text.endIndex {
        let end = text.index(start, offsetBy: chunkSize, limitedBy: text.endIndex) ?? text.endIndex
        chunks.append(String(text[start..<end]))
        guard let nextStart = text.index(start, offsetBy: chunkSize - overlapSize, limitedBy: text.endIndex) else { break }
        start = nextStart
    }
    return chunks
}

withThrowingTaskGroup запускає кожний чанк паралельно. Для 10 чанків це у 5–7 раз швидше послідовної обробки.

Формати виводу

Конспект може бути кількох типів. Промпти під кожний:

Тип Промпт-інструкція
Короткий виклад «Summarize in 3-5 sentences. Key points only.»
Булети «Extract 5-8 key points as bullet list. Each point = one idea.»
Mind-map JSON «Return JSON: {title, branches: [{topic, subtopics: []}]}»
Q&A «Generate 5 questions and answers based on the text.»
Action items «Extract only action items and deadlines. Format: - [Task]: [Deadline/Owner]»

Для структурованого виводу використовуємо response_format: { type: "json_object" } в OpenAI API — модель обов'язково повертає валідний JSON без markdown-обгортки.

let requestBody: [String: Any] = [
    "model": "gpt-4o-mini",
    "messages": messages,
    "response_format": ["type": "json_object"],
    "temperature": 0.2
]

Суммаризація у реальному часі: лекції та наради

Якщо джерело — мікрофон (запис лекції, наради), конспект будується поверх транскрибації. Потік:

AVAudioEngine → фрагменти по 30 сек → SpeechRecognizer (Whisper API або нативний SFSpeechRecognizer) → накопленний транскрипт → суммаризація з rolling window.

// Суммаризація кожні 5 хвилин транскрипта з перекриттям
class LiveSummaryEngine {
    private var transcript = ""
    private var lastSummaryLength = 0

    func onNewTranscript(_ chunk: String) {
        transcript += " " + chunk

        // Суммаризуємо новий блок при накопленні ~2000 слів
        let wordCount = transcript.split(separator: " ").count
        if wordCount - lastSummaryLength > 2000 {
            Task { await summarizeNewBlock() }
            lastSummaryLength = wordCount
        }
    }

    private func summarizeNewBlock() async {
        let newContent = transcript.components(separatedBy: " ")
            .dropFirst(max(0, lastSummaryLength - 200))  // перекриття 200 слів
            .joined(separator: " ")

        let summary = try? await llmService.summarize(newContent)
        await MainActor.run { appendToNotes(summary ?? "") }
    }
}

На Android аналог через SpeechRecognizer + MediaRecorder з чанкингом по RECOGNIZER_RESULT_STABILITY.

Збереження та пошук конспектів

Конспекти повинні бути доступні офлайн та підтримувати пошук. На iOS — Core Data або SwiftData з повнотекстовим індексом через NSPersistentStoreDescription з SQLite FTS5. На Android — Room з @Fts4 або @Fts5 анотацією.

Семантичний пошук (за смислом, не за словами) — через векторні embeddings, зберігаємі локально в SQLite-VSS або на сервері через pgvector. Для мобільного додатка достатньо серверного пошуку за embeddings з кешем результатів.

Орієнтири за часом

Базова суммаризація документа через API — 2–3 дні. Map-reduce для довгих документів + кілька форматів виводу — 1,5 тижня. Live-конспектирування з транскрибацією — 3–4 тижні.