Создание лучших чат-ботов на базе GPT-3.

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

Как и многие другие, возможно, включая вас, поскольку вы читаете это, я довольно часто использовал GPT-3 и ChatGPT, и при этом я обнаружил, что очень часто они отвечают на вопросы очень убедительно, но неправильно. Действительно, я исследовал это довольно глубоко, когда GPT-3 был выпущен, в форме экзаменов, таких же, как те, которые я сдавал бы студенту по естественнонаучному предмету:



Недавно и осторожно, поскольку я знал об этих ограничениях, я с нетерпением начал создавать своих собственных чат-ботов на базе GPT-3. Сначала путем исправления некоторых библиотек PHP и написания соответствующего кода JavaScript, а в последнее время — исключительно на JavaScript:



Работая над этим последним проектом, то есть вызывая GPT-3 из чистого JavaScript, я изучил больше ссылок OpenAI на API GPT-3 и обнаружил, что можно очень легко получить ряд оценок, связанных с каждым токеном, созданным языковой моделью. Оказывается, эти оценки на самом деле представляют собой вероятности в логарифмической форме, доставляемые токеном GPT-3 за токеном вместе с текстовым предсказанием. Эти вероятности измеряют «вероятность» различных токенов, произведенных GPT-3. Хотя эти вероятности потенциально могут содержать информацию о том, насколько GPT-3 уверен в производимом контенте, это не дано. Поэтому я решил изучить это здесь на практике с помощью серии новых приложений JavaScript, на которые вы можете опираться.

В частности, здесь я рассмотрю, как получить эти вероятности маркеров и какие значения они принимают для текстов, которые, как мне известно, являются правильными или неправильными. Я также исследую влияние обучения за несколько попыток на эти оценки, чтобы узнать, действительно ли оно делает GPT-3 более уверенным в своих ответах или нет.

GPT-3 и вероятности журнала токенов

Если вы читаете это, GPT-3 не нуждается в представлении. Но на всякий случай достаточно сказать, что GPT-3 означает Generative Pre-trained Transformer (теперь в версии 3, но фактически состоящий из разных моделей, каждая в разных версиях) и что это современная языковая модель, которая генерирует письменный контент с учетом входных данных.

Когда вы вводите какой-либо текст в GPT-3 (называемый «подсказкой»), он разбивается на так называемые токены, которые представляют собой единицы переменного размера, начиная от отдельных букв и заканчивая слогами и даже словами (в зависимости от различных вещей). Токены распространяются по сети, в результате чего синтезируются новые токены, которые вместе образуют новые слова, предложения и абзацы. Эти тексты обычно имеют смысл и неплохую грамматику, если только вы не имеете дело с экзотическим языком, с которым GPT-3 не знаком при обучении. Однако они не обязательно точны по своему содержанию, особенно если вы ожидаете, что она «подумает» о проблеме или установит связи между понятиями, или если вы спросите о вещах, которые модель не видела во время обучения (например, она не будет я не знаю, кто я, так что, вероятно, что-то придумаю, см. пример позже).

Одной из важных особенностей GPT-3 и других больших языковых моделей является то, что они являются «небольшими учениками», что означает, что они могут обрабатывать и «понимать» некоторую информацию, переданную в подсказке, а затем могут отвечать на вопрос или выполнять задачу на основе на этой информации. В arXiv есть целый препринт, объясняющий это; и у меня есть несколько примеров проектов, в которых я использую эту функцию:





Теперь особенность GPT-3, которую я здесь затрагиваю (и которая мало обсуждается в Интернете, несмотря на ее огромную важность), заключается в том, что помимо возврата текста, GPT-3 может возвращать вероятность, связанную с каждым токеном, который составляет созданный текст. Эти вероятности, фактически возвращенные в логарифмической форме, измеряют вероятность появления каждого токена в контексте выходного текста. Более низкие логарифмические вероятности указывают на менее вероятные слова, а более высокие логарифмические вероятности указывают на более вероятные слова.

По словам самого ChatGPT, GPT-3 использует эти логарифмические вероятности для создания связного и грамматически правильного текста; кроме того, он использует логарифм вероятностей для генерации следующего слова на основе наиболее вероятного слова, которое может появиться следующим, что позволяет генерировать контекстуально точный текст. Здесь я исследую, содержит ли это также информацию о точности содержания. Спойлер: да, хоть немного; и, кроме того, обучение за несколько попыток не только улучшает сами ответы, но и улучшает логарифмические вероятности.

Получение вероятностей журнала при вызове API GPT-3

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

Вероятности журнала токенов в принципе могут помочь обнаружить неверную информацию; но как мы их получим?

Вот небольшая модификация кода, который я недавно представил для вызова API GPT-3 полностью из JavaScript, с поправками, чтобы также получить вероятности журнала токенов:

// Your OpenAI API key
const apiKey = “(your API key here)”;

fetch(
 `https://api.openai.com/v1/completions`,
 {
 body: JSON.stringify({
  “model”: “text-davinci-003”,
  “prompt”: “Where is Luciano Abriata from?”,
  “temperature”: 0,
  “max_tokens”: 20,
  “logprobs”: 1}),         //Note we request for logprobs
 method: “POST”,
 headers: {
 “content-type”: “application/json”,
 Authorization: “Bearer ” + apiKey,
 },
 }
 ).then((response) => {
 if (response.ok) {
 response.json().then((json) => {
 console.log(json);
 });
 }
 });

Вызов fetch() включает в себя все, что необходимо для вызова GPT-3 и получения текстов и вероятностей токенов. И подсказка включает информацию для быстрого обучения, помещенную перед вопросом «Откуда Лучано Абриата?»

Тестирование вероятностей токенов в разных сценариях

Давайте посмотрим, что произойдет, если мы вызовем вышеуказанную функцию с подсказкой, которая включает только вопрос «Откуда Лучано Абриата?», то есть без какой-либо вспомогательной информации, объясняющей, что я из Аргентины.

Мы ожидаем, что GPT-3 не будет знать, откуда я, так как я не знаменитость. И действительно, это «выдумывает», что я из Италии:

(Забавный факт: это не так уж и много, потому что все мои предки были итальянцами… здесь GPT-3, вероятно, сделал предположение, основываясь на моем имени… но нет, я родился и вырос в Аргентине.)

Итак, что мы видим в логе консоли? Много интересных выводов, кроме самого выводимого текста. Разберем самые важные элементы:

Во-первых, вы видите объект text, который включает вывод: Лучано Абриата из Италии.

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

Вы можете видеть, что token_logprobs достигает минимального значения -0,49 для токена 9, «Италия», в то время как все остальные токены очень близки к 0 (кроме тех, которые в конце тоже отрицательные, но мы этого не делаем). меня не волнуют эти закрывающие токены).

В принципе, это хорошая новость, потому что это означает, что GPT-3 дает ключ к пониманию того, что эта часть информации может быть неправильной или «выдуманной». Однако не будем спешить делать какие-либо выводы и продолжим изучение этого вопроса.

Что, если мы предоставим некоторую информацию в подсказке, а затем спросим об этом? Что-то вроде этого:

Лучано Абриата — ученый, родившийся в Аргентине, сейчас работающий в Швейцарии. Он занимается структурной биологией, виртуальной реальностью, ЯМР, научным письмом, программированием и т. д. Откуда родом Лучано Абриата?

// Your OpenAI API key
const apiKey = “(your API key here)”;

fetch(
 `https://api.openai.com/v1/completions`,
 {
 body: JSON.stringify({
  “model”: “text-davinci-003”,
  “prompt”: “Luciano Abriata is a scientist from Argentina, now working
             in Switzerland. He works on structural biology, virtual
             reality for chemistry, NMR, etc.
             Where is Luciano Abriata from?”,
  “temperature”: 0,
  “max_tokens”: 20,
  “logprobs”: 1}),         //Note we request for logprobs
 method: “POST”,
 headers: {
 “content-type”: “application/json”,
 Authorization: “Bearer ” + apiKey,
 },
 }
 ).then((response) => {
 if (response.ok) {
 response.json().then((json) => {
 console.log(json);
 });
 }
 });

В данном случае GPT-3 не только правильно отвечает, говоря, что я из Аргентины, но и говорит об этом уверенно: «Аргентина», опять же в токене 9, имеет логарифмическую вероятность, очень близкую к 0:

Более тщательные тесты с представлением вероятностей токенов в виде цветов в созданном тексте.

Чтобы проверить возможности логарифмических вероятностей в пометке потенциально неверной информации, я написал это простое веб-приложение (ссылка ближе к концу), которое обрабатывает приглашение с помощью GPT-3 и отображает полученный текст, окрашенный для каждого токена в соответствии с его логарифмической вероятностью:

В этом приложении, которое вы можете попробовать по ссылке, которую я привожу ниже, цветовые ключи для каждого токена вводятся через HTML-тег ‹font› следующим образом:

  • журнал проб. › -0,1 → зеленый
  • -0,3 › логарифм вероят. › -0,1 → желтый
  • -0,5 › логарифм вероят. › -0,3 → оранжевый
  • журнал проб. ‹ -0,5 → красный

Давайте немного проанализируем это: вопрос о человеке, которого я выдумал, и о котором GPT-3 вместо того, чтобы сказать, что не знает, отвечает, хотя температура 0, поэтому не ожидается, что он выдумывает… Понятно, что нельзя полагаться на параметр температуры как на способ предотвращения генерации ложной информации.

Теперь обратите внимание, что из 4 наиболее важных черт, придуманных для этого вымышленного персонажа (он итальянец, философ и профессор философии, и Ла Сапиенца из Римского университета), некоторые из них сильно помечены:

«Философ и профессор философии» в среднем имеет логарифмическую вероятность около -1, а «Рим Ла» около -1,5.

Между тем, «Сапиенца», вероятно, останется незамеченной, т.е. с высокой логарифмической вероятностью, потому что является идеальным продолжением «Университета Рима Ла». Точно так же «итальянец», вероятно, остается высоким, потому что оно идет вскоре после «Джулио», которое является очень итальянским именем.

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

Кажется, что низкая логарифмическая вероятность указывает на потенциально неточную информацию, но высокое значение не гарантирует фактической точности.

Давайте теперь попробуем заменить «Джулио» на «Джона», то есть спросить «Кто такой Джон Каранчани?»:

На этот раз он придумал, что персонаж итало-американец, и пометил эту информацию довольно плохой оценкой.

Еще один тест с использованием типично французского имени «Филипп»:

Теперь это означает, что персонаж французский, и помечает это оранжевым цветом.

Давайте теперь спросим о другом: о химии. Какова молекулярная формула уксусной кислоты?

Мы получаем правильный ответ, и все в зеленом цвете указывает на очень хорошие результаты.

Что, если мы составим молекулу? Бизарриновая кислота, например:

Похоже, он «понимает», что выдумывает вещи. Конечно, мы бы предпочли, чтобы GPT-3 ответил «Я не знаю» или «Бизарриновая кислота не существует». Но очень плохой результат лучше, чем ничего.

Эффект передачи информации для обучения за несколько выстрелов

Как обсуждалось ранее и в многочисленных статьях повсюду, GPT-3 может извлекать информацию из фрагментов текста, переданных для обучения за несколько выстрелов, и, таким образом, более точно отвечать на вопросы — по крайней мере, в соответствии с переданной информацией.

Как это отражается на вероятностях жетонов?

Давайте посмотрим пример. Я придумал человека по имени Стефан Фаркони и хочу знать, откуда он и чем занимается:

Как и ожидалось, все было выдумано и отмечено плохими оценками.

Теперь давайте дадим GPT-3 некоторую информацию об этом человеке и спросим еще раз:

Теперь ответ фактически согласуется с переданной информацией, и GPT-3 помечает часть его («Греция») как достоверную. Однако насчет «ученого-компьютерщика» не уверен. Обратите внимание, что «ученый» является хорошим продолжением слова «компьютер», поэтому в моей интерпретации GPT-3 на самом деле «не уверен» в концепции «ученый-компьютерщик» в целом.

Хотите попробовать это приложение?

Вот:

https://lucianoabriata.altervista.org/tests/gpt-3/js-only/GPT3-JSonly-logprobs-color.html

Просто вставьте свой ключ API OpenAI для GPT-3, введите вопрос или подсказку и нажмите «Отправить боту».

Пожалуйста, поделитесь своими результатами в комментариях! Отражали ли вероятности токенов фактическую точность полученного текста?

Заключение

Использование GPT-3 и подобных языковых моделей в приложениях для чат-ботов может представлять серьезную проблему с точки зрения получения точной и надежной информации. Хотя мы надеемся, что новые методы улучшат достоверность, на данный момент можно использовать вероятности токенов для измерения «уверенности», которую GPT-3 имеет для каждого токена, составляющего его вывод. Я показал вам, что с помощью этой информации можно приблизительно приблизиться к уровню уверенности GPT-3 в сгенерированном тексте, но это не совсем безопасно.

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

Я также показал вам, что обучение за несколько попыток помогает повысить не только точность ответов, особенно для вопросов, о которых GPT-3 не «знает», но и их надежность, измеряемую вероятностями токенов. Однако и здесь мы видим, что предоставление информации посредством обучения за несколько попыток не гарантирует высоких оценок в ответах, даже если информация в этих ответах верна.

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

www.lucianoabriata.com Пишу и снимаю обо всем, что лежит в сфере моих широких интересов: природа, наука, технологии, программирование и т. д. Стать участником Medium , чтобы получить доступ ко всем его историям (партнерские ссылки платформы, за которые я получаю небольшой доход бесплатно для вас) и подписаться, чтобы получать мои новые истории по электронной почте. Чтобы проконсультироваться по поводу небольших вакансий, посетите мою страницу услуг здесь. Вы можете связаться со мной здесь.