Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moscow Python Meetup №97. Константин Крестников...

Moscow Python Meetup №97. Константин Крестников (Техлид команды GigaChain (SberDevices)). GigaChain: Новые инструменты для разработки агентов на примере агента техподдержки

Мини-воркшоп о том, как решать задачу создания мультиагентных систем в комплексе. Мы пройдем по всему пути создания мультиагентного решения на примере бота техподдержки GigaChat в тг:
- Сборка мультиагентной системы на GigaGraph
- Отладка в графическом интерфейсе
- Вывод в телеграм
- Замер качества

Видео: https://moscowpython.ru/meetup/97/gigachain-agents/

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

December 24, 2024
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Что такое AI агенты? AI агент (в широком понимании) —

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

    работы с LLM на python. Позволяет создавать создавать различные решения вокруг LLM. Основное понятие — «цепочка» действий. langchain-gigachat — партнерский пакет для LangChain, добавляющий поддержку GigaChat. LangGraph — часть LangChain, позволяющая создавать агентов и мультиагентные системы, описывая их в виде графов. GitHub:
  3. Основные сущности 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="Сэм")
  4. Г лавный промпт 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}"), ] )
  5. Функция диалога 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
  6. 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)
  7. Отладка Файл 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
  8. Фреймворк для сверх-быстрой разработки UI для LLM-приложений. В основном ориентирован

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

    решение Проверка готовых решений Построение собственной архитектуры
  10. Датасет для оценки бота Датасет (Вопрос- ответ) Вопросы от реальных

    пользователей Документация, Курсы Личный опыт, здравый смысл Синтетика
  11. Датасет — загрузка в LangFuse LangFuse — система для логирования

    работы LLM приложений, работы с датасетами. OpenSource, self-hosted Загрузка через API: Также можно развернуть свой инстанс LangFuse
  12. 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:""" )
  13. Заходим в GigaLogger и видим результат прогона для GigaChat Lite

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

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

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

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

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

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

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

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

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

    нарезки документов на части Эмбеддинги через API Векторная СУБД для хранения и поиска
  23. Г отовый промпт для RAG Проверка! Все хорошо, но нет

    документов для оценки Функция объединения найденных документов в строку Цепочка в нотации LCEL описывающая RAG
  24. Г отовый промпт для RAG Документы, которые были использованы Соберем

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

    универсальных QnA. Статья ” Adaptive-RAG: Learning to Adapt Retrieval- Augmented Large Language Models through Question Complexity” 👉
  26. Граф это набор узлов и связей между ними Весь код

    графа находится в graph.py Связи графа Узлы графа
  27. Каждому узлу соответствует вызов функции. Обычно это обращение к агенту,

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

    но не обязательно. А вот так выглядит re-ranker документов. Цепочка: Нода:
  29. Видим значительную деградацию по сравнению с обычным RAG. Это связано

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

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

    умеет в smalltalk, защиту от провокаций и поиск в интернете для общих вопросов
  32. 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 - ключевой файл для конфигурации отладчика
  33. 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)
  34. 1 grag.query("Какие модели есть в gigachat api?").response\ В GigaChat API

    доступны следующие модели: GigaChat Lite, GigaChat Pro, GigaChat Max и Embeddings. Каждая из этих моделей имеет свои особенности и используется для различных задач, таких как генерация текста, обработки запроса и создание векторных представлений.