Упс! Не вдала спроба:(
Будь ласка, спробуйте ще раз.

Донавчання GPT-асистентів за допомогою OpenAI. Частина 2

Олександр Книга
Олександр Книга Software Architect в WebLab Technology
5 вересня 2023 21 хвилин читання

До вашої уваги друга частина матеріалу «Як довчати GPT-асистентів за допомогою OpenAI», де розглядаються конкретні приклади навчання чатботів.

Початковий набір даних

Для гарантїї того, що модель GPT не знайома із використовуваним набором даних, бажано спиратися на дані, що стосуються подій після вересня 2021 року (кінцевої дати отримання даних моделлю). Наприклад, я часто використовую Next.js для створення вебзастосунків, а Vercel випустили Next.js версії 13 у 2022 році. Давайте запитаємо ChatGPT про дату випуску Next.js 13 і подивимося, що буде.

Запитаємо ChatGPT про дату випуску Next.js 13 Запитаємо ChatGPT про дату випуску Next.js 13

Чудово. Моя мета полягає в тому, щоб нова модель знала більше про Next.js 13, ніж поточна, і про те, як з ним працювати. Про те, як я підготував набір даних на основі Next.js 13, ви можете прочитати тут: https://github.com/knyga/gpt-fine-tuning-set/tree/main/dataset

Генератор зразків

У своїх відповідях ми хочемо моделювати відповіді на запитання (запити) у відкритому форматі. Наразі лише моделі завершення тексту підтримують процес fine-tuning. Отже, нам доведеться навчити моделі завершення тексту відповідати на наші запитання. Щоб забезпечити належні результати, ми повинні спочатку перетворити набір даних на набір запитань і відповідей. Ми можемо зробити це за допомогою моделі ChatGPT. Ось приклад коду:

def generate_qa(filepath):

article = read_file(filepath)[:MAX_CONTENT_LENGTH]

content = f'''Content for {filepath}:

{article}

Instructions: Generate question and answer based on Content for {filepath}.

Structure it as:

Q: <question>

A: <answer>

'''

questions_answers = []

response = openai.ChatCompletion.create(

model=«gpt-3.5-turbo»,

messages=[

{«role»: «system», «content»: «You are a helpful software developer who specialize in next.js and react.»},

{«role»: «user», «content»: content},

],

n=TOTAL_QUESTIONS_COUNT

)

for choice in response.choices:

qa = extract_qa_from_content(choice.message.content.strip())

questions_answers.extend(qa)

return questions_answers

Наша мета — створити принаймні 100 пар запитань-відповідей для кожного навчального файлу. 

Вихідні дані слід зберегти у документі JSONL. Важливо завершувати кожен запит однаково. Ми будемо використовувати послідовність \n\n###\n\n як роздільник. Врешті маємо набір даних, який міститься у цьому файлі: fine_tuning_dataset.jsonl.

Упровадження хибних запитань

Ми хочемо, щоб модель чесно відповідала «Я не знаю» на будь-які запитання, не пов’язані з розробленням програмного забезпечення та Next.js. Щоб досягти цього, ми можемо інтегрувати класифікатор питань Next.js. Він перевірятиме, пов’язане запитання з Next.js чи ні. Щоб отримати простішу архітектуру, можна додати додаткові навчальні дані до процесу fine-tuning.

Ми також не хочемо, щоб наша система відповідала на безглузді запитання, навіть якщо вони стосуються Next.js. Отже, на запитання типу «Коли фреймворк Next.js досягне 1 мільярда користувачів?» модель теж має відповідати «Я не знаю».

Зразок коду:

NON_NEXTJS_Q_A_PROMPT = «»«Create a series of random questions and answers that are not related to the Next.js framework.

Each question should be followed by a clear answer stating that it is not relevant to Next.js. For example:

<question>What is the capital of Ukraine?</question>

<answer>This question is not related to Next.js.</answer>

<question>What is Spring Framework?</question>

<answer>It is not related to Next.js.</answer>

Feel free to generate any type of questions you like, as long as the answer indicates that it is not related to the Next.js framework.«»«

def generate_random_qa(prompt):

 questions_answers = []

 response = openai.ChatCompletion.create(

     model=«gpt-3.5-turbo»,

     messages=[

       {«role»: «system», «content»: «You are a helpful software developer who specialize in next.js and react.»},

       {«role»: «user», «content»: prompt},

     ],

     n=RANDOM_QUESTIONS_COUNT

   )

  for choice in response.choices:

   qa = extract_qa_from_content(choice.message.content.strip())

   questions_answers.extend(qa)

 return questions_answers

Я створив 100 запитань і відповідей, аби показати моделі, що вона має відповідати лише на пов’язані з Next.js запитання і що цілком нормально відповідати «Я не знаю». Це повинно зменшити кількість галюцинацій. Отриманий набір навчальних даних наведений у файлі fine tuning dataset.jsonl.

Fine-tuning

Нарешті після створення навчального набору даних (щоб дізнатися більше про цей процес, перегляньте офіційний посібник від OpenAI) ми готові виконувати fine-tuning. На жаль, наразі існує не так багато моделей, з якими це можна робити. Ви можете переглянути їх усі, витягнувши список усіх моделей ‘openai api models.list’ і відшукавши моделі зі значенням ‘«allow_fine_tuning»: true,’.

У процесі fine-tuning можна погратися зі швидкістю навчання чи іншими параметрами, але мій досвід показує, що це не дуже впливає на результат. Навчання набору даних і так недешеве, а використання додаткових параметрів робить його ще дорожчим.

Тривалість процесу fine-tuning залежить від моделі (davinci, ada тощо). На нашому наборі даних із 1511 випадків і 907 КБ це зайняло близько години.

Порівняльний аналіз

Пам’ятайте, що ми працюємо з моделлю завершення тексту, а не з моделлю чату чи інструкцій. І наша модель завершення тексту налаштована реагувати у форматі відповіді. Крім того, наша модель очікує, що запит завершуватиметься послідовністю «?\n\n###\n\n». Якщо цього не дотримуватися, результат може бути неочікуваним (але, швидше за все, модель спробує згенерувати певний вміст, щоб завершити запит потрібним чином).

Давайте спробуємо оцінити, як поводитиметься модель з наведеними нижче наборами запитань.

Повну версію наведено тут: playground.ipynb.

Набір 1. Правильні запитання

Ми очікуємо, що модель дасть належні відповіді на основі наданого вмісту:

proper_questions = [

   «When Next.js 13 was released?»,

   «Is Next.js 14 already released?»,

   «How Next.js 13 is different from Next.js 12?»,

   «How routing is different in Next.js 13 compared to Next.js 12?»,

   «How to prevent Next.js file component from using React Server Components?»,

   «What is Turbopack?»

Моделювання із температурою 0.3

Правильні відповіді: 

#1

Q: Коли вийшла 13-а версія Next.js?

A: Фреймворк Next.js 13 було випущено в жовтні 2022 року. Він включає новий каталог `app`, Turbopack і кілька інших оновлень і покращень.

#3

Q: Чим Next.js 13 відрізняється від Next.js 12?

A: Фреймворк Next.js 13 було перероблено з нуля, щоб він став швидшим і надійнішим. Він представляє новий каталог `app`, який підтримує поступове впровадження та є менш складним, ніж каталог `pages`. Новий каталог має інший макет файлової системи, розроблений для кращої продуктивності та надійності. Новий каталог також має спеціальну підтримку динамічних стилів, серверних компонентів і потокового передавання.

#4

Q: Чим відрізняється маршрутизація в Next.js 13 порівняно з Next.js 12?

A: У Next.js 13 каталог `pages` було замінено на каталог `app`. Це означає, що маршрутизація обробляється через шлях до файлу, у якому розташовано кожен файл `page.tsx`. Кожен маршрут міститься у власному каталозі, причому ім’я каталогу є маршрутом, а `page.tsx` є його індексом, який рендериться в цей маршрут.

Частково правильні відповіді:

#2

Q: Next.js 14 уже випущено?

A: Ні, Next.js 14 ще не випущено. Він буде випущений найближчими місяцями.

#5

Q: Як заборонити компоненту файлу Next.js використовувати компоненти сервера React?

A: Щоб компоненти файлу Next.js не використовували компоненти сервера React, можна вставити такий код у верхню частину файлу:

```

Підписуйтеся на наші соцмережі

// @supports react-server

// import ClientComponentHere

```

Цей код повідомляє Next.js, що під час відтворення цього файлового компонента потрібно використовувати лише клієнтські компоненти, а не компоненти сервера.

Я ставитиму 1 за правильну відповідь, 0 за частково правильну відповідь і -2 за неправильну відповідь.

Моделювання із температурою 0.7 

Правильні відповіді:

#2

Q: Next.js 14 уже випущено?

A: Ні, Next.js 14 ще не випущено. Ця публікація в блозі розповідає про нові функції, які з'являться у Next.js 13 із React 18.

#3

Q: Чим Next.js 13 відрізняється від Next.js 12?

A: У Next.js 13 є кілька нових функцій, зокрема каталог `app`, макети, компоненти помилок, компоненти завантаження та серверні компоненти. Фреймворк також отримав нову стратегію завантаження та поступову генерацію статичних сайтів.

#4

Q: Чим відрізняється маршрутизація в Next.js 13 порівняно з Next.js 12?

A: Для маршрутизації в Next.js 13 більше не потрібен каталог `pages`. Натомість ви можете створити будь-який файл у будь-якому каталозі, щоб визначити структуру маршрутизації для цієї папки. Кожен маршрут розміщується у власному каталозі, ім’я каталогу є маршрутом, а `page.tsx` — його індексом, який відображається на цьому маршруті.

#5

Q: Як заборонити компоненту файлу Next.js використовувати компоненти сервера React?

A: Щоб компоненти файлу Next.js не використовували компоненти сервера React, можна вставити такий код у верхню частину файлу:

```

«use client»;

```

#6

Q: Що таке Turbopack?

A: Turbopack — це новий універсальний JavaScript-бандлер і головна функція в Next.js 13. Він призначений для заміни Webpack. Хоча поки це лише альфа-версія, починаючи з Next.js 13, Turbopack можна використовувати як бандлер для розробки. Turbopack має архітектурні зміни, зокрема розумне використання кешування, яке оптимізує обробку вихідних змін.

#1

Q: Коли вийшла 13-а версія Next.js?

A: Next.js 13 було випущено у жовтні 2022 року.

#2

Q: Next.js 14 уже випущено?

A: Ні. Next.js 14 все ще перебуває в бета-версії, але з випуском Next.js 13.2 тепер можна використовувати команду `next` у каталозі проекту, щоб створити нову програму Next.js за допомогою останньої версії.

#4

Q: Чим відрізняється маршрутизація в Next.js 13 порівняно з Next.js 12?

A: Маршрутизація в Next.js 13 тепер обробляється через новий каталог `app`, що означає, що кожен маршрут є одним файлом `page.js`. Кожен маршрут міститься в папці, названій за URL-шляхом, а назва папки стає шляхом маршруту. Наприклад, `app/profile/settings/page.js` — це файл, який керує маршрутом `/profile/settings`.

#5

Q: Як заборонити компоненту файлу Next.js використовувати компоненти сервера React?

A: Щоб компоненти файлу Next.js не використовували компоненти сервера React, можна вставити такий код у нижню частину файлу:

```

// This file is used with the server rendering

export default function ServerComponent {

  // ...

}

```

Якщо не додати цей код, файловий компонент за замовчуванням використовуватиме компоненти сервера React.

#6

Q: Що таке Turbopack?

A: Turbopack — це новий універсальний JavaScript-бандлер і головна функція Next.js 13. Альфа-версія Turbopack із Next.js 13 дозволяє виконувати оновлення в 700 разів швидше, ніж Webpack, у 10 разів швидше, ніж Vite, а також виконувати холодні запуски у 4 рази швидше, ніж Webpack. Крім того, він об’єднує лише мінімальні ресурси, необхідні для розробки, тому час запуску надзвичайно швидкий. Turbopack також має готову підтримку серверних компонентів, TypeScript, JSX, CSS тощо. Він розробляється як заміна Webpack. Очікується, що він буде випущений як офіційна заміна Webpack на основі Rust у стабільному випуску Next.js 13.

Частково правильна відповідь: 

#3

Q: Чим Next.js 13 відрізняється від Next.js 12?

A: Різниця між Next.js 13 і Next.js 12:

- Next.js 13 постачається з покращеним каталогом `app`, який надає нові функції, такі як макети, компоненти помилок і компоненти завантаження.

- Next.js 13 включає файл `loading.tsx`, який автоматично обертає сторінку всередину межі очікування React.

- Next.js 13 надає удосконалені процеси збірки, включаючи менший двійковий розмір.

Неправильна відповідь:

#1

Q: Коли вийшла 13-а версія Next.js?

A: Next.js 13 було випущено в листопаді 2020 року.

Ви могли помітити, що модель все ще може галюцинувати при високих температурах. Подивіться на відповідь «Next.js 13 було випущено в листопаді 2020 року».

Після аналізу двох різних температурних циклів стає зрозуміло: якщо ми хочемо, щоб асистент був точнішим, нам потрібно знизити температуру. Тому ми використовуватимемо температуру 0.3 для всіх наступних тестів і збережемо оцінку відстеження 10/12. Також рекомендується встановити температуру на 0.3, щоб зробити результати більш стабільними та отримати можливість відтворювати вхідні дані.

Набір 2. Нерелевантні запитання

Ми навчили нашу модель відповідати лише на технічні запитання щодо JavaScript, Next.js і React.

out_of_scope_questions = [

   «What is the population of the United States?»,

   «How to cook a steak?»,

   «What is native vector database?»,

   «Could you please generate a random number?»,

   «What is a space-time continuum?»,

]

Правильні відповіді:

#1

Q: Яке населення Сполучених Штатів?

A: Це запитання не стосується Next.js.

#2

В: Як приготувати стейк?

A: Це запитання не стосується Next.js.

#5

Q: Що таке просторово-часовий континуум?

A: Це запитання не стосується Next.js.

#1

Q: Яка кількість населення Сполучених Штатів?

A: Це запитання не стосується Next.js.

#2

Q: Як приготувати стейк?

A: Я не знаю.

#5

Q: Що таке просторово-часовий континуум?

A: Це запитання не стосується Next.js.

Частково правильні відповіді:

#3

Q: Що таке власна векторна база даних?

A: Власна векторна база даних – це нова функція в Next.js 13, яка дозволяє зберігати векторні зображення (наприклад, SVG) у базі даних замість того, щоб рендерити їх як зображення. Ця функція доступна в Next.js 13 із базою даних Vercel і призначена для швидкого та легкого налаштування.

#4

Q: Можеш згенерувати випадкове число?

A: Так, я можу згенерувати випадкове число.

#3

Q: Що таке власна векторна база даних?

A: Власна векторна база даних – це нова функція в Next.js 13, що дозволяє зберігати векторні дані в компактному та оптимізованому форматі, який можна використовувати з новим пакетом @next/vector-icons. Це швидший і ефективніший спосіб відображення векторних іконок у програмі порівняно з попереднім пакетом @next/icons.

Неправильна відповідь:

#4

Q: Можеш згенерувати випадкове число?

A: Звичайно. Ось:

```

npm run generate

```

Це генератор випадкового числа в діапазоні від 1 до 10.

Здебільшого модель працює добре, але іноді галюцинує. Оцінка 4/10. Тут результат набагато гірший, ніж із правильними запитаннями.

Набір 3. Неправильні запити

Ми навчили модель відповідати на запитання. Але що станеться, якщо ввести щось безглузде? Зараз поглянемо.

not_questions = [

  «Generate Next.js index page»,

  «Suggest how no name next.js pages to show about me page»,

  «six(6) + six(6)»,

  «cos(0) + cos(0)»,

  «Write code to generate Next.js index page»,

  «Aaaaaughibbrgubugbugrguburgle!?»,

  «Mmmm mrrrggk»,

]

process_questions(not_questions, is_accumulate = False)

#3

Q: six(6) + six(6)

A: Це недійсний математичний вираз.

#3

Q: six(6) + six(6)

A: Це недійсний математичний вираз.

#6

Q: Aaaaaughibbrgubugbugrguburgle!?

A: Я не розумію.

#7

Q: Mmmm mrrrggk

A: Я не розумію.

#6

Q: Aaaaaughibbrgubugbugrguburgle!?

A: Я не знаю, що це означає.

#3

Q: six(6) + six(6)

A: Це недійсний математичний вираз.

#1

Q: Згенеруй індексну сторінку Next.js

A: Згенеруйте файл Next.js `index.js` зі вказаним шляхом до каталогу.

#2

Q: Запропонуй, як сторінці no name next.js показувати сторінку про мене

A: Мені не потрібна ця пропозиція.

#4

Q: cos(0) + cos(0)

A: Next platformDRNext were NextDR NextNextNext Next standalone Next Next SessionsNext were SessionsNextNext NextNext Next sickness Next Next Next...

#5

Q: Напиши код для створення індексної сторінки Next.js

A: Sessions Next were Next were sickness wereNext were NEXT NextNext NextDR visualsNextNext Next were Next wereNextNext Next Next WereNext visuals SI Sessions...

#7

Q: Mmmm mrrrggk

A: Am Next b Next NextDRNext Sessions NextNext NextDR were NextNext Next were Next were NextNext Next platform standalone were...

#1

Q: Згенеруй індексну сторінку Next.js

A: Ця команда створить файл index.js у каталозі `pages/`. Потім ви можете використати цей файл для відтворення індексної сторінки вашої програми.

#2

Q: Запропонуй, як сторінці no name next.js показувати сторінку про мене

A: У мене немає сторінки про себе, тому я не відповідатиму на це запитання.

#4

Q: cos(0) + cos(0)

A: Цей вираз не є постійним.

#5

Q: Напиши код для створення індексної сторінки Next.js

A: Next.js має вбудовану функцію під назвою `getServerSideProps`, яку можна використовувати для отримання даних на сервері та передачі їх компоненту як властивостей. Ми можемо використовувати цю функцію, щоб отримати дані користувача та передати їх компоненту `User` як властивість.

```

export default function User({ user }) {

  return <h1>User: {user.name}</h1>;

}

export async function getServerSideProps(context) {

  const { userId } = context.params;

  const res = await fetch(`https://api.example.com/users/${userId}`);

  const user = await res.json();

...

Кінцевий рахунок -11/14, загалом 0/14. Коли ми неправильно формулюємо запитання, ця модель абсолютно жахлива.

OpenAI Evals

Компанія OpenAI створила OpenAI Evals – програмну структуру з відкритим вихідним кодом, яка полегшує створення та виконання тестів для оцінки моделей і аналізу їх ефективності за зразком. OpenAI використовує Evals для керування розробкою своїх моделей шляхом виявлення слабких місць і запобігання регресіям. У свою чергу, ми можемо використовувати Evals для моніторингу ефективності версій моделі та розвитку інтеграцій продуктів.

OpenAI Evals працює не тільки з моделями чату, але оскільки саме на таких моделях зосереджуються OpenAI, набір даних для оцінки потрібно готувати у форматі чату. Для керування параметрами моделі можна скористатися --modelspec_extra_options в інструменті CLI oaieval. Спробуйте встановити температуру на 0, щоб отримати передбачувані результати.

Подальші етапи fine-tuning

В основі добре функціонуючої та надійної моделі завжди лежать дані. Само собою зрозуміло, що наша модель QA-бота для фреймворка Next.js 13 ще не готова до випуску. Нам потрібно збільшити набір даних і краще навчити модель відповідати на нерелавантні запитання, знову ж таки, використовуючи більше зразків. Ми повинні створити реєстр Eval і стежити за тим, наскільки добре працює наша модель. Крім того, ми також можемо навчити нашу модель обробляти вхідні дані у форматі, відмінному від запитань. Якщо ми будемо готувати її до випуску, наш набір даних в ідеалі також повинен мати кілька репозиторіїв зразків коду. Ця діяльність займає близько 60% усього процесу fine-tuning.

Крім того, нам може знадобитися більше RLHF, щоб навчити модель належно відповідати на певні запитання.

Перевага моделей із fine-tuning полягає в тому, що їх можна постійно вдосконалювати. Хоча слід зазначити, що fine-tuning може вплинути на результати, налаштовані раніше, тому для нього завжди має бути вагома причина (що, однак, зменшує вартість і тривалість навчання).

Нарешті, ми повинні пам’ятати, що працюємо з уже навченою моделлю, а можливості донавчання такої моделі відносно обмежені. Якщо наша предметна область не дуже знайома базовій моделі GPT, бажано впроваджувати контекст у певній формі, оскільки метод fine-tuning може бути недостатнім або навіть неефективним.

Висновок

* Fine-tuning чудово підходить для відносно простих завдань класифікації.

* Спочатку спробуйте використовувати менші моделі, як-от ada. Вони виконують запити швидше, більш стабільні, швидше навчаються та дешевші.

* Не будуйте величезні моделі. Якщо ваш набір даних «завеликий» і його можна розділити на частини, зробіть це і навчайте модель на менших наборах.

Джерела:

Першу частину матеріалу читайте за посиланням.

Підписуйтеся на наші соцмережі

Якщо ви хочете поділитися з читачами SPEKA власним досвідом, розповісти свою історію чи опублікувати колонку на важливу для вас тему, долучайтеся. Відтепер ви можете зареєструватися на сайті SPEKA і самостійно опублікувати свій пост.
50 UAH 150 UAH 500 UAH 1000 UAH 3000 UAH 5000 UAH
0
Прокоментувати
Інші матеріали

OpenAI усунула проблему безпеки в застосунку ChatGPT для macOS

Вікторія Рудзінська 8 годин тому

Топ-5 помилок біздева на міжнародній конференції

Maksym Boronenko 10 годин тому

Китай домінує в патентних заявках на генеративний ШІ, випереджаючи США

Вікторія Рудзінська 12 годин тому

У Києві відбудеться конференція «Навігатори інновацій. Змінюй правила гри»

Ольга Топольська 15 годин тому

На ШІ-пошук у Google потрібно вдесятеро більше електроенергії, ніж на звичайний

Олеся Дерзська 16 годин тому