Хочу описать процесс создания приложения, которое работает с OpenAI API. Идея приложения возникла из потребности улучшить мой английский язык. Как говорится, если у вас есть молоток, то все проблемы выглядят как гвозди. Так как я программист, я решил написать Искусственный Интеллект, который будет заменять учителя английского языка.
Сценарий взаимодействия с приложением следующий: ученик задает тему урока, ИИ-учитель предоставляет список основных слов по теме. Ученик может спрашивать значение слов, которые ему не знакомы, ИИ-учитель предоставляет значения слов и примеры их использования. Затем ИИ-учитель вступает в диалог с учеником по заданной теме, ученик может отвечать на вопросы и задавать свои вопросы. ИИ-учитель также находит ошибки в ответах ученика.
Изначально я думал о создании полноценного веб-сервиса, на котором любой желающий сможет зарегистрироваться, привязать свою карту и начать обучение с ИИ-учителем. Однако в итоге, я решил начать с прототипа: консольного приложения на Rust, с которым можно будет вести диалог из терминала. Но потом я немного остыл от этой идеи, так как реализация полноценного сервиса требует открытия юридического лица, заключения договора с банком для обработки карт клиентов, аренды облака для сервера, разработки веб-версии ИИ-учителя и инвестиций в рекламную кампанию.
Я, конечно, могу выполнить все эти задачи, но создание такого сервиса будет достаточно долгим и необходимы значительные инвестиции. А сделать это на коленке и потерять свое время, и не иметь возможности составить конкуренцию с аналогичными стартапами из США, которые имеют достаточные средства на рекламу и развитие, неинтересно.
Вернемся к тонкостям реализации данного приложения. Для того чтобы получить список основных слов по теме, нужно выполнять запрос "completions" к OpenAI API. Этот запрос возвращает логическое завершение текста, который вы ему передадите, например, список основных слов по теме урока.
В итоге, методом проб и ошибок у меня получился запрос, который посылает программа, он выглядит следующим образом:
Give list of words linked with the subject "_TOPIC_". Words should comma separated. Only words
.
Где _TOPIC_ - тема урока с ИИ-учителем. Результатом работы этого запроса будет список слов, разделенных запятой, по нужной вам теме.
Далее по логике приложения необходимо было дать объяснение словам, которые не знает ученик. Получился следующий запрос:
Give answer what is "_WORD_" from the field "_TOPIC_".
Где _WORD_ - слово, которое требует объяснения, _TOPIC_ - тема урока. В ответ вы получите 1-2 предложения, объясняющие данное слово.
Для наглядности, необходимо сгенерировать примеры использования данного слова. У меня получились следующие два запроса:
Give sentence with word "_WORD_" in field "_TOPIC_".
Give rude sentence with word "_WORD_" in field "_TOPIC_".
На каждый из них я получил два разных предложения, в которых демонстрируется использование слова. Первое - общего характера, второе - немного с агрессией, для разнообразия, так сказать.
Далее приложение должно вступить в диалог с учащимся. Один из самых простых способов - это использовать список слов по теме урока и задать вопрос, используя его. У меня получился следующий запрос к OpenAI API:
Give _QUESTION_TYPE_. About "_TOPIC_". Use word "_WORD_". Do not use word "_TOPIC_".
Где _QUESTION_TYPE_ - тип вопроса, который выбирается случайным образом из списка:
Yes/No question
Wh-question
Choice question
Open-ended question
Hypothetical question
Leading question
Rhetorical question
Funnel question
Probing question
Clarifying question
Follow-up question
Forced-choice question
Matching question
Categorical question
Comparison question
Rude question
Polite question
Что позволяет генерировать всегда разные вопросы даже при многократном прохождении урока по одной и той же теме.
При том в этом запросе я добавил в конец "Do not use word "_TOPIC_", чтобы в каждом вопросе от учителя не было слова с упоминанием темы урока, а то все предложения будут одинаковыми. И выглядит это очень не естественно.
Далее стоит задача определить, есть ли ошибки в ответе ученика. Для этого у OpenAI API есть запрос "edits". Он позволяет взять кусок текста и изменить в него. Там два параметра: исходный текст и то, что с ним надо сделать. В итоге, я, вызывая эту функцию, передавал текст ответа ученика и следующую строку:
Fix grammar and spelling.
На выходе я получал строку с исправленным текстом. Если она не совпадала с тем что писал ученик, то я считал, что он ошибся, и выводил исправленный вариант.
В случае, когда ученик игнорирует вопрос ИИ-учителя и пишет в ответ свой вопрос, или отвечая на него, добавляет еще и свой, то я через OpenAI API "completions" генерирую ему ответ такой строкой:
Give _SENTENCE_TYPE_ answer on text: _STUDENT_QUESTION_.
Где _STUDENT_QUESTION_ - текст с вопросом учащегося, а _SENTENCE_TYPE_ - тип утвердительного предложения который выбирается случайным образом из следующего списка:
Declarative
Imperative
Assertive
Optative
Exhortative
Descriptive
Expository
Complex
Polite
Rude
Таким образом, даже на одни и те же вопросы ИИ-учитель всегда дает разный ответ, что вносит разнообразие во время общения.
Код консольной программы ИИ-учителя можно посмотреть здесь. Код библиотеки работающей с OpenAI API можно посмотреть здесь.
Ну и наконец, пример взаимодействия с этой программой, которая заменяет учителя английского языка:
Please enter a topic of the lesson:
hotel
Words of lesson:
Lodging
Accommodation
Suite
Room
Reception
Concierge
Check-in
Check-out
Amenities
Restaurant
Bar
Pool
Spa
Gym
Valet
Bellhop
Do you know all these words? Say: Yes or write unknown words comma separated:
bellhop, valet
Bellhop
A bellhop is a hotel employee who assists guests with their luggage and other needs. They are usually the first person a guest sees when they arrive at the hotel. Example 1: The bellhop carried our luggage to our room in the hotel. Example 2: "Hey bellhop, why are you so slow? Hurry up and get my bags to my room!"
Valet
Valet is a service offered by some hotels where a guest can have their car parked and retrieved by a hotel employee. Example 1: The hotel valet was very helpful in parking our car. Example 2: "If you can't do your job as a valet in this hotel, then you should find another job."
What type of establishment typically offers a variety of food and beverages for customers to enjoy?
I think it is restraunt.
I think it is restaurant. < grammar fixes
What is the process for check-in at a lodging establishment?
You need show a passport and student card. Is it correct?
You need to show a passport and student card. Is it correct? < grammar fixes
Yes, it is correct that you need to show a passport and student card in order to prove your identity and student status. Depending on the situation, you may need to provide additional documents such as a birth certificate or proof of address.
What kind of lodging would you prefer?
I prefer room with toulet and shower. If I visit hotel with wife then I prefer one big bad for two.
I prefer room with toilet and shower. If I visit hotel with wife then I prefer one big bad for two. < grammar fixes
What is the average wait time at the reception desk?
Usually it could take not more 5 minutes.
Usually it could take not more than 5 minutes. < grammar fixes
What services does a concierge provide?
You could ask a concierge call you at 7:00 am to wake you tommorow.
You could ask a concierge to call you at 7:00 am to wake you tomorrow. < grammar fixes
What kind of accommodation can you find when you travel?
When I travel I usualy take apartmant in hotel.
When I travel I usually take an apartment in a hotel. < grammar fixes
Do you have a swimming pool at your accommodation?
No We do not have swimming pool at the hotel.
No, we do not have a swimming pool at the hotel. < grammar fixes