Презентации и программа лекций

Учебный курс «Обработка естественного языка»

См. также:

Лекция 1

Введение и классические алгоритмы

  1. Понятия токенизации, сегментации, лемматизации и стемминга.
  2. Формальные аналитические грамматики и утилита Томита-парсер.
  3. TF-IDF, скрытые марковские модели и алгоритм Витерби.

📌 Презентация

Лекция 2

Векторное представление слов

  1. Перцептрон, полносвязные сети и функции активации.
  2. Векторное представление слов, унитарный код. Word embedding, sparse и dense представления, косинусное расстояние и HNSW.
  3. Модель Word2vec.
  4. FastText, ELMo, GloVe.
  5. Алгоритмы построения векторного представления текста на базе трансформера.

📌 Презентация

Лекция 3

Рекуррентные сети и модели памяти

  1. Идея рекуррентной сети и её особенности.
  2. Нейронная сеть Элмана.
  3. Модель Seq2seq.
  4. Долгая краткосрочная память и управляемый рекуррентный блок.
  5. Модель Tacotron2 как пример Seq2seq.

📌 Презентация

Лекция 4

Механизм внимания

  1. Идея механизма внимания.
  2. Подходы Богданова и Луонга.
  3. Внутреннее внимание.
  4. multi-head attention и позиционное кодирование.

📌 Презентация

Лекция 5

Трансформер

  1. Преимущества трансформера и его назначение.
  2. Схема кодера и декодера.
  3. Типы multi-head attention в архитектуре трансформера.
  4. Порядок обучения трансформера.
  5. Switch Transformer, MoE, BERT и T5.

📌 Презентация

Лекция 6

Языковые модели и модели семейства GPT

  1. Понятие языкового моделирования.
  2. История развития и описание архитектуры GPT.
  3. Техника подсказок и типы моделей.
  4. RAG, MCP и LoRA.

📌 Презентация

Лекция 7

Оценка качества языковых моделей

  1. Тест Тьюринга, оценка классификации, таблица сопряжённости, F1 и MCC .
  2. Классические датасеты, BLEU и другие вычислимые метрики.
  3. Проблема оценки качества LLM, перплексия и галлюцинации.
  4. Датасеты для оценки способности запоминания фактов, логического рассуждения и математических навыков.

📌 Презентация

* Лекция 8

Агенты, Изображение и звук

  1. Диффузионный процесс и Stable diffusion.
  2. ИИ-агенты, их типы и характеристики.
  3. Мел-кепстральные коэффициенты.
  4. Синтез речи и модель Tacotron2.

📌 Презентация

Практические работы

1. Предобработка текста

Требуется прочитать текст на русском языке из файла и вывести все пары соседних слов, которые:

  • имеют имена существительные или имена прилагательные на первом или втором месте (всего четыре возможные комбинации);
  • совпадают по роду, числу и падежу.

Все пары следует выводить в виде лемм. Например, если исходная пара имела вид «необычайных университетов», то должна быть выведена пара «необычайный университет». Пары следует определять после сегментации и токенизации текста.

2. Векторное представление слов

Используя import gensim, необходимо реализовать вычисление десяти самых близких по смыслу слов, находящихся в окрестности результата операций сложения и вычитания в векторной модели. Каждому студенту преподавателем будет дана пара слов и необходимо найти такую линейную комбинацию исходных слов, чтобы в результате вычислений заданная пара попадала в первую десятку. Задание предполагает работу только с именами существительными (учащийся может использовать для решения тоже только имена существительные). Предобученные векторы слов можно взять отсюда.

3. Маскирование слов

Много подсказок

📌 Полезная презентация

Используя модель BERT и её функцию Masked language modelling, требуется реализовать вычисление десяти самых вероятных слов на месте любого умышленно пропущенного слова в корректно составленном предложении на русском языке.

Каждому студенту преподавателем будет дана пара слов, и требуется построить окружение, т. е. само возможное предложение на русском языке с пропущенным словом, для которого в вариантах подстановки пара слов будет встречаться в первой десятке. Слова должны совпадать с точностью до словоформы (слово «домами» не может подходить под требуемое слово «домом»).

4. Генерация текста

Много подсказок

📌 Полезная презентация

Используя модель RuGPT от Сбера, необходимо реализовать возможность генерации текста по заданному промпту. Допускается использование как старой модели rugpt3large_based_on_gpt2, так и новой ruGPT-3.5-13B.

Каждому студенту преподавателем будет дана пара слов, и требуется подобрать промпт таким образом, чтобы выданная пара слов встречалась бы в сгенерированном тексте с учётом порядка и с учётом словоформ (как в предыдущей работе). Нужно использовать чистую фундаментальную модель без навыков ответа на вопросы (например, rugpt3large_based_on_gpt2). Подобранный промпт не должен содержать искомые слова ни в одной из их словоформ. Ограничений на значения параметров нет (даже на длину генерируемого текста и режим сэмплирования), но нельзя использовать LogitsProcessor.

Функция generate выглядит так, как её приводят авторы модели:

def generate(
    model, tok, text,
    do_sample=True, max_length=100, repetition_penalty=5.0,
    top_k=5, top_p=0.95, temperature=1,
    num_beams=None,
    no_repeat_ngram_size=3
    ):
  input_ids = tok.encode(text, return_tensors="pt")
  print(model.generate.__globals__['__file__'])
  out = model.generate(
      input_ids,
      max_length=max_length,
      repetition_penalty=repetition_penalty,
      do_sample=do_sample,
      top_k=top_k, top_p=top_p, temperature=temperature,
      num_beams=num_beams, no_repeat_ngram_size=no_repeat_ngram_size
      )
  return list(map(tok.decode, out))

5. Управление генерацией текста

Необходимо разработать собственный вариант LogitsProcessor для управления генерацией текста с подключением пользовательских правил декодирования через LogitsProcessorList. Созданный обработчик должен изменять логиты следующего токена перед его выбором моделью. Логика работы обработчика должна быть собственной и не должна полностью повторять встроенные реализации библиотеки. В базовом варианте работы следует всячески повышать вероятность генерации текста с появлением слова UNIX. Далее каждый учащийся получит от преподавателя индивидуальное задание.

Можно брать любую модель класса AutoModelForCausalLM, но нельзя предпринимать какие-либо усилия по модификации промптов с целью достижения нужного результата. Также запрещается заменять задачу постобработкой уже сгенерированного текста.

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, LogitsProcessor, LogitsProcessorList

class BanWordsLogitsProcessor(LogitsProcessor):
    def __init__(self, tokenizer, banned_words):
        self.banned_token_ids = []
        for word in banned_words:
            ids = tokenizer.encode(word, add_special_tokens=False)
            self.banned_token_ids.extend(ids)
        self.banned_token_ids = list(set(self.banned_token_ids))

    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
        scores[:, self.banned_token_ids] = -float("inf")
        return scores

model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")

banned_words = ["Windows", "Microsoft", "Bill", "Gates", "Office", "explorer", "Edge"]

processor = BanWordsLogitsProcessor(tokenizer, banned_words)
logits_processor = LogitsProcessorList([processor])
prompt = "The most popular desktop operating system is"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    do_sample=True,
    temperature=0.9,
    logits_processor=logits_processor,
    pad_token_id=tokenizer.eos_token_id,
)

generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)

6. Клиент для локальной модели с тулом

Требуется поднять локальный вариант vLLM с загруженной внутри любой языковой моделью (рекомендуется начинать эксперименты с различных вариантов Qwen). В результате должен быть доступен провайдер OpenAI API без задействования облачных сервисов. Допускаются режимы CUDA и CPU. Языковую модель можно выбрать, исходя из аппаратных возможностей используемой системы. Следует протестировать качество работы VLLM простым запросом с использованием curl.

Далее следует разработать простой клиент с использованием LangChain4j, который способен делать запросы к поднятому vLLM с использованием одного тула fetchURL. Тул fetchURL должен принимать в качестве аргумента адрес страницы в сети, производить её доставку и возвращать содержимое в модель. Если Content-Type окажется явно бинарным, модели следует дать ответ с указанием подумать ещё раз хорошенько.

В режиме сдачи лабораторной «Ха, я давно уже true-вайбкодер!» можно попытаться добиться безупречно стабильного вызова тулов на локальных моделях в режиме CPU. Результат будет оценён с положительными последствиями для сдающего, поскольку задача эта зело лукавая.

В режиме сдачи лабораторной «Ой, я ведь всего лишь системный аналитик!» допускается замена LangChain4j на обычный LangChain, хотя следует осознавать, что это ни разу не тянет на прод. Совершившему такую замену сдающему ничего не будет.

Желающим для выполнения работы может быть предоставлен доступ на систему с RTX 4090 и 128G RAM. Для этого преподавателю следует выслать открытый ключ SSH и обещание не ссориться с другими пользователями системы.

7. Асоциальный Linux-хейтер

Необходимо разработать мультиагентную сеть с фиксированным пайплайном на основе LangChain4j, которая является консольным приложением-чатом и ведёт себя следующим образом:

  1. Получает от пользователя хвалу тех или иных прекрасных возможностей Linux, которая может содержать ссылки на Википедию, а может быть абсолютно голословной и даже ложной.
  2. Полученную информацию проверяет в Википедии либо поиском через MediaWiki API, если это голословное утверждение, или путём чтения соответствующей страницы, если это ссылка на домен wikipedia.org. Все прочие ссылки игнорируются.
  3. Если пользователя удалось запалить в искажении фактов о Linux и его чрезмерном возхвалении (голословные утверждения без ссылок, которые не подтверждаются поиском в Википедии), приложение должно навести хейт и обвинить пользователя в том, что он просто никогда не пользовался Microsoft Windows, где давно уже всё нормально.
  4. Если ссылка была, но по ней не удалось обнаружить подтверждение слов пользователя о Linux, пользователя следует обвинить в неумении читать собственные пруфлинки.
  5. Если слова пользователя вдруг оказались справедливыми, следует произвести поиск в Википедии материалов, показывающих, что в Microsoft Windows тоже вообще всё не хуже.
  6. Если материалы нашлись, в пользователя следует бросить ссылками с предложением их читать и приходить позже, когда он, наконец, сам научится нормально читать Википедию.
  7. Если материалы найти не удалось, следует предложить пользователю пространные рассуждения, что Microsoft Windows и Linux разработаны под разные задачи, и наличие тех или иных возможностей не означает превосходства одной системы над другой.

Работа принимается, если бот смог разуверить преподавателя в преимуществах Linux над Microsoft Windows. Можно использовать любые модели (локальные и облачные) и любой стиль общения из числа законных. По просьбе учащегося при проверке работы преподаватель может включать себе режимы 1B, 3B, 7B, 16B, 32B, 70B и 230B (мало ли какая модель используется, схватка может оказаться слишком неравной). Следует предусмотреть достаточные лимиты, защищающие от зацикливания вызова тулов. В режиме сдачи работы «Ха, я давно уже true-вайбкодер!» поощряется использование расширенных механизмов работы с памятью агентов и управлением контекстами.

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

Если учащийся допускает для себя использование платных облачных моделей, следует обратить внимание на deepseek-v4.1-flash, цена использования которой держится на уровне 80р. за миллион токенов. Её возможностей, предположительно, должно быть достаточно для выполнения лабораторной работы.