Пошаговое руководство по созданию AI-чата GPT-3

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

Кроме того, для общего обзора пространства генеративного ИИ и возможностей в нем загляните в эту ветку в Твиттере.

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



Обзор

Само приложение будет использовать OpenAI GPT-3, а интерфейс будет представлять собой простое приложение для чата в React. GPT-3 — это инструмент искусственного интеллекта, который отправляет завершения на заданный текст.

Мы собираемся разработать подсказку, которую мы отправим в GPT-3. Мы включим характеристики чат-приложения и любое поведение, которое мы хотим поощрять. Мы будем прототипировать с помощью ChatGPT. Затем мы добавим подсказку и вызов API GPT-3 в приложение чата React.

Шаг 1: Все сводится к быстрому дизайну

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

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



Взгляните на Руководство по быстрому дизайну OpenAI. Короче говоря, рекомендации заключаются в том, чтобы показывать И рассказывать, предоставлять качественные данные и проверять настройки модели.

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

Итак, опишите, что вы хотите, чтобы GPT-3 делал, а также приведите несколько примеров. Конкретно для подсказок разговора — предложения OpenAI заключаются в том, чтобы описать, на что похожи ответы в чате, а также дать API идентификатор. Взгляните на примеры в подсказке OpenAI, чтобы начать чувствовать себя (примеры помогают в обучении как для GPT-3, так и для людей 😛).

Вы также можете думать об этом как об игре в шарады, как описано в «Руководстве для начинающих по GPT-3»:

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

Это немного искусство, и, к счастью, есть отличные способы прототипирования. Перейдите на chatGPT и введите свое приглашение. Посмотрите, как GPT отвечает, и настройте.

В примере с благодарностью я бы хотел, чтобы приложение поощряло меня чувствовать благодарность. Если мне трудно что-то придумать, это может мне помочь. В ведении дневника практика благодарности является обычным явлением. Каково было бы сделать его интерактивным? Чтобы получить помощь в этом, если это необходимо?

Я включаю в подсказку результаты, которые я хотел бы получить от приложения, а также несколько примеров поведения. Я делюсь некоторыми конкретными ответами, но на самом деле я не делюсь примером разговора. Это то, что я мог бы включить, если бы почувствовал, что GPT не улавливает то, что я ищу.

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

Это работает лучше, но на самом деле это не спрашивало меня о моей собственной благодарности.

Это работало намного лучше. У меня было несколько разговоров в ChatGPT с этой подсказкой, и они оказались полезными. Теперь я прошу еще несколько способов начать разговор — мы будем использовать это в нашем приложении позже. Вместо вызова API OpenAI каждый раз, когда я обновляю приложение, я буду использовать один из этих ответов. Я делаю это, чтобы быть более эффективным с вызовами API.

Теперь перейдите к Примеру чата на игровой площадке OpenAI. Отбросьте подсказку, с которой вы работали, и посмотрите, как она себя чувствует. Возможно, вам придется внести некоторые коррективы. В предыдущем проекте приложения для чата я перешел от второго лица вы, описывая приложение, к третьему лицу, описывая, например, помощника ИИ. На самом деле мне не нужно было делать это здесь, основываясь на ответе.

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

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

Шаг 2. Настройте приложение

Я создал приложение на основе примера openai-quickstart-node, поэтому полезно иметь представление о javascript и некоторое знакомство с React. Кроме того, я сам только изучаю React.

Клонируйте репозиторий сюда и установите его, следуя инструкциям в файле readme. Настройте учетную запись OpenAI и получите ключ API. Сделайте копию .env-example и добавьте сюда свой ключ API. Держите ключ API в секрете.

Шаг 3: Сделайте его своим

Сейчас мы все сложим. Нам нужно запустить сервер, чтобы сохранить ключ API закрытым. Возьмите созданную ранее подсказку и поместите ее в файл generate.js.

const pre_prompt = `
You support me in identifying gratitude in my life. 
You share examples of gratitude, and you also share reasons why recognizing gratitude 
can improve one's wellbeing. You help me find gratitude. Your language is simple, clear, 
and you are enthusiastic, compassionate, and caring. 
An example of this is "I'm curious, what do you feel grateful for today?" 
or "I'd love to know what you feel thankful for." 
or "Is there anything that comes to mind today that filled you with gratitude?" 
Your presence fills me with calm. You're jovial. 
Limit the questions in each message and don't be too repetitive. 
Gently introduce the idea of gratitude in our conversation.

Start with a quick greeting, and succinctly give me an example thing i can be thankful for. 
Share this example gratitude in the first person. 
Here is an example of how to start the conversation: 
"Hi! I'm glad we can talk today. One thing I've been grateful for lately is the sound of the wind in the trees. It's beautiful."
`;

Я выделю несколько ключевых частей приложения. Наблюдать за тем, как моделируется память, довольно увлекательно. Я называю это pre_prompt, потому что приглашение обновляется для каждого вызова API. На самом деле GPT-3 не имеет памяти, и каждый вызов независим друг от друга. Чтобы имитировать наличие памяти в конво, весь конво включается в подсказку до этого момента. Таким образом, когда API ответит на ваше последнее сообщение, он будет иметь доступ ко всей беседе и будет использовать этот контекст. Вы можете увидеть это в действии в Примере чата OpenAI Playground. Итак, мы начнем с pre_prompt, а затем включим весь convo.

function generatePrompt(chat) {
  let messages = "";
  chat.map((message) => {
    const m = message.name + ": " + message.message + "\n";
    messages += m;
  });

  const prompt = pre_prompt + messages + "AI:";

  return prompt;
}

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

      const completion = await openai.createCompletion({
        model: "text-davinci-003",
        prompt: generatePrompt(chat),
        temperature: 0.9,
        max_tokens: 250,
        presence_penalty: 0.6,
        stop: ["AI:", "Me:"],
      });
      res.status(200).json({ result: completion.data.choices[0].text });

Сторона клиента

Добавьте несколько созданных ранее приветствий.

function getGreeting() {
    const greetings = [
      "Hi there! How's your day going? I've been feeling particularly grateful for the delicious meals I've been able to enjoy lately. How about you?",
      "Good morning! I hope you're having a great start to your day. I'm feeling grateful for the beautiful nature around me, it always helps me to feel at peace. What are you thankful for today?",
      "Hello! I'm grateful for the laughter and joy that my loved ones bring me. What are you grateful for today?",
      "Hey, How's it going? Today, I'm grateful for the simple things in life like a warm bed and a good book. What are you grateful for today?",
      "Hi, how are you? I'm feeling grateful for the memories I've made with friends and family. Is there anything you're grateful for today?",
    ];
    const index = Math.floor(greetings.length * Math.random());
    return greetings[index];
  }

Когда мы вызываем generate.js, мы будем отправлять все наши сообщения, включая самое последнее.

const response = await fetch("/api/generate", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          chat: [...messages, { name: "Me", message: sentInput }],
        }),
      });

Мы обновим messages на основе ответа, который получим от API.

const data = await response.json();
      if (response.status !== 200) {
        throw (
          data.error ||
          new Error(`Request failed with status ${response.status}`)
        );
      }

      setMessages((prevMessages) => {
        const newMessages = [
          ...prevMessages,
          { name: "AI", message: data.result },
        ];
        return newMessages;
      });

Запустите приложение и внесите любые изменения, которые вам нравятся. Переименуйте приложение в соответствии с индивидуальностью чата, которую вы создаете, и обновите стили. Сделай сам 🙌.

Шаг 4: Разверните

Поскольку это построено с использованием Next.js, мы можем использовать Vercel для развертывания. Это довольно плавный процесс. Теперь вы можете поделиться своим приложением с друзьями и получить обратную связь. Обратите внимание, что с вас будет взиматься плата в зависимости от использования API OpenAI, поэтому следите за использованием.

Лично я, когда начал, сделал небольшой релиз, чтобы получить обратную связь. Я думаю о том, как лучше всего управлять затратами, прежде чем выпускать более широко. Мне нравится идея сделать меньший выпуск для платных пользователей, что компенсирует затраты на API. Мне определенно любопытны какие-либо убедительные подходы для этого.

Если вы построите что-то с этим, я хотел бы проверить это.

Уууу!!

Спасибо за чтение! Если вы занимаетесь созданием приложений для генеративного ИИ, я бы хотел поговорить! Я whatlight в твиттере. Не стесняйтесь присылать любые вдохновляющие ресурсы и проекты туда или в комментарии.