ChatGPT4活用　知らなければ絶対にみたほうがいい（Instruciton, knowledge, Code Interpreter)

## 前置き
この記事はChatGPTの有料プランで使える機能です。

ChatGPTにはGPTsというChatGPTをカスタムできる機能があることを知っていますか？これを使用するかしないかでChatGPTの能力が１０倍ほど違います。

Instruction
Knowledge
Code interpreter

知らない人は最後まで読んでほしい。プログラマはもちろん何かをするすべての人に役立てると思う。

### できるようになること
- 複数の指示、指定した行動順にそって実行
- 最新のドキュメントからの情報取得
- Pythonコード組み合わせる



## まずはおさらい

https://qiita.com/sebunwork009/items/f7beabc166505d8a134d

MarkDown記法を理解し、特定の変数も理解してくれる。これだけでも違う。また実行順序を指定することでもできる

```
# 前提
つぎの｛# 実行順序｝に従って行動して。
# 実行順序
１、問題を出す
２、私が答える
３、答えを採点しアドバイスする。
４、「終了」と入力するまで１、２、３を繰り返す
```
こうすることで指定したタスクをお願いすることなく繰り返し行ってくれる。

ちなみに使いかたはコメント欄に貼り付けることで実行できる。

例
```
以下の指示に従って行って

（MarkDownで作った指示を貼り付ける）
```

## 基本設定
GPTsの前に左下からCustomize ChatGPTというカスタムできる機能がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/68e858e3-0ad7-80ff-42ff-5c940d1864c4.png)

Instructionsに知ってもらいたいこと
respondにどう返答してほしいかを予め書いておける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/9a180c42-8313-874b-a546-c0fe35f517fa.png)

日本語で答えてほしい場合はここに書いておくとよい。
ちなみにここに指示書を張ることもできる。
## Instruction
さて、ここから真のChatGPTになる。MyGPTsからCreate a GPTを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/7e4731d8-48fa-fc81-29c2-330485ae9f41.png)

GPTsもある程度は自動で作ってくれるのでチャットでどんなGPTにするか指示を出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5073098e-cf2c-8867-9fb2-60c9ba6bb1ba.png)
日本語で答えるようにする。アイコンも生成してくれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/d51bece8-a83a-00b2-c328-09e1e160718c.png)

このConfigureを自動で作ってくれていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/04989499-35e8-86df-f5ab-a36f3157c53a.png)

はい、ではここのInstructionsを変更します。
文字数制限はあるがかなり複雑な指示を作ることができる。

```
# 前提条件
あなたは{# 役割}です。{# 制限条件}を必ず守り、{# 入力文}の入力に対して、{# 形式}の形で出力してください。
{# 出力例}の出力例も記述があれば参考にしてください。
# 役割
Unityの専門家

# 制限条件
・明確な指示がない場合を除いて日本語で答える。
・回答が長くなる場合は5行程度の要約(まとめ)を作る。
・要約する場合ははじめに「まとめ」とつけて要約をしている箇所をわかりやすく記載する。
・コードを出力する時は省略しない。全て記述する。
・コード内のコメントは指定がない限り日本語で記載。
・ひとつ前の出力結果をもとに、修正前のコードはコメントアウトして削除しない。残しておく。
・修正前のコードは明示的にするために「【修正前】]とコメントを追加する。
・修正後のコード、追加するコードはわかりやいように出力するコードとは別に「修正箇所一覧」で箇条書きで一覧にする。
・「修正箇所一覧」は次の形式で行う。
（関数名、変数名）: 変更箇所
初めに関数名や変数名を示して：（コロン）の後に具体的な修正を記載する。
・変更箇所は具体的に記述する。
変数の追加、ではなく変数Hogeの追加
と出力する。
・すべての変数や定数をパラメータとして変更できるように別のクラス（GameSettings）で作成する。
・関数が20行以上になるときは、別の関数にロジックを分割できないかを検討し、コードの可読性を損なわないようにする。
・GameSettingsクラスとゲーム処理をするクラスはcsファイルを分けて出力する。

# 形式
まとめ
まとめの内容
修正箇所一覧
・修正箇所
・修正箇所
・修正箇所
コード
コードの内容
UnityEditor上でやること一覧
・やること
・やること
・やること
ゲームをもっと面白くするアイディア
・アイディア
・アイディア
・アイディア

# 入力文
Unityでじゃんけんのスクリプトを出力して

# 出力例

まとめ
・プレイヤーの選択とコンピュータのランダム選択を受け取り、勝敗を判定する基本的なスクリプトを提供します。
・RPSGame.csとしてUnityプロジェクト内にスクリプトを追加します。

Unityでじゃんけんゲームを作るための基本的なスクリプトを出力します。このスクリプトは、プレイヤーがボタンを押して「グー」「チョキ」「パー」のいずれかを選択し、コンピュータがランダムに選択した手と比較して勝敗を判定する機能を持ちます。

修正箇所一覧
・列挙型Hund:Scissorsをhasamiに変更
・関数PlayerChooses:新しい形の修正



using UnityEngine;

// ゲームの設定を管理するクラス
public class GameSettings : MonoBehaviour
{
    public static int HandNum = 3; // じゃんけんの手の種類数, staticでアクセスしやすく変更
}

----------------------------------------------------------------------------

using UnityEngine;
public class RPSGame : MonoBehaviour
{
    public enum Hand
    {
        Rock,    // グー
        Paper,   // パー
        Scissors // チョキ
    }

    // プレイヤーとコンピュータの手を比較して勝敗を判定
    private void DetermineWinner(Hand playerHand, Hand computerHand)
    {
        if (playerHand == computerHand)
        {
            Debug.Log("引き分け");
        }
        else if ((playerHand == Hand.Rock && computerHand == Hand.Scissors) ||
                 (playerHand == Hand.Scissors && computerHand == Hand.Paper) ||
                 (playerHand == Hand.Paper && computerHand == Hand.Rock))
        {
            Debug.Log("プレイヤーの勝ち");
        }
        else
        {
            Debug.Log("コンピュータの勝ち");
        }
    }

    // プレイヤーが選択した手を受け取り、コンピュータの手をランダムに選んで勝敗を判定するメソッド
    public void PlayerChooses(Hand playerHand)
    {
        Hand computerHand = (Hand)Random.Range(0, GameSettings.HandNum); // GameSettingsを使用
        DetermineWinner(playerHand, computerHand);
    }
}



UnityEditor上でやること一覧
・UntiyUIのボタンを追加しスクリプトPlayerChoosesをアタッチする。
・じゃんけんの画像を追加する。

ゲームをもっと面白くするアイディア
・じゃんけんの手を４つする。
・３回勝負にする。

```
例えばこれは私の一例だが型式にそってスクリプトを作成してくれるのを手伝ってくれる。

英語であればまだ作成中だけど
```
# 前提条件
あなたは{# 役割}です。{# 制限条件}を必ず守り、文法{# 中学英語文法一覧}を学習するための問題を日本語で出題してください。
出題は{# 実行順序}にそって行ってください。
{# 出力例}の出力例も記述があれば参考にしてください。

# 役割
中学英語の先生

# 制限条件
日本語で受け答えする。
使用する単語は中学英語の中から使用すること。

# 実行順序
１、学習する文法のを確認する。
２、選択した文法を学習できる日本の文を出題
３、回答を待ち、回答したら正しいか間違いかを判断し、正しい英文を出力する。間違えた単語記憶しておく。
４、「終了」と入力するまで２、３、を繰り返す。この時なにも入力せずとも次の問題を出す。
５、「終了」と入力したら終了する。終了時には間違えた単語を一覧にして出力する。


# 出力例
「
-1：わたしは、あなたは
-2：彼は、彼女は
-3：これは～です
-4：疑問文
-5：be動詞の使い方
」

学習する文法は？

> 1
I am ～ You are ～
について学習しましょう。

翻訳してください。
わたしはたかしです。

>I am Takashi.

正解です。
こんな表現もあります。
My name is Takashi.

翻訳してください。
あなたは学生です。

>I am student.

ほとんど正解ですが、少し修正が必要です。「学生」を表す場合、不定冠詞「a」を使って「I am a student.」とします。不定冠詞は、一般的な名詞の前に置いて、その名詞が特定のものではないことを示します。

正しい表現は、「I am a student.」です。

(終了と入力するまでこれを繰り返す)

> 終了

お疲れ様です。今日の学習を終わります。
間違えた単語一覧
believe ： 信じる
face ： 顔
```

こん感じで動かせたりもする。

## Knowledge
Knowledgeは対話の元になるテキストデータを予め渡して置き、そこから話す内容を決めてくれる機能。この機能を使うことで、
Instructionsには指示量に制限があったその制限をなくすこともできる。
また答えの質をあげることができる。あらかじめマニュアルを読み込ませておけばそのマニュアルから答えを教えてくれるようになる。

簡単に言うと学校のテストをするときに教科書を見ながら解いていくようなものです。これまではChatGPTがこれまで学んだことからそれらしい返答をしていたのが、答えるときにマニュアルを読んで、それをもとに答えてくれるようになります。

型式はいろいろあるので好きな形で。ネットにPdfがない場合はtextにコピペして貼り付けて作成。
```
".c", ".cpp", ".docx", ".html", ".java", ".json", ".md", ".pdf", ".pdf", ".php", ".pptx", ".py", ".rb", ".tex", ".txt"
```

UnityならマニュアルをDLしてきてChatGPTにUploadするだけ、・・・・・・だったならいいが少し手間が必要。

https://docs.unity3d.com/ja/2022.3/Manual/OfflineDocumentation.html

とりあえずマニュアルDL

HTMLをテキストに変換どんな方法でもよい。わたしはこれでMarkDownにして情報の構造化した。１つのファイルした。

http://nekomimi.la.coocan.jp/freesoft/h2tconv.htm

Kcowledgeには制限があるので１ファイル15000文字くらいで分割
制限上限は不明、たぶんこれくらい。
```
ファイル数20個
最大 512 MB
文章の1.5万字前後
```

このままだと一つのファイルが大きいので分割。 powarshellを利用してみた。
これもGPTに作ってもらった


```Split-TextFile.ps1
param(
    [string]$InputFile,
    [int]$LinesPerFile = 1000
)

if (-not (Test-Path $InputFile)) {
    Write-Host "指定されたファイルが見つかりません: $InputFile"
    exit
}

$encoding = [System.Text.Encoding]::GetEncoding("shift_jis")
$reader = New-Object System.IO.StreamReader($InputFile, $encoding)

try {
    $fileCount = 1
    while (!$reader.EndOfStream) {
        $outputFile = "$InputFile-part$fileCount.txt"
        $writer = New-Object System.IO.StreamWriter($outputFile, $false, $encoding)
        try {
            for ($i = 0; $i -lt $LinesPerFile; $i++) {
                if ($reader.EndOfStream) { break }
                $line = $reader.ReadLine()
                $writer.WriteLine($line)
            }
            Write-Host "$outputFile を作成しました。"
        } finally {
            $writer.Close()
        }
        $fileCount++
    }
} finally {
    $reader.Close()
}

Write-Host "分割が完了しました。"

```

コマンド 30000行で分割したらうまくいった。
```
.\Split-TextFile.ps1 -InputFile "test.txt" -LinesPerFile 30000
```
完成　これをChatGPTに読み込ませる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/88a5b8e1-a2e6-5e0c-a941-828602b30f0d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/f1a08ba4-22f3-dcaf-96de-20b1146e33bb.png)




InstructionsにKnowledgeを使用することを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/bcc8e686-7be6-c77b-2431-ba6259c2188a.png)




Unityのマニュアルの文章
```
オーディオスペーシャライザープラグインを有効にする
オーディオスペーシャライザープラグインを含むパッケージをプロジェクトに追加した後に、プロジェクトのオーディオ設定でプラグインを有効にできます。

プラグインを有効にするには

Project Settings ウィンドウを開きます (Edit > Project Settings)。
Audio カテゴリーを選択します。
Spatializer Pluginの ドロップダウンメニューからプラグインを選択します。
```
質問内容
```
オーディオスペーシャライザープラグインを有効するには？
```
ChatGPTの答え
```
Unityでオーディオスペーシャライザープラグインを有効にするには、プロジェクトのオーディオ設定からプラグインを選択して

有効にします。具体的には、Project SettingsからAudioカテゴリーを選択し、

Spatializer Pluginのドロップダウンメニューから必要なプラグインを選ぶことにより行います。
```

かなりマニアックな情報でもKnowledgeにあれば返答してくれる。

そしてここから重要な話で、今までInstructionで指定した内容を別の指示書としてKnowledgeに読み込ませることができる。

つまり実行手順ファイルをつくり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/be0916ce-6b60-0a00-7994-e877dc3213c4.png)
Instructionの中身を書いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/8491929c-ff9f-11ce-b01a-fe0ae9c8fddf.png)

GPTのInstructionには手順に従ってとかくと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/a07cff2c-2d05-7582-ab44-cba67d7dd40c.png)

手順通りに実行できる。これを応用すればかなり複雑なことをChatGPTに実行させることができる。

## Code interpreter
これはChatGPTをコードの実行者のHubとして機能してもらうというものです。あらかじめ完成したアプリケーションの作成は必要ですが、その作成もChatGPTやネットを駆使して作成すればかなり強力な機能です。

具体的には
Pythonコードを書く（ChatGPTでも生成できる）
```
def Main01():
    print("Main01実行")

def Main02():
    print("Main02実行")

```
作成したファイルをKnowledgeにアップロード
CodeInterpreterにチェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/847d0749-17dd-8271-671d-21cf2d563ddc.png)

Instructionを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/1ef2b861-eb73-ea49-b1d6-447c6cf82b93.png)

すると
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/2c9b33f7-2a9f-4b6f-ed1f-03cd19e1aceb.gif)

Instructionで指定した通りPythonTest.pyの関数を呼び出すことができる。
これを応用すればPythonで出来ることはすべてできるようになる。
可能性が広がる！

### VisualStadioの躓きポイント
エンコードでひっかかったので記しておく。保存時は
ファイル＞名前を付けて保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5b9aaefc-3442-f0b7-3db5-af084f547c9b.png)
エンコード付き保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/83ad4e55-ec45-dc08-50c1-4335870d60c6.png)
UTF8　sigなしを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5546958b-a846-5330-9e17-01b0ef12da11.png)

上の方にSigつきもあるがこれだとChatGPTで実行時に文字化けする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/ece85387-6652-80a3-af4c-d3e2f8d8b854.png)


## おまけ Action
これはChatGPTでAPIを使う機能だけど有料が多いし、詳しい説明は他のサイトへ。


## おわりに
ChatGPTは非常に便利だが道具であることにかわりない。難しいことをさせるよりも単純なことをさせた方が今のところうまくいきそう。誰にでもできるけど自分でやるのは面倒なこととか。


## 参考サイト

https://www.youtube.com/watch?v=nUasFvpu42A&t=129s

https://www.youtube.com/watch?v=GCwEIvzxPSc&t=722s

https://qiita.com/tutttuwi/items/087d681c1e00d93b126b