はじめに
小学生の頃から嫌いなことがあります。
それは、プリントの「感想」の欄です.
自分の思いを文章にするのが苦手で、「箇条書きでよくないか、、、?」と常々思ってきました。
読書感想文なんて一番苦手でした。
そんな私がOpenAI社のGPT-3を利用して
【感想文ジェネレーター】
を作成しました。
無料枠で作成したため、無料枠が尽きると動かなくなりますので、
突然サービス終了する可能性があります。ご容赦ください。
(特にCSSには)改善の余地があります。ちょっとずつ直します
概要
(現在の画面と異なる可能性があります)
-
感想文ジェネレーターを開く
-
必要な項目を入力
- 例)
- 何について
- TypeScript初学者研修
- 職業
- 会社員3年目
- 何文字程度で作成するか
- 300
-
生成
そこそこいい感じですね👍
私が作る文章よりもしっかりしています
ざっくり技術スタック
ざっくり構成
ざっくり解説してみると、
利用者
- ブラウザで必要な情報を入力し、回答生成のリクエストを送る。
-
API Gatewayを通してstep functionsへ通じ処理が始まる。 -
API Gatewayのtimeoutは29sのため、step functionsを使い、タイムアウトの問題を解決している。 - 非同期処理で、
OpenAIからの回答が返ってきたらSupabaseに回答を格納する。 - ブラウザでは
Supabaseのリアルタイム機能を使い、特定のテーブルのINSERTイベントを検知し、回答を表示する。
開発
- フロントエンド側は
Vercelでビルド・デプロイしているので、githubのmainブランチの変更を検知してビルド・デプロイが走る - バックエンド側のは
ServerlessFrameworkでデプロイしている。
OpenAI回答生成
ソースコード
import { Configuration, OpenAIApi } from 'openai'
const getAnswer = async (event) => {
const config = new Configuration({ apiKey: ************** });
const openai = new OpenAIApi(config);
const prompt = `
質問: あなたの職業は${event.occupation}です。${event.title}についての感想を以下を参考に${event.answer_length}文字程度で作成してください。
${event.feature}
回答:
`
const response = await openai.createCompletion(
{
model: "text-davinci-003",
prompt: prompt,
temperature: 1,
max_tokens: 1000,
}
);
}
解説
nodejsでは、openaiライブラリをインストールして使います
# npm
npm i openai
# yarn
yarn add openai
# pnpm
pnpm i openai
-
config設定
この時にapiKeyを使うのですが、この値は
GitHubに上げたり、フロント側のソースコードに載せたりしないようにしましょう
私はprocess.env.*****で環境変数にしました。const config = new Configuration({ apiKey: ************** }); -
configを使って初期化をします。
const openai = new OpenAIApi(config); -
createCompletion
初期化をしたら
createCompletionメソッドを使います。
このメソッドはプロンプトに基づいてテキストを生成するメソッドです。主なプロパティは以下の通りです。
- model: 使用するモデルの名前
- prompt: テキスト生成のための入力となる文字列
- max_tokens: 生成する最大トークン数
- temperature: 生成されるテキストの多様性を制御するパラメータ。0から1までの値を設定し、1に近づくほど多様性が上がる。
他にも色々なプロパティがあるので、もっとカスタマイズしたい場合は公式ドキュメントをご参照ください
const response = await openai.createCompletion( { model: "text-davinci-003", prompt: prompt, temperature: 1, max_tokens: 1000, } ); -
promptについて
createCompletionメソッドは前の文から予測して次の文を考えるメソッドなので、例としては以下のように使います。Aさん: 昨日の星空は綺麗だったね。Bさんはどうだった? Bさん:ここまでを
propmtに入れることでBさんのセリフをBさんの立場で考えてくれるという仕組みです。私の場合は
const prompt = ` 質問: あなたの職業は${event.occupation}です。${event.title}についての感想を以下を参考に${event.answer_length}文字程度で作成してください。 ${event.feature} 回答: `このようにすることで、感想文を書く立場・対象・特徴について設置を教え、回答を生成させています。
他の実装箇所については徐々に記事にして行こうと思います〜
最後に
AIを作るのは大変ですが、
AIを使うのは簡単でした。
楽しい世の中になってきましたね

