6
3

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 3 years have passed since last update.

ReactNativeでGPT-3を使う

Last updated at Posted at 2021-12-01

GPT-3がウェイトリストなしで利用可能になりました

OpenAIが開発した高精度な言語モデルGPT-3がウェイトリストなし、アカウント登録だけで誰でも利用可能になりました。

Javascript用のライブラリもいくつか公開されています。そのうちの一つ、openai-apiを使ってReactNativeアプリ内からGPT-3にリクエストを送信して文章を生成してみました。

API keyの用意

Open AIでアカウントを登録してAPI keyを用意します。なお、アカウント登録ではSMS認証が必要です。

アカウント登録後、ダッシュボードでAPI keyを作成してコピーしておきます。

img1.png

デモ用アプリを用意

APIにリクエストを送信してレスポンスを表示するだけなので、新規でアプリを作っても良いのですが、今回は自分用に作成したボイラープレートを使いました。

ライブラリのインストール

OpenAIのドキュメントページではJavascript用のライブラリがいくつか紹介されていますが、一番ダウンロード数の多いopenai-apiを使いました。

yarn add openai-api

完成画面

img2.jpg

上下にテキストボックスがあり、下のテキストボックスに文章を入力してGenerateボタンを押すと、上のテキストボックスにGPT-3により生成された文章が表示されます。

コード

画面全体のコードです。

import React, { useEffect, useState } from 'react'
import { Text, View, TextInput, Dimensions, StyleSheet, TouchableOpacity, ActivityIndicator } from 'react-native'
import OpenAI from 'openai-api'

export default function Gpt() {
  const [comment, setComment] = useState('')
  const [message, setMessage] = useState('ここにGPT-3が生成した文章が入ります')
  const [isLoading, setIsLoading] = useState(false)
  const height = Dimensions.get('window').height
  const openai = new OpenAI('API keyは見せられないよ')

  useEffect(() => {
    console.log('Gpt screen')
  }, [])

  const generateMessage = async() => {
    setIsLoading(true)
    const prompt = comment
    const gptResponse = await openai.complete({
      engine: 'davinci',
      prompt: prompt,
      maxTokens: 300,
      temperature: 0.9,
      topP: 1,
      presencePenalty: 0,
      frequencyPenalty: 0,
      bestOf: 1,
      n: 1,
      stream: false,
      stop: ['\n', "testing"]
    });
    console.log(gptResponse.data)
    const responseMessage = gptResponse.data.choices[0].text
    setMessage(responseMessage)
    setIsLoading(false)
  }

  return (
    <View style={styles.container}>
      <View style={styles.content}>
        <TextInput
          multiline
          style={[styles.input, {height: height*0.3, backgroundColor: 'snow'}]}
          placeholder=''
          placeholderTextColor="#aaaaaa"
          value={message}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
          editable={false}
        />
        <TextInput
          multiline
          style={[styles.input, {height: height*0.3, marginTop: 20}]}
          placeholder=''
          placeholderTextColor="#aaaaaa"
          onChangeText={(text) => setComment(text)}
          value={comment}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        />
        <TouchableOpacity
          style={styles.button}
          onPress={() => generateMessage()}
        >
          {!isLoading?
          <Text style={styles.buttonText}>Generate</Text>:
          <ActivityIndicator size="small" color="#0000ff" />
          }
        </TouchableOpacity>
      </View>
    </View>
  )
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  content: {
    width: '100%',
    paddingHorizontal: 20,
  },
  input: {
    height: 48,
    borderRadius: 10,
    overflow: 'hidden',
    backgroundColor: 'white',
    paddingHorizontal: 10
  },
  button: {
    marginLeft: 30,
    marginRight: 30,
    marginTop: 20,
    height: 48,
    borderRadius: 5,
    alignItems: "center",
    justifyContent: 'center',
    backgroundColor: '#788eec'
  },
  buttonText: {
    color: 'white',
    fontSize: 16
  },
})

GPT-3に関する部分

まずはライブラリをインポートします。

import OpenAI from 'openai-api'

OpenAIのダッシュボードで確認したAPI keyを使って初期化します。

const openai = new OpenAI('API keyは見せられないよ')

APIにリクエストを送信して、レスポンス表示用のテキストボックスにセットする関数です。

入力欄の値をpromptとして格納してAPIにリクエストを送信しています。

  const generateMessage = async() => {
    setIsLoading(true)
    const prompt = comment
    const gptResponse = await openai.complete({
      engine: 'davinci',
      prompt: prompt,
      maxTokens: 300,
      temperature: 0.9,
      topP: 1,
      presencePenalty: 0,
      frequencyPenalty: 0,
      bestOf: 1,
      n: 1,
      stream: false,
      stop: ['\n', "testing"]
    });
    console.log(gptResponse.data)
    const responseMessage = gptResponse.data.choices[0].text
    setMessage(responseMessage)
    setIsLoading(false)
  }

APIからのレスポンスは以下のようになっています。

Object {
  "choices": Array [
    Object {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "text": "2018年も、より良い1年になるよう、粘り強く頑張っていきましょう!",
    },
  ],
  "created": 1638347659,
  "id": "cmpl-4AFMBCd5PS3aMNFDL2q65G9NWBzS5",
  "model": "davinci:2020-05-03",
  "object": "text_completion",
}

注意

API keyはgitignoreしましょう。API keyをプッシュすると数秒で検知して使用が停止されます。

API keyが無効化されると以下のようなメールが届きます。

img4.png

6
3
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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?