2023-02-11

python

chatGPT

Posted by

applemango

アプリケーションにchat-gptを埋め込む

今回はアプリケーションにchat-gptを埋め込んで行きます

今回はbackendメインに書くのでfrontendは省略します

chatGPTを準備する

まずpythonでchatGPTを使う為にopenAIのライブラリを入れ、インポートします

$ pip install openai
import openai

インストールし終わったらapi keyを入手します

入手にはopenAIのアカウントが必要ですがアカウントさえあれば簡単に入手出来ます

まず下のサイトにアクセスして

+ Create new secret keyを押し

表示されたkeyをコピーするだけです

apiのlimitは無料分でも一分間に20 requestと150K tokenがあるので個人的につかうぶんには引っかかる事はなさそうです

keyを発行したらopenai.api_keyを設定します

import openai
openai.api_key = "sk-XXX_API_KEY_HERE_XXX"

タスクを与える

次にタスクを与えます

タスクは自然言語で与えます、例えばchatGPTには不向きですが絵などを描かせるには以下のようにします

def generate_prompt(order):
    return """Please write shapes and patterns in 0s and 1s.
The size is 16pixel in height and 16pixel in width.

examples:
name: quadrangle
result:
0000000000000000
0000000000000000
0000000000000000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0001111111111000
0000000000000000
0000000000000000
0000000000000000
name: circle
result:
0000000000000000
0000000000000000
0000000000000000
0000000100000000
0000011111000000
0000111111100000
0000111111100000
0001111111110000
0000111111100000
0000111111100000
0000011111000000
0000000100000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
order:
name: {}
result:""".format(
        order.capitalize()
    )

このプロンプトではorderにSquare in the middleと入力すると以下のようにかえって来ます

(まだ呼び出し部分作って無いですが)

0000000000000000
0000000000000000
0000000000000000
0001111111111000
0001000000001000
0001000000001000
0001000000001000
0001000000001000
0001000000001000
0001000000001000
0001111111111000
0000000000000000
0000000000000000
0000000000000000
0000000000000000

少し尖った物を出しすぎたので真面目にやります

自然言語をsqlite3に変換する場合は以下のようになります

def generate_prompt(order):
    return """Assume:
Create sqlite3 state
Now you have the following tables

tables:
CREATE TABLE user (
        id INTEGER NOT NULL,
        name VARCHAR NOT NULL,
        password VARCHAR NOT NULL,
        PRIMARY KEY (id),
        UNIQUE (name)
);
CREATE TABLE post (
        id INTEGER NOT NULL,
        user_id INTEGER,
        title VARCHAR,
        body VARCHAR,
        PRIMARY KEY (id),
        FOREIGN KEY(user_id) REFERENCES user (id)
);
CREATE TABLE IF NOT EXISTS "like" (
        id INTEGER NOT NULL,
        user_id INTEGER,
        post_id INTEGER,
        "like" BOOLEAN,
        PRIMARY KEY (id),
        FOREIGN KEY(user_id) REFERENCES user (id),
        FOREIGN KEY(post_id) REFERENCES post (id)
);

order: {}""".format(
        order.capitalize()
    )

試しに、orderに"Get the post where user id is 1 and user like is true"を指定し実行すると以下のようなクエリが帰ってきてちゃんと実行出来るのがわかります

SELECT post.* 
    FROM post
    JOIN "like" ON post.id = "like".post_id
    WHERE "like".user_id = 1 AND "like"."like" = 1;

chatGPTを動かす

タスクを作ったらいよいよ動かして行きます

response = openai.Completion.create(
        model="text-davinci-003",
        prompt=generate_prompt("Get the post where user id is 1 and user like is true"),
        temperature=0.6,
        max_tokens=2048
    )
print(response)
print(response.choices[0].text)

今回はmodeltext-davinci-003promptに先ほど作った自然言語をsql分に変換する奴を、指定しています

temperatureは0から2までの間でランダム生を指定します、低い方がランダム性が低くなります

max tokensはpromptの長さと出力の長さを足し合わせたtokenの数の最大値を決めます

今回は2048を指定していますが実際には305しか使用されませんでした

文章のトークン量は以下のサイトで確認出来ます

実際に生成した結果は以下のようになります

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "text": "\n\nSELECT post.* \nFROM post\nJOIN \"like\" ON post.id = \"like\".post_id \nWHERE \"like\".user_id = 1 AND \"like\".\"like\" = 1;"
    }
  ],
  "created": 1677854773,
  "id": "cmpl-XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "model": "text-davinci-003",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 48,
    "prompt_tokens": 257,
    "total_tokens": 305
  }
}

flaskで作ってみるならこんな感じかな?

@app.route("/ai", methods=["POST"])
@cross_origin()
def get_ai():
    command = request_data(request, "command")
    response = openai.Completion.create(
            model="text-davinci-003",
            prompt=generate_prompt(command),
            temperature=0.6,
            max_tokens=360
        )
    return jsonify({"data":response.choices[0].text})

後は結果を適当に煮るなりparseするなりすれば完成です

終わりに

この記事はAIが執筆していません

将来的なGoogleからの評価を気にしてNI(Natural Intelligence (ダサく言うと人))がAIを怯えながら書いています

このドキュメントどう?

emoji
emoji
emoji
emoji