Комментарии 13

Запрос до сих пор в обработке.
Толку от всех этапов нет, если одно слово все впечатление ломает, нехватает на входе. быстрого валидатора
да, спасибо за комментарий, вижу что там все бесплатные запросы кончились у всех активных провайдеров, поэтому оно так и повисло, ща вот пишу заглушку чтобы оно хотя-бы уведомляло об этом в обратку

Добавил различные промежуточные тексты, чтобы было понятнее что происходит и вывожу провайдера и модель которая используется
11000 чанков это сколько в байтах?
вот эти файлы на куски разбиты https://github.com/site15/rag-system/tree/main/sources
файлов: 450, размер общий: 16.5 MiB (17,311,147 bytes)
куски разной длины

Хороший проект, но у меня думает, к сожалению, 2-3 минуты на вопрос. Я RAG собирал на векторах из PDF-ов ~50 Mb на llama 3.2 и он был очень быстр
Тут я больше изучал как вообще можно строить эти RAG системы и какие компоненты там могут быть
Я добавил там на сайте возможность посмотреть какие именно промпты запускались и там теперь видно почему долго
Запускается ведь не один промпт, а много, для того чтобы из 11000 чанков сделать 5 и уже в 5 искать нужные данные, все зависит еще и от самого вопроса, чем он ближе к данным которые в базе тем быстрее отработают все логики



Так как я использую бесплатные лимиты, я стараюсь не делать параллельных запросов - у некоторых провайдеров на это тоже стоят ограничения. Но если делать production-ready RAG-систему и купить платный доступ к нейросетям или развернуть их на собственном железе, то многие задачи можно распараллелить и существенно ускорить поиск ответа.
Автор, рекомендую погрузиться в сложный мир обработки данных, и, вместо 8 промтов нейросетям, использовать собственно-написанные parser, chunker, и далее - embeddings и retrieval. Это позволит вам сократить скорость с 40 секунд на ответ до 2 секунд.
Разобраться в этом стоит, потому что тогда промт для вас станет вишенкой на торте, а не сложнейшим этапом.
Там уже это все есть, в итоге после фильтрации из 11000 записей емебедниг чанков по входному запросу получаем 5 чанков с контекстом и есть входной запрос от пользователя
Запрос пользователя нужно привести к нужному нам формату - это делается через дополнительные запросы к нейронке
Потом этот "нормализованный" запрос + история переписки прогоняем для каждого чанка и используем специальный промпт который определяет есть ли ответ на заданный вопрос в текущем контексте
После прогона по всем чанкам и нахождения ответа мы формируем ответ пользователю тоже через специальный промпт который дополнительно трансформирует ответ используя историю переписки
На вход приходят разные виды документов: переписки из чата, посты из хабра, резюме с хедхантер, спарсенный сайт визитки
Документ можно разделить на разные категории, документ бьется на чанки и у каждого чанка своя категория, запрос от пользователя имеет свою категорию, история может иметь другую отличную от последнего запроса категорию
В зависимости от категорий мы используем разные промпты при трансформации входных, промежуточных и выходных данных
export enum Category {
telegram = 'telegram',
/**
* рекламные, массовые или нерелевантные сообщения;
*/
spam = 'spam',
/**
* предложения о работе на полный рабочий день (штат, фултайм, постоянная занятость);
*/
job = 'job',
/**
* вопросы о найме, формировании или усилении команды;
*/
hiring = 'hiring',
/**
* вопросы о собеседованиях, подготовке к ним, оценке кандидатов;
*/
interview = 'interview',
...
}
Рекомендую посмотреть, что такое cosine similarity - она решит вашу проблему. Вы можете заменить ваши промты одним надежным алгоритмом.
Я глубоко не копал RAG, просто выделил неделю на изучение и не больше, и поделился тем что узнал и сделал с 0 знаниями
Сейчас есть база с векторными колонками, и я ищу совпадения вектора входного поискового запроса с векторами чанков а также с специальной графовой версий чанка, там под капотом тоже происходит поиск синусом


И после фильтрации я и получаю вместо 11000 чанков 5
Вы пытаетесь top 5 чанков отфильтровать через 5 запросов к нейронке, находя "один самый точный". - это не та стратегия для RAG.
Вы можете либо сразу закинуть эти 5 чанков (найденных путем ретривера) в основную модель, либо, если хотите, взять одну модель реранкера - она сравнит векторы и семантику, и отправит самый точный вариант.
LLM, даже локальная на 8B параметров, хорошо может из 5 вариантов выбрать 1 верный - не стоит недооценивать ее возможности

Моя RAG-система: как я за 8 дней собрал RAG для своего сайта визитки