Урок 2 из 8

Компоненты — кирпичики любого ИИ-приложения

Каждый делает одну вещь и имеет понятные «разъёмы»

⏱ ≈ 8 минут · почти без кода

Что такое компонент

Компонент — минимальная рабочая единица Haystack. У каждого одна задача: один умеет вызывать языковую модель, другой — искать документы, третий — превращать PDF в текст.

Аналогия

Компоненты — сотрудники компании с чёткими должностными инструкциями. «Поисковик» ищет и передаёт находки дальше. «Редактор» собирает промпт. «Переговорщик» общается с моделью. Каждого можно обучить, заменить или проверить отдельно — компания не встанет.

Разъёмы: входы и выходы

У каждого компонента объявлены типизированные входы и выходы (в документации их называют sockets — «сокеты», то есть разъёмы). Например, поисковый компонент принимает на вход текст запроса, а на выход отдаёт список документов.

Это главная фишка Haystack: перед запуском он проверяет, что выход одного компонента подходит ко входу следующего. Несовместимую конструкцию он не даст даже собрать — ошибка всплывёт сразу, а не в три часа ночи у пользователя.

Запомнить

Типизация разъёмов — как формы вилок и розеток: USB не воткнёшь в аудиовход. Ошибки сборки видны до запуска, а не в продакшне.

Основные семейства компонентов

СемействоЧто делаетПример
GeneratorsГоворят с языковой моделью, получают ответOpenAIChatGenerator, есть для Anthropic, Ollama и др.
EmbeddersПревращают текст в векторы — числа, кодирующие смыслSentenceTransformersTextEmbedder
RetrieversИщут подходящие документы в хранилищеInMemoryBM25Retriever
ConvertersПревращают файлы (PDF, DOCX, HTML) в текстPyPDFToDocument
PreProcessorsЧистят и режут тексты на фрагментыDocumentSplitter
BuildersСобирают промпт из шаблона и данныхChatPromptBuilder
RankersПересортировывают найденное по релевантностиTransformersSimilarityRanker
RoutersНаправляют данные по разным веткам по условиюConditionalRouter
EvaluatorsОценивают качество ответовFaithfulnessEvaluator

Полный список семейств с пояснениями — в шпаргалке по компонентам.

Свои компоненты

Если готового «станка» нет — свой пишется в несколько строк Python: обычный класс с пометкой @component и объявленными входами-выходами. Так к конвейеру подключают что угодно: ваш CRM, GetCourse, любой внутренний API.

Проверьте себя

1. Ученику нужно, чтобы бот нашёл в базе школы подходящие фрагменты уроков. Какое семейство компонентов этим занимается?
2. Что даёт типизация входов и выходов компонентов?
3. Вы хотите подключить к конвейеру данные из GetCourse, готового компонента для этого нет. Что делать?
🎉 Урок пройден! Вы знаете, из каких кирпичиков строится приложение. Дальше — как их соединять.
💬 Что-то непонятно? Спросите Клода в папке курса — например, «покажи, как выглядит свой компонент для GetCourse».

Источники