31
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenAI APIを利用して【感想文ジェネレーター】を作成しました

Posted at

はじめに

小学生の頃から嫌いなことがあります。
それは、プリントの「感想」の欄です.
自分の思いを文章にするのが苦手で、「箇条書きでよくないか、、、?」と常々思ってきました。

読書感想文なんて一番苦手でした。

そんな私がOpenAI社のGPT-3を利用して
【感想文ジェネレーター】
を作成しました。

無料枠で作成したため、無料枠が尽きると動かなくなりますので、
突然サービス終了する可能性があります。ご容赦ください。

(特にCSSには)改善の余地があります。ちょっとずつ直します

概要

(現在の画面と異なる可能性があります)

  1. 感想文ジェネレーターを開く

  2. 必要な項目を入力

    • 例)
    • 何について
      • TypeScript初学者研修
    • 職業
      • 会社員3年目
    • 何文字程度で作成するか
      • 300
  3. 生成

    そこそこいい感じですね👍
    私が作る文章よりもしっかりしています

ざっくり技術スタック

opinion-ai.drawio.png

ざっくり構成

構成.drawio.png

ざっくり解説してみると、

利用者

  1. ブラウザで必要な情報を入力し、回答生成のリクエストを送る。
  2. API Gatewayを通してstep functionsへ通じ処理が始まる。
  3. API Gatewayのtimeoutは29sのため、step functionsを使い、タイムアウトの問題を解決している。
  4. 非同期処理で、OpenAIからの回答が返ってきたらSupabaseに回答を格納する。
  5. ブラウザではSupabaseのリアルタイム機能を使い、特定のテーブルのINSERTイベントを検知し、回答を表示する。

開発

  • フロントエンド側はVercelでビルド・デプロイしているので、githubmainブランチの変更を検知してビルド・デプロイが走る
  • バックエンド側のはServerlessFrameworkでデプロイしている。

OpenAI回答生成

ソースコード

handler.ts
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
  1. config設定

    この時にapiKeyを使うのですが、この値はGitHubに上げたり、フロント側のソースコードに載せたりしないようにしましょう
    私はprocess.env.*****で環境変数にしました。

    const config = new Configuration({ apiKey: ************** });
    
  2. configを使って初期化をします。

    const openai = new OpenAIApi(config);
    
  3. 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,
        }
      );
    
  4. promptについて

    createCompletionメソッドは前の文から予測して次の文を考えるメソッドなので、例としては以下のように使います。

    Aさん: 昨日の星空は綺麗だったね。Bさんはどうだった?
    Bさん: 
    

    ここまでをpropmtに入れることでBさんのセリフをBさんの立場で考えてくれるという仕組みです。

    私の場合は

    const prompt = `
      質問: あなたの職業は${event.occupation}です。${event.title}についての感想を以下を参考に${event.answer_length}文字程度で作成してください。
      ${event.feature}
      回答: 
    `
    

    このようにすることで、感想文を書く立場・対象・特徴について設置を教え、回答を生成させています。

他の実装箇所については徐々に記事にして行こうと思います〜

最後に

AIを作るのは大変ですが、
AIを使うのは簡単でした。

楽しい世の中になってきましたね

31
13
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?