GPTを利用して言葉でPCを操作したい！（プロンプト編）

# はじめに

GPTが出現してからいろいろな利用形態が散見されるが、まだパソコンを操作しようという試みが見当たらなかったのでやってみた。
今回やった方法は、コマンド操作に関してはおそらくすぐに実用に耐えるものができそうにも感じた。
画面操作に関しては、画像とテキスト同時にAPIに送るればできそうだが、今回は簡易的に、操作の説明を付けている。


# 概要

概要は独り言みたいなものなので、読み飛ばしてもらって構わない。

モデルは、GPT3-turboを利用する。操作には速度がいるので、GoogleのBirdもあるが、試験的だそうなので今回はOpenAI製のGPTさんをお迎えすることにする
今回は、簡単な操作で設定画面を開いたり、メモ帳を開いたり、コマンド打ったりすることにしよう。

まずどうやって操作するかだが、

ユーザ入力　→　GPT　→　解析　→　操作

という風にしてみる。

GPTの出力はプログラムで解析できるようにJson形式で出力していただく方が扱いやすいのでそのようにプロンプトを記述する。

GPTのテキスト出力がJson形式だと、どんなサービスを作ろうともいとも簡単にGPTさんを組み込むことができると思う(*'ω'*)

例えば、入力されたテキストからブラウザで検索して結果を出したいときに、GPTに調べるとよさそうな言葉の羅列を考えてもらって、その優先順位ごとにJsonに纏めてもらって、それをもとに検索して結果を出力するとか。

話がそれたが、要はお堅いプログラム様に柔らかいGPT様が指示を出すためには、そのつなぎ言葉としてJsonがいいのではということだと思っただけ('ω')

# 仕組み

GPTにあらかじめPCを操作する方法をJson形式で出力してくれるようにプロンプトを作成し、その出力結果を利用して操作しようというもの

プロンプトを以下のように設定してみる。
プロンプトジャックみたいな対策はしていません。
拡張子をpmptにすることでプロンプトを記述したファイルだとしよう。

```pmpt:prompt.pmpt
あなたはこれから仮想的にパソコンの操作をするとします。
そのために、パソコンを操作していただくための方法を記します。
以下の通りに出力すると、操作ができるとみなしてください。
出力はJson形式です。
以下は出力のフォーマットです。
'''
[
    {
        "type" : "操作のタイプが入ります。この形式は\'native\'です",
        "data" : {
           "cursol" : {
                "x" : "座標X",
                "y" : "座標Y",
                "state" : "ボタンのPush状態、ClickDownだと、1、ClickUpだと2",
                "type" : "ボタンの種類です。右クリックだと1、左クリックだと2"
            }
        }
        "description" : [
            "操作の説明が入ります。",...
        ]
    },
    {
        "type" : "操作のタイプが入ります。この形式は\'cmd\'です",
        "data" : {
            "cmd" : [
                "コマンドプロンプトで実行できるコマンドが引数付きで入る",...
            ]
        }
        "description" : [
            "操作の説明が入ります。",...
        ]
    },...
]
'''
連続で操作する場合は、リストに追記してください。
...がついている場合は、リストに追記できる場所とします。
尚、場所については以下に明記します。

'''
Windowsボタンは座標10, 20にあるとします。
設定ボタンは50,30にあり、Windowsボタンを押した後に機能します。
色の設定は100,20,にあり、設定ボタンを押すと出現します。
'''

Json以外の出力はしないでください。

それでは以下から操作を開始します。
```
こんな感じで具体例を挙げることで、正しく出してくれるようになる。
このプロンプトを`setting.pmpt`というファイルとして保存し、APIにリクエストを送るプログラム側で、そのファイルを読み込んで、systemプロンプトとして設定することにします。

# 実行してみる

これをsystemに設定して、userで次のように問いかけてみる。

```
色の設定を開いてください
```

```
コマンドプロンプトで新しいファイルを作り、その中にHelloと記述してください。ファイル名はAです
```

すると次のように出てきます。

```
[
    {
        "type": "native",
        "data": {
            "cursol": {
                "x": 10,
                "y": 20,
                "state": 1,
                "type": 2
            }
        },
        "description": [
            "Windowsボタンを押下します。"
        ]
    },
    {
        "type": "native",
        "data": {
            "cursol": {
                "x": 50,
                "y": 30,
                "state": 1,
                "type": 2
            }
        },
        "description": [
            "設定ボタンを押下します。"
        ]
    },
    {
        "type": "native",
        "data": {
            "cursol": {
                "x": 100,
                "y": 20,
                "state": 1,
                "type": 2
            }
        },
        "description": [
            "色の設定を開きます。"
        ]
    }
]
```
```

[
    {
        "type": "cmd",
        "data": {
            "cmd": [
                "echo Hello > A.txt"
            ]
        },
        "description": [
            "コマンドプロンプトで新しいファイルを作成し、その中に"Hello"と記述します。",
            "ファイル名は"A.txt"です。"
        ]
    }
]
```

何ということでしょう、画面操作はともかく、コマンドプロンプトに関しては実際に実用に耐えそうなレスポンスが返ってきました。

後はこれをプログラム側でJson形式を解析し、実際に操作するだけです。
まだプロンプトは再考する必要はありますが、とりあえずの仕組みはこれでも実行できそうですね('ω')


# もっと難しい操作

最も図かしい操作について、できるかどうかを試してみました。
画面操作はいったん置いといて、コマンド操作にフォーカスしてみます。

```
コマンドプロンプトを利用してHelloworldを表示するC言語プログラムが書かれたファイルを作成してください。
```

```
[
    {
        "type": "cmd",
        "data": {
            "cmd": [
                "echo #include <stdio.h>\n\nint main() {\n printf("Hello, World!");\n return 0;\n} > hello.c"
            ]
        },
        "description": [
            "C言語プログラムを含むファイルを作成します。"
        ]
    }
]
```

なんかできそうなのが出力されました

# まとめ

ということで、プロンプトを制御することでJson形式で出力し、それを用いてコマンドライン操作をすることが可能になりました！。　画面操作はまだ再考の余地ありですね

これはChatGPT上でしか試してませんが、組み込みで利用するときは、Open AI API を利用してレスポンスを取得すると実際に操作できるようになると思います。

ただGPTもAIなので、たまにJsonが崩れたものを出したりするので、その場合に再度出力を行うコードにしたり、再試行回数を設定したりすると、画面操作の自動化が実現できそうな感じでワクワクしています。

誰か、応用できそうな点とか、改善点とかあれば共有してくれるありがたいです('◇')ゞ
ではでは～