Реалізація AI-вилучення ключових тезисів з документа в мобільному додатку
Вилучення тезисів відрізняється від суммаризації: не «перекажи коротше», а «витащи конкретні твердження, які автор хоче довести». Для наукової статті — гіпотези та висновки. Для договору — ключові обов'язки сторін. Для звіту — рекомендації та метрики.
Це задача на розуміння структури документа, й до неї потрібен інший промпт.
Завантаження документа на мобільному клієнті
Джерела документів у мобільному додатку — PDF з UIDocumentPickerViewController, фото через PHPickerViewController, текст з буфера обміну або URL.
PDF вимагає вилучення тексту перед передачею в LLM. На iOS — PDFKit:
import PDFKit
func extractText(from url: URL) -> String {
guard let document = PDFDocument(url: url) else { return "" }
return (0..<document.pageCount).compactMap { index in
document.page(at: index)?.string
}.joined(separator: "\n\n")
}
PDFKit не розпізнає текст у скановані PDF (зображення). Для сканів потрібен OCR — Vision.VNRecognizeTextRequest або хмарний Google Document AI. Це окремий етап pipeline.
На Android — PdfRenderer для рендерингу сторінок у Bitmap, потім ML Kit Text Recognition для OCR, або бібліотека itextpdf/pdfbox-android для нативного вилучення тексту з цифрових PDF.
Промпт для вилучення тезисів
Промпт — найважливіше тут. «Виділи ключові думки» даст суммаризацію. Для тезисів потрібний структурований вивід:
You are an expert document analyst. Extract the key theses from the document.
A thesis is a specific, arguable claim the author makes — not a topic or summary.
Return JSON:
{
"theses": [
{
"text": "exact or closely paraphrased thesis statement",
"location": "section or paragraph reference",
"type": "hypothesis|conclusion|recommendation|fact|argument",
"confidence": 0.0-1.0
}
],
"document_type": "research|contract|report|article|other"
}
Limit: 5-10 most important theses only.
Поле type — важливе. Для договору цікаві тільки obligation та condition, для наукової статті — hypothesis та conclusion. Фільтрація по type на клієнті дозволяє показувати релевантне для конкретного use-case.
struct Thesis: Codable {
let text: String
let location: String
let type: ThesisType
let confidence: Float
}
enum ThesisType: String, Codable {
case hypothesis, conclusion, recommendation, fact, argument, obligation
}
Відображення: анотації в документі
Тезис цінніший, якщо привязаний до конкретного місця в документі. На iOS — PDFAnnotation для підсвітлення відповідного фрагмента.
func highlightThesis(_ thesis: Thesis, in document: PDFDocument) {
guard let page = findPage(for: thesis.location, in: document) else { return }
let annotation = PDFAnnotation(
bounds: findBounds(for: thesis.text, on: page),
forType: .highlight,
withProperties: nil
)
annotation.color = colorForType(thesis.type)
annotation.contents = thesis.text
page.addAnnotation(annotation)
}
func colorForType(_ type: ThesisType) -> UIColor {
switch type {
case .conclusion: return .systemGreen.withAlphaComponent(0.4)
case .hypothesis: return .systemBlue.withAlphaComponent(0.4)
case .recommendation: return .systemOrange.withAlphaComponent(0.4)
default: return .systemYellow.withAlphaComponent(0.4)
}
}
Пошук bounds для тексту на PDF-сторінці — через page.findString(_:withOptions:). Працює для цифрових PDF; для сканів потрібні координати з OCR.
Робота з великими документами
Договір на 50 сторінок = ~60k токенів. Це влізає в контекст gpt-4o, але дорого й повільно. Розумніше — спочатку виділити структуру документа (заголовки, розділи), потім обробляти кожний розділ окремо та агрегувати тезисы.
func extractThesesFromLargeDocument(_ text: String) async throws -> [Thesis] {
let sections = splitBySections(text) // розбивка по паттернам заголовків
var allTheses = [Thesis]()
for section in sections {
guard section.content.count > 200 else { continue } // пропускаємо оглавлення та порожні розділи
let theses = try await extractTheses(from: section.content, sectionTitle: section.title)
allTheses.append(contentsOf: theses)
}
// Дедупліка подібних тезисів через embeddings similarity
return deduplicate(allTheses)
}
Дедупліка важлива: різні розділи документа можуть повторювати одну думку. Проста дедупліка — по Jaccard-схожості тексту, більш точна — по cosine similarity embeddings.
Орієнтири за часом
Базове вилучення тезисів з текстового документа — 3–5 днів. Повний pipeline з PDF-парсингом, OCR для сканів, анотаціями в документі та обробкою великих файлів — 2–3 тижні.







