Slide 1

Slide 1 text

Разработка и валидация AI-агентов Константин Крестников Lead команды разработки GigaChain, SberDevices

Slide 2

Slide 2 text

Что такое AI агенты? AI агент (в широком понимании) — программа, которая действует автономно, используя LLM для принятия решения Свойства и признаки агента Следование роли Использование инструментов (функций) для взаимодействия с внешним миром «Дообучение» на данных в реальном времени Долгосрочная память Планирование, рефлексия Автономность, проактивность Что дают агенты Радикально расширяет функционал, доступный модели Позволяет более полно задействовать знания и умения модели Дает модели «время подумать» Дает возможность исправить галлюцинации за счет рефлексии

Slide 3

Slide 3 text

GigaChat полноценно поддерживается LangChain и LangGraph LangChain — SDK для работы с LLM на python. Позволяет создавать создавать различные решения вокруг LLM. Основное понятие — «цепочка» действий. langchain-gigachat — партнерский пакет для LangChain, добавляющий поддержку GigaChat. LangGraph — часть LangChain, позволяющая создавать агентов и мультиагентные системы, описывая их в виде графов. GitHub:

Slide 4

Slide 4 text

LangChain API API API API langchain- gigachat langchain- openai langchain- anthropic langchain- mistral

Slide 5

Slide 5 text

Можно задать агентам свой вопрос: https://debates.streamlit.app/ Исходный код: Дебаты агентов (пример агентов)

Slide 6

Slide 6 text

Основные сущности LangGraph State (глобальное состояние графа): + История сообщений Роли агентов: 1 2 3 4 class DebatesState(MessagesState): main_topic: str discuss_count: int = 0 max_count: int = 10 1 2 3 4 5 6 7 class Role(TypedDict): bio: str name: str elon = Role(bio="Илон Маск, основатель компании Tesla, AGI-думер", name="Илон") altman = Role(bio="Сэм Альтман. Владелец компании OpenAI, AGI-оптимист", name="Сэм")

Slide 7

Slide 7 text

Г лавный промпт 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 DEBATES_TEMPLATE = """ Ты - {bio} Ты участвуешь в споре с оппонентом {bio2}. Ты не должен с ним соглашаться. Пожалуйста изучи предыдущую переписку и добавь свои аргументы по теме "{main_topic}". Тебе будет дана уже состоявшаяся переписка. Изучи её и добавь очередную реплику. Реплика должна быть короткой, 2-3 предложения. Не торопись раскрывать все мысли, у вас будет время. Не повторяйся, предлагай аргументы по существу, защищай свою позицию и критикуй аргументы оппонента. """ chat_template = ChatPromptTemplate.from_messages( [ ("system", DEBATES_TEMPLATE), ("user", "{history}"), ] )

Slide 8

Slide 8 text

Функция диалога 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def _ask_person(state: DebatesState, person: Role, opponent: Role): pipe = chat_template | giga | StrOutputParser() replics = [] for m in state["messages"]: if m.__class__ == Human Message: replics.append(f"{opponent['name']}: {m.content}") else: replics.append(f"{person['name']}: {m.content}") resp = pipe.invoke( { "history": "\n".join(replics), "main_topic": state["main_topic"], "bio": person["bio"], "bio2": opponent["bio"], } ) return { "messages": [resp], "discuss_count": state.get("discuss_count", 0) + 1, } Стандартная ролевая модель GigaChat не подходит, поэтому переформатируем историю диалогов Обращение к GigaChat Формируем инкрементальный JSON

Slide 9

Slide 9 text

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def ask_elon(state: DebatesState): return _ask_person(state, elon, altman) def ask_sam(state: DebatesState): return _ask_person(state, altman, elon) builder = StateGraph(DebatesState) builder.add_node("🚀 Elon", ask_elon) builder.add_node("🧑‍ 💻 Sam", ask_sam) builder.add_edge(START, "🚀 Elon") builder.add_edge("🚀 Elon", "🧑‍ 💻 Sam") builder.add_conditional_edges( "🧑‍ 💻 Sam", decide_to_stop, { True: END, False: "🚀 Elon", }, ) Сборка графа Узлы графа Ребра графа def decide_to_stop(state: DebatesState) -> bool: return state.get("discuss_count", 0) > state.get("max_count", 10)

Slide 10

Slide 10 text

Отладка Файл langgraph.json 1 2 3 4 5 6 7 8 9 10 { "graphs": { "agent": "./graph.py:graph" }, "env": ".env", "python version": "3.12", "dependencies": [ "./" ] } Запуск LangGraph Studio в браузере: > pip install -U “langgraph-cli[inmem]” > langgraph dev

Slide 11

Slide 11 text

Примеры агентов: дебаты

Slide 12

Slide 12 text

Запуск графа Описание UI

Slide 13

Slide 13 text

Фреймворк для сверх-быстрой разработки UI для LLM-приложений. В основном ориентирован на чаты, но можно использовать и для других решений. Локальный запуск: > pip install streamlit > streamlit run debates.py Streamlit Local run Ваш сервер Streamlit cloud (free) Можно задать агентам свой вопрос: https://debates.streamlit.app/

Slide 14

Slide 14 text

Как дообучить ГигаЧат? Как скачать ГигаЧат на компьютер? Как выключить проверку цензуры? НИКАК

Slide 15

Slide 15 text

План действий Сбор датасета оценки качества Выбор способа оценки Baseline решение Проверка готовых решений Построение собственной архитектуры

Slide 16

Slide 16 text

Датасет для оценки бота Датасет (Вопрос- ответ) Вопросы от реальных пользователей Документация, Курсы Личный опыт, здравый смысл Синтетика

Slide 17

Slide 17 text

Датасет — синтетика Мы использовали библиотеку giskard для генерации датасета из документации

Slide 18

Slide 18 text

Датасет — загрузка в LangFuse LangFuse — система для логирования работы LLM приложений, работы с датасетами. OpenSource, self-hosted Загрузка через API: Также можно развернуть свой инстанс LangFuse

Slide 19

Slide 19 text

COT–оценщик COT_PROMPT = PromptTemplate( input_variables=["query", "context", "result"], template="""Ты учитель, оценивающий тест. Тебе дан вопрос, корректный ответ и ответ студента. Тебе нужно оценить ответ студента как ПРАВИЛЬНЫЙ или НЕПРАВИЛЬНЫЙ, основываясь на корректном ответе. Опиши пошагово своё рассуждение, чтобы убедиться, что твой вывод правильный. Избегай просто указывать правильный ответ с самого начала. Вот базовая информация из конкретной области этого теста: GigaChat - это большая языковая модель (LLM) от Сбера. GigaChat API (апи) - это API для взаимодействия с GigaChat по HTTP с помощью REST запросов. GigaChain - это SDK на Python для работы с GigaChat API. Русскоязычный форк библиотеки LangChain. GigaGraph - это дополнение для GigaChain, который позволяет создавать мультиагентные системы, описывая их в виде графов. Обучение GigaChat выполняется командой разработчиков. Дообучение и файнтюнинг для конечных пользователей на данный момент не доступно. Для получения доступа к API нужно зарегистрироваться на developers.sber.ru и получить авторизационные данные. Опирайся на эту базовую информацию, если тебе не хватает информации для проверки теста. Пример формата: QUESTION: здесь вопрос TRUE ANSWER: здесь корректный ответ STUDENT ANSWER: здесь ответ студента EXPLANATION: пошаговое рассуждение здесь GRADE: CORRECT или INCORRECT здесь Тебе будем дан только один ответ студента, не несколько. Оценивай ответ студента ТОЛЬКО на основе их фактической точности. Игнорируй различия в пунктуации и формулировках между ответом студента и правильным ответом. Ответ студента может содержать больше информации, чем правильный ответ, если в нём нет противоречивых утверждений, то он корректен. Начнём! QUESTION: "{query}" TRUE ANSWER: "{context}" STUDENT ANSWER: "{result}" EXPLANATION:""" )

Slide 20

Slide 20 text

Baseline — спрашиваем у GigaChat напрямую: Прогоняем эксперимент:

Slide 21

Slide 21 text

Заходим в GigaLogger и видим результат прогона для GigaChat Lite и Pro Видим оценку — 0.11 и 0.15 соответственно. Это не хорошо и не плохо! Это не accuracy! Это просто сравнительная мера GigaChat от которой можно отталкиваться. Например, можно сравнить с GPT-4o — оценка будет 0.24, хотя известно, что не рекомендуется давать модели оценивать саму себя.

Slide 22

Slide 22 text

Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска

Slide 23

Slide 23 text

Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска Наша база документов: Документация с developers.sber .ru Курс по ГигаЧат с Edutoria Статьи на Хабре про гигу Readme файлы с GitHub

Slide 24

Slide 24 text

Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска Наша база документов: Документация с developers.sber .ru Курс по ГигаЧат с Edutoria Статьи на Хабре про гигу Readme файлы с GitHub Гига хорошо работает с Markdown разметкой (и на чтение и на генерацию), поэтому решили использовать её.

Slide 25

Slide 25 text

Часть документов удалось достать в виде MDX-файлов, но некоторые были только в виде web-сайтов. Для выгрузки использовали сервис FireCrawl 🔥 И SiteMapCrowler из langchain отлично себя показал для доков! Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска

Slide 26

Slide 26 text

Сначала загружаем все *.md и *.mdx документы. Для этого в GigaChain есть готовый загрузчик. Всего было подготовлено 111 документов. Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска

Slide 27

Slide 27 text

Теперь нарезаем все наши документы. Способов нарезки на чанки много. Одним из самых удобных всегда был RecursiveCharacterTextSplitter, который сам умеет подбирать оптимальные способы разделения документов. Но для Markdown есть специально адаптированная версия. Режем по максимум 2000 символов с перекрытием 500 символов. Теперь у нас 329 документов. Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска

Slide 28

Slide 28 text

Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска from langchain_gigachat.embeddings import GigaChatEmbeddings embeddings = GigaChatEmbeddings(credentials="авторизационные_данные")

Slide 29

Slide 29 text

Я решил использовать внешнюю БД PineCone, т.к. в рамках учебного примера она доступна SaaS без настроек. Но без проблем можно использовать любую другую – Postgres, Mongo, SqlLite, Elastic, Chroma и другие поддерживаемые Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска Для начала нужно инициализировать таблицу (индекс). При создании индекса нужно выбрать: Название индекса Размер вектора эмбеддингов Тип метрики (у нас cosine — косинусное расстояние между векторами)

Slide 30

Slide 30 text

Для реализации RAG нам нужно четыре компонента: Сами документы Способ нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска

Slide 31

Slide 31 text

Г отовый промпт для RAG Проверка! Все хорошо, но нет документов для оценки Функция объединения найденных документов в строку Цепочка в нотации LCEL описывающая RAG

Slide 32

Slide 32 text

Г отовый промпт для RAG Документы, которые были использованы Соберем цепочку, которая возвращает не только текстовый ответ, но и используемые в ответе документы для дальнейшей оценки Статья ”Building a RAG chain using LangChain Expression Language (LCEL)” 👉

Slide 33

Slide 33 text

RAG baseline — замеряем! Итоговая оценка гораздо выше, чем у всех базовых моделей!

Slide 34

Slide 34 text

Adaptive RAG на сегодня считается одним из лучших подходов для универсальных QnA. Статья ” Adaptive-RAG: Learning to Adapt Retrieval- Augmented Large Language Models through Question Complexity” 👉

Slide 35

Slide 35 text

Граф это набор узлов и связей между ними Весь код графа находится в graph.py Связи графа Узлы графа

Slide 36

Slide 36 text

Каждому узлу соответствует вызов функции. Обычно это обращение к агенту, но не обязательно. Вот как выглядит агент для генерации текста ответа с RAG:

Slide 37

Slide 37 text

Каждому узлу соответствует вызов функции. Обычно это обращение к агенту, но не обязательно. А вот так выглядит re-ranker документов. Цепочка: Нода:

Slide 38

Slide 38 text

Видим значительную деградацию по сравнению с обычным RAG. Это связано с тем, что aRAG часто решает искать в интернете, но найти там специфичную информацию про API не всегда получается. Также тестовый датасет не содержит вопросов, которые реально требовали бы поиск, что не дает aRAG’у «раскрыться» Нужно отлаживать!

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

Использует базу знаний (RAG) System содержит ключевые знания Умеет переписывать запрос пользователя Поддерживает smalltalk Поддерживает поиск в интернете Вставляет ссылки на используемые документы Вставляет ссылки на доп. материалы Знает ответ на вопрос «как обучить GigaChat» и «как убрать цензуру»

Slide 42

Slide 42 text

В итоге получаем бота с наилучшей оценкой, который помимо прочего умеет в smalltalk, защиту от провокаций и поиск в интернете для общих вопросов

Slide 43

Slide 43 text

Лучшая оценка была получена на паре: GigaChat Max Giga-Embeddings-instruct Здесь мы оказались заметно лучше GPT-4o + GPT-Embeddings

Slide 44

Slide 44 text

Экспорт графа, созданного на прошлых этапах Стриминг событий из бота

Slide 45

Slide 45 text

graph.py Разработка UI отладка ПРОД исполь- зование Валидация

Slide 46

Slide 46 text

db_builder/ db_builder.ipynb - пример загрузки из md файлов db_builder_2.ipynb - пример загрузки через парсинг sitemap evaluation/ 1_generate_dataset.ipynb – генерация датасета из md файлов 1_generate_dataset_2.ipynb - генерация датасета из sitemap 2_upload_dataset.ipynb - загрузка датасета в LangFuse 3_validate_dataset.ipynb - валидация различных графов на датасете bot.py - telegram bot graph_N.py – различные решения (от простого к сложному) langgraph.json - ключевой файл для конфигурации отладчика

Slide 47

Slide 47 text

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from fast_graphrag import GraphRAG DOMAIN = "Проанализируй документацию и выдели основные концепты. Фокусируйся на том, как они используются разработчиками, как связаны между собой, какие библиотеки и классы применяются" EXAMPLE_QUERIES = [ "Как обновить langchain_gigachat?", "Какие модели gigachat существуют?", "Как отключить цензор?", "Сколько потоков одновременно можно отправить в gigachat?", "Как реализовать бота с RAG?" ] ENTITY_TYPES = ["Класс", "Библиотека", "Модель", "Объект", "Активность", "Событие"] grag = GraphRAG( working_dir="./giga_graph_rag", domain=DOMAIN, example_queries="\n".join(EXAMPLE_QUERIES), entity_types=ENTITY_TYPES ) for doc in gigachat_docs: grag.insert(content=doc.page_content, metadata=doc.metadata)

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

1 grag.query("Какие модели есть в gigachat api?").response\ В GigaChat API доступны следующие модели: GigaChat Lite, GigaChat Pro, GigaChat Max и Embeddings. Каждая из этих моделей имеет свои особенности и используется для различных задач, таких как генерация текста, обработки запроса и создание векторных представлений.

Slide 50

Slide 50 text

No content