Гайд · TNWS AI

Как настроить смысловой поиск в Haystack InMemoryEmbeddingRetriever

Haystack 3.1Python#Haystack#RAG#Python
4 мин—

Индексируем документы и запрос одной embedding-моделью, проверяем размерность, top_k и качество на перефразировках.

Применимость и задача

Поисковый запрос: «как настроить смысловой поиск Haystack embedding retriever». Материал сверён с официальной документацией Haystack 3.1 19 сентября 2026 года. Примеры рассчитаны на Python и пакет haystack-ai; для векторного примера дополнительно нужен пакет sentence-transformers-haystack. Демонстрационное InMemoryDocumentStore не рекомендовано разработчиком для production. Интерфейс командной строки ниже — Python API, а не названия пунктов графического меню.

InMemoryEmbeddingRetriever принимает query_embedding, а не исходный вопрос. Для поиска нужны векторы документов в хранилище и вектор запроса. В документации Haystack 3.1 пример использует пакет sentence-transformers-haystack и два компонента — SentenceTransformersDocumentEmbedder и SentenceTransformersTextEmbedder; метрика задаётся в InMemoryDocumentStore.

Нумерованный порядок работы

  1. Создайте два документа с явными фактами и заранее выпишите релевантный ID для перефразированного вопроса.
  2. Выберите одну поддерживаемую локальную embedding-модель для документов и запроса; установите отдельную интеграцию.
  3. Получите векторы документов и запишите обогащённые объекты в InMemoryDocumentStore с выбранной метрикой.
  4. Закодируйте вопрос text embedder и передайте embedding в retriever.
  5. Сравните ID выдачи с разметкой; отдельно повторите тест после перестановки документов и негативного вопроса.

Готовый шаблон

from haystack import Document
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack_integrations.components.embedders.sentence_transformers import (
    SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder)

model = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
store = InMemoryDocumentStore(embedding_similarity_function="cosine")
docs = [Document(id="r7", content="Возврат доступен в течение двух недель."),
        Document(id="d9", content="Доставка работает по будням.")]
doc_embedder = SentenceTransformersDocumentEmbedder(model=model)
text_embedder = SentenceTransformersTextEmbedder(model=model)
doc_embedder.warm_up(); text_embedder.warm_up()
store.write_documents(doc_embedder.run(documents=docs)["documents"])
vector = text_embedder.run(text="Сколько времени есть на возврат?")["embedding"]
print([d.id for d in InMemoryEmbeddingRetriever(store).run(
    query_embedding=vector, top_k=2)["documents"]])

Пример предназначен для контролируемого теста на своих данных. Установите зависимости в отдельном окружении и зафиксируйте версии; при использовании локальной embedding-модели отдельно проверьте её доступность и разрешённость для вашего проекта. Код был проверен на синтаксис Python, но его вызовы Haystack в данном материале не выдаются за выполненный runtime-тест.

Вход и ожидаемый результат

Вход: «Сколько времени есть на возврат?» против документа со словами «в течение двух недель» и постороннего документа о доставке. Ожидается релевантность r7; численный score и идеальное ранжирование на двух записях не гарантируются и должны быть измерены. Если r7 не находится, проверьте модель, размерность и наличие embedding на каждой записи.

Помимо положительного кейса записывайте отрицательный: отсутствие факта, чужой документ, пустой файл или несовместимая редакция правила в зависимости от задачи. Храните ожидаемые ID и смысл результата отдельно от вывода программы. Если пример не прошёл, выясните, на каком шаге данные впервые разошлись: загрузка, обработка, извлечение или построение ответа. Нельзя исправлять результат одной только формулировкой ответа, если нужный факт никогда не поступил в контекст.

Разбор ограничений и ошибок

Смысловой поиск решает задачу перефразировок, но это не магическая семантическая проверка фактов. Смена модели только в поисковом запросе оставляет старые векторы документов в другом пространстве; одинаковая размерность вектора ещё не доказывает совместимость. Проводите переиндексацию после смены модели и не смешивайте версии в одном тесте. Избранный пример модели многоязычный и доступность конкретного репозитория надо подтвердить перед установкой в вашей инфраструктуре; реальный запуск здесь не выполнялся. Для содержания с кодами «AX-41» сравните embedding-поиск с BM25: модель может сблизить смысл описаний, но потерять важный символ идентификатора. top_k ограничивает размер кандидатов для последующего анализа, а не оценивает истинность ответа. В production-сценарии нужен persistent store и разграничение доступа; in-memory здесь только наглядный эксперимент.

Проверочный сценарий на реальном корпусе

Соберите десять пар запрос—ожидаемый документ, включая синоним, отрицание, дату, номер товара и документ другого арендатора. Оцените Recall@1 и Recall@3, а не только результат первого запроса; изменение модели может улучшить перефразировку и одновременно испортить поиск кодов. Если корпус постоянно обновляется, запишите version ID модели в метаданных индекса и обеспечьте атомарный переход на новый набор векторов. Для ошибки «нет результатов» проведите две проверки: действительно ли запись попала в store и имеет embedding, а затем входит ли она в shortlist. Модель генерации RAG не восстановит факт, который retriever не дал в контекст. Не публикуйте векторные представления персональных документов без проверки политики хранения.

Критерии приёмки

  • Все документы имеют embedding.
  • Одинаковая модель использована для обеих сторон.
  • Ожидаемый r7 попадает в top_k на размеченном тесте.

Не принимайте демонстрационный вывод за статистику качества. Для рабочего приложения повторите эти проверки на обезличенном наборе документов, измерьте результат после изменения версии корпуса и запретите доступ к источникам вне полномочий пользователя. Корректный ответ HTTP вашего сервиса не означает корректный ответ RAG-системы; последнее устанавливается сопоставлением факта с разрешённым источником.

Типичные ошибки: чего не делать

  • Не подавать строку напрямую вместо query_embedding.
  • Не менять модель только для запроса.
  • Не выводить качество из одного теста на двух документах.

Если после обновления пакета поведение разошлось с примером, сначала проверьте официальную документацию именно установленной версии, а затем обновите тест и собственный код. Не пытайтесь обходить ограничения сервиса, подменять чужие документы или использовать промпт как замену серверной проверки доступа.

FAQ

Нужна ли отдельная интеграция?

Да, для SentenceTransformers установите sentence-transformers-haystack.

Где задают cosine?

При создании InMemoryDocumentStore.

Является ли смысловая близость доказательством?

Нет, проверяйте извлечённый фрагмент и его источник.

Официальные источники

Частые вопросы

Нужна ли отдельная интеграция?

Да, для SentenceTransformers установите sentence-transformers-haystack.

Где задают cosine?

При создании InMemoryDocumentStore.

Является ли смысловая близость доказательством?

Нет, проверяйте извлечённый фрагмент и его источник.

Читайте также

Комментарии

Пока тихо. Скажите первое слово