Интеграция Haystack для NLP-пайплайнов

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1566 услуг
Интеграция Haystack для NLP-пайплайнов
Средний
от 1 недели до 3 месяцев
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    901
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1119
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    853

Интеграция Haystack для NLP-пайплайнов

Haystack (deepset) — production-ready фреймворк для построения NLP-пайплайнов с нативной поддержкой RAG, question answering и document processing. В отличие от LangChain с его императивным стилем, Haystack использует декларативную модель пайплайнов — компоненты соединяются в граф, данные текут между ними типизированно. Это упрощает тестирование, версионирование и замену компонентов.

Когда Haystack — правильный выбор

Haystack выигрывает у конкурентов в нескольких сценариях:

  • Document-centric задачи — когда основная работа связана с поиском и обработкой корпуса документов
  • Production-grade RAG — нужна надёжная, тестируемая система, а не прототип
  • Команда предпочитает явную конфигурацию — YAML-пайплайны легче аудировать, чем Python-код LangChain
  • Multi-hop question answering — Haystack имеет встроенные компоненты для сложного поиска

LangChain / LlamaIndex предпочтительнее для быстрого прототипирования и агентных сценариев с множеством инструментов.

Ключевые абстракции Haystack 2.x

В Haystack 2.x (текущая версия) изменилась архитектура по сравнению с 1.x:

  • Component — базовый блок, имеет типизированные @component.input и @component.output
  • Pipeline — граф компонентов, соединённых по типам данных
  • Document — унифицированный объект с content, meta, embedding, id
  • DocumentStore — абстракция хранилища (InMemory, Elasticsearch, OpenSearch, pgvector, Weaviate, Qdrant, Milvus)
from haystack import Pipeline, Document
from haystack.components.retrievers import InMemoryBM25Retriever
from haystack.components.generators import OpenAIGenerator
from haystack.components.builders import RAGPromptBuilder

# Сборка RAG-пайплайна
pipeline = Pipeline()
pipeline.add_component("retriever", InMemoryBM25Retriever(document_store=store))
pipeline.add_component("prompt_builder", RAGPromptBuilder())
pipeline.add_component("generator", OpenAIGenerator(model="gpt-4o-mini"))

pipeline.connect("retriever.documents", "prompt_builder.documents")
pipeline.connect("prompt_builder.prompt", "generator.prompt")

Подключение DocumentStore

Выбор хранилища зависит от масштаба и требований:

DocumentStore Когда использовать
InMemoryDocumentStore Разработка, тесты, < 10K документов
ElasticsearchDocumentStore Уже есть ES, нужен BM25 + semantic
QdrantDocumentStore Высокая производительность, > 1M векторов
PgvectorDocumentStore Интеграция с PostgreSQL-инфраструктурой
WeaviateDocumentStore Managed cloud, built-in hybrid search

Настройка Qdrant:

from haystack_integrations.document_stores.qdrant import QdrantDocumentStore

document_store = QdrantDocumentStore(
    url="http://localhost:6333",
    index="documents",
    embedding_dim=1536,
    recreate_index=False,
)

Индексирование документов

Пайплайн индексирования — отдельный от пайплайна поиска:

from haystack.components.converters import PyPDFToDocument
from haystack.components.preprocessors import DocumentCleaner, DocumentSplitter
from haystack.components.embedders import OpenAIDocumentEmbedder
from haystack.components.writers import DocumentWriter

indexing = Pipeline()
indexing.add_component("converter", PyPDFToDocument())
indexing.add_component("cleaner", DocumentCleaner())
indexing.add_component("splitter", DocumentSplitter(
    split_by="sentence", split_length=5, split_overlap=2
))
indexing.add_component("embedder", OpenAIDocumentEmbedder(
    model="text-embedding-3-small"
))
indexing.add_component("writer", DocumentWriter(document_store=document_store))

indexing.connect("converter.documents", "cleaner.documents")
indexing.connect("cleaner.documents", "splitter.documents")
indexing.connect("splitter.documents", "embedder.documents")
indexing.connect("embedder.documents", "writer.documents")

Гибридный поиск

Haystack поддерживает гибридный поиск (BM25 + semantic) через DocumentJoiner:

from haystack.components.retrievers import InMemoryBM25Retriever, InMemoryEmbeddingRetriever
from haystack.components.joiners import DocumentJoiner
from haystack.components.rankers import MetaFieldRanker

pipeline.add_component("bm25", InMemoryBM25Retriever(document_store=store, top_k=10))
pipeline.add_component("semantic", InMemoryEmbeddingRetriever(document_store=store, top_k=10))
pipeline.add_component("joiner", DocumentJoiner(join_mode="reciprocal_rank_fusion"))

pipeline.connect("bm25.documents", "joiner.documents")
pipeline.connect("semantic.documents", "joiner.documents")

RRF (Reciprocal Rank Fusion) объединяет результаты обоих ретриверов без необходимости нормализации скоров.

Кастомные компоненты

Haystack легко расширяется собственными компонентами:

from haystack import component
from haystack.dataclasses import Document
from typing import List

@component
class CustomReranker:
    @component.output_types(documents=List[Document])
    def run(self, documents: List[Document], query: str) -> dict:
        # Ваша логика переранжирования
        scored = [(doc, self.score(doc, query)) for doc in documents]
        ranked = sorted(scored, key=lambda x: x[1], reverse=True)
        return {"documents": [doc for doc, _ in ranked[:5]]}

Сериализация и деплой пайплайнов

Пайплайны сериализуются в YAML — это ключевое преимущество для DevOps:

# Экспорт
pipeline.to_yaml("rag_pipeline.yaml")

# Импорт
pipeline = Pipeline.from_yaml("rag_pipeline.yaml")

YAML-файл пайплайна можно хранить в Git, делать code review конфигурации, деплоить через CI/CD. Haystack Hayhooks предоставляет REST API для сервинга пайплайнов:

pip install hayhooks
hayhooks run --pipelines-dir ./pipelines

После запуска пайплайн доступен по /pipeline/rag/run.

Оценка качества RAG

Haystack имеет встроенные инструменты для evaluation:

from haystack.evaluation import EvaluationResult
from haystack.components.evaluators import (
    FaithfulnessEvaluator,
    ContextRelevanceEvaluator,
    SASEvaluator
)

Метрики: Faithfulness (ответ соответствует контексту), Context Relevance (контекст релевантен вопросу), SAS (семантическое сходство ответа с эталоном).

Производительность и масштабирование

  • Async-режим через pipeline.run_async() для конкурентной обработки запросов
  • Batching для embedder-компонентов (до 10x ускорение при индексировании)
  • Caching через CachingChecker + Redis — кэширование результатов поиска для идентичных запросов
  • Prometheus-метрики через Hayhooks middleware

Типичная производительность RAG-пайплайна: 1–3 секунды на запрос при использовании gpt-4o-mini и Qdrant.

Сроки интеграции

  • Базовый RAG-пайплайн (1 DocumentStore, 1 LLM): 1–2 недели
  • Гибридный поиск + custom reranker: 3–4 недели
  • Production deployment + мониторинг + evaluation: 6–8 недель