gpt3.5（ChatGPT？）が変数名考えてくれるアプリをpythonで作った

**[GitHub](https://github.com/mizugame634978/NameMaster)** に上げたプログラムのコア部分の解説

# ３行で教えて！
- 関数名や変数名を考えてくれる
- 出てきた名前の説明もしてくれる
- 作成するのにAIの深い知識は必要ない
# なぜこの記事を書いたのか
何かしらの技術記事を書いてみたいと思っていたが１から書くのはハードルが高いので、過去にGitHubでREADMEを書いたプログラムを解説することにした。
# 本編

このアプリはpython,gpt3.5のapi,tkinter(pythonでGUIプログラムを作るためのライブラリ)で作成しましたが、この記事で伝えたいことはgpt3.5に適当に入力を与えていい感じの出力をもらう部分なのでpythonを知らない人が見てもなんとなく理解できると思います。

なのでこの記事の想定読者はtkinterでgpt3.5を使ったアプリの使い方を学びに来た人ではなく、gpt3.5をアプリにいい感じで組み込んだ例を見に来た人です。
## 動作原理
```
ユーザーから何らかの方法で関数や変数の概要を文字列で取得（変数char1）
↓
char1と予め定義していたルールを定めた文字列を結合(変数str1)
↓
str1をgpt3.5に投げて帰ってきた結果を表示
```
動作原理は上記のようになります。

ChatGPTに質問する際に色々ルールを書いたあとに質問を書く人がいますよね？それと同じことをしています。

今回のプログラムで`引数の2つの値の最大値を求めるプログラム`について名前の候補を聞いた場合gpt3.5には
```markdown
ルール0 : 回答は日本語で行ってください,
ルール1 : 私の質問にはトークン数が270以下になるように答えてください,
ルール2 : 「以下のようなものが考えられます」のような前置きは省略してください,
ルール3 : あなたの考えた名前について説明もしてください,
命令 : 私はプログラムを書いています。以下の関数もしくは変数につける名前を３つほど考えてください,
関数もしくは変数:引数の2つの値の最大値を求めるプログラム,
```
のような質問文が送られます。

## 実際の動作例
### 画面
![230809198-07e63d99-aaba-44ac-ab82-a9345d05418a (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1255098/c14120b8-298f-897b-912c-597af24325a5.png)
1番の矢印：ユーザーの入力を受け付けるテキスト入力欄
2番の矢印：ユーザーの入力を使って回答を生成するボタン
3番の矢印：回答を表示する欄

### コード
```python:１連の処理を行う関数
def generat_answer():# ２番矢印のボタンを押すことで起動
    char1 =  entryBox1.get()#１番矢印のテキスト入力欄から文字列を取得
    str3 = '関数もしくは変数'

    str0 = "ルール0 : 回答は日本語で行ってください,\n" \
    "ルール1 : 私の質問にはトークン数が270以下になるように答えてください,\n" \
    "ルール2 : 「以下のようなものが考えられます」のような前置きは省略してください,\n" \
    "ルール3 : あなたの考えた名前について説明もしてください,\n" \
    "命令 : 私はプログラムを書いています。以下の" + str3 +"につける名前を３つほど考えてください,\n" \
    + str3 +":"
    
    str1 = str0 + char1 + ","
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": str1},
        ],
        max_tokens=300,#トークンを使える数には限りがあるので
    )
    result = str(response["choices"][0]["message"]["content"])

    ''' ３番矢印の欄に回答を出力'''
    textBox1.configure(state=tk.NORMAL)#編集できる
    textBox1.insert(tk.END,result)
    textBox1.configure(state=tk.DISABLED)#編集禁止
```


ユーザーから入力を受け取って、それを出力する機能はこの関数generat_answerで行っています。
#### gpt3.5のとの通信部分について
事前にapiを使う際に楽をできるライブラリをインストールしておきます。
```python
import openai
openai.api_key = "あなたのopen aiのapiキー"
```
gpt3.5との通信部分では`role`にデフォルト？の`user`を指定し、`content`には事前に定義していた質問とユーザーの文字列を結合した変数`str1`を渡しています。またトークン(1回の回答の文字数と関連がある)の最大値は300にしています。そしてapiの戻り値を受け取った辞書型の`response`からgpt3.5の回答の部分を変数`result`に渡しています。
```python
response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": str1},
        ],
        max_tokens=300,#トークンを使える数には限りがあるので
    )
result = str(response["choices"][0]["message"]["content"])
```
# 終わりに
今回はとにかくアウトプットを作ることを優先したため、クオリテティに変わらず半日という期間の間で出来上がったものを公開しました。

感想として2つありまして1つ目は記事を書くことはすごく難しかったこと。2つ目は短い制作期間を最初に決めていたことは結果としてよかったと思えたことです。

## 1つ目の感想について
私は現在大学生で講義中の感想を x *100 文字以下で書く課題や実験のレポートがすごく苦手です。

その理由としては多くの文字数をそもそも稼げないというのもあるのですが、話の流れやセクションをきちんと決めることや相手に前提条件をきちんと伝えることが苦手であることも理由の１つです。

今回の技術記事に関しては見せる対象が教授1人ではなく全世界です。レポートとは違いセクションも決まっておらず、受理されることだけ考えればよいレポートと違いできるだけ自分の考えを伝える、できるだけわかりやすく伝える、など拘れてしまうポイントは多くクオリティは青天井です。


## 2つ目の感想について
1つ目の感想でも述べましたが書くための能力もいつもより必要で、また全世界に公開することなども重なり、不安とこだわりで書くのに多くの時間がかかることが予想されます。

最初は半日だったのが、3日、1週間、2週間、1ヶ月...と伸びていくのは容易に想像できます。またそれだけではなく自分が不安を感じなくなるクオリティになっていないとうことで、公開するのをやめてしまうかもしれません。

よって最初に半日というタイムリミットを設定したことで、公開するのを諦めるという最悪の事態は回避できたので、制作期間を決めることは良いことだったと思いました。