8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ターミナルで質問、AIが答える!新時代のコマンドラインツール “askchatgpt”をぜひ使って欲しい

Last updated at Posted at 2023-08-02

みなさん、gitのコミットメッセージとAuthorだけを一発で表示するコマンド、すぐに打てますか? 私はそれがちょっと難しいです。

でも、この新しいスクリプトを使えば、それが可能になります。

「askchatgpt」コマンドの誕生

ここで「askchatgpt」という新しいコマンドをご紹介しましょう。その一部をここに示します。

$ askchatgpt 'gitでコミットメッセージとauthorだけ表示'
git log --pretty=format:'%h - %an, %s'

なんとターミナルで質問し、AIが答えてくれる時代がやってきました!

様々な使い方

さらにこのコマンドは、単なる文字列の置換から、一般的な質問まで対応しています。

$ askchatgpt '"いっぱい"の"い"を"お"に置換'
echo 'いっぱい' | sed 's/い/お/g'
$ askchatgpt 'おなか痛いんだけどどうしたらいい?'
おなか痛い場合、以下の方法を試してみることをおすすめします…

そして、もし強制的にコマンドを返させたい場合は、「-f」オプションを追加します。

$ askchatgpt 'おなか痛いんだけどどうしたらいい?' -f
echo 'おなか痛い時の対処法は以下の通りです: 1. 休息をとる 2. 温かいお茶を飲む 3. 軽い運動をする 4. 胃薬を飲む 5. 食事を控える ただし、おなか痛い原因によっては医師の診断が必要な場合もあります。症状が重い場合や長期間続く場合は、早めに医師に相談してください。'

誰でも利用可能

もちろんこのスクリプトは、皆さんも利用可能です。スクリプトは以下の通りです。Pathが通る場所に配置し、実行権限を与えればすぐにでも利用できますよ。

#!/bin/bash

function_call_only=false

while (( "$#" )); do
  case "$1" in
    -f)
      function_call_only=true
      shift
      ;;
    *)
      query=$1
      if [ "$2" != "-f" ]; then
        function_call_only=false
      fi
      shift
      ;;
  esac
done

function call_openai_api {
    query=$( echo "$query" | sed 's/"/\\\"/g')
    
    function_call=$(if $function_call_only; then echo '{"name":"run_bash_command"}'; else echo '"auto"'; fi)
    local json='{
        "model": "gpt-3.5-turbo-0613",
        "messages": [{"role": "user", "content": "'"$query"'"}],
        "functions": [
            {
            "name": "run_bash_command",
            "description": "run bash command",
            "parameters": {
                "type": "object",
                "properties": {
                    "command": {
                        "type": "string",
                        "description": "bash command to run"
                    }
                },
                "required": ["command"]
                }
            }
        ],
        "function_call": '"$function_call"',
        "temperature": 0.1
    }'
    curl -s https://api.openai.com/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d "$json"
}

if [ -z "$OPENAI_API_KEY" ]; then
    echo "Error: OPENAI_API_KEY is not set. Please set the variable before running this script."
    exit 1
fi

json_data=$(call_openai_api "$@")

error_message=$(echo $json_data | jq -r '.error.message')
if [ "$error_message" != 'null' ]; then
  echo "$error_message"
    exit 1
fi

if [[ $(echo "$json_data" | jq -r '.choices[0].message.function_call.name') == "run_bash_command" ]]; then
  arguments=$(echo "$json_data" | jq -r '.choices[0].message.function_call.arguments' | jq -r '.command')
  echo $arguments
elif [[ $(echo "$json_data" | jq -r '.choices[0].message.function_call.name') == "python" ]]; then
  python_script=$(echo "$json_data" | jq -r '.choices[0].message.function_call.arguments')
  echo "$python_script"
else
  content=$(echo "$json_data" | jq -r '.choices[0].message.content')
  echo $content
fi

でもちょっと注意!

でも、このツールを使うときには注意が必要です。特に $() で囲って評価させると、それが実行されてしまいます。これは何が実行されるかわからないため、非常に危険です。

$ $(askchatgpt '今何時?')
18:32:24

なので、以下のような事はしないでくださいね。

$ $(askchatgpt 'フォーク爆弾を実行')

絶対にまねしてはいけません!

開発経緯

askchatgptがないときは、

1.毎回コマンドをGoogle先生に聞く

2.ChatGPTに聞く

の2択でした。

これらが面倒くさくなり、いちいちブラウザを開くことなく質問できないか、と思ってGPTに作らせた作ったスクリプトです。

私以外のエンジニアもコマンド全暗記していない限り、同じような問題に直面するかと思います。その時はぜひこの記事を思い出してください。

所感

開発を終え、使って3日目

今のところ操作感は良好です。

ブラウザを毎回開く必要がなくなったのがとても楽に感じます。

また、知らないコマンドをサジェストしてくれることもあるので、AIに頼り切って記憶力が退化するどころか知識が増えていきます。感覚的にはCopilotに近いです。

便利ではあるのですが、AIである以上すべてを任せきりにすることはできません。出力されたコマンドが意図通りのものか確認し、修正できる程度の知識が人間に要求されます。

まとめ

AIがコマンドラインツールに融合することで、我々の作業がよりスムーズになります。ターミナルで直接質問し、AIが答えてくれる「askchatgpt」。その活用の幅はあなた次第です!ただし、利用する際には十分注意してくださいね。

凄く便利ですが……

ある日突然、GPTがクソヤベぇコマンドをサジェストし、

あなたが実行しても私は何の責任も取れません\(^o^)/

$ askchatgpt 'ルートディレクトリ以下のファイルをすべて削除' -f
rm -rf /
$ askchatgpt 'ルートディレクトリ以下の権限をすべて000に変更'
chmod -R 000 /
$ askchatgpt 'フォーク爆弾を実行'
:(){ :|:& };:

(おわり)

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?