aichat -- ChatGPT APIを利用したコマンドラインツールの紹介

2023/03/05に公開

OpenAI の Chat API をコマンドラインから使いたいと思ったので作りました。

https://github.com/tkawachi/aichat

チャット

$ aichat
user: ChatGPT API にアクセスするコマンドラインつくったのだけど、ブログタイトルは何がいいと思う?
assistant: 

「ChatGPT APIを利用したコマンドラインツールの紹介」
「ChatGPT APIを使った自動応答ツールの作成方法」
「ChatGPT APIを使って、簡単にチャットボットを作ろう!」
「ChatGPT APIを活用した、簡単な自然言語処理ツールの作成方法」
などが良いかもしれません。
user: ありがとう
assistant: どういたしまして!ただ、ブログの内容やテーマによっては適切なタイトルが異なる場合がありますので、少し詳しい情報を教えていただけますか?

要約

チャットするだけではなく、$HOME/.aichat/prompts/ に YAML ファイルを作っておくことで様々なタスクが実行できるようになります。

たとえば $HOME/.aichat/prompts/summarize.yml に次の内容を書きます。
$INPUT 部が入力に置き換えられて実行されます。 role に指定できるのは systemuser のみです。

messages:
  - role: system
    content: "次の内容を200文字程度で簡潔に要約しなさい"
  - role: user
    content: $INPUT

aichat の README.md を要約させてみましょう。

$ aichat summarize < README.md 
aichatは、OpenAIのChatAPIをコマンドラインから使用するためのプログラムです。
OPENAI_API_KEY環境変数にAPIキーを設定する必要があります。実行すると、ターミナル上で対話
することができます。また、`aichat foo`コマンドを使用することもできます。
`$HOME/.aichat/prompts/foo.yml`にプロンプトテンプレートを配置することで、`foo`の部分を
任意の名前に置き換えることができます。コマンドライン入力は`$INPUT`に埋め込まれ、APIに送
信されます。

ばっちりですね!

コードレビュー

次はコードレビューにトライしましょう。
$HOME/.aichat/prompts/review.yml に次の内容を書きます。

messages:
  - role: system
    content: |-
      与えられたプログラムの差分を読み、次の観点でレビューしてください。
      - 変更の目的(40文字以内。1行で)
      - より詳細な説明
      - (Optional) 改善するためのアドバイス
      - (Optional) セキュリティ上の問題
  - role: user
    content: $INPUT

temperature: 0

temperature は 0~1 の小数で、数字が高いほどランダム性が高まります。
コードレビューではあまり適当なことを言ってほしくないので0にしてあります。
差分を食わせるとレビューしてくれます。
次の例では この差分 を対象にしています。

$ git diff 6b1af39^..6b1af39 | aichat review
- 変更の目的:Prompt構造体にtemperatureとmax_tokensを追加し、prompt.yamlファイルから読
み込むようにする。
- Prompt構造体にtemperatureとmax_tokensを追加し、prompt.yamlから読み込むように変更され
ています。また、aiChat.client.CreateChatCompletionのTemperatureとMaxTokensには、
prompt.yamlで定義された値が優先されます。これにより、より柔軟なAIチャットが実現されま
す。
- アドバイス:特にありません。
- セキュリティ上の問題:特にありません。

それなりにレビューになっていそうな気がします。

コミット前にスペルミスをしていたことがあったのですが、その時はこのように優しく教えてくれました。

- アドバイス:`Tempareture`は`Temperature`のスペルミスであるため、修正することをお勧めします。

コミットメッセージ作成

私は英語でコミットメッセージを書くのが苦手なので、それもトライしてみます。
$HOME/.aichat/prompts/commit-message.yml に次の内容を書きます。

messages:
  - role: system
    content: |-
      Read the diff for the given program and create a Git commit message, the first
      line should be a title of no more than 80 characters, the second line should 
      be blank, and the third and subsequent lines should be a description of the 
      diff. The description should be a brief summary of the important points, no 
      more than 80 characters long, with a line break.
  - role: user
    content: $INPUT

temperature: 0

先ほどと同じように この差分 に対して実行してみます。

$ git diff 6b1af39^..6b1af39 | aichat commit-message
Add support for temperature and maxTokens in prompts

This commit adds support for setting the temperature and maxTokens options
in prompts. It introduces two new functions, `firstNonZeroInt` and
`firstNonZeroFloat32`, which return the first non-zero value in a list of
integers or floats. In the `main` function, the temperature and maxTokens
options are set based on the values in the prompt, if they are non-zero.

冗長ですがまちがったことはいってなさそうです。

実際に使うときは git commit -t <(git diff --staged | aichat commit-message) といったコマンドラインで、生成したメッセージが入った状態で編集を開始できます。
日本語のほうが望ましいときは YAML の内容を調整すればOKです。

まとめ

いろんな prompt を YAML を書くだけで気軽にAI活用できちゃいます。無限大の可能性を感じます。
日々のコマンドプロンプトに一服の清涼剤を加えてみてはいかがでしょうか。

良い prompt ができたら、私にもこっそり教えてください!

追記

https://github.com/tkawachi/my-aichat-prompts にお試し中のプロンプトを置いておきますので、ぜひ遊んでみてくださいね

Discussion