Код к семинарам курса «Агентные системы в бизнесе», ВШЭ, 2026.
За семестр мы строим одну систему: службу поддержки платёжного сервиса «Лира». Клиенты пишут в поддержку, а система разбирает обращения, ищет ответы в регламентах, проверяет платежи и передаёт сложные случаи человеку. На каждом семинаре в проекте появляется новая часть: сначала выкладывается заготовка, после занятия решение.
Нужен Python 3.9 или новее.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .envВ .env впишите свой ключ в строку LLM_API_KEY=. Ключ выдаёт
преподаватель, у каждого он свой и с дневным лимитом. Не выкладывайте его:
файл .env уже в .gitignore.
У ключа есть и лимит 10 запросов в минуту. Клиент сам выдерживает паузы по
строке LLM_RPM=10 в .env, поэтому замер трёх кандидатов на 30 обращениях
идёт около девяти минут, а задержка в таблице считается без ожидания.
Тесты работают без ключа и без сети:
python -m pytest testsРаботайте в своём форке этого репозитория. Заготовка каждого нового семинара появляется здесь перед занятием, и её подтягивают в форк так:
git remote add upstream https://github.com/paNikitin/asbiz.git # один раз
git pull upstream mainЕсли вы меняли в форке те же строки, что изменились в заготовке, git попросит разрешить конфликт вручную.
desk/: код проекта.tests/: тесты.data/: обращения клиентов с правильной разметкой и правила разметки.runs/: сюда скрипты сохраняют результаты замеров.
- Отправили запрос к модели вручную и посмотрели, из чего состоит ответ:
блоки, причина остановки, счёт токенов (
1_raw_request.py). - Написали клиент
desk/llm.py. Через него идут все вызовы модели: он повторяет запрос при сбоях, считает токены и деньги, хранит кэш ответов. - Добавили потоковую выдачу (
desk/stream.py) и научились мерить время до первого токена. - Проверили, как положение даты в постановке влияет на кэш у провайдера
(
3_prefix_cache.py). - Сравнили на 30 обращениях три способа поставить модели задачу: короткую
постановку, постановку с правилами и те же правила с рассуждением
(
desk/bench.py). Выбор кандидата записывается по шаблонувыбор_шаблон.md.
python 1_raw_request.py
python 3_prefix_cache.py
python -m desk.bench --n 30Домашнее задание: дз_1.md.
Собираем функцию triage(text): она разбирает обращение и возвращает объект
Ticket с категорией, срочностью, цитатой, номерами платежей, суммой и
пометкой, нужен ли человек. Схема проверяет, что модель ничего не выдумала.
Задание: задание.md.
Домашнее задание: дз_2.md.