расскажу о паттерне FAN IN FAN OUT
🧬🧬🧬
Начну с примера, и небольшое вступление:
Тащемто не хватило мне фантазии на развитие бота, решил сделать системы аля AI на своих данных. Подробнее об архитектуре расскажу позже(во время рефакторинга).
Мне понадобилось сохранять данные в векторной базе данных, выбор пал(зря) на Qdrant. Для сохранения данных нам надо перевести слова в вектора, и сохранить в базе где потом по векторам и будет найден текст(в идеале текст в "синтезируется" той самой чатГПТ моделью). Тут есть ограничение, слова(текст) в вектор "превращается" с помощью другой модели, у которой ограничение на 92 слова/вектора, так как текст может быть супер большим мы будем использовать КАЛКАРЕНСИ с паттерном FAN OUT, а потому сделаем FAN IN. С помощью ГОРУТИН мы запустим текст/92 слова запросов в модель - это и будет часть FAN OUT, из текста(потока данных) делаем несколько потоков
for _, chunk := range chunks {
wg.Add(1)
go func(n []string) {
defer wg.Done()
embeddings, err := es.CreateEmbedding(chunk)
if err != nil {
return
}
embeddingsFloat32 := make([][]float32, len(embeddings))
for i, emb := range embeddings {
embeddingsFloat32[i] = make([]float32, len(emb))
for j, val := range emb {
embeddingsFloat32[i][j] = float32(val)
}
}
results <- vectorWithPayload{
vector: embeddingsFloat32,
payload: strings.Join(chunk, " "),
}
}(chunk)
}
Для имплементации паттерна нам нужен пакет sync и WaitGroup(из прошлых постов) и гоурутины
Создаем канал с данными в который будем записывать все результаты наших гоурутин
Проходимся циклом по кускам текста/данных и каждая гоурутина записыват в канал данные которые получила из апи модели + я добавляю оригинальный текст/кусок текста что бы сопоставлять в будущем в поиске по векторам что же они нашли.
Когда канал будет готов, мы делаем FAN IN - проходимся по каналу(в некоторой степени это массив) и записываем в базу наши данные.
👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻
П.C. у меня испыталка на сруби новый проект, поэтому редко посты, надеюсь в след месяце пойду по собесам по гошке.🤌