В этом уроке мы узнаем, как создать проверку орфографии внутри облачной функции с помощью ChatGPT.
Большая языковая модель OpenAI ChapGPT — это гораздо больше, чем просто интерфейс чата. Это мощный инструмент для решения целого ряда задач, включая перевод, генерацию кода и, как мы увидим ниже, даже проверку орфографии. Благодаря своему REST API ChatGPT предоставляет простой и чрезвычайно эффективный способ добавить в проект возможности анализа и генерации языка искусственного интеллекта.
Облачная функция
Вот код облачной функции:
// Entry point for AWS Lambda. export async function spellcheck({ body }: { body: string }) { // Read the text from the request body. const { textToCheck } = <{ textToCheck: string }>JSON.parse(body); //... perform spellchecking // Return an HTTP OK response return { statusCode: 200, body: JSON.stringify(...) }; }
Эта функция Typescript будет обработчиком для AWS Lambda, принимая HTTP-запрос в качестве входных данных и возвращая HTTP-ответ. В приведенном выше примере мы деконструируем bodyполе из входящего HTTP-запроса, анализируем его в JSON и считываем свойство textToCheckиз тела запроса.
Пакет «Опенай»
Чтобы реализовать функцию проверки правописания, мы отправим textToCheckOpenAI и попросим модель ИИ исправить за нас любые орфографические ошибки. Чтобы упростить это, мы можем использовать пакет openai в NPM. Этот пакет поддерживается OpenAI как удобная оболочка Javascript/Typescript вокруг API REST OpenAI. Он включает в себя все необходимые нам типы Typescript и упрощает вызов ChatGPT.
Установите пакет openai следующим образом:
npm install --save openai
Затем мы можем импортировать и создать экземпляр класса OpenAIв нашем обработчике функции, передав наш ключ API OpenAI, который в этом примере хранится в переменной среды с именем OPENAI_KEY. (Вы можете найти свой ключ API в настройках пользователя после регистрации в OpenAI.)
// Import the OpenAI package import OpenAI from "openai"; export async function spellcheck({ body }: { body: string }) { const { textToCheck }: { textToCheck: string } = JSON.parse(body); // Create a new instance of OpenAI... const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY }); //... perform spellchecking return { statusCode: 200, body: JSON.stringify(...) }; }
Sample Text
Наконец, нам нужен образец текста с орфографическими ошибками, чтобы проверить его, и что может быть лучше, чем получить его, спросив сам ChatGPT!
Этот текст является хорошей проверкой нашей программы проверки орфографии, поскольку он содержит очевидные орфографические ошибки, такие как «сущность», а также некоторые более сложные грамматические ошибки, такие как «принцип » вместо «принцип ». Подобные ошибки проверят нашу проверку орфографии за пределами простого поиска слов, которых нет в словаре; Принцип и принцип являются допустимыми английскими словами, поэтому нашей программе проверки правописания потребуется использовать контекст, в котором они появляются, чтобы правильно обнаружить эту ошибку. Настоящее испытание!
Ввод текста, вывод текста
Самый простой способ найти орфографические ошибки во textToCheckвходных данных — создать приглашение, которое попросит ChatGPT выполнить проверку орфографии и вернуть нам исправленную версию. Позже в этом руководстве мы собираемся изучить гораздо более мощный способ получения дополнительных данных из API OpenAI, но на данный момент этот простой подход будет хорошей первой итерацией.
Для этого нам понадобятся две подсказки. Первый — это запрос пользователя, который инструктирует ChatGPT проверить орфографические ошибки:
Исправьте орфографические и грамматические ошибки в следующем тексте:
Нам также понадобится системная подсказка, которая поможет модели возвращать только исправленный текст.
Вы копирайтер, который исправляет куски текста, вы всегда отвечаете только исправленным текстом, без пояснений и прочего описания.
Системные подсказки полезны для того, чтобы дать модели некоторый начальный контекст и указать ей вести себя определенным образом для всех последующих подсказок пользователя. В системном приглашении мы указываем ChatGPT возвращать только исправленный текст, а не дополнять его описанием или другим начальным текстом.
Мы можем протестировать систему и пользовательские подсказки на игровой площадке OpenAI.
Для вызова API мы будем использовать openai.chat.completions.create({…})метод класса, OpenAIэкземпляр которого мы создали выше, и возвращать ответное сообщение.
Собрав все это вместе, приведенный ниже код отправит эти два запроса вместе с входным текстом в конечную openai.chat.completions.create({…})точку API OpenAI. Также обратите внимание, что мы указываем модель, которая будет использоваться как gpt-3.5-turbo. Для этого мы можем использовать любую модель OpenAI, включая GPT-4:
// Import the OpenAI package import OpenAI from "openai"; export async function spellcheck({ body }: { body: string }) { const { textToCheck }: { textToCheck: string } = JSON.parse(body); // Create a new instance of OpenAI. const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY }); const userPrompt = 'Correct the spelling and grammatical errors in the following text:\n\n'; const gptResponse = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: [ { role: "system", content: "You are a copy editor that corrects pieces of text, you always reply with just the corrected text, no explanations or other description" }, { role: "user", content: userPrompt + textToCheck } ] }); // The message.content will contain the corrected text... const correctedText = gptResponse.choices[0].message.content; return { statusCode: 200, body: correctedText }; }
Ввод текста, вывод JSON
На данный момент мы написали облачную функцию AWS Lambda, которая отправляет некоторый текст в ChatGPT и возвращает исправленную версию текста с удаленными орфографическими ошибками. Но openaiпакет позволяет нам сделать гораздо больше. Разве не было бы неплохо вернуть из нашей функции некоторые структурированные данные, в которых фактически перечислены замены, сделанные в тексте? Это значительно облегчит интеграцию этой облачной функции с пользовательским интерфейсом.
К счастью, OpenAI предоставляет в API функцию, которая позволяет добиться именно этого: вызова функций.
Вызов функций — это функция, присутствующая в некоторых моделях OpenAI, которая позволяет ChatGPT отвечать структурированным JSON вместо простого сообщения. Поручив модели ИИ вызвать функцию и предоставив подробную информацию о функции, которую она может вызвать (включая все аргументы), мы можем получить гораздо более полезный и предсказуемый ответ JSON от API.
Чтобы использовать вызов функции, мы заполняем functionsмассив в параметрах создания завершения чата. Здесь мы сообщаем ChatGPT, что вызываемая функция makeCorrectionsсуществует и что она может вызываться с одним аргументом replacements:
const gptResponse = await openai.chat.completions.create({ model: "gpt-3.5-turbo-0613", messages: [ ... ], functions: [ { name: "makeCorrections", description: "Makes spelling or grammar corrections to a body of text", parameters: { type: "object", properties: { replacements: { type: "array", description: "Array of corrections", items: { type: "object", properties: { changeFrom: { type: "string", description: "The word or phrase to change" }, changeTo: { type: "string", description: "The new word or phrase to replace it with" }, reason: { type: "string", description: "The reason this change is being made", enum: ["Grammar", "Spelling"] } } } } } } } ], });
Здесь важны описания функции и всех аргументов, поскольку ChatGPT не будет иметь доступа ни к какому нашему коду, поэтому все, что он знает о функции, содержится в описаниях, которые мы ей предоставляем. Свойство parametersописывает сигнатуру функции, которую может вызывать ChatGPT, и соответствует схеме JSON для описания структуры данных аргументов.
Приведенная выше функция имеет единственный аргумент с именем replacements, который соответствует следующему типу TypeScript:
type ReplacementsArgType = { changeFrom: string, changeTo: string, reason: "Grammar" | "Spelling" }[]
Определение этого типа в схеме JSON гарантирует, что JSON, который мы получим от ChatGPT, будет соответствовать этой предсказуемой форме, и мы сможем использовать его JSON.parse()для десериализации в объект этого типа:
const args = <ReplacementsArgType>JSON.parse(responseChoice.message.function_call!.arguments);
Собираем все вместе
Вот окончательный код нашей функции AWS Lambda. Он вызывает ChatGPT и возвращает список исправлений фрагмента текста.
Здесь следует отметить еще несколько вещей. Как упоминалось ранее, только несколько моделей OpenAI поддерживают вызов функций. Одной из этих моделей является gpt-3.5-turbo-0613, поэтому она была указана при вызове конечной точки завершения. Мы также добавили function_call: { name: ’makeCorrections’ }к звонку. Это свойство является указанием модели, что мы ожидаем, что она вернет аргументы, необходимые для вызова нашей makeCorrectionsфункции, и что мы не ожидаем, что она вернет сообщение чата:
import OpenAI from "openai"; import { APIGatewayEvent } from "aws-lambda"; type ReplacementsArgType = { changeFrom: string, changeTo: string, reason: "Grammar" | "Spelling" }[] export async function main({ body }: { body: string }) { const { textToCheck }: { textToCheck: string } = JSON.parse(body); const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY }); const prompt = 'Correct the spelling and grammatical errors in the following text:\n\n'; // Make ChatGPT request using Function Calling... const gptResponse = await openai.chat.completions.create({ model: "gpt-3.5-turbo-0613", messages: [ { role: "user", content: prompt + textToCheck } ], functions: [ { name: "makeCorrections", description: "Makes spelling or grammar corrections to a body of text", parameters: { type: "object", properties: { replacements: { type: "array", description: "Array of corrections", items: { type: "object", properties: { changeFrom: { type: "string", description: "The word or phrase to change" }, changeTo: { type: "string", description: "The new word or phrase to replace it with" }, reason: { type: "string", description: "The reason this change is being made", enum: ["Grammar", "Spelling"] } } } } } } } ], function_call: { name: 'makeCorrections' } }); const [responseChoice] = gptResponse.choices; // Deserialize the "function_call.arguments" property in the response const args = <ReplacementsArgType>JSON.parse(responseChoice.message.function_call!.arguments); return { statusCode: 200, body: JSON.stringify(args) }; }
«textToCheck»: «Thier journey to the nearby city was quite the experience. If you could of seen the way people reacted when they first saw the castle, it was as if they were taken back to a era long forgotten. The architecture, with it’s grand spires and ancient motifs, captured the essense of a time when knights roamed the land. The principle reason for visiting, however, was the art exhibition showcasing several peices from renowned artists of the past.»
{ "textToCheck": "Thier journey to the nearby city was quite the experience. If you could of seen the way people reacted when they first saw the castle, it was as if they were taken back to a era long forgotten. The architecture, with it's grand spires and ancient motifs, captured the essense of a time when knights roamed the land. The principle reason for visiting, however, was the art exhibition showcasing several peices from renowned artists of the past." }
[ { "changeFrom": "Thier", "changeTo": "Their", "reason": "Spelling" }, { "changeFrom": "could of", "changeTo": "could have", "reason": "Grammar" }, { "changeFrom": "a", "changeTo": "an", "reason": "Grammar" }, //... ]
Заключение
Используя API OpenAI и облачную функцию, вы можете создавать приложения, которые не только выявляют орфографические ошибки, но и понимают контекст, улавливая сложные грамматические нюансы, которые обычные программы проверки правописания могут упустить из виду. Это руководство представляет собой основу, но потенциальные возможности применения ChatGPT для анализа и исправления языка огромны. По мере того, как ИИ продолжает развиваться, будут расти и возможности таких инструментов.