2023-02-11
Posted by
アプリケーションに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)
今回はmodel
にtext-davinci-003
をprompt
に先ほど作った自然言語を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を怯えながら書いています
このドキュメントどう?