153 KiB
1_Intro +
Предисловие, Оглавление, Глава 1 и 2
===== Страница 1 =====
Масштабирование Retrieval Augmented Generation
Промышленный RAG
===== Страница 2 =====
Промышленный RAG
Масштабирование Retrieval Augmented Generation
===== Страница 3 =====
Добро пожаловать
===== Страница 4 =====
Краткое содержание
ЧАСТЬ 1: ПОСТРОЕНИЕ ВАШЕГО RAG
1 Введение в промышленный RAG
2 Ничего не происходит, пока кто-нибудь не напишет оценку (eval)
3 Загрузка в поисковый сервис (ingestion)
4 Поиск с использованием агентов AutoGen
ЧАСТЬ 2: РАЗВЕРТЫВАНИЕ И УЛУЧШЕНИЕ
5 Хостинг, масштабирование и нагрузочное тестирование
6 Стратегии коммуникации: Отказ от ответственности, обратная связь и настройка промптов
7 Безопасность и управление
ЧАСТЬ 3: ПОДДЕРЖКА
8 Мониторинг и наблюдаемость (observability)
9 Написание читаемого кода
10 Советы и устранение неполадок
===== Страница 5 =====
1
1 Введение в промышленный RAG
Эта глава раскрывает
- Знакомство с Retrieval Augmented Generation (RAG)
- Понимание разницы между Наивным RAG (Naive RAG) и Промышленным RAG (Enterprise RAG)
- Изучение причин, по которым бизнесу нужен Enterprise RAG
- Демонстрация реальных примеров использования RAG в действии
Вы когда-нибудь мечтали о волшебном помощнике, который мог бы дать вам именно ту информацию, которая вам нужна, именно тогда, когда она нужна, без каких-либо хлопот? Позвольте рассказать вам о моем помощнике, Раджинальде. Он не просто любой помощник; он невероятно быстр и всегда точно знает, где найти то, что я ищу.
Однажды я случайно спросил: «Раджинальд, не мог бы ты сказать мне, сколько стоит продукт XYZ?» Не сбиваясь с ритма, он помчался вниз в архив. Он пробежал через лабиринт пыльных полок, заставленных старыми книгами. Он потянулся к одному конкретному тому, открыл его на нужной странице и нашел цену на продукт XYZ. Moments later, он был снова рядом со мной, сияя от гордости. «Цена на продукт XYZ — два доллара и сорок пять центов», — сказал он с уверенной улыбкой.
Разве не было бы замечательно, если бы получение информации всегда было таким простым? Представьте, что у вас есть доступ к любым нужным данным за секунды, без обычного стресса. Именно здесь на сцену выходит Retrieval Augmented Generation, или RAG. Это как иметь цифрового Раджинальда, который может мгновенно получить доступ ко всей информации вашей компании, без каких-либо физических ограничений.
===== Страница 6 =====
Итак, что же такое Retrieval Augmented Generation? Проще говоря, RAG — это передовая технология искусственного интеллекта, которая сочетает в себе разговорные навыки чат-ботов с получением данных в реальном времени из различных источников. Представьте его как суперэффективного помощника, который понимает ваши вопросы на простом английском и точно знает, где найти ответы. Вы можете спросить: «Какой текущий статус Проекта GKR?» или «Сколько единиц продукта XYZ мы продали в прошлом квартале?» ИИ понимает ваш вопрос, ищет в ваших базах данных и дает вам точный ответ — все за считанные секунды. Смотрите диаграмму на рисунке 1.1 ниже для сравнения типичного поиска по базе данных и поиска с использованием RAG.
Поиск с использованием SQL
- Пользовательский вопрос Вручную написать поисковый запрос
- Где я могу купить продукт XYZ?
SELECT * FROM PRODUCTS WHERE name = "Product XYZ" - Отправить запрос в базу данных
.connect() .execute() .commit() - Прочитать результаты поиска
name: Product XYZ where_to_buy: products.com price: $5.99 - Придумать ответ Вы можете купить продукт XYZ на products.com за $5.99.
Поиск с использованием RAG
- Пользовательский вопрос Где я могу купить продукт XYZ?
- Компьютер думает 30 секунд Поиск в базе данных продуктов...
- Компьютер возвращает ответ Вы можете купить продукт XYZ на products.com за $5.99
Рисунок 1.1 Левый столбец показывает множество шагов и сложность ручного поиска записей в SQL-базе данных. Сравните это с относительной легкостью и простотой задания вопроса RAG-чат-боту, показанному в правом столбце.
Но RAG не просто отвечает на простые вопросы; он идет дальше, предоставляя детальную, конкретную информацию, адаптированную под ваши потребности. Он может корректировать стиль ответа, адаптируясь к выбранному вами языку. Он соединяется с различными источниками данных — такими как базы данных, PDF-документы и приложения like Slack — поэтому, независимо от того, где хранится ваша информация, RAG может найти ее и представить вам наилучшим образом.
===== Страница 7 =====
В RAG ИИ подключается к поисковой системе. Всякий раз, когда пользователь задает вопрос, ИИ вступает во взаимодействие, ищет ответ на этот вопрос в базе данных, а затем доставляет ответ в виде хорошо написанного предложения или абзаца. Взгляните на рисунок 1.2 ниже, чтобы увидеть, как система RAG взаимодействует с LLM (большой языковой моделью).
Вопрос пользователя: Сколько стоит продукт XYZ?
Промпт: Пожалуйста, используйте полученные данные, чтобы ответить на вопрос пользователя.
Полученные данные:
Имя: ProductXYZ
Цена: $42.00
Вес: 2 кг
-> LLM -> Ответ: Продукт XYZ стоит $42.00.
Рисунок 1.2 В системе RAG вопрос пользователя, промпт и полученные данные объединяются и отправляются в LLM, которая генерирует ответ, используя всю эту входную информацию.
Но не все системы RAG созданы равными. Многие начинающие начинают с того, что я люблю называть «Наивный RAG» (Naive RAG), который работает следующим образом: Сначала вы преобразуете вопрос пользователя в эмбеддинг (векторное представление) — числовое представление, которое захватывает смысл вопроса, а не только его точные формулировки. Эти числовые коды действуют как «семантические отпечатки пальцев», позволяя системе понимать не только то, о чем вы спрашиваете, но и как это связано с другими фрагментами информации.
Затем вы сравниваете этот эмбеддинг вопроса с кучей эмбеддингов, хранящихся в векторной базе данных — специализированном хранилище, предназначенном для хранения и быстрого поиска по этим числовым представлениям. В отличие от традиционных баз данных, которые ориентированы на точное совпадение ключевых слов, векторные базы данных извлекают информацию на основе концептуального сходства. Поэтому, даже если вы не используете точные слова из хранящихся документов, система все равно может найти релевантный контент. Наиболее подходящий текст затем передается обратно в LLM вместе с вашим вопросом, чтобы модель могла сформулировать ответ, используя предоставленный контекст. Это простой процесс, и вы найдете массу обучающих видео на YouTube, которые проведут вас через такую настройку.
===== Страница 8 =====
4
На практике, однако, Наивный RAG часто спотыкается в бизнес-среде. Он может выдать неправильные данные или выдавать неточные ответы, когда запросы усложняются или ваш набор данных огромен. Фактически, мы видели некоторые оценки, что до 80% реализаций RAG терпят неудачу в бизнесе. Я видел пост в LinkedIn, где основатель разговаривал с 30 разными компаниями, все из которых пытались использовать RAG для своего бизнеса, и ни одна из них не добилась успеха. Именно эту проблему и призвана решить эта книга. Мы называем наше решение Enterprise RAG: или, проще говоря, RAG, который полезен для бизнеса. Он системно решает сложные реальные проблемы — такие как запросы к нескольким базам данных, обновленные данные и уточнение неоднозначных пользовательских вопросов. Короче говоря, он делает поиск более эффективным, точным и гораздо более удобным для пользователя, даже в масштабах предприятия. Наконец, мы рассмотрим реальные примеры, где Enterprise RAG может оказать значительное влияние — от небольших семейных магазинов до крупных корпораций, поставщиков медицинских услуг и учебных заведений. К концу этой главы вы увидите, как Enterprise RAG может преобразовать то, как вы взаимодействуете с данными, делая вашу рабочую жизнь не только проще, но и более продуктивной и приятной.
На протяжении всей этой книги мы шаг за шагом проведем вас через создание вашей собственной системы Enterprise RAG. К концу у вас будут знания и инструменты для реализации масштабируемого решения RAG, адаптированного под потребности вашего бизнеса, и вы будете обладать возможностью использовать весь потенциал поиска данных на основе ИИ.
1.1 Краткое введение в RAG
Теперь, когда мы познакомились с концепцией RAG и тем, как она может служить вашим цифровым Раджинальдом, давайте посмотрим, как она может преобразовать ваши ежедневные операции. Представьте, что клиент звонит в вашу компанию и спрашивает о продукте: «Является ли продукт XYZ легковоспламеняющимся?»
Без RAG перед вами стояла бы большая задача. Сначала вам нужно выяснить, какая из нескольких различных баз данных вашей компании содержит информацию о заказах — уже сама по себе большая работа. Затем вам пришлось бы написать точный поисковый запрос, убедившись, что название продукта написано точно; любая ошибка может означать отсутствие результатов. После того как вы извлекли информацию о продукте, вам нужно вручную просмотреть ее всю, чтобы узнать, является ли продукт XYZ легковоспламеняющимся. После всей этой работы, которая легко может занять значительное время и усилия из-за беспорядочных данных и множества баз данных, вы, наконец, получите ответ для клиента.
Чтобы проиллюстрировать этот процесс, взгляните на рисунок 1.1. Он показывает традиционный метод обработки такого запроса без системы RAG. Вы заметите, насколько трудоемкими и сложными являются шаги, включающие ручное написание поисковых запросов и прочесывание данных.
===== Страница 9 =====
5
Без RAG
Затраченное время: 5 минут
- Вопрос пользователя
- Найти базу данных
- Написать поисковый запрос
- Подумать, что сказать
- Искать информацию для ответа на вопрос пользователя
- Пролистать результаты поиска
- Ответить на вопрос пользователя
Рисунок 1.3 Традиционный ручной процесс получения ответов, требующий запросов к базе данных, исправлений и ручного просмотра. Этот процесс отнимает много времени и требует больших усилий.
Но что, если вы попробуете использовать Наивный RAG для помощи? Как мы узнали ранее, Наивный RAG работает, принимая вопрос, преобразуя его в числа (мы называем это эмбеддингом), а затем ища похожую информацию в ваших данных. Затем он использует языковую модель, чтобы попытаться ответить на ваш вопрос на основе найденного. Звучит полезно, правда? Но вот загвоздка: Наивный RAG иногда может быть хуже, чем вообще не использовать RAG. Он часто извлекает неправильную информацию, потому что не использует правильные методы поиска. Даже когда он находит правильную информацию, он может все перепутать или «галлюцинировать», выдавая вам неточный ответ. Большинство онлайн-руководств учат именно такому RAG, и бизнесы не получают отличных результатов с ним.
Для нашего текущего примера вы могли бы спросить Наивный RAG: «Мне нравятся собаки. Собаки милые, собаки забавные, собаки — мои самые любимые существа в мире. Кстати о стоматологах, вы продаете вязаные шапки для кошек?». Наивный RAG ошибочно фокусируется на слове «собака» и извлекает запись о книге под названием «Как обучить вашу собаку ИИ», но не извлекает информацию, которая могла бы помочь ответить на ваш вопрос. Озадаченный, наивный RAG галлюцинирует ответ на ваш вопрос: «Да, у нас есть вязаные шапки для кошек. Они сделаны из шерсти альпаки и стоят по 479 долларов каждая». Это даже хуже, чем не возвращать никакой информации, потому что иногда неправильная информация может звучать правдоподобно.
===== Страница 10 =====
Обратитесь к рисунку 1.2, чтобы увидеть, как Наивный RAG пытается упростить процесс получения информации. Хотя на поверхности он кажется более эффективным, на блок-схеме не показаны потенциальные ловушки Наивного RAG, такие как неточное извлечение данных и дезинформация из-за отсутствия контекстуального понимания.
Наивный RAG
- Вопрос пользователя
- Эмбеддинг
- Векторный поиск
- Языковая модель
- Ответить на вопрос
Рисунок 1.4 Базовый процесс RAG с эмбеддингом, векторным поиском и большой языковой моделью. Этот простой подход эффективен, но подвержен ошибкам и не обрабатывает контекст.
===== Страница 11 =====
7
Теперь давайте посмотрим, как этот сценарий разыгрывается с Enterprise RAG. Вы просто вводите в чат-бот: «Мне нравятся собаки. Собаки милые, собаки забавные, собаки — мои самые любимые существа в мире. Кстати о стоматологах, вы продаете вязаные шапки для кошек?» За кулисами ИИ начинает работать. Он использует обработку естественного языка, чтобы понять ваш вопрос, даже если вы использовали косвенную речь. Затем ИИ умно превращает ваш вопрос в оптимизированный поиск, проверяя все соответствующие базы данных одновременно. Например, он может сосредоточиться на «вязаных шапках для кошек», чтобы обеспечить эффективный поиск. Примерно через десять-тридцать секунд чат-бот отвечает полным предложением: «Да, мы продаем вязаные шапки для кошек. Каждая шапка стоит около 20 долларов, и они сделаны из шерстяной пряжи».
В этом примере Enterprise RAG сократил время поиска на колоссальные 90% — с пяти минут до всего лишь половины минуты. Рисунок 1.3 иллюстрирует, как Enterprise RAG улучшает весь процесс RAG. Блок-схема показывает более способную, надежную систему, которая сокращает ручные усилия и повышает точность, полностью используя расширенные возможности ИИ.
Промышленный RAG Затраченное время: 30 секунд
- <Вопрос пользователя>
- Валидация ввода
- Триажирование вопроса
- Переписывание запроса
- Высококачественная языковая модель
- Асинхронные агенты
- Промышленный поиск
- Нет результатов: Уточнить вопрос пользователя или ограничения RAG
- Есть результаты:
- 2x Упорядочить и отфильтровать результаты
- <Написать ответ>
Рисунок 1.5 Пайплайн Enterprise RAG улучшает скорость, точность и масштабируемость за счет включения валидации, переписывания запросов и асинхронных агентов, сокращая время ответа до 30 секунд.
Эта система не только ускоряет процессы — она делает все более точным, менее сложным и доступным для всех в вашей компании, независимо от их технических знаний.
===== Страница 12 =====
Вот как это работает. Когда пользователь задает вопрос, система запускает процесс с Валидации Ввода (Input Validation). Этот шаг проверяет, что вопрос имеет смысл и следует любым необходимым форматам или правилам содержания, что помогает избежать недопонимания и ошибок в дальнейшем. Например, он может отфильтровывать слишком длинные или слишком короткие запросы, настраивая более гладкий процесс с самого начала.
Затем мы переходим к этапу Триажирования Вопроса (Question Triage). Здесь система категоризирует вопрос на основе его темы и сложности, решая, какой маршрут является лучшим для извлечения информации. Если кто-то спрашивает о конкретном продукте, это может запустить последовательность, в которой агенты ищут в базе данных продуктов. Вопрос о заказе может пойти по совершенно другому пути. Этот этап триажирования имеет crucialное значение, потому что он гарантирует, что вопрос следует по правильному пути, делая весь процесс извлечения более эффективным.
После категоризации вопрос может пройти через Переписывание Запроса (Query Rewriting). Этот шаг похож на быстрый макияж вопроса, чтобы лучше соответствовать языку и ключевым словам баз данных, которые он ищет. Если пользователь спрашивает: «Какая гарантия на мой блендер X24?» этот этап может перефразировать его в «Гарантия на блендер X24» для выполнения более точного поиска. Переписывание запроса особенно полезно, когда пользователи задают вопросы неформально, повышая шансы найти точные ответы.
Теперь, с уточненным запросом, система активирует Асинхронных Агентов (Asynchronous Agents), поддерживаемых Высококачественной Языковой Моделью (High-Quality Language Model), для начала поиска. Эти агенты проводят Промышленный Поиск (Enterprise Search) по нескольким источникам одновременно, чтобы быстро и точно вернуть результаты. Система выполняет поиск с использованием Поискового Индекса ИИ (AI Search Index), который объединяет поиск по ключевым словам и векторный поиск. И если ничего релевантного не находится, система предлагает пользователю перефразировать или уточнить свой вопрос, сохраняя фокус поиска и избегая задержек.
Когда данные поступают, они сортируются на этапе Упорядочивания и Фильтрации Результатов (Order and Filter Results). Этот шаг гарантирует, что передаются только релевантные данные, и упорядочивает их так, чтобы ответы системы были более последовательными.
Наконец, мы достигаем Агента-Писателя (Writer Agent). Этот агент собирает наиболее релевантную информацию и формирует ее в ясный, отточенный ответ. Это как иметь редактора на standby, обеспечивая, чтобы ответ был одновременно точным и легким для понимания, готовым к немедленным потребностям пользователя.
От начала до конца эта система спроектирована быть гибкой и масштабируемой. Она обрабатывает как структурированные данные, такие как SQL-записи, так и неструктурированную информацию, такую как документы, позволяя ей расти вместе с вашим бизнесом. Enterprise RAG развивается вместе с вами, адаптируясь по мере добавления новых источников данных и расширения ваших информационных потребностей.
Думайте об этой системе RAG как о вашем цифровом помощнике, мгновенно извлекающем нужную вам информацию, чтобы ваша команда могла оставаться сосредоточенной на значимой работе. Она преобразует извлечение данных из обременительной задачи в бесшовный опыт, повышая производительность, улучшая обслуживание клиентов и улучшая коммуникацию в вашей организации. Интегрируя Enterprise RAG, вы раскрываете весь потенциал ваших данных, делая их доступными для всех и выводя эффективность вашего бизнеса на новые высоты.
===== Страница 13 =====
9
1.2 Разница между наивным RAG и Enterprise RAG
Давайте углубимся немного глубже в разницу между Наивным RAG и Enterprise RAG, чтобы мы могли понять, почему в бизнес-среде Наивный RAG просто не справится. Помните нашего надежного помощника, Раджинальда (RAGinald)? Он тот, кто мчится, чтобы принести любой фрагмент информации, который мне нужен, возвращаясь с ответом за несколько секунд. Мы говорили о том, как Retrieval Augmented Generation, или RAG, делает это возможным в простой обстановке. Но что происходит, когда мы пытаемся масштабировать это на всю компанию? Что ж, тогда все становится немного интереснее.
В своей простейшей форме RAG довольно прост. Это как иметь Раджинальда по вашему первому зову. Если я спрошу его: «Какова цена продукта XYZ?» он точно знает, где найти эту информацию, и доставляет ее незамедлительно. В интернете бесчисленные руководства, показывающие, как реализовать эту базовую версию RAG. Вам не нужно быть техническим волшебником, чтобы запустить его. Он доступен, эффективен и хорошо работает для очень простых задач. Рисунок 1.4 иллюстрирует простоту пайплайна Наивного RAG.
Пайплайн Наивного RAG
- Задать вопрос
- Извлечь контекст
- Отправить вопрос, контекст и промпт в LLM
- Получить ответ
Рисунок 1.6 Пайплайн наивного RAG с ограниченными шагами для извлечения ответов. Подходит для простых запросов, но недостаточен для обработки сложных или крупномасштабных enterprise-потребностей.
Теперь давайте применим эту концепцию к крупной компании с огромными объемами данных, множеством отделов и разнообразными потребностями клиентов. Внезапно наша простая настройка начинает выглядеть немного перегруженной. Представьте, что Раджинальд пытается управлять не просто одной книжной полкой, а целой библиотекой, заполненной бесчисленными томами. Вот здесь он начинает потеть. Каждый шаг в процессе сопровождается своим набором проблем, превращая once-простую задачу в сложную операцию. Эти соображения изображены на Рисунке 1.5, выделяя ключевые вопросы, которые необходимо решить при построении enterprise-системы RAG.
===== Страница 14 =====
10
Пайплайн Enterprise RAG
Задать вопрос
-
На каком языке? Какой длины может быть вопрос? Как обучать наших пользователей? Использовать историю чата?
-
Извлечь контекст
-
Используя какую базу данных? Как ее искать? Достаточно ли она быстра? Достаточно ли она точна? Нет релевантных результатов, тогда что?
-
Отправить вопрос, контекст и промпт в LLM
- Доверять LLM? Остановить галлюцинации? Контекст слишком длинный? Промпт слишком сложный? Обучать свою собственную модель?
- Получить ответ
- Последовательные ответы? Как обрабатывать обратную связь пользователя? Что, если данные верны, но ответ неверен? Что, если RAG не может ответить на вопрос?
-
Рисунок 1.7 Ключевые вопросы для проектирования enterprise-систем RAG, касающиеся ограничений пользовательского ввода, производительности базы данных, точности контекста и управления обратной связью для лучшей масштабируемости и надежности.
Рассмотрите разнообразие вопросов, поступающих в глобальную компанию. Вопросы бывают всех форм и размеров, и обработка этого разнообразия является значительной проблемой. Например, клиенты могут задавать вопросы на разных языках. Компания, работающая на международной арене, не может ожидать, что все ее клиенты будут говорить на одном языке, поэтому система должна понимать и обрабатывать многоязычные запросы. Представьте, что клиент из Испании спрашивает о продукте на испанском, а другой из Японии спрашивает на японском. RAG должен понимать оба и предоставлять точные ответы.
Эффективное и точное извлечение данных — еще одно препятствие. При огромных базах данных, содержащих миллионы записей, извлечение правильной информации быстро является критически важным. Система должна знать, какие базы данных искать, и должна гарантировать, что данные актуальны. Клиенты сегодня ожидают почти мгновенных ответов; медленное время извлечения может привести к разочарованию и плохому пользовательскому опыту.
Точность имеет paramount importance. Предоставление неверной или нерелевантной информации может подорвать доверие клиента к компании. Представьте, если клиент спрашивает о доступности продукта, и система ошибочно сообщает, что его нет в наличии, когда на самом деле он доступен. Такие ошибки могут привести к потере продаж и нанести ущерб репутации компании.
===== Страница 15 =====
11
Доверие к Большой Языковой Модели (LLM), которая питает ИИ, добавляет еще один уровень сложности. LLM мощны, но не непогрешимы. Иногда они могут генерировать информацию, которая звучит правдоподобно, но не соответствует действительности — явление, известное как «галлюцинация» в терминах ИИ. Например, ИИ может уверенно заявить, что продукт имеет определенные функции, которых у него на самом деле нет. Так же, как и люди, ИИ может ошибаться, и компаниям необходимо предвидеть и минимизировать эти ошибки. Это особенно важно, потому что могут быть юридические последствия; если ИИ предоставляет неверную информацию, которая приводит к недовольству клиентов или вреду, компания может быть привлечена к ответственности. Например, Canada Air был юридически обязан выполнить обещание, которое его ИИ-чат-бот дал клиенту.
Доставка окончательного ответа пользователю — последняя часть процесса, но она так же важна, как и предыдущие шаги. Обеспечение того, чтобы ИИ предоставлял последовательные ответы с течением времени и по схожим запросам, помогает строить доверие и надежность.
Иногда у ИИ не будет ответа, и ему нужен изящный способ сообщить об этом. Также важно, чтобы ИИ сообщал пользователю о своих возможностях и ограничениях, чтобы у пользователей были реалистичные ожидания.
Управление затратами — еще один критический аспект масштабирования RAG для enterprise-использования. Внедрение таких функций, как агенты или переписывание запросов, может повысить точность ответов, но часто сопровождается дополнительными расходами. Мониторинг их использования и оптимизация рабочих процессов помогают контролировать затраты. Backend-вычисления и поисковые сервисы могут стать дорогими, особенно в масштабе. Регулярная оценка моделей использования и использование экономически эффективной инфраструктуры могут существенно повлиять на управление бюджетом.
Правильные защитные меры, или ограждения (guardrails), необходимы для поддержания целостности системы RAG. ИИ должен быть проинструктирован избегать использования неподобающего языка или высказываний, которые могут привести к негативной огласке. Представьте, если ИИ случайно использовал ненормативную лексику или сделал бестактное замечание — это могло бы сделать компанию вирусной по всем неправильным причинам. Ограждения должны быть на месте, чтобы предотвратить возможность системы сказать что-либо, что может навредить репутации компании.
Защита конфиденциальной информации также критически важна. ИИ не должен случайно раскрывать конфиденциальные данные, такую как личная информация клиентов или проприетарные детали компании. Это включает наличие строгого контроля доступа и установление политик того, как данные могут быть извлечены и переданы.
Объединяя все эти элементы, масштабирование Retrieval Augmented Generation для enterprise-использования — это не просто сделать систему больше; это сделать ее умнее, надежнее и удобнее для пользователя. Путь от настройки Naive RAG до решения enterprise-уровня заполнен проблемами, но награды значительны. Компании могут предоставлять более быстрый, точный клиентский сервис, принимать основанные на данных решения более эффективно и оставаться конкурентоспособными на быстро развивающемся рынке.
===== Страница 16 =====
12
Что касается Раджинальда, он больше не просто бегает вверх и вниз по лестнице. В этом enterprise-сценарии он теперь оснащен реактивным ранцем, многоязычными словарями и сетью помощников-коллег — все работают вместе, чтобы поддерживать бесперебойную работу операций по извлечению данных компании. Он стал символом передовых, эффективных и отзывчивых систем ИИ, которые необходимы современным предприятиям для успеха.
Итак, хотя проблем много, потенциальные выгоды от масштабирования RAG огромны. Речь идет о принятии технологий для расширения человеческих возможностей, подобно тому, как дать Раджинальду тот реактивный ранец. При вдумчивой реализации и фокусе на решении сложностей компании могут преобразовать свои операции и подготовить себя к успеху в эпоху ИИ.
1.3 Почему бизнесу нужен Enterprise RAG
Мы провели некоторое время с нашим надежным помощником, Раджинальдом. Хотя иметь настоящего помощника, как Раджинальд, звучит потрясающе, это не совсем практично — или бюджетно — для большинства предприятий. Именно здесь на сцену выходит Enterprise RAG. Enterprise RAG — это не только о скорости; это о расширении возможностей ваших сотрудников с помощью мгновенного доступа к информации, необходимой им для эффективного выполнения своей работы. С Enterprise RAG ответы находятся на расстоянии одного вопроса, позволяя сотрудникам сосредоточиться на том, что они делают лучше всего.
Этот мгновенный доступ к информации приводит к более оптимизированным операциям. Быстрый доступ к данным означает, что решения можно принимать быстрее, проекты могут двигаться вперед раньше, и возможности не упускаются из-за задержек в получении информации. Представьте инвестора, оценивающего последние новости об акции: с системой RAG он может собрать все relevant заголовки и рыночные данные за мгновения, позволяя ему принять решение о покупке или продаже гораздо быстрее (и точнее). Такая скорость может быть разницей между выигрышной сделкой и упущенным шансом.
Более того, когда каждый в организации имеет доступ к нужной ему информации, сотрудничество становится более гладким, а производительность взлетает. Команды могут делиться идеями без усилий, координировать задачи эффективно и согласовывать свои усилия для достижения общих целей. Например, маркетинговый отдел может мгновенно получить доступ к отзывам клиентов, собранных службой поддержки, позволяя им корректировать свои стратегии в реальном времени. Такой уровень сотрудничества усиливает инновации и стимулирует рост бизнеса.
Время имеет существенное значение, особенно когда дело доходит до обслуживания клиентов. Чем быстрее вы можете решить проблемы, тем счастливее будут ваши клиенты и тем эффективнее станут ваши операции. Рассмотрим сценарий, в котором клиент обращается в поддержку со сложной проблемой. Традиционно, агент поддержки, возможно, должен будет искать в нескольких базах данных, консультироваться с другими отделами или ставить клиента на удержание, чтобы найти необходимую информацию. Этот процесс может быть трудоемким и разочаровывающим как для агента, так и для клиента.
===== Страница 17 =====
13
С Enterprise RAG агент поддержки может получить доступ ко всей relevant информации почти мгновенно. Компании, внедрившие RAG, часто видят значительное сокращение времени решения проблем в службе поддержки. Команда поддержки клиентов LinkedIn сократила свое время на одно обращение на 28,6% (https://www.evidentlyai.com/blog/rag-examples). Это приводит к более счастливым клиентам, которые чувствуют себя оцененными и услышанными, и это повышает моральный дух и продуктивность команд поддержки, которые теперь могут обрабатывать запросы более эффективно. Более быстрое время решения не только улучшает удовлетворенность клиентов, но и позволяет командам поддержки сосредоточиться на более сложных проблемах, требующих человеческого понимания.
RAG разрушает барьеры, будучи первым приложением ИИ, которое универсально полезно для всех типов бизнеса. Независимо от того, являетесь ли вы крупной корпорацией, обрабатывающей огромные объемы данных в нескольких отделах, небольшим семейным магазином, стремящимся улучшить взаимодействие с клиентами, или средним бизнесом, стремящимся гибко масштабировать операции, RAG предоставляет инструменты, которые могут адаптироваться к вашим конкретным потребностям.
Извлекающая информацию из нескольких источников, RAG предоставляет всесторонний и точный ответ, снижая риск упустить критические детали. Эта универсальность означает, что сотрудники тратят меньше времени на сбор информации из разных систем и больше времени на осмысленное использование данных. Это способствует созданию более информированной рабочей силы, способной принимать лучшие решения и стимулировать инновации.
Однако, прежде чем погружаться, важно рассмотреть несколько ключевых факторов — включая стоимость внедрения. Настройка системы RAG — это не просто установка программного обеспечения; она включает расходы, связанные с арендой или приобретением необходимого оборудования и программного обеспечения, а также текущие операционные расходы. Например, вам нужно будет инвестировать в облачные вычисления для обработки требований продвинутых моделей ИИ.
Дополнительно, технические навыки, необходимые для настройки и поддержки системы, являются важным соображением. Внедрение RAG часто требует опыта в ИИ, машинном обучении и инженерии данных. Это может означать найм нового персонала с нужными навыками или инвестиции в обучение вашей существующей команды.
Также важно признать, что внедрение RAG не является решением «включи и работай». Вашей компании нужно будет инвестировать в подготовку данных, разработку программного обеспечения и текущее обслуживание, чтобы обеспечить эффективную работу системы. Технология ИИ быстро развивается, и поддержание вашей системы RAG в актуальном состоянии может потребовать регулярных обновлений, которые сопровождаются своими собственными затратами.
Взвешивая эти соображения тщательно — включая финансовые инвестиции и распределение ресурсов — вы можете определить, подходит ли RAG для вашего бизнеса. При вдумчивой реализации и с четким пониманием связанных затрат, Enterprise RAG предлагает путь к большей эффективности и успеху. Это не просто технологическое достижение; это стратегический актив, который может преобразовать ваши бизнес-операции и позиционировать вас для долгосрочного роста.
===== Страница 18 =====
14
Представьте мир, в котором у каждого сотрудника есть цифровой помощник, столь же эффективный и энергичный, как Раджинальд. Таково обещание Enterprise RAG — масштабируемое, экономически эффективное решение, которое приносит преимущества мгновенного получения информации во всю вашу организацию. Независимо от того, являетесь ли вы стартапом, стремящимся оставить свой след, или established компанией, стремящейся оптимизировать операции, Enterprise RAG предлагает значительные преимущества, которые могут перевесить первоначальные затраты, приводя к большей эффективности и успеху.
Это будущее не построится само собой — ему нужны квалифицированные строители, как вы. Хотя RAG стало модным словом в технических кругах, большинство реализаций в реальном мире все еще не дотягивают, особенно на enterprise-уровне. Но к тому времени, когда вы закончите эту книгу, у вас будут инструменты, стратегии и perspective, чтобы построить то, что действительно работает. Вы не просто будете исправлять поиск — вы будете помогать формировать то, как ИИ интегрируется в реальный бизнес, делая знания более доступными, решения более быстрыми, а команды более способными.
1.4 Примеры использования
Чтобы оживить концепцию, мы рассмотрим реальные примеры, где RAG оказывает значительное влияние в различных отраслях. Представьте, что вы управляете небольшой кофейной обжаркой с несколькими популярными сортами зерен. Одно утро вы задаете своей системе RAG простой вопрос: «Мы еще не закончились эфиопские зерна, и как скоро нам следует заказать снова?» За секунды система обращается к вашим журналам закупок, хранящимся в PDF-листе инвентаря, вместе с данными о продажах из ваших записей, и отвечает: «Вы привезли 20 мешков эфиопских зерен на прошлой неделе, и вы продали 15 — в основном за последние три дня. Ваш поставщик обычно доставляет за неделю, так что, возможно, нам стоит скоро заказать снова». Вместо ручной проверки документов или электронных таблиц вы получаете мгновенный, надежный ответ, который помогает вам оставаться ahead of demand и радовать ваших клиентов.
Масштабируясь до крупной корпорации, предположим, вы руководитель в крупной beverage компании, стремящийся оставаться ahead of отраслевых тенденций. Вы спрашиваете: «Какие вопросы задавали нашему конкуренту во время их последнего звонка о доходах?» RAG-чат-бот эффективно компилирует информацию: «Во время последнего звонка о доходах аналитики спрашивали об их планах международной экспансии, влиянии роста цен на производственные затраты и их стратегии по переходу на устойчивую упаковку». Вооруженные этим insight, вы можете адаптировать свои стратегии, proactively решать similar проблемы и, возможно, даже обыгрывать вашу конкуренцию.
В занятой больнице врачам нужен быстрый доступ к данным пациентов и медицинским исследованиям. Врач может спросить: «Каковы последние результаты анализов пациентки Смит, и есть ли новые исследования по ее состоянию?» RAG promptly отвечает: «Последние тесты пациентки Смит показывают улучшение функции почек и стабилизированное кровяное давление. Недавнее исследование, опубликованное в этом месяце, предлагает новый протокол лечения, который может быть полезен для ее состояния». Это быстрое извлечение информации о пациенте и relevant исследований может улучшить уход за пациентом и потенциально спасти жизни.
===== Страница 19 =====
15
В быстро меняющемся бизнес-мире важно быть в курсе финансовых показателей. Владелец бизнеса может поинтересоваться: «Обобщите ключевые выводы из моих отчетов о продажах, P&L и выручке». RAG доставляет: «Продажи выросли на 8% по сравнению с прошлым кварталом, с сильным ростом в онлайн-сегменте. Однако прибыль немного снизилась из-за роста затрат на поставки. Выручка в целом показывает стабильное улучшение, но затраты на запасы требуют более пристального внимания». С этим summary вы можете быстро принимать обоснованные решения, сосредотачиваясь на стратегических корректировках без необходимости прочесывать все детальные финансовые отчеты.
Педагоги также могут извлечь выгоду из RAG. Представьте университетского профессора, готовящегося к лекции, который спрашивает: «Найдите недавние case studies о внедрении возобновляемой энергии в развивающихся странах». RAG предоставляет: «Вот три case studies за последний год, посвященных инициативам в области солнечной энергии в Кении, ветряным электростанциям в Чили и гидроэлектростанциям в Лаосе, с акцентом на их экономическое и социальное воздействие». Это экономит часы исследовательского времени, позволяя профессору создать более увлекательную и информативную лекцию.
Эти яркие примеры (highlight), как RAG преобразует то, как мы взаимодействуем с данными. Предоставляя немедленный доступ к информации, повышая производительность, улучшая обслуживание клиентов и предлагая экономию затрат, RAG становится неоценимым активом для любой организации. Его универсальная применимость означает, что независимо от размера или сектора вашего бизнеса, RAG может быть адаптирован для удовлетворения ваших потребностей и помочь вам более эффективно достигать ваших целей.
1.5 Создание системы RAG
Теперь, когда мы хорошо понимаем, что делает система RAG, мы реализуем нашу собственную с нуля. Смотрите рисунок 1.6 для обзора всех компонентов, которые мы будем строить. Мы начнем в Главе 2 с построения eval (оценок), которые вы видите внизу блок-схемы. Затем в Главе 3 мы перейдем к первому типу загрузки (ingestion), который оптимизирует документы для извлечения из векторной базы данных. Вы не можете ничего извлечь, если вам нечего извлекать! После этого мы будем работать над вторым типом загрузки в Главе 4, который преобразует структурированные данные в легко доступные для поиска записи. Следующим шагом будет построение механизма извлечения в Главе 5, который будет включать 2 ранее построенных поисковых сервиса и новый набор агентов. Наконец, мы разберемся с аспектом генерации системы, summarising извлеченные данные и возвращая ответ.
===== Страница 20 =====
16
Построение системы RAG (Часть 1)
- Введение
- Eval
- Загрузка в поисковый сервис
- Агенты для извлечения данных
Развертывание и Улучшение (Часть 2)
6) Развертывание, масштабирование и нагрузочное тестирование
7) Отказ от ответственности и обратная связь
8) Безопасность и управление
Поддержка (Часть 3)
10) Мониторинг и дашборды
11) Написание читаемого кода
12) Разное дополнения
Рисунок 1.8 Архитектура системы Enterprise RAG, показывающая этапы загрузки, извлечения и генерации. Необработанные данные предварительно обрабатываются, эмбеддятся и ищутся для доставки точных, контекстно-осознанных ответов.
Давайте рассмотрим каждый шаг на примере. Представьте, что вы владелец магазина электроники, и вы продаете широкий ассортимент продукции — от фенов до телевизоров и музыкальных систем. Каждый продукт имеет несколько вариаций, и все они поставляются со своими собственными руководствами пользователя. Покупатели и пользователи часто задают вам конкретные вопросы о продуктах, которые очень сложно запомнить реальному человеку. Вопросы типа «Какое время работы батареи наушников XM5?» или «Каков гарантийный срок фена MegaCorp?» — это очень конкретные и важные вопросы, которые должны быть решены, чтобы покупатели могли проанализировать, что они хотят приобрести.
В таком сценарии система вопросов и ответов на основе RAG была бы очень полезна. Давайте рассмотрим каждый шаг, чтобы понять, как построить систему RAG поверх сотен руководств пользователя для электронных продуктов.
Загрузка (Ingestion): мы предварительно обрабатываем эти PDF-файлы руководств пользователя, чтобы мы могли предоставлять relevant информацию нашей языковой модели. Используя библиотеки Python, такие как PyPDF2, мы начинаем с извлечения текста из каждого PDF. Затем мы разбиваем (или «чункуем») содержимое на небольшие разделы, потому что передача LLM огромных, неструктурированных документов часто приводит к плохим ответам или потраченным впустую токенам. Делая эти чанки логически осмысленными — например, разбивая их по заголовкам, абзацам или определенному количеству слов — мы помогаем LLM сузить точно ту часть руководства, на которую нужно ссылаться.
Зачем чунковать? Меньшие части дают нашей системе более четкий контекст. Вместо передачи целых 30-страничных PDF-файлов мы передаем только чанк, который говорит, скажем, о «Смазке шестерен», что drastically увеличивает точность и сокращает шум.
===== Страница 21 =====
Как только у нас есть эти текстовые чанки, мы помечаем их метаданными — такими как название продукта, тема или номер страницы — чтобы позже система могла быстро фильтровать по relevant полям. Это делает извлечение намного быстрее, поскольку ему не приходится пробираться через каждый отдельный чанк. После tagging мы эмбеддим каждый чанк, используя качественную модель эмбеддингов. Эмбеддинги превращают ваш текст в числовые векторы, которые capture смысл в формате, который может храниться в векторной базе данных, прямо рядом с этими удобными метаданными. Затем, когда поступает пользовательский запрос, система ищет эмбеддинги, соответствующие запросу, и возвращает именно тот чанк (и контекст), который нужен пользователю, complete с быстрой ссылкой на источник.
Пример метаданных для sample чанка: {"название продукта": "Наушники Aetheraxis XM5", "тема": "обслуживание батареи", "номер страницы": 8}. Если пользователь задает вопрос о батарее для наушников Aetheraxis XM5, эти метаданные позволят нам точно определить наиболее relevant информацию без поиска по сотням руководств.
Вы также можете избежать всех этих хлопот и позволить управляемому сервису, такому как Azure AI Search, позаботиться об этом. Управляемые поисковые сервисы предоставляют вам пользовательский интерфейс для загрузки вашего необработанного текста в доступные для поиска записи с различными опциями и предпочтениями.
Извлечение (Retrieval): Давайте перейдем к другой стороне истории, где мы фокусируемся на выводе (inference), или запросе к нашей системе RAG. Не все пользователи являются инженерами по промптам, и поэтому пользовательские запросы иногда могут быть расплывчатыми или запутанными, и наша работа — убедиться, что мы преобразуем пользовательские запросы в поисковый термин, чтобы мы могли найти правильную и relevant информацию для пользователя. Допустим, пользователь задает вопрос: «На сколько часов хватает моих наушников aetheraxis xm5 после полной зарядки?». Это сложно искать, потому что наши руководства пользователя содержат информацию на очень техническом языке, и поэтому мы используем LLM, чтобы переписать этот вопрос в поисковый запрос: «Время работы батареи наушников Aetheraxis ultrasound». Теперь мы просим агентов ИИ использовать этот поисковый термин для запроса к нашей векторной базе данных и получить топ-3 или 5 чанков данных, которые мы встроили на предыдущих шагах. Эти чанки будут действовать как справочный материал или контекст для нашей LLM, чтобы сгенерировать ответ.
Генерация (Generation): Это последний шаг нашей системы RAG. Теперь у нас есть две вещи — пользовательский запрос и relevant контекст (извлеченные чанки данных). Теперь все, что нам нужно, это преобразовать relevant информацию в формат, понятный нашим читателям и который отвечает на их вопрос. Поскольку наш пользователь задал вопрос очень разговорным way, «На сколько часов хватает моих наушников aetheraxis xm5 после полной зарядки?», нам также нужно убедиться, что наша система генерирует ответ, который является разговорным и легким для понимания. Допустим, наш извлеченный чанк имеет следующий текст:
«Наушники Aetheraxis XM5 обладают исключительным временем работы от батареи — 8 часов при непрерывном воспроизведении музыки и 14 часов при обычном использовании, что на 40% лучше, чем у предыдущей модели».
Мы не можем напрямую предоставить это как ответ нашему читателю, поскольку это может быть немного запутанно и слишком технично. Однако, когда мы передаем этот контекст нашей LLM вместе с оригинальным пользовательским запросом и нашим системным промптом, LLM перефразирует это в окончательный ответ, как показано ниже:
===== Страница 22 =====
18
«Наушники Aetheraxis XM5 обладают потрясающим временем работы от батареи, которое на 40% лучше, чем у предыдущей модели. Эти наушники могут работать 14 часов при обычном использовании после полной зарядки. Если вы непрерывно слушаете музыку, батарея может разрядиться через 8 часов, и ее нужно будет зарядить».
Поскольку у нас также есть метаданные, добавленные к нашим чанкам, мы можем предоставить их вместе с нашим ответом на случай, если пользователь захочет проверить информацию. Это позволит пользователю найти точный документ и страницу, где была найдена информация. Сервисы LLM, такие как Perplexity, используют это для повышения доверия пользователей к своим ответам.
Реализуя систему RAG, владелец магазина преобразует обширную библиотеку руководств по продуктам в интеллектуального помощника, способного предоставлять быстрые, точные и разговорные ответы на вопросы клиентов. Это не только улучшает удовлетворенность клиентов за счет быстрой доставки информации, но и высвобождает ценное время, которое можно перенаправить на другие важные бизнес-операции. Система RAG эффективно превращает сложные технические документы в доступные знания, обеспечивая лучшее принятие решений покупателями и повышая общий опыт покупок. В следующих главах мы углубимся в каждый из этих шагов, проводя вас через процесс создания мощной системы RAG, tailored под ваши нужды.
1.6 Резюме
- Retrieval Augmented Generation (RAG) — это передовая технология ИИ, которая сочетает в себе разговорные навыки с поиском данных в реальном времени, как эффективный помощник.
- RAG позволяет пользователям задавать вопросы на простом языке и получать детальную, конкретную информацию, адаптированную к их потребностям, получая доступ к данным из баз данных, документов и приложений like Slack.
- Наивный RAG, хотя его легко настроить, часто не справляется в бизнес-среде из-за непонимания контекста, извлечения неверных данных или предоставления неточных («галлюцинированных») ответов.
- Enterprise RAG предназначен для обработки сложных бизнес-сценариев, точно обрабатывая разнообразные вопросы на разных языках и улавливая намерения пользователя.
- Внедрение Enterprise RAG приводит к оптимизации операций, более быстрому принятию решений, улучшению сотрудничества и расширенному клиентскому сервису за счет быстрого решения проблем.
- Книга шаг за шагом проведет читателей через создание их собственной системы Enterprise RAG, давая им возможность использовать весь потенциал поиска данных на основе ИИ.
===== Страница 23 =====
19
2 Ничего не происходит, пока кто-нибудь не напишет оценку (eval)
Эта глава раскрывает
- Знакомство с eval и разработкой на основе оценок (Eval-Driven Development)
- Понимание, почему оценки необходимы до написания кода
- Создание эффективных оценок для вашей системы RAG
- Внедрение автоматизированных оценок в сквозное тестирование
- Использование оценок для создания надежного и эффективного RAG-чат-бота
В предыдущей главе мы представили основы Retrieval Augmented Generation (RAG) и изучили, как Enterprise RAG может преобразовать способ взаимодействия бизнеса с данными. Теперь мы готовы засучить рукава и начать строить нашу собственную систему RAG. Эта глава посвящена crucial роли evals — оценочных тестов, которые направляют процесс разработки. Eval, по сути, является тестовым случаем. Если вы не знакомы с разработкой через тестирование (test-driven development), вот как это работает:
- Сначала вы пишете несколько тестов для вашего кода.
- Вы запускаете эти тесты и убеждаетесь, что они проваливаются.
- Вы пишете ровно столько кода, чтобы ваши тесты прошли.
- Вы снова запускаете тесты и убеждаетесь, что на этот раз они проходят.
===== Страница 24 =====
20
Evals работают так же в контексте построения RAG-чат-бота. Мы собираемся построить некоторые evals (тесты), а затем запустить их с помощью Github Actions, чтобы убедиться, что они проваливаются. На протяжении оставшейся части книги мы будем писать код, чтобы эти тесты прошли. К концу книги у вас будет полностью функционирующая система RAG, которая пройдет все тесты, которые мы вместе построим в этой главе. Вот quick пример eval:
- Вопрос: "Что такое Продукт XYZ?"*
- Ответ: "Продукт XYZ — это бытовой огнемет, созданный для использования на кухне."
Eval — это basically список пар вопрос-ответ, который показывает типы вопросов, на которые ваша система должна уметь отвечать, а также правильный ответ на каждый вопрос. Мы обсудим, как evals помогают прояснить цели проекта, обеспечить соответствие бизнес-потребностям и предотвратить дорогостоящие ошибки. Хотя evals обычно пишутся или используются на ранних стадиях разработки пайплайна RAG, настройка автоматических Evals в процессе CI/CD (Непрерывная Интеграция / Непрерывное Развертывание) происходит позже, once система построена. В этой главе мы углубимся в автоматизацию evals, давая вам полную картину их интеграции в ваш пайплайн. Имейте в виду, что вы, вероятно, вернетесь к этому процессу после того, как построите свою систему RAG. Понимая важность evals и изучая, как эффективно создавать и внедрять их, вы заложите foundation для того, что предстоит, обеспечивая, чтобы ваш RAG-чат-бот соответствовал потребностям вашей организации и превосходил ожидания.
2.1 Знакомство с eval и разработкой на основе оценок
Время для истории: Незадолго до того, как я присоединился к моей нынешней компании, примерно в августе 2023 года, генеральные директора были на звонке с акционерами, которые настаивали, что компания должна внедрить ИИ, несмотря ни на что. Именно тогда я связался и в итоге был нанят. В тот момент, когда я начал, мои менеджеры сказали мне построить программу на основе ИИ, которая могла бы вспоминать информацию о наших продуктах. У нас более пяти миллионов продуктов, поэтому для наших представителей службы поддержки клиентов всегда было огромной тратой времени отслеживать детали по любому одному из них.
С первого дня я объяснил, что не могу построить точную систему, которую они имели в виду, пока у меня не будет 10–20 примеров типов вопросов, на которые они хотят, чтобы ИИ отвечал — и, что не менее важно, правильных ответов. Несколько дней спустя мои менеджеры дали мне список пар вопрос-ответ, таких как:
- «Что означает POSTS?» / «POSTS означает Process Occurring Status Tungsten Stills, которые являются 5 шагами в нашем процессе металлургии».
- «Пожалуйста, сравните Westchester 30 с Westchester 45.» / «В то время как Westchester 30 содержит 5% порошка чили, Westchester 45 содержит 8%».
- «Из какого металла сделан Продукт XYZ?» / «Продукт XYZ сделан из меди.»
===== Страница 25 =====
Наличие этих примеров вопросов и ответов значительно облегчило мою работу. Мне не нужно было строить чат-бот, который мог бы отвечать на каждый возможный запрос, только на те, которые мы явно определили. Затем я провел время, спрашивая моего босса и коллег, где найти данные, стоящие за этими конкретными запросами. Например, я спрашивал: «Где находится информация о Westchester 30?» и они указывали мне на правильную базу данных. Мой босс даже передал мне базу данных, полную документов о продуктах, которую мы также использовали для поиска.
Естественно, кто-то в команде в конечном итоге пожаловался: «Я спросил ИИ о наших новых клиентах — почему он ничего не знал об этом?» Моим ответом был: «Это не было в evals. Если вы хотите добавить это, это нормально, но мы никогда не обсуждали данные клиентов в нашем первоначальном плане.» Вот почему наличие этих question-answer evals с самого начала было так critical. Без них я бы имел дело с постоянно движущейся целью. Вместо этого я заканчивал вопрос номер один, затем брался за вопрос номер два и так далее. И со временем мы просто продолжали добавлять больше evals — по крайней мере, один для каждого нового типа поиска, который мы вводили.
Вот как работает подход eval-driven development. Сначала соберите список вопросов — в идеале не менее 10–20 — которые ваш RAG-чат-бот, вероятно, получит. Эти вопросы должны поступать от вашего босса, ваших клиентов или стейкхолдеров, которые понимают бизнес-потребности. Наряду с каждым вопросом получите правильный ответ. Затем постройте чат-бот, чтобы он прошел evals (мы рассмотрим это подробно в следующих главах). Вы будете разрабатывать свой чат-бот так, чтобы, когда он сталкивается с вопросом из вашего списка, он предоставлял соответствующий ответ — или что-то близкое к нему.
Вот и все! Этот подход dramatically упрощает проект. Вместо борьбы с расплывчатыми целями у вас теперь есть конкретные, измеримые цели. Относительно просто заставить один вопрос работать правильно. Заставить все их работать может быть немного сложнее и involves некоторый trial and error, но это definitely достижимо. Мы углубимся в этот процесс больше в последующих главах.
Зачем использовать evals? Они приносят ясность, преобразовывая широкие директивы в конкретные задачи. Evals обеспечивают измеримость, предлагая четкий способ оценить прогресс и успех. Они помогают команде разработчиков сосредоточиться на том, что наиболее важно для бизнеса, и они повышают эффективность, уменьшая неоднозначность и ускоряя процесс разработки.
Для иллюстрации давайте посмотрим на некоторые примеры вопросов и ответов для бизнеса электронной коммерции:
Представьте, что клиент спрашивает: «Что такое Продукт XYZ и как он сравнивается с Продуктом ABC?» Ответ может быть: «Продукт XYZ и ABC — это два продукта из одной линейки. XYZ — это тостер для мяса, а ABC — тостер для пальцев.»
Другой вопрос может быть: «Какие из наших продуктов для домашних животных одобрены FDA?» Соответствующий ответ: «Продукт XYZ был одобрен FDA, что, вероятно, было ошибкой.»
Клиент может поинтересоваться: «Из какого пластика сделан Продукт XYZ? Насколько велик Продукт XYZ?» На что ответ: «Продукт XYZ сделан из низкокачественного, легко плавящегося пластика. Он весит четыре фунта в чистом виде, чего никогда не бывает.»
Это некоторые глупые примеры, но вы поняли идею. Создавая эти evals, вы устанавливаете четкие ожидания для производительности вашего чат-бота. Каждый успешный ответ приближает вас на один шаг к полностью функциональной системе RAG, которая соответствует потребностям вашей компании.
===== Страница 26 =====
22
Чтобы помочь вам разработать эффективные наборы оценок для вашей системы RAG, вот разные наборы evals, каждый tailored под конкретную предметную область.
Для Извлечения Медицинской Информации вы можете включить такие вопросы, как: «Каковы общие симптомы диабета 2 типа?», «Перечислите потенциальные побочные эффекты амоксициллина» и «Объясните различия между МРТ и КТ-сканами.» Вопросы Финансового Консультирования могут быть: «Какова текущая уровень инфляции в Соединенных Штатах?», «Чем Roth IRA отличается от традиционного IRA?» и «Объясните концепцию усреднения стоимости доллара при инвестировании.»
Возможные вопросы Рекомендаций Товаров для Электронной Коммерции: «Порекомендуйте ноутбук, подходящий для графического дизайна, стоимостью до 1500 долларов.», «Каковы основные features последних моделей смартфонов?» и «Сравните наушники с шумоподавлением от Бренда А и Бренда Б.» Для Поддержки Клиентов клиенты могут спросить: «Как мне сбросить пароль моей учетной записи, если я его забыл?», «Мой заказ еще не прибыл. Что мне делать?» и «Объясните, как настроить двухфакторную аутентификацию на моей учетной записи.»
Вопросы в области Технической Поддержки могут быть: «Почему мой компьютер работает медленно, и как это исправить?», «Каковы шаги по устранению неполадок с Wi-Fi соединением, которое постоянно обрывается?» и «Как восстановить удаленные файлы с моего жесткого диска?» Для Суммаризации Новостей вы можете включить: «Обобщите ключевые моменты из последнего отчета ООН о климате.», «Предоставьте краткий обзор последних глобальных тенденций на фондовом рынке.» и «Каковы были основные результаты последнего саммита G7?»
Построение системы RAG становится much more manageable с evals. Вместо абстрактных целей у вас теперь есть tangible roadmap. Все дело в том, чтобы сделать этот первый шаг — заставить один вопрос работать — и строить оттуда.
2.2 Почему вы не можете написать ни строчки кода, пока нет eval
Без eval вы ориентируетесь без компаса. Ваш босс или клиент может иметь грандиозное видение, но если оно не изложено с конкретными примерами, вам остается только гадать. И давайте посмотрим правде в глаза — догадки часто приводят к несовпадению ожиданий и, в конечном счете, разочарованию.
Вот сложная часть: ваш босс или клиент может не увидеть немедленной необходимости предоставить эти примеры. Они могут сказать, что они слишком заняты или пообещать сделать это позже. Дни превращаются в недели, и вы остаетесь в подвешенном состоянии. Но вот в чем дело — вы не можете двигаться вперед без них. Вежливо, но твердо напомните своему боссу или клиенту, что вы не можете продолжать свою работу, пока у вас не будет нескольких примеров вопросов, на которые они хотят, чтобы ИИ ответил, вместе с правильными ответами. Подчеркивая необходимость eval, вы не просто подстраховываетесь; вы обеспечиваете успех проекта.
Без eval вы рискуете стать жертвой скрытых предположений. Ваш босс или клиент может иметь конкретные ожидания, которые они никогда не озвучивали. Независимо от того, насколько хорошо вы спроектируете чат-бот, если он не совпадает с этими невысказанными идеями, он не получит их одобрения. Получая конкретные примеры заранее, вы устраняете неоднозначность. Вы знаете точно, на что вы нацелены, и ваш босс знает, чего ожидать.
===== Страница 27 =====
Представьте себе этот сценарий: ваш босс тестирует чат-бот с вопросом, который вы никогда раньше не видели, и недоволен результатом. «Почему он не ответил на мой вопрос правильно?» — спрашивают они. Вы можете уверенно ответить: «Этот тип вопроса не был включен в evals, которые мы обсуждали. Я построил чат-бот на основе предоставленных примеров. Хотели бы вы добавить этот вопрос в список evals?» Это не только подчеркивает важность initial eval, но и открывает дверь для дальнейшего уточнения. И для стартапов, по мере того как клиенты задают новые типы вопросов, это хорошая идея добавлять эти вопросы в ваши evals.
Помимо опроса вашего босса, another ценная стратегия для создания evals — это привлечение предметного эксперта к процессу. Эксперт может помочь написать всесторонние evals — он знает тонкости предметной области и может предоставить нюансированные вопросы и ответы. Он также может критиковать ответы чат-бота, обеспечивая, чтобы ответы были точными и соответствовали отраслевым стандартам. Это сотрудничество повышает качество вашего чат-бота и добавляет доверия проекту.
Отличный способ придумать новые evals — это использовать ваши каналы поддержки клиентов. Поговорите с людьми на передовой вашей службы поддержки — теми, кто отвечает на самые сложные или частые вопросы каждый день. Вы также можете проверить систему заявок поддержки вашей компании, чтобы определить основные проблемы, по которым клиенты открывают заявки, и посмотреть, можно ли их решить с помощью RAG. Даже расшифровки звонков поддержки могут выявить повторяющиеся проблемы или фразы, которые появляются часто. Сбор реальных пользовательских запросов таким образом помогает вам разрабатывать evals, которые truly отражают повседневные проблемы, так что ваша система обучена решать реальные пользовательские pain points, а не гипотетические сценарии.
Начинать проект ИИ без eval — это как посылать Раджинальда в архивы с завязанными глазами. Он может что-то найти, но вряд ли это будет то, что вам было нужно. Итак, прежде чем вы напишете ни строчки кода, убедитесь, что у вас есть этот eval в руках. Это foundation, на котором rests весь ваш проект.
2.3 Как использовать evals
Итак, у вас есть ваши evals — эти драгоценные пары вопросов и ответов от вашего босса или клиента — и вы готовы начать строить ваш RAG-чат-бот. Но с чего начать? Давайте пройдемся по процессу вместе, подобно обучению нашего друга Раджинальда на его первый рабочий день.
Путешествие начинается с определения ваших evals, которые служат foundation для возможностей вашего чат-бота. Это первый шаг в нашем flow разработки, как показано на рисунке 2.1. Эта блок-схема outlines итеративный процесс построения и уточнения вашей системы RAG: определить evals, реализовать систему RAG, протестировать evals, изменить промпты по мере необходимости и повторно протестировать evals, пока все не заработает гладко. Эта глава будет фокусироваться только на evals, а остальная часть книги будет фокусироваться на реализации системы RAG.
===== Страница 28 =====
24
flowchart TD
A(Определить eval) --> B[Реализовать систему RAG]
B --> C{Протестировать evals}
C -->|Тесты проваливаются| D[Изменить промпты]
C -->|Тесты успешные| E[Конец]
D --> C
Рисунок 2.1 Итеративный процесс для построения системы RAG с использованием evals. Шаги включают определение evals, реализацию системы, тестирование, изменение промптов и повторное тестирование для уточнения.
online
Начните с выбора самой простой пары вопрос-ответ из ваших evals. Начало с простого помогает вам почувствовать процесс, не перегружаясь. Затем вы будете реализовывать систему RAG, шаг за шагом, используя принципы, изложенные в этой книге. В главах 3 и 4 мы покажем вам, как подготовить ваши данные для поиска, используя два очень разных метода. В главе 5 мы обсудим использование агентов для улучшения качества ответов и увеличения гибкости в вашей системе RAG. Глава 6 будет охватывать фактический вывод системы, используя все данные, собранные агентами, чтобы написать удобный для пользователя ответ на eval вопрос. Когда наша система, наконец, настроена и готова к работе, мы запустим наш первый набор evals.
===== Страница 29 =====
25
Например, рассмотрим вопрос: «Каков вес Продукта XYZ?» с ответом: «Продукт XYZ весит 2.5 фунта.» Вы введете «Каков вес Продукта XYZ?» в ваш чат-бот и посмотрите, получите ли вы ожидаемый вывод: «Продукт XYZ весит 2.5 фунта.» Сравните фактический ответ чат-бота с ожидаемым ответом, чтобы определить, работает ли он правильно.
Если чат-бот не предоставляет правильный ответ, пришло время изменить ваши промпты или код соответственно. Мы покажем вам, как изменить ваши промпты и код в последующих главах. Этот шаг troubleshooting имеет crucialное значение и является частью итеративного процесса, показанного на Рисунке 2.1. Проблема обычно попадает в одну из двух категорий: извлечение неправильных данных или генерация неправильного ответа при наличии правильных данных. Используйте советы, предоставленные позже в этой книге, чтобы диагностировать и исправить проблему.
Как только вы решите любые проблемы и ваш чат-бот предоставит правильный ответ, переходите к следующей паре вопрос-ответ в ваших evals. Запустите этот вопрос через вашу систему RAG и сравните вывод вашей системы с ожидаемым ответом из eval. Если он сработает с первой попытки, отлично! Если нет, вам может потребоваться добавить больше агентов и баз данных, similar к тому, что вы сделали для первого eval. Не волнуйтесь, все это будет рассмотрено в последующих главах. Просто убедитесь, что когда вы изменяете свой код, вы запускаете ОБА первый и второй eval вопросы. Вы хотите убедиться, что, улучшая ответ вашей системы RAG на eval вопрос 2, вы не ухудшили его ответ на eval вопрос 1. Продолжайте в этом pattern, изменяя код и запуская evals, пока каждый eval не будет проходить. Этот итеративный подход гарантирует, что все ожидаемые типы вопросов адресованы, строя уверенность и создавая solid foundation для обработки более сложных запросов. Мы покажем вам, как делать это автоматически, каждый раз, когда вы пушите код, в следующем подразделе. Обычно мы бы строили это как часть пайплайна Непрерывной Интеграции/Непрерывного Развертывания после того, как вся система RAG была завершена, но мы хотим дать вам полную картину того, как и почему мы используем evals с самого начала. Вы, возможно, захотите пересмотреть эту главу и, в частности, следующий подраздел после того, как вы завершите свой пайплайн RAG в конце этой книги.
Подумайте, как бы мы обучали нашего старательного помощника, Раджинальда. Мы бы не просто бросили его в архивы без руководства. Мы бы определили вопросы, которые ему могут задать, наметили ресурсы, которые ему понадобятся, и предоставили инструкции о том, как он должен находить и представлять информацию. Те же принципы применимы к вашему RAG-чат-боту. Методично прорабатывая каждый eval, вы гарантируете, что ваш чат-бот хорошо подготовлен для удовлетворения потребностей ваших пользователей.
После завершения системы RAG evals могут использоваться для отладки. Например, допустим, у вас есть eval, который спрашивает: «Каков рейтинг качества Стерео 123?». Вы вводите этот вопрос в вашу систему RAG, и она отвечает: «Извините, но я не могу найти никакой информации о Стерео 123.» Затем вы обнаруживаете, что соединение с вашей базой данных не работает, потому что вы используете старый API-ключ. Вы обновляете API-ключ в вашем коде и снова запускаете eval, используя тот же вопрос. На этот раз система RAG отвечает: «Стерео 123 имеет рейтинг качества AA.» Вы теперь диагностировали и исправили проблему, используя ваши evals. Конечно, ваши поисковые функции также должны иметь модульные тесты, но наличие eval на месте служит дополнительной мерой безопасности, потому что он тестирует ваш пайплайн от начала до конца.
===== Страница 30 =====
26
В качестве другого примера, давайте представим, что один из ваших eval вопросов гласит: «Сколько весит Продукт ABC?» и его соответствующий правильный ответ: «Продукт XYZ весит 6.53 килограмма.» Когда вы спрашиваете вашу систему RAG eval вопрос, она генерирует ответ «Продукт ABC весит 1 стоун.» Однако ваш eval указал, что единицы должны быть в килограммах, а не в стоунах. Вы погружаетесь в ваш код и добавляете промпт к вашему агенту-писателю, говоря ему возвращать все веса в килограммах. Наконец, вы снова пропускаете ваш eval вопрос через систему RAG и получаете правильный ответ: «Продукт XYZ весит 6.53 килограмма.»
Использование evals эффективно bridges разрыв между ожиданиями ваших стейкхолдеров и технической реализацией вашего чат-бота. Это гарантирует, что вы не просто строите чат-бот — вы строите правильный чат-бот. Следуя этому структурированному, итеративному процессу, вы согласовываете ваши усилия по разработке с потребностями вашего бизнеса, resulting в более эффективной и действенной системе RAG.
2.4 Автоматические eval в сквозном тестировании
В разработке программного обеспечения автоматизированное тестирование является важной частью поддержания качества и надежности. Каждый раз, когда вы загружаете код, строите или развертываете, автоматизированные тесты помогают убедиться, что все работает как ожидалось. Вы можете применить тот же принцип к вашему RAG-чат-боту, используя оценки, или «evals». Давайте explore, как автоматизация ваших evals может поддерживать ваш чат-бот работающим на своем лучшем уровне, даже когда вы вносите изменения.
В самом простом случае, вы можете запускать ваши evals, садясь и задавая чат-боту эти вопросы, затем вручную проверяя, совпадают ли ответы с вашими ожиданиями. Хотя этот ручной подход работает для мелкомасштабного тестирования, он становится непрактичным по мере того, как ваш чат-бот становится более сложным. Именно здесь автоматизированные evals вступают в игру.
Представьте, что у вас есть десять eval вопросов для тестирования вашего чат-бота. Вы настроили вашу систему так, что она дает правильный ответ на каждый вопрос — кроме вопроса номер три. Решив исправить это, вы слегка изменяете ваш промпт. Отличные новости: вопрос номер три теперь предоставляет правильный ответ! Но подождите — внезапно вопросы два и пять больше не работают.
Это называется регрессией, и это common сценарий при внесении изменений в вашу систему. Корректировка одной части может непреднамеренно повлиять на другие. Автоматизированные evals помогают вам избежать этой predicament, выявляя такие проблемы рано, позволяя вам пересмотреть ваши промпты или код до того, как будет нанесен какой-либо реальный ущерб. Они также могут помочь вам поймать аномалии, такие как отсутствующие данные, и убедиться, что расплывчатые или запутанные запросы обрабатываются правильно. Они обеспечивают, чтобы ваш чат-бот продолжал работать как ожидалось после любых изменений, поддерживая consistent уровень производительности. Когда вы изменяете промпты или инструкции, автоматизированные evals помогают проверить, что эти изменения негативно не повлияли на ответы чат-бота в других местах. Это safety net, которая предупреждает вас о непредвиденных последствиях.
===== Страница 31 =====
27
Рисунок 2.2 иллюстрирует процесс автоматизированных evals. На этой блок-схеме вы можете видеть, как процесс инициируется всякий раз, когда вносятся изменения в чат-бот. Он начинается с запуска автоматизированных evals, затем переходит к тестированию ответов чат-бота против ожидаемых ответов. Если ошибки найдены, мы должны изменить промпты или код соответственно, и evals запускаются снова. Если все тесты проходят, обновленный чат-бот может быть развернут confidently. Это визуальное представление помогает вам понять циклическую природу тестирования и уточнения вашего чат-бота для поддержания оптимальной производительности.
flowchart TD
A(Триггер Автоматизированных Eval) --> B{Запустить Evals}
B --> D[Все Тесты Проходят]
D --> E(Продолжить)
B --> C[Ошибки Найдены]
C --> F[Изменить Промпты]
F --> B
Рисунок 2.2 Использование evals в качестве тестовых случаев в пайплайнах CI/CD. Evals обеспечивают, чтобы чат-бот consistently соответствовал стандартам производительности, запуская, изменяя и перетестируя промпты в continuous цикле обратной связи.
online
Автоматизированные evals catch несоответствия или ошибки immediately. Это раннее обнаружение позволяет вам решать проблемы до того, как они повлияют на ваших пользователей. Они также экономят ваше время, автоматизируя процесс тестирования. Вместо ручной проверки каждого ответа после каждой настройки, вы можете сосредоточиться на разработке, доверяя, что evals предупредят вас о любых проблемах. Дополнительно, evals могут тестировать, чтобы убедиться, что ваш RAG-чат-бот отвечает без предвзятости, фильтрует неподобающий контент и properly обрабатывает edge cases.
Рисунок 2.3 показывает реализацию автоматизированных evals. Эта блок-схема демонстрирует, как разные компоненты взаимодействуют в процессе оценки. Она начинается с тестового скрипта, который отправляет eval вопросы чат-боту. Чат-бот генерирует ответы, которые затем передаются в Большую Языковую Модель (LLM) для оценки. LLM сравнивает ответы чат-бота с ожидаемыми ответами. На основе оценки система решает, пройти тесты или провалить их. Этот рисунок предоставляет четкую картину задействованных компонентов и того, как они работают вместе для автоматизации процесса тестирования.
===== Страница 32 =====
28
flowchart LR
A(Тестовый Скрипт) -->|Eval Вопрос| B[Чат-бот]
A -->|Eval Ответ| C[LLM]
B -->|Чат-бот Ответ| C
C --> D{Похожи ли эти 2 ответа?}
D -->|ДА| E(Результат: ПРОЙДЕНО)
D -->|НЕТ| F(Результат: ПРОВАЛ)
Рисунок 2.3 Как работает процесс Автоматизированного Eval. Evals взаимодействуют с чат-ботом и большой языковой моделью (LLM) для оценки и обеспечения точности ответов, проходя или проваливаясь на основе схожести.
online
2.4.1 Как использовать LLM в процессе eval
После получения ответов чат-бота вы сравните их с ожидаемыми ответами, используя Большую Языковую Модель. LLM оценивает схожесть между ответом чат-бота и ожидаемым ответом. Вы можете определить, что constitutes «достаточно похоже» на основе конкретных критериев, relevant для вашего случая использования. Если ответы достаточно похожи, развертывание продолжается. Если нет, пайплайн возвращает ошибку и прерывает развертывание. Настройка оповещений для уведомления команды разработчиков о любых сбоях позволяет принять немедленные меры.
Использование LLM для сравнения имеет свои преимущества и недостатки. LLM могут понимать семантические сходства, даже когда формулировка не идентична, обеспечивая, что правильные ответы не пропускаются из-за различий в phrasing. Они учитывают вариации в формулировках, фокусируясь на правильности информации, делая оценки более точными. Автоматизация процесса сравнения уменьшает ручные усилия, экономя ваше время и позволяя вам сосредоточиться на разработке.
Однако LLM иногда могут предоставлять непоследовательные оценки из-за их случайной природы. Это означает, что вам все еще нужен человек в цикле для мониторинга и проверки результатов или добавления некоторых проверок на основе правил. Например, ваш чат-бот, возможно, ответил на вопрос perfectly, но LLM, оценивающая его ответ, может неправильно оценить ответ как низкокачественный. Вы, возможно, захотите также добавить правило в ваш код, которое гарантирует, что определенные ключевые слова присутствуют в ответах. Например, если eval вопрос говорит: «Что такое ProductXYZ?» вы, возможно, захотите включить некоторый код для проверки, присутствуют ли «тостер» и «мясо» в ответе.
===== Страница 33 =====
Запуск оценок через LLM, особенно в масштабе, также может привести к более высокым вычислительным и monetary расходам, влияя на бюджет вашего проекта. Взвешивая эти pros и cons, вы можете решить, как лучше всего интегрировать LLM в ваш процесс оценки. Мы рекомендуем комбинировать автоматизированные оценки с occasional человеческим надзором, чтобы получить лучшее из обоих миров.
По мере того как вы уточняете промпты и инструкции вашего чат-бота, автоматизированные evals помогают вам поддерживать качество, проверяя, что изменения улучшают производительность чат-бота без введения ошибок. Вы можете вносить корректировки confidently, зная, что у вас есть safety net, чтобы поймать непредвиденные последствия. Это гарантирует, что чат-бот продолжает соответствовать ожиданиям, установленным вашим боссом и стейкхолдерами.
2.4.2 Тестирование всех источников данных
Чтобы построить эффективный RAG-чат-бот, essential иметь evals, которые представляют каждый источник данных, к которому ваш чат-бот будет обращаться. Думайте об этом как об обеспечении того, что Раджинальд хорошо разбирается в каждом разделе библиотеки, который ему, возможно, потребуется посетить. Наличие evals для каждого источника данных обеспечивает всестороннее тестирование. Это позволяет вам проверить способность чат-бота извлекать и обрабатывать информацию из всех частей вашей системы, обнаруживать области, где чат-бот, возможно, терпит неудачу, и быстро исправлять проблемы. Например, ваша база данных «продуктов» может быть неработоспособна на этой неделе. Вы можете не знать, если не запустите evals, которые specifically запрашивают данные из этой базы данных.
Начните с перечисления всех источников данных, с которыми будет взаимодействовать ваш чат-бот, таких как базы данных информации о клиентах, базы данных атрибутов продуктов, истории заказов, системы управления запасами, политики и кодексы компании, и базы знаний поддержки. Для каждого источника данных разработайте хотя бы одну пару вопрос-ответ. Например, для базы данных информации о клиентах у вас может быть:
- Вопрос: "Каков последний заказ, размещенный клиентом Джейн Доу?"
- Ответ: "Последний заказ Джейн Доу был №98765, размещенный 15 марта 2023 года, для набора посуды из нержавеющей стали."
Охватывая все источники данных, вы гарантируете, что ваш чат-бот может обрабатывать запросы, связанные с любой частью вашей системы, предоставляя сбалансированную производительность по всем направлениям.
2.4.3 Реализация автоматических eval
Теперь давайте посмотрим, как вы можете реализовать автоматические evals программно. Вам может быть интересно, почему мы создаем эти evals в самом начале процесса RAG-чат-бота, а не в конце. Это очень похоже на Разработку через Тестирование (TDD): мы сначала пишем наши тесты, затем строим код, который проходит их. К тому времени, когда вы закончите эту книгу, у вас будет complete система RAG, которая может пройти эти specific вопросы оценки.
Мы разберем код на части и объясним каждый сегмент, прежде чем показать его. Пожалуйста, смотрите рисунок 2.4 ниже для краткого обзора нашего процесса построения кода.
===== Страница 34 =====
30
- Evals: "Что такое Underwhelming Spatula?"
- Промпт: сравнить сгенерированные с ожидаемыми ответами
- Отправить в OpenAI
- Запустить все evals как тестовый случай
- Автоматизировать тестирование через Github Actions
Рисунок 2.4 Автоматизированная система eval для разработки RAG. Evals сравнивают ответы чат-бота с ожидаемыми выводами и автоматизируют тестирование через GitHub Actions, обеспечивая высококачественную производительность.
Прежде чем мы углубимся в код, убедитесь, что у вас установлен Python 3.11 (или подходящая версия). Если вам нужно установить Python или обновить его, вы можете скачать его на python.org. Вам также понадобится установить Git для управления вашим контролем версий; если это для вас ново, ознакомьтесь с документацией Git на git-scm.com.
Как только у вас есть Python и Git, создайте папку с именем RagInProduction. Откройте ваш терминал или командную строку, перейдите в эту папку и выполните git init, чтобы инициализировать новый репозиторий. Настройка виртуального окружения (например, с использованием python -m venv venv) является опциональной, но может помочь держать ваши зависимости организованными. Далее установите библиотеку OpenAI, выполнив:
pip install openai
===== Страница 35 =====
Эта библиотека позволяет вам отправлять запросы к моделям OpenAI и получать их ответы. Для получения дополнительной информации об OpenAI API, нажмите здесь: https://github.com/openai/openai-python/, и чтобы получить OpenAI API ключ, нажмите здесь: https://platform.openai.com/docs/quickstart. Однако, вы НЕ должны хранить ваш API ключ напрямую в вашем скрипте, по соображениям безопасности — именно здесь пригодятся переменные окружения. Самый простой способ сохранить ваш API ключ в безопасности — создать файл с именем .env в папке вашего проекта и включить в него следующее:
OPENAI_API_KEY=sk-abc123YourKey
Затем в терминале установите пакет python-dotenv:
pip install python-dotenv
В ваших скриптах вы можете загружать и использовать ключ, не раскрывая его. Например:
from dotenv import load_dotenv
import os
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
Этот подход предотвращает попадание вашего ключа в контроль версий или совместное использование в виде plain text.
ПРИМЕЧАНИЕ Код в этой книге разработан, чтобы проиллюстрировать, как можно проще, ключевые концепции RAG в production. Перед развертыванием любого кода в профессиональной среде вам, вероятно, потребуется добавить модульные тесты, docstrings, type hints, логи и сообщения об ошибках. Мы не включили docstrings, потому что Manning позволяет аннотации в своем коде, и мы не включили type hints, тесты, логи или сообщения об ошибках ради сохранения краткости, простоты и легкой читаемости. Вам придется иметь дело со всеми этими вещами в Prod, но мы решили опустить их, потому что они не добавили бы ничего к обучению.
Имея все это в виду, давайте начнем с создания нашего скрипта автоматических eval в файле с именем run_evals.py. Внутри этого файла вы можете начать с настройки двух списков: один для ваших вопросов оценки, а другой для правильных, ожидаемых ответов. После этого вы определите функцию, которая отправляет сообщения в API OpenAI, заботясь о связи с LLM и обеспечивая доставку промптов correctly.
===== Страница 36 =====
32
Листинг 2.1 Построение автоматических eval
import openai
import os
from dotenv import load_dotenv
load_dotenv()
evals = [
"What is Underwhelming Spatula?", #A
"Who wrote 'Dubious Parenting Tips'?", #A
"How long is Almost-Perfect Investment Guide?", #A
]
eval_answers = [
"Underwhelming Spatula is a kitchen tool that redefines expectations by fusing whimsy with functionality.",
"Lisa Welton wrote Dubious Parenting Tips.",
"The Almost-Perfect Investment Guide is 210 pages long.",
#A
]
#A Создайте списки вопросов и ответов, данных вам вашим боссом и/или стейкхолдерами в вашем проекте RAG.
Далее, в том же файле мы определяем функцию для отправки сообщений в API OpenAI. Эта функция будет обрабатывать связь с LLM.
===== Страница 37 =====
33
Листинг 2.2 Построение функции "Отправить в OpenAI"
def send_to_openai(message):
openai.api_key = os.environ.get("OPENAI_API_KEY") #A
completion = openai.chat.completions.create(
model="gpt-4o", #B
messages=[{"role": "user", "content": message}] #C
)
return completion.choices[0].message.content.strip() #D
#A Вам нужно будет получить API ключ от OpenAI, зарегистрировав учетную запись.
#B ChatCompletion.create отправляет сообщение указанной модели (в данном случае, gpt-4o), которая генерирует ответ.
#C OpenAI ожидает получения сообщений в определенном формате. Вы должны указать как роль говорящего, так и содержание для каждого сообщения.
#D Функция возвращает содержание ответа, очищенное от любых начальных или конечных пробелов.
Все еще в run_evals.py, вы напишете другую функцию, которая сравнивает ожидаемый ответ с любым ответом, сгенерированным LLM. Эта функция попросит LLM решить, совпадает ли сгенерированный ответ с ожидаемым. Если они совпадают, LLM возвращает «PASS.» Если нет, она возвращает «FAIL.» По мере развития вашей системы RAG вы можете добавить больше инструкций к промпту, чтобы accommodate более строгие требования, такие как точное совпадение дат и чисел или запрос объяснений, если ответ не прошел.
Листинг 2.3 Функция сравнения одного ожидаемого с одним сгенерированным ответом
def evaluate_generated_answer(expected_answer, generated_answer): #A
prompt = f"""Please evaluate the generated answer. If the generated answer provides the same information as the expected answer, then return PASS. Otherwise, return FAIL. Expected answer: {expected_answer} Generated answer: {generated_answer}""" #B
response = send_to_openai(prompt) #C
return response #D
#A Принимает на вход один ожидаемый ответ и один сгенерированный ответ
#B Создает промпт, просящий LLM сравнить два ответа
#C Отправляет созданный промпт в OpenAI
#D Возвращает результат
===== Страница 38 =====
34
Далее вы создадите файл с именем test_automated_evals.py. Этот файл будет перебирать каждый вопрос оценки, отправлять его чат-боту и проверять ответ. Вы также настроите GitHub Action так, чтобы при каждом обновлении вашего репозитория тест запускался автоматически через pytest. На практике система будет захватывать реальные ответы от вашего RAG API, но сейчас вы можете использовать dummy ответы, чтобы убедиться, что все работает как ожидалось.
Листинг 2.4 Сравнение всех ожидаемых со всеми сгенерированными ответами как тестовый случай
from run_evals import evaluate_generated_answer #A
def run_RAG(user_question): #B
return "IDKL0L"
def test_run_RAG(): #C
eval_questions = [
"What is Underwhelming Spatula?",
"Who wrote 'Dubious Parenting Tips'?",
"How long is Almost-Perfect Investment Guide?",
]
eval_answers = [
"Underwhelming Spatula is a kitchen tool that redefines expectations by fusing whimsy with functionality.",
"Lisa Welton wrote Dubious Parenting Tips.",
"The Almost-Perfect Investment guide is 210 pages long.",
]
generated_answers = []
for question in eval_questions:
answer = run_RAG(question)
generated_answers.append(answer) #D
for i in range(len(eval_questions)):
result = evaluate_generated_answer(eval_answers[i], generated_answers[i])
assert "PASS" in result #F
#A Импортируем функцию оценки, которую мы определили ранее.
#B Мы еще не написали нашу функцию RAG, поэтому мы просто вернем какой-нибудь dummy текст.
#C Эта функция будет запускаться каждый раз, когда вызывается pytest, потому что она начинается с "test_".
#D Для каждого вопроса в нашем списке evals мы пропускаем этот вопрос через нашу фальшивую функцию RAG и добавляем ответ в список.
===== Страница 39 =====
35
#E Аналогично, мы перебираем все сгенерированные ответы и убеждаемся, что они совпадают с ответами, которые мы ожидаем.
#F Если слово "PASS" есть в каждом результате, мы знаем, что наш RAG работает правильно. Если нет, наш тест выдаст ошибку.
Чтобы управлять зависимостями, создайте файл requirements.txt в вашей основной директории. Включите openai==1.60.2, dotenv и pytest. Фиксация конкретной версии OpenAI обеспечивает стабильность, если пакет изменится. Содержимое файла должно выглядеть так:
openai==1.60.2
dotenv
pytest
Вы также создадите две новые папки: одну с именем .github и, внутри нее, другую с именем workflows. В папке workflows создайте файл test.yml. Заполните его конфигурацией, которая сообщает GitHub Actions, когда запускаться (каждый раз, когда вы пушите код в main), какую операционную систему использовать (Ubuntu), как настроить Python 3.11, как установить зависимости и, наконец, как запустить ваши тесты. Обратите внимание, что прокомментированные аннотации (#A, #B и т.д.) объясняют каждый шаг простым языком, например, запуск на Ubuntu (#B) или установка ваших требований (#E):
===== Страница 40 =====
36
Листинг 2.5
name: Automatic Testing
on:
push:
branches:
- main #A
jobs:
test:
runs-on: ubuntu-latest #B
steps:
- name: Check out code
uses: actions/checkout@v3 #C
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.11 #D
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt #E
- name: Run tests
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
python -m pytest -s #F
#A Каждый раз, когда вы пушите код, это действие выполняется на вашей ветке "main".
#B Запускайте ваш код на операционной системе Ubuntu.
#C Проверьте ваш код и установите его на тестовом сервере, предоставленном Github.
#D Убедитесь, что мы используем Python 3.11.
#E Установите новейшую версию Pip, а также все требования, которые вы перечислили в вашем файле requirements.txt.
#F Запустите тесты, которые мы написали ранее в test_automated_evals.py.
===== Страница 41 =====
37
Как только у вас все настроено локально, перейдите на GitHub.com, создайте репозиторий с именем RagForEnterprise и зайдите в его настройки. В разделе «Secrets and Variables» -> «Actions» добавьте ваш OpenAI API ключ как секрет с именем OPENAI_API_KEY. Подключите этот новый удаленный репозиторий к вашему локальному проекту (в интернете много tutorials, если вам нужна помощь с Git), затем commit и push ваши изменения. Вернувшись на GitHub, вы должны увидеть ваш код в репозитории RagForEnterprise вместе с записью о запуске тестов. Вы, вероятно, получите падающий тест, что именно вы и хотите на этом этапе — точно так же, как в Test Driven Development, вы начинаете с определения падающих evals, затем строите вашу систему RAG, пока они не пройдут.
Если вы хотите протестировать все на вашей локальной машине, вы можете установить pytest с помощью
python -m pip install pytest
а затем запустить
python -m pytest test_automated_evals.py.
Автоматизация ваших evals таким образом действует как continuous партнер по обеспечению качества для вашего RAG-чат-бота. Каждый раз, когда вы обновляете ваш код или корректируете промпт, эти тесты помогают поддерживать надежность и эффективность. Включая автоматизированные evals в ваш workflow, вы proactively уточняете производительность вашего чат-бота, следя за любыми регрессиями или багами.
2.5 Резюме
- Eval необходимы для разработки RAG. Evals служат тестовыми случаями, которые преобразуют широкие цели в конкретные, измеримые задачи, направляя разработку вашего RAG-чат-бота.
- Получайте Evals до написания кода. Получение evals от стейкхолдеров до написания любого кода имеет crucialное значение для избежания скрытых предположений, обеспечения соответствия ожиданиям и защиты проекта от несоответствующих результатов.
- Используйте пошаговый подход, начиная с простых пар вопрос-ответ, определяя необходимые данные, создавая агентов и функции поиска, предоставляя четкие инструкции, тестируя ответы, устраняя проблемы и повторяя итерации.
- Интегрируйте evals в ваш пайплайн развертывания для автоматизации тестирования, используйте большие языковые модели (LLM) для сравнения ответов и охватывайте все источники данных для обеспечения комплексной и эффективной оценки.
- Eval улучшают коммуникацию между разработчиками и стейкхолдерами, позволяют непрерывное улучшение и имеют criticalческое значение для разработки, тестирования и поддержки надежного RAG-чат-бота, который соответствует организационным потребностям и приносит существенную ценность.