Featured image of post EmacsとChatGPTが超合体して第二の脳を構築する「chatgpt-shell.el」

EmacsとChatGPTが超合体して第二の脳を構築する「chatgpt-shell.el」

大規模言語モデル(LLM)の登場以降、テキストベースの作業は大きく変わりつつあります。

個人的にはLLMは直接的な知識提供よりは、やはり自然言語操作における能力で真価を発揮すると考えています。 この能力は、ノート作成やブログ記事の執筆など、テキストベースの作業の効率を大いに向上させます。 私自身、Emacsのorg-modeを用いてメモシステムやブログの作成に取り組んでおり、EmacsにLLMを組み込むことで、この作業がさらに便利になっています。

本記事では、 chatgpt-shell を利用してEmacsにChatGPTを組み込む方法を紹介します。

ChatGPT and DALL-E Emacs shells + Org babel 🦄 + a shell maker for other providers - xenodium/chatgpt-shell
GitHub - xenodium/chatgpt-shell: ChatGPT and DALL-E Emacs shells + Org babel 🦄 + a shell maker for other providers

chatgpt-shellのセットアップ

chatgpt-shell をインストールします。MELPAからインストールできます。

1
(use-package chatgpt-shell :ensure t)

OpenAI API Keyの取得

chatgpt-shell はOpenAI APIを利用するので、API Keyが必要です。

https://platform.openai.com/api-keysから Create new secret key を選択して新しいシークレットを作成します。

Restricted scopeを選ぶ場合は以下のAPIが使える Model capabilitiesWrite 権限で付与します。

  • /v1/audio
  • /v1/chat/completions
  • /v1/embeddings
  • /v1/images
  • /v1/moderations

PassによるAPI Keyの保存

OpenAIのAPI KeyをEmacsから利用するために、今回はPassを使います。

Pass: The Standard Unix Password Manager

PassはコマンドラインベースのPassword Managerです。Debian系では apt でインストールできます。

1
sudo apt install pass

Passでは保存される情報はGPGを使って暗号化されるため、まずGPGのKeyを作成します。

1
gpg --full-generate-key

プロンプトに沿ってKeyが作成できたら、 gpg --list-secret-keys --keyid-format=long と実行してKey IDを確認します。

1
2
3
4
5
/Users/hubot/.gnupg/secring.gpg
~------------------------------------
sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid                          Hubot <hubot@example.com>
ssb   4096R/4BB6D45482678BE3 2016-03-10

上記の例では、 3AA5C34371567BD2 がKey IDになります。

このKey IDを使ってPassを初期化します。

1
pass init 3AA5C34371567BD2

この後 pass でストアが作成されたことが確認できます。

ストアができたらシークレットを保存します。

1
pass insert openai-key

EmacsからAPI Keyを利用する

Emacsからは auth-source 経由でPassからシークレットを取得できます。 GPGの復号は auth-source がやってくれます。利用時にEmacsからインタラクティブにGPGで設定したパスワードが要求されます。

上記の手順で作成したシークレットは、 openai-key で保存されていますので、 (auth-source-pass-get 'secret "openai-key") で取得できます。

chatgpt-shell のconfigに追加します。

1
2
3
4
(use-package chatgpt-shell
  :config
  (chatgpt-shell-openai-key (lambda ()
                              (auth-source-pass-get 'secret "openai-key"))))

chatgpt-shellの使い方

上記の手順でOpenAI API Keyの設定が完了していれば、準備は完了です。

Chat shellを使う

最も基本的な使い方として、ChatGPTのWebフロントのようにChatシェルを使って対話をすることができます。

以下は M-x chatgpt-shell を呼び出して、elispを生成している例です。コードのハイライトもできています。

Chatの出力を作業バッファに直接書いてもらう

M-x chatgpt-shell-prompt-appending-kill-ring でミニバッファにChat入力をして、出力をカレントバッファに直接書き出してもらうことができます。

ブラウザとEmacsを行き来したり、コピペする必要すらないので非常に便利です。

プロンプトテンプレートを登録して、よくやる作業をコマンド化する

chatgpt-shell にはリージョンで囲んだコードのユニットテストを書いてもらったり、文章の校正をお願いしたりするコマンドが用意されています。

これらは実際プロンプトテンプレートが書かれており、コマンドでリージョン内の文章と合わせてGPTのモデルに投げることで実現されています。

なので、同じように自分でプロンプトテンプレートを用意しておくことで独自のコマンドを作ることができます。 以下は英単語の意味と用例を特定のフォーマットで出力してもらうためのコマンド例です。

1
2
3
4
5
6
(defun my/chatgpt-shell-english-word (word)
  "Dictionary for a english word"
  (interactive "sWord: ")
  (chatgpt-shell-send-to-buffer
   (concat "あなたは英語の教師です。" word "の意味と用例を英和辞書形式で以下のorgフォーマットで出力してください。\n"
           "* 単語\n- 品詞:\n- 意味:\n- 用例:\n  1. 英文\n     日本語\n  2. 英文\n     日本語/n  3. 英文/n     日本語/n")))

(chatgpt-shell-prompt-query-response-style 'inline) としておくと、カレントバッファに出力してくれます。

まとめ

この記事では、EmacsにChatGPTを組み込む方法として、 chatgpt-shell のインストールと設定プロセスを説明しました。

chatgpt-shell は、テキスト編集やコーディングにChatGPTの能力を利用することを可能にし、直接的なテキスト入力、ChatGPTとのインタラクティブな対話、カスタムコマンドの作成など、 Webフロントで使うよりも一歩踏み込んだ効率的な使い方を実現できます。

EmacsにChatGPTを組み込むことで、ノートやコーディングを含むあらゆるテキストベースの作業効率を爆上げすることができるので、非常におすすめです。

今回は触れていませんが、 chatgpt-shell は他にもDALL-Eによる画像生成や org-babel との連携機能などもあるため、応用の可能性はまだまだありそうです。

Built with Hugo
テーマ StackJimmy によって設計されています。