Хотите изучить Warhammer 40K? Создайте этого чат-бота с помощью Vector и RAG на стандартном оборудовании

Хотите изучить Warhammer 40K? Создайте этого чат-бота с помощью Vector и RAG на стандартном оборудовании

27 февраля 2024 г.

При создании генеративного приложения ИИ, которому для выполнения задачи необходимо несколько раз вызывать модель большого языка (LLM), распространенной проблемой является то, что повторные запросы к LLM могут быть как дорогостоящими, так и непредсказуемыми. Большие модели, такие как GPT-3.5/4, невероятно ресурсоемки для обучения и выполнения вывода; это отражается на расходах на API, а также на периодических перебоях в обслуживании. ChatGPT изначально был выпущен в качестве предварительной исследовательской версии и не предназначался для использования в производственных приложениях. Однако его полезность для широкого спектра приложений неоспорима, поэтому интерес к LLM резко возрос.

С момента создания ChatGPT пользователи искали способы обойти отсутствие конфиденциальности и невозможность контролировать время безотказной работы или настройки вывода при использовании GPT. Это привело к популярности бесплатных общедоступных моделей, таких как Llama 2 компании Meta, а затем к созданию квантованных версий и версий с меньшими параметрами. Llama, который может работать на потребительском оборудовании. Эти общедоступные модели способны обеспечивать почти ту же функциональность, что и GPT, при гораздо меньшей вычислительной мощности, хотя и за счет меньшего количества параметров и меньшего количества подробных выходных данных.

Если ваше приложение не обязательно зависит от обработки слишком больших контекстов или создания подробного вывода, то размещение собственного вывода на экземплярах, которыми вы управляете, может быть более экономичным вариантом. А когда дело доходит до реальных приложений дополненная генерация извлечения (RAG), разница в стоимости может стать еще более существенной.

Я продемонстрирую простой метод объединения векторных хранилищ, лексического поиска и разработки подсказок для выполнения точного RAG на обычном оборудовании. Используя этот метод, вы можете уменьшить сложность больших объемов информации и сделать запуск приложений генеративного ИИ более точным, эффективным и экономичным в масштабе. Используя RAG для конкретных хранилищ информации, вы можете получить возможность устранять галлюцинации и создавать эффективных и знающих агентов из любого исходного материала без необходимости платить за сторонние API.

Для начала вам понадобится экземпляр DataStax Enterprise 7 или DataStax Astra DB для хранения векторов и текстовых данных, а также LLM и модель преобразователя предложений для генерации ответов и кодирования данных с помощью векторов. В зависимости от сложности ваших данных или запросов пользователя вы также можете рассмотреть возможность объединения с базой данных DataStax Enterprise 6.8, которая может выполнять Solr выполняет поиск по более широкому диапазону данных, что я и использовал в этом примере. DataStax постоянно работает над улучшениями, позволяющими выполнять все эти операции с одной базой данных, но сейчас я использую две базы данных.

Решение проблемы галлюцинаций

Независимо от того, какой LLM вы выберете, все они по-прежнему страдают от галлюцинаций. На данный момент это ограничение необходимо устранить путем подачи правдивой информации в контекст подсказок LLM, также известного как RAG. Метод, с помощью которого вы находите свою информацию и преобразуете ее для подсказок, полностью зависит от вашей модели данных, но вы можете найти более подходящую информацию более эффективным способом, используя векторные базы данных.

Предположим, например, что у вас есть коллекция электронных книг по теме, которую вы хотели бы изучить, например, как играть в Warhammer 40,000. . В обычных обстоятельствах потребовались бы годы, чтобы прочитать вспомогательную литературу и получить достаточный игровой опыт, чтобы достичь экспертного уровня.

Целевой вопрос, например: «Что вы можете рассказать мне о Морвенне Вале из Адепта Сороритас?» лучше всего ответит игрок-ветеран или любой сотрудник магазина Warhammer. Хотя ChatGPT может ответить на многие вопросы об игре, к сожалению, в нем нет данных для обучения этому конкретному персонажу:

Сравните это с параметром LLM Llama 2 13B, размещенным на потребительской рабочей станции с видеокартой Nvidia RTX A4000. Точно так же модель может демонстрировать базовые знания вселенной Warhammer, но из-за настройки модель не заботится о том, что персонаж не найден, и вместо этого отображает галлюцинацию с лучшими усилиями:

Если вы хотите создать чат-бота, который поможет как новичкам, так и ветеранам играть в Warhammer 40,000, то такие результаты неприемлемы. Чтобы быть эффективным гидом по игре, чат-бот должен знать правила игры, правила для каждого юнита, некоторые знания, а также стратегию и комментарии. К счастью, вся эта информация о правилах 10-го издания доступна бесплатно на Games Workshop и фан-сайтах, и все, что вам нужно сделать, это сделать ее доступной для поиска в вашем приложении чат-бота.

Сравните это с той же моделью 13B Llama, где с помощью RAG предлагается сравнить пару источников о Морвенне Вале и придумать соответствующий ответ на основе подсказки пользователя. На этот раз чат-бот имеет доступ к базе данных поиска и базе данных векторов, полной вся общедоступная информация о том, как играть в Warhammer 40,000, 10-е издание:

Какая разница! Он не только находит соответствующую информацию об этом нишевом персонаже, но и приводит свои результаты в соответствие с контекстом того, как играть в игру с правилами 10-го издания.

Самое сложное во всем этом — провести эффективный поиск релевантных страниц для загрузки в LLM. Здесь векторные базы данных могут быть особенно полезны.

Применение векторов

В этом примере мы будем использовать DSE 7 и DSE 6.8, работающие в экземплярах Docker, чтобы удовлетворить требования к базе данных приложения чат-бота, которое должно иметь возможность сравнивать векторы и выполнять лексический поиск. В DSE 7 и Astra DB появилась возможность хранить векторы и выполнять векторный поиск, а также фильтрацию по текстовым совпадениям. Для этого примера нам нужно просмотреть всего несколько десятков книг, поэтому запуска экземпляров DSE в Docker будет достаточно для большинства потребительского оборудования.

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

Например, PDF-файлы электронных книг могут быть лучше закодированы с помощью преобразователей предложений, таких как miniLM, и векторы можно использовать для сравнения сходства между запросом и данным источником. В этом случае модель преобразователя предложений используется для создания вложений текста страницы в электронную книгу, и это может позволить вам сравнить его с подсказкой пользователя, чтобы выяснить, соответствует ли результат запросу. Релевантные страницы должны содержать один или несколько терминов, которые похожи на запрос пользователя и приводят к более высоким показателям сходства с точки зрения модели.

Тем не менее, векторы лучше всего применять в качестве дополнения к существующей модели лексического поиска. Если вы выполняете поиск только по векторам, вы можете неожиданно получить несвязанные документы и предоставить их в качестве контекста там, где они не применяются.

В этом примере запрос «Что вы можете рассказать мне о Морвенне Вале из Адепта Сороритас?» могут быть преобразованы с помощью LLM в набор простых поисковых запросов:

Морвенн, Вал, Адепта, Сороритас

Первым шагом в поиске соответствующих документов будет поиск документов, содержащих эти основные термины. Это можно сделать, сначала отфильтровав текстовые совпадения в базе данных, чтобы найти ключевые слова в тексте страницы, соответствующие такому запросу. Причина использования LLM для генерации ключевых слов состоит в том, чтобы предоставить более широкий диапазон возможных ключевых слов для поиска, поскольку он часто пытается добавить больше ключевых слов, которые связаны, но не находятся в тексте исходного приглашения. Однако будьте осторожны, поскольку LLM также могут генерировать специальные символы и странные последовательности, которые вам придется очищать.

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

В этом случае первый шаг должен соответствовать страницам, на которых конкретно показана учетная карточка Морвенна Валя или игровая механика, поскольку они описывают юнит персонажа с точки зрения того, как он играет в игре. Если страница соответствует определенному порогу релевантности запросу пользователя, определенному приложением, она суммируется и помещается в список результатов.

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

Как видите, для этого потока LLM вызывается довольно часто. LLM отвечает за преобразование запроса пользователя в ключевые слова, обобщение применимых результатов и выбор контекста, который лучше всего отвечает на запрос. Каждый проверяемый источник добавляет еще один вызов LLM, что может быть довольно затратным при выполнении запросов к GPT. Но если у вас уже есть нужная информация и вы просто хотите ее обобщить или преобразовать, возможно, вам не понадобится использовать такую ​​большую модель. На самом деле переход на модели меньшего размера может дать ряд преимуществ.

Используя меньший LLM, вы можете снизить вычислительные затраты на каждый запрос, что со временем может привести к значительной экономии. Это также может привести к сокращению времени отклика ваших пользователей, что может улучшить их общее впечатление. В этом примере, где RAG выполняется с использованием небольшого LLM и небольших баз данных, размещенных на одном экземпляре графического процессора, требуется около 30 секунд, чтобы получить 15 источников, проанализировать их на предмет релевантности и предоставить окончательный ответ. И чем короче запросы (источники), тем быстрее можно вернуть результаты.

Кроме того, этот метод обеспечивает повышенную безопасность и масштабируемость. Благодаря быстрому проектированию и конвейеру обращений к LLM вы находитесь в полный контроль над тем, как осуществляется доступ к данным и что пользователи получат в своих ответах. Что касается использования ресурсов, пример модели с параметрами 13B потребляет лишь немногим более 8 ГБ видеопамяти и по-прежнему дает релевантные ответы. В зависимости от потребностей это показывает потенциал для запуска RAG даже на множестве других платформ, таких как пользовательские рабочие станции и мобильные устройства.

Управление выводом

Быстрое проектирование — ключ к тому, чтобы RAG делал именно то, что вы хотите. Вы контролируете, как чат-бот интерпретирует данные и контекст, в котором он должен думать. В этом примере мы хотим убедиться, что чат-бот знает, что мы ищем именно информацию о Warhammer, поэтому мы можем сначала попросить его помочь предоставить вспомогательный контекст для запроса пользователя:

Запрос: «»

Дайте мне минимальный список ключевых слов Warhammer 40K, разделенных запятыми, для поисковой системы. Отвечайте только запросом. Не используйте смайлы или специальные символы.

Ответ:

Warhammer 40,000 полон терминов и имен, которые могут появиться в другой, несвязанной с ней популярной культуре, поэтому важно установить контекст RAG в самом первом запросе. Этот контекст должен быть доступен для выбора или изменения, если ваше приложение охватывает несколько контекстов, например, если вам нужно охватить несколько редакций правил игры Warhammer или объединить их с официальными книгами знаний.

Обратите внимание, что в этом эксперименте запрос пользователя всегда инкапсулируется в кавычки. Это помогает LLM различать запрос, на который он пытается ответить напрямую, и отдельные инструкции по созданию подсказок, на которые он не должен отвечать напрямую. Часть подсказки с вопросами и ответами можно настроить в соответствии с конкретным контекстом, но в основном все, что вам нужно сделать, это сообщить LLM, на что он должен и не должен напрямую реагировать и как реагировать.

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

Затем лексические и векторные сравнения могут выполняться в фоновом режиме, а список результатов составляется для рассмотрения LLM. Поскольку на исходный запрос пользователя никогда не дается прямой ответ с выводом на первом этапе, LLM только преобразует то, что найдено в результате поиска, и его можно легко остановить от ответа на запросы за пределами его защитных ограждений или базы знаний.

Если есть релевантные результаты поиска:

Запрос: «»

Просмотрите эти результаты поиска и используйте их для ответа на запрос.

Результат 1

Результат 2

и т. д.

Ответ:

Если релевантные результаты поиска отсутствуют:

Запрос: «» n Вежливо сообщите мне, что вы искали, но не смогли найти ответ на запрос. Вместо этого ответьте, насколько вам известно.

Ответ:

Для дополнительной безопасности вы можете полностью отклонить или перенаправить запрос, если его невозможно обслужить.

Запрос: «»

Вежливо сообщите мне, что вы искали, но не смогли найти ответ на запрос. Попросите меня вместо этого обратиться за помощью в службу поддержки клиентов.

Ответ:

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

Запрос: «»

Просмотрите результаты поиска и используйте их для ответа на запрос. Будьте максимально подробны и цитируйте источники.

Результат 1

Результат 2

и т. д.

Ответ:

Ограничения

У LLM ограниченное контекстное окно, и он не может обрабатывать очень большие страницы текста. Рассмотрите возможность ограничения размера строки, чтобы ваши данные были более управляемыми и их было проще обрабатывать. LLM для обработки. Например, хорошо работает разбиение страниц на куски примерно по 1000 символов и старайтесь не вводить в подсказку более четырех или пяти подробных ответов.

LLM не запоминает разговоры, кроме тех, которые можно поместить в контекстное окно. Можно создать постоянное хранилище данных разговоров, но LLM не может вместить в подсказку слишком большие разговоры или подробный контекст; существует верхний предел того, что он может трансформировать. Это означает, что несмотря ни на что, в определенный момент вы заметите, что LLM «забывает» определенные детали, даже если они представлены в качестве контекста; это просто неотъемлемое ограничение инструмента. Лучше всего полагаться на него только при коротких разговорах и сосредоточиться на преобразовании небольших объемов текста за раз, чтобы свести к минимуму галлюцинации.

Случайность в LLM может быть проблемой. Тестирование и настройка потребуются, чтобы определить, какие подсказки лучше всего подходят для вашего набора данных, и какая модель лучше всего подходит для вашего варианта использования. В моем тестировании с моделью с параметрами 13B было много непредсказуемости относительно того, какие ключевые слова поиска были сгенерированы из первого запроса, особенно по мере увеличения длины запроса. Для достижения наилучших результатов придерживайтесь более коротких подсказок.

Заключение

Иными словами, использование RAG путем объединения векторных и лексических Модели поиска позволяют более эффективно находить и сортировать релевантные результаты и генерировать выходные данные агента, которые гораздо менее подвержены галлюцинациям. Чем меньше контекст для поиска, тем точнее и точнее ответы. Создание собственного конвейера вызовов LLM обеспечивает гораздо большую гибкость в настройке ответов на желаемый уровень точности и защитных ограждений.

Хотя он не может обрабатывать чрезмерно большие объемы данных в ограниченном контекстном окне, он предлагает возможность создавать эффективных помощников на ограниченных базах знаний, а также запускать больше одновременных агентов на том же или меньшем оборудовании, чем раньше. Это может открыть больше возможностей для виртуальных помощников в таких приложениях, как настольные игры, или даже охватить более сложные темы для использования государственными, юридическими и бухгалтерскими фирмами, научными исследованиями, энергетикой и т. д.

Если вы готовы приступить к сборке, вы можете попробуйте Astra DB бесплатно. Создайте свою базу данных и начните загружать источники RAG сегодня, при этом не требуется опыта работы с облаком или базой данных.

Марио Чарнелл-Дельгадо, DataStax


Также опубликовано здесь.< /п>


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE