Соберём рабочий инструмент: поиск по смыслу в ваших собственных книгах. Всё локально, на вашем ноутбуке, и заодно станет понятно, как устроен RAG изнутри.
У вас полтора десятка книг в HTML. Задача: спросить «почему лампа мигает после включения» и получить нужные куски текста — даже если слова «мигает» там нет, а есть «пульсации выпрямленного напряжения».
ваши книги → нарезка на куски → эмбеддинг каждого куска → база векторов
↓
ваш вопрос → эмбеддинг вопроса → поиск ближайших ──┘
↓
куски текста
↓
(необязательно) языковая модель
↓
ответ
Последние два шага необязательны. Часто достаточно самого поиска: вы получаете три нужных абзаца и читаете сами. Это быстрее, точнее и не содержит риска выдумывания. Языковую модель добавляют, когда нужен связный ответ, а не ссылки.
Самый недооценённый шаг. Слишком крупные куски — в ответ попадает много лишнего и смысл размывается. Слишком мелкие — теряется контекст, и кусок становится непонятен сам по себе.
| Размер куска | Что получается |
|---|---|
| Предложение | Слишком узко: «Его надо заменить» — а что «его»? |
| Абзац (200–400 слов) | Обычно оптимально |
| Раздел под заголовком | Хорошо для структурированных книг вроде ваших |
| Глава целиком | Слишком широко: вектор усредняет всё и ни на что не похож |
Это отдельная модель, не та, что генерирует текст. Её единственная работа — превращать текст в вектор.
ollama pull nomic-embed-text
| На что смотреть при выборе | Почему |
|---|---|
| Поддержка русского | Многие модели заметно слабее вне английского. Проверяйте на своих текстах |
| Размер вектора | Больше — точнее и тяжелее. Типично 384–1024 |
| Максимальная длина входа | Кусок не должен её превышать, иначе хвост обрежется молча |
| Скорость | Вам предстоит прогнать тысячи кусков |
Вопрос и документы должны кодироваться одной и той же моделью. Векторы от разных моделей находятся в разных пространствах, и сравнивать их бессмысленно — поиск будет выдавать случайный мусор без единой ошибки в коде. Сменили модель эмбеддингов — пересчитывайте всю базу.
| Вариант | Когда подходит |
|---|---|
| Просто список в памяти | До нескольких тысяч кусков. Для ваших книг — достаточно |
| Файл на диске | Чтобы не пересчитывать при каждом запуске |
| Векторная база | Десятки тысяч кусков и больше, нужны фильтры и обновления |
Не начинайте с базы данных. Пятнадцать книг — это тысячи кусков, и перебор всех векторов занимает доли секунды. База нужна, когда кусков сотни тысяч.
Считаем косинусную близость вопроса с каждым куском и берём лучшие. Дальше — нюансы, которые отличают работающий поиск от игрушки.
| Приём | Что даёт |
|---|---|
| Брать 5–10 кусков, а не 1 | Нужное часто не на первом месте |
| Отсекать по порогу близости | Если всё ниже 0,3 — ответа в базе просто нет, и лучше это сказать |
| Гибридный поиск | Совместить поиск по смыслу с обычным поиском по словам. Ловит точные термины и номера деталей |
| Переранжирование | Взять 20 кандидатов и отсортировать более тяжёлой моделью. Заметно точнее, но медленнее |
Поиск по смыслу плох там, где нужна буквальная точность: артикул «BUZ11», обозначение «C12», редкое слово. Обычный текстовый поиск это ловит, а смысловой — размывает. Их сумма работает заметно лучше каждого по отдельности, и это самое дешёвое улучшение качества.
Если нужен связный ответ, а не список абзацев, найденные куски подаются модели вместе с вопросом. Формулировка запроса здесь решает многое.
Ответь на вопрос, используя ТОЛЬКО приведённые ниже фрагменты. Если в них нет ответа — так и скажи, не придумывай. После каждого утверждения укажи, из какого фрагмента оно взято. ФРАГМЕНТЫ: [1] (Учебник по электрике, гл. 9) ... [2] (LED, гл. 10) ... ВОПРОС: почему лампа мигает после включения?
Модель всё равно может сказать то, чего в фрагментах нет, — механизм в главе 11. Указание источника для каждого утверждения помогает: вы можете проверить за десять секунд. Считайте такой ответ черновиком со ссылками, а не истиной.
| Симптом | Причина | Что делать |
|---|---|---|
| Находит не то | Куски слишком большие | Резать мельче, добавить перекрытие |
| Находит обрывки без смысла | Куски слишком мелкие | Резать крупнее, дописывать заголовок |
| Полный мусор в выдаче | Разные модели для вопроса и базы | Пересчитать базу одной моделью |
| Не находит точные термины | Смысловой поиск их размывает | Добавить обычный текстовый поиск |
| Плохо с русским | Модель эмбеддингов слабая вне английского | Попробовать другую, сравнить на своих текстах |
| Модель отвечает мимо фрагментов | Слабая модель или размытая инструкция | Жёстче формулировка, модель крупнее |
Заведите два десятка вопросов, на которые вы знаете правильный ответ и знаете, в какой главе он лежит. Прогоняйте их после каждого изменения настроек.
Система, которая на любой вопрос что-то уверенно выдаёт, бесполезна. Проверяйте её на вопросах, ответа на которые заведомо нет: правильное поведение — сказать «не нашёл». Именно этот тест чаще всего пропускают, а он ловит самые дорогие ошибки.
Вернёмся к устройству. Механизм, который позволил всему этому взлететь, и главное изобретение последних лет.
Бесплатная книга · tariel.ge · версии инструментов и команды проверяйте в документации проектов
Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.