Все примеры кода и базовая схема реализации взяты с Baeldung
Коротко
- Для статичных, важных документов лучше ручная семантика.
- Для потоковых загрузок — автоматическая разметка: сначала грубый срез по токенам + overlap, со временем добавляем ML‑сегментацию.
- Размер чанка подбираем под модель и бюджет: чем меньше токенов — тем дешевле запрос, но выше риск потери контекста.
Как обработать PDF?Что делать с изображениями?
- Извлекаем текст (PDF‑miner, Tesseract для сканов).
- Чистим, режем на чанки, строим эмбеддинги.
- Кладем в vector store вместе с метаданными (имя файла, страница).
- Прогоняем картинку через CLIP или похожую модель → получаем визуальный эмбеддинг.
- (Опционально) генерируем текст‑описание через Vision‑LLM, чтобы LLM мог использовать контент как подсказку.
- Сохраняем эмбеддинг + текстовое описание в базе.
Коротко
- Храним «горячие» индексы в RAM, «холодные» — на SSD.
- Держим отдельное поле для даты — позволяет резать выдачу по свежести.
- Стартовые значения: threshold 0.3‑0.4, k = 5‑10. Дальше тюним под метрики Precision и Recall.
@GetMapping("/search")
public String getWikiAnswer(@RequestParam("question") String question) {
return chatClient.prompt() // создаем prompt‑цепочку
.user(question) // текст запроса
.advisors(questionAnswerAdvisor) // подключаем RAG‑адвайзер
.call() // вызываем модель
.content(); // забираем ответ
}КороткоКомбинация тоже возможна: дообученная модель + RAG для свежести.
- Берем RAG, если нужно работать с динамичными или закрытыми данными и быстро выводить их в прод.
- Выбираем fine‑tuning, когда важно изменить «стиль мышления» модели: научить ее отвечать по фирменному шаблону, писать код в своем стиле или корректно обрабатывать доменную терминологию.