В современных rag системах центральным инструментом являются ретриверы - объекты, которые отвечают за поиск близкой к запросу информации (контекста). Одним из них является BM25Retriever, основанный на частоте встречаемости. В отличие от аналогов, использующих векторные представления, он полагается на точные совпадение единиц, на которые разбит текст (токенов). Для демонстрационных целей возмем набор текстов с описанием компьютерных угроз с сайта MITRE ATT&CK (тут и тут): Для корректной работы BM25Retriever важен способ разбиения текста на единицы, для этого используется параметр preprocess_func. Зададим функцию, осуществляющую деление по словам и их стемминг: Верхнеуровнево для работы надо уметь создать BM25Retriever, используя, например, метод from_texts и найти ближайшие тексты с invoke: from_texts получает аргументы: Следует отметить, что k можно поменять (например, когда вы загружаете настроенный дамп retriever-а) так: bm_retriever.k = 1. from_texts выполняет следующий код: В invok