LoginSignup
705
535

More than 1 year has passed since last update.

いちいちシェルコマンド思い出せないので、ChatGPTで自然言語からスクリプトを生成するツールつくった

Last updated at Posted at 2023-03-03

はじめに

ChatGPT APIが出たので早速さわってみました。せっかくなので何か便利なものをということで自分向けに使えそうなツールをつくっていたら
良いかんじに動作したのでご紹介します。

つくったものは、「ChatGPTを用いた自然言語によるシェルコマンドランチャー」です。百聞は一見にしかずと言うことでまずは動作するところをみてください。
japanese-usage.gif

概要

wannaコマンドは、ChatGPTを用いた自然言語によるシェルコマンドランチャーです。自然言語によって、bash scriptを生成し、名付けし、管理できます。

コマンドライン上での操作は簡単に多くのことを行うことができるため、非常に便利です。しかし、多くのコマンドやオプションの組み合わせを覚えておくのは熟練したプログラマでもむずかしく、Google検索やmanコマンドなどを駆使して思い出しながら実行することも多くあるでしょう。

たとえば、「このディレクトリの配下にあるすべての.pyファイルを再帰的に発見して、それらの行数の合計を出力する」 といったタスクを行おうとするとき、findxargswcなどのコマンドをどのように組み合わせたら良いのかを一発で思い出すのは中々難しいです。

wanna think

このようなときにwanna thinkコマンドを使います。

$ wanna think このディレクトリの配下にあるすべての.pyファイルを再帰的に発見して、それらの行数の合計を出力する

と打てば、AIアシスタントが自動的に次のようなbash scriptを生成します。

#!/usr/bin/env bash
find . -name "*.py" | xargs wc -l | awk '{total += $1} END{print total}'

あなたはただ、それをみて、実行するかしないかを決めれば良いだけです。

? What's next? (Use arrow keys)
 » Do
   Save
   Another Question
   Exit

あなたの依頼に対して、AIはスクリプトを生成し、その解説をします。
Doを選べば、提案されたスクリプトを実際に実行してその結果を表示します。
実行後に問題なく動作することを確認したら、保存をすることができます。

? I thought of the following names. Which one do you like? (Use arrow keys)
 » count_py_lines
   py_line_counter
   recursive_py_counter
   py_line_sum

そういえば、「コンピュータサイエンスで最も難しいことは"命名"である」とフィルカールトンも言っていました。
このAIは、生成したスクリプトに丁度良い名前も提案してくれます。あなたは、コードレビューアとして良さそうな名前を選ぶだけです。

wanna do

wanna doコマンドを使えば、過去に保存したコマンドを実行することができます。
ただ単にwanna doと入力すればインクリメンタルに保存済のコマンドを選び、実行できます。

$ wanna do

wanna-do.gif

$ wanna do random_passwords

のようにコマンド名を直接打って実行することもできます。

wanna list

記録済のスクリプトをリストアップします。

$ wanna list 
count_py_lines      :このディレクトリの配下にあるすべての.pyファイルを再帰的に発見して、それらの行数の合計を出力する
top_memory_usage    :メモリ使用量の多いプロセスを上位10個出力する
random_passwords    :ランダムに10個のパスワードを生成する

これを用いると、たとえば、こんなことができます。

$ wanna list | peco | xargs wanna do

wanna-list-peco.gif

インストール

インストールは、pipを用いて簡単にできます。python3.10以上の環境で動作します。

pip install wanna

また、OEPNAI_API_KEYを使うため、ご自身のアカウントでtokenを取得してください。

export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

雑感

さわってみて思ったのは、text-davinci-003よりも素直でプロンプトがストレートに記述できるのと、コードの中にthink_xxxxのような関数を定義しているときに、思考可能な何かをプログラムに組み込んでいる実感がわいてわくわくしました。

あわせてこちらもご一読ください。

本記事に関するイベントについて

登壇します。是非ご参加ください!

705
535
7

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
705
535