- Последний пост
- 10 сент. 2025 г.
- Последнее чтение
- 13 авг.
- Постов за неделю
- 0
- Всего постов
- 22
- Тип
- открытый
- Язык
- русский
- Категория
- Познавательное
- В каталоге с
- 13 авг.
- 1/24сутки в ленте
- —
- 1/48двое суток
- —
- 1/72трое суток
- —
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
Про построение мультиагентных систем простыми словами На данный момент занимаюсь мультиагентными системами и поэтому сегодня объясняю взаимодействие агентов на пальцах. Агент - llm модель, функционал которой мы используем по api. Его действия это tools, а если он хранит инфу в базе данных, то это Rag система, но сегодня не про нее. Мозг агента это системный промт, который мы ей прописываем, то есть по сути говорим llm что конкретно мы от нее хотим. Как выстроить агентное взаимодействие: Есть много разных вариантов взаимодействия агентов, самый простой это иерархическая структура босс-подчиненный. Суть данной структуры заключается в том, что у нас есть главный агент, который запромчен раздавать поручения, еще несколько агентов заданы выполнять эти поручения. Каждому агенту мы прописываем его роль и данные, которые он получает и отдаёт. Главный агент получает данные и отдаёт их+поручения второстепенным агентам. Так как каждый из агентов имеет свою роль, например "аналитик", то он заведомо знает, что именно он должен делать с данными, но получает уточняющую информацию от главного агента. Почему на проде мультиагентная система даёт прирост по качеству по сравнению с агентной системой: Все просто, один агент имеет свою цепочку размышлений, больше агентов=более сложная цепочка размышлений, что помогает посмотреть на данные с разных точек зрения.
Собираем API Сначала нужно установить FastAPI и сервер для запуска приложения. Все это делается одной командой в терминале: pip install fastapi unicorn Идем дальше: from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Привет, FastAPI!"} Здесь мы создали приложение, добавили первый маршрут (/ — главная страница) и настроили ответ в формате JSON. Теперь можно запустить сервер: uvicorn main:app --reload После этого API начнет работать. Можно открыть браузер и ввести http://127.0.0.1:8000, чтобы увидеть наш JSON-ответ. А если добавить /docs в конец адреса (http://127.0.0.1:8000/docs), откроется автоматически сгенерированная документация. В ней можно посмотреть, какие маршруты есть в API, какие параметры они принимают и сразу протестировать их.
Про многопоточность часть 2 А теперь представим ситуацию - данных слишком много, причем по прежнему разных, нужно использовать несколько алгоритмов, как это реализовать? В Python есть два основных способа работы с потоками: 🔸Низкоуровневый — через модуль threading (ручное управление) 🔸Высокоуровневый — через ThreadPoolExecutor (автоматическое управление пулом потоков) Рассмотрим оба подхода с примерами. 1. Ручное управление потоками (threading) Базовый пример import threading def task(text): print(f"Поток {threading.current_thread().name} обрабатывает: {text}") # Создаем потоки threads = [] for i in range(3): thread = threading.Thread(target=task, args=(f"текст-{i}",), name=f"Thread-{i}") threads.append(thread) thread.start() # Запускаем поток # Ждем завершения всех потоков for thread in threads: thread.join() print("Все потоки завершили работу") Вывод: Поток Thread-0 обрабатывает: текст-0 Поток Thread-1 обрабатывает: текст-1 Поток Thread-2 обрабатывает: текст-2 Все потоки завершили работу 2. Автоматическое управление (ThreadPoolExecutor) Базовый пример from concurrent.futures import ThreadPoolExecutor def process_text(text): return f"Обработано: {text}" texts = ["отзыв 1", "отзыв 2", "отзыв 3"] # Создаем пул из 2 потоков with ThreadPoolExecutor(max_workers=2) as executor: # Вариант 1: map (параллельное выполнение) results = list(executor.map(process_text, texts)) # Вариант 2: submit (отдельные задачи) futures = [executor.submit(process_text, text) for text in texts] results = [future.result() for future in futures] print(results) Вывод: ['Обработано: отзыв 1', 'Обработано: отзыв 2', 'Обработано: отзыв 3'] А теперь главное, что нужно запомнить: В threading каждый поток вызывается вручную через .start() В ThreadPoolExecutor отправляются пулом без твоего вмешательства через with И самый важный поинт: в части 1 мы параллелим задачи одной модели при обучении, в части 2 мы параллелим сами модели Ставим реакции, если заходит контент 🔥
Про многопоточность в машинном обучении Представим ситуацию: данных дали мало, все разные, да и еще нужно найти самые устойчивые признаки, что делать? Multi-Task Learning, MTL — это подход, при котором модель обучается на нескольких связанных задачах одновременно, что улучшает обобщающую способность за счет совместного использования представлений данных. Основные методы MTL в глубоком обучении: 🔸Жёсткое разделение параметров (Hard Parameter Sharing) Общие скрытые слои для всех задач, но индивидуальные выходные слои для каждой. 🔸Мягкое разделение параметров (Soft Parameter Sharing) У каждой задачи своя модель, но параметры регуляризуются для сходства (например, через L2-норму). Не забываем про взвешивание потерь — автоматическую настройку важности каждой задачи на основе её неопределённости. Ставим реакции и выложим код с реализацией 🔥
видео или голосовое, без подписи
Что такое паттерны в решении алгоритмических задач Паттерны в решении алгоритмических задач — это типичные подходы или стратегии, которые часто используются для решения определенных классов задач. Каждая задача входит в ряд задач, которые перекрывает определённый паттерн Примеры задач на Окна фикс. длины: ✔️максимальная сумма массива Пересекающиеся окна: ✔️цепочка уникальных генов Не пересекающиеся окна: ✔️Сжатие значений счётчика
Решение алгоритмической задачи с собеседования в Сбер Задача: Объедините два отсортированных связанных списка Описание задачи: Напишите функцию, которая принимает две головы отсортированных односвязных списков и объединяет их в один отсортированный связанный список. Что необходимо знать? Паттерн "dummy node" (или "фиктивный узел") часто используется в задачах, связанных с манипуляцией связанными списками, чтобы упростить обработку крайних случаев, таких как пустой список или изменение головы списка. Суть решения заключается в добавлении "пустой головы" связного списка Пример: Вход: List1: 1 -> 2 -> 4 List2: 1 -> 3 -> 4 Выход: 1 -> 1 -> 2 -> 3 -> 4 -> 4 Решение с использованием паттерна "dummy node" Создайте фиктивный узел, который будет использоваться для упрощения обработки крайних случаев. Используйте два указателя для прохода по each спискам и один указатель для добавления узлов в объединенный список. Переместите указатели по спискам, сравнивая значения узлов и добавляя меньший узел в объединенный список. В конце добавьте оставшиеся узлы из любого списка, если они остались. class ListNode: def __init__(self, value=0, next=None): self.value = value self.next = next def mergeTwoLists(list1: ListNode, list2: ListNode) -> ListNode: # Создаем фиктивный узел dummy = ListNode(0) current = dummy # Инициализируем указатели для each списка p1 = list1 p2 = list2 while p1 and p2: if p1.value < p2.value: current.next = p1 p1 = p1.next else: current.next = p2 p2 = p2.next current = current.next # Добавляем оставшиеся узлы из любого списка if p1: current.next = p1 else: current.next = p2 return dummy.next # Пример использования list1 = ListNode(1, ListNode(2, ListNode(4))) list2 = ListNode(1, ListNode(3, ListNode(4))) merged_head = mergeTwoLists(list1, list2) # Функция для печати списка def printList(head: ListNode): current = head while current: print(current.value, end=" -> ") current = current.next print("None") printList(merged_head) В этой задаче паттерн "dummy node" упрощает обработку крайних случаев, таких как пустые списки или списки с одним элементом
видео или голосовое, без подписи
Логово Комара pinned «Основные понятия или как запускать коды из канала, чтобы они работали 🔋 1 Что такое модель? Модель- алгоритм, позволяющий обрабатывать наши данные так, чтобы получился желаемый результат (прогнозирование, классификация и т. д.) 2 Что такое метрика? Метрика…»
Основные понятия или как запускать коды из канала, чтобы они работали 🔋 1 Что такое модель? Модель- алгоритм, позволяющий обрабатывать наши данные так, чтобы получился желаемый результат (прогнозирование, классификация и т. д.) 2 Что такое метрика? Метрика- математическая оценка того, насколько хорошо или плохо работает модель 3. Как загрузить модель? Загрузка происходит путём импортирования из библиотек: import *название библиотеки* 4. Что делать если модель не импортируется? Значит нужно установить эту библиотеку: Pip install *название библиотеки* 5. Как скормить модели свои данные или загрузить существующие? df = pd.read_csv("название файла") Файл с данными должен храниться в той же папке, что и код 6.Как посмотреть на данные? df.head() df- переменная, в которой хранятся данные 7.Где запускать код? • Visual Studio Code • Google Colab
Статьи и публикации Стэнфордского университета про LLM *LLM-модели, способные распознавать, переводить, прогнозировать или генерировать текст или другой контент
Перевод аудио в текст с помощью нейронной сети📌 Часть 2 audio = whisper.pad_or_trim(audio_13) #Number of samples in our trimmed/padded audio n_samples = audio.shape[-1] #Time of each sample time = np.linspace(0,(n_samples-1)*delta,n_samples) plt.figure(figsize=(20,10)) plt.title('Signal') plt.plot(time,audio) plt.ylabel('amplitude') plt.xlabel('seconds') plt.show() """Next, we can start plotting a mel spectogram by applying a log_mel_spectogram() funtion to our audio file. It converts the y-axis (frequency) into the mel scale:""" mel = whisper.log_mel_spectrogram(audio).to(model_m.device) fig, (ax1, ax2) = plt.subplots(2) fig.tight_layout(pad=5.0) ax1.plot(time,audio) ax1.set_title('Signal') ax1.set_xlabel('Time, seconds') ax1.set_ylabel('Amplitude') ax2.imshow((mel.numpy()*mel.numpy())**(1/2),interpolation='nearest', aspect='auto') ax2.set_title('Mel Spectrogram of a Signal') ax2.set_xlabel('Time, seconds') ax2.set_ylabel('Mel Scale') #Next, we can move on to language detection. #Language detection sr=22050 ipd.Audio(audio, rate=sr) probs = model_m.detect_language(mel) probs #Transcription file_path2= 'Rec.mp3' transcription = model_m.transcribe(file_path2, fp16 = False)['text'] transcription
Перевод аудио в текст с помощью нейронной сети📌 Часть 1. Загрузка модели и аудио файла #Importing the necessary libraries import torch import whisper import pytube import librosa import matplotlib.pyplot as plt import numpy as np import IPython.display as ipd #Loading the Model model_m = whisper.load_model('medium') #Loading the file # вставьте сюда ваш файл file_path = '/content/Rec.mp3' #Loading audio_13 = whisper.load_audio(file_path) audio_13 #Задаем время голосовго файла - 12 секунд T = 12 #Checking the number of samples in our audio file n_samples = audio_13.shape[0] #Time between samples delta = T/n_samples #Sampling frequency Fs = 1/delta #Time of each sample time = np.linspace(0,(n_samples-1) * delta,n_samples) time #Now we plot the amplitude with respect to time: plt.figure(figsize=(20,10)) plt.title('Signal') plt.plot(time,audio_13) plt.ylabel('amplitude') plt.xlabel('seconds') plt.show()
Тема, которую необходимо освоить перед тем, как вникать в рекомендательные системы -ранжирование Ранжирование от ВШЭ Ранжирование от Яндекса Основные подходы ранжирования Ранжирование с нуля
Создание системы рекомендаций from collections import Counter import datetime import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.utils import shuffle from models.features.topics import topics_similarity from models.features.cosine import cosine_similarity_features clf = RandomForestClassifier() clf_one = RandomForestClassifier() clf_two = RandomForestClassifier() def generate_features(data, val=None): features = [] for raw in data: features.extend(topics_similarity(raw)) features.extend(cosine_similarity_features(data[:-1], data[-1])) if val is None: return features else: return features, val def generate_data(data): x_true = [] y_true = [] x_false = [] y_false = [] print('Start generate features.') for urls in data.sequences.find(): features = generate_features(data.get_articles_data(urls['urls']), 1) x_true.append(features[0]) y_true.append(features[1]) print('Start generate random data.') while len(x_true) != len(x_false): features = generate_features(data.get_random_articles(4), 0) x_false.append(features[0]) y_false.append(features[1]) return x_true + x_false, y_true + y_false def init(data): try: x = np.load(open('train_x.np', 'rb')) y = np.load(open('train_y.np', 'rb')) except FileNotFoundError: x, y = generate_data(data) np.save(open('train_x.np', 'wb'), x) np.save(open('train_y.np', 'wb'), y) x, y = shuffle(x, y) x_one = list(map(lambda a: a[:81], x)) x_two = list(map(lambda a: a[:122], x)) print('Train model for 3 articles.') clf.fit(x, y) print('Train model for 1 article.') clf_one.fit(x_one, y) print('Train model for 2 articles.') clf_two.fit(x_two, y) def predict(input_articles, input_ids,tvrain_data, recommends_num): result_counter = Counter() min_time = input_articles[0]['time'] - datetime.timedelta(hours=5) max_time = input_articles[-1]['time'] + datetime.timedelta(hours=5) mongo_query = {'time': {'$gt': min_time, '$lt': max_time}} len_articles = len(input_articles) # Gen for articles in Mongo for article in tvrain_data.iterate_articles(except_articles=input_ids, query=mongo_query): new_features = generate_features(input_articles + [article]) if len_articles == 3: result = clf.predict_proba([new_features]) elif len_articles == 2: result = clf_two.predict_proba([new_features]) elif len_articles == 1: result = clf_one.predict_proba([new_features]) result_counter[article['_id']] = result[0][1] return list(result_counter.most_common(recommends_num)) Материалы по данной теме
Создание системы рекомендаций ☸️ 🔸Среди рекомендательных систем выделяются три основных типа: коллаборативная фильтрация, контетная и гибридная. 🔸Коллаборативная фильтрация - наверное, наиболее популярная модель для рекомендации объектов. Её основная идея заключается в том, что если объекты смотрят почти одинаковые пользователи, то эти объекты стоит рекомендовать этим пользователям. В коллаборативной фильтрации выделяется два основных подхода: 🔶Корреляционные модели - основная идея таких моделий основана на хранении матрицы пользователей/объектов. 🔶Латентные модели - модели, которые позволяют не держать матрицу пользователей/объектов, а строятся на основе 'профилей' пользователей и объектов. Профиль - это вектор скрытых характеристик. 🔸Следующий способ построения рекомендательной модели - контетные рекомендации. Это значит, что наша модель будет зависеть от содержимого объектов. Например, можно оценивать похожесть текстов новостей (о том, как именно этот делать - чуть позже) или к фильму "Титаник" рекомендовать другие фильмы Кэмерона. Главная идея этого метода заключается в том, что мы пытаемся достать как можно большую информацию об объекте, который мы хотим порекомендовать, и используем эту информацию для поиска таких же объектов, после чего мы просто рекомендуем похожие объекты. 🔸Наша гибридная модель на основе признаков, которые мы вытащили для объекта и для пользователя возвращает вероятность того, что пользователь прочитает эту статью (кликнет на неё).
Для тех, кто только хочет окунуться в DL с уклоном на CV, Мюнхенский университет выпустил открытый курс с лекциями и задачами
видео или голосовое, без подписи
Неделю назад участвовали в хакатоне, хочу поделиться некоторыми инсайтами от задачи. Задача заключалась в создании сервиса, который получает статью, преобразует ее в диалог между отцом и дочерью, где отец объясняет какую-то тему, а затем этот диалог озвучивается. Разработали следующую архитектуру: парсер для ссылок отправлял текст в настроенную модель GPT, которая создавала диалог из статьи, после чего модель синтеза речи озвучивала его. Все это было завернуто в Docker-контейнер и запущено на виртуальной машине. Однако столкнулись с проблемой: SSML-разметка не работала, озвучка была монотонной, без правильных ударений, а также размер токенов часто превышал допустимое значение. Для решения проблем решили попробовать подход prompt engineering. Мы создали километровый промпт, в котором подробно прописывали интонации, возможные ошибки и способы их устранения.По сути, все наши проблемы модель GPT сама устраняла, что было достаточно удобно. В итоге заняли шестое место. В условиях бекендерской задачи для ML-инженеров использование prompt engineering оказалось наилучшим решением. А тот факт, что весь код держался на одном длинном промпте, уже не баг,а фича, как говорится 🤔 Так вот, теперь инсайт: Не стоит недооценивать promt engineering, но и про промт инъекции забывать нельзя
видео или голосовое, без подписи