title | emoji | type | topics | published | published_at | ||||
---|---|---|---|---|---|---|---|---|---|
自動補完の未来: 操作の補完 dmacro への招待 |
😎 |
tech |
|
true |
2024-05-08 00:00 |
テキストエディタの入力支援の仕組みは以下のように進化してきました。
- 辞書データに基づく単語の補完(Vimの
CTRL-X
補完など) - 辞書データに基づくコード片の補完(スニペット補完機能)
- 文脈に応じたルールベースの単語の補完(Language Server Protocolなど)
- 生成AIを用いたより大きなコード片の補完(GitHub Copilot)
いずれの支援機能も登場当時は革命的として歓迎されてきました。では、次に来る革命的な支援機能は何でしょうか?私は操作の補完を提案します。現在の補完機能は、新しくコードを書く(いわゆる新規作成)のタスクに対応しています。しかし、日常的なコーディングのほとんどは新規作成のタスクではなく、編集・更新といった上書き操作です。ここを支援するべきではないでしょうか?
ところで、操作の補完はとても難しいです。テキストエディタの気持ちになって考えてみましょう。従来の補完機能は、現在表示されている画面上の文字列から新しい文字列を推測する、つまり値から値の操作だけで実装できます。しかし、操作の補完は異なります。文字列から実行されるべき操作(関数)を推測する必要があります。つまり、値から関数を推測する技術が必要になります。情報科学的に言えば高階の計算が必要になります。
では、これまでこのような機能は実装されていなかったのでしょうか?特にあの便利な生成AIなるものでエイヤッとできないのでしょうか?生成AIはCopilot Chatという形で部分的に達成しています。たとえばCopilotに「現在の行にある数字を全て、1ずつ加算して。」と指示します。すると、以下のようにCopilotはスマートに問題を解決します。
- Copilotは現在行を削除
- 1ずつ加算した文字列を推測
- 推測した文字で補完(新規作成のタスク)
これは生成AIの上手い使い方のようですが、以下の問題があります。
- 指示中に表われる操作の意味(作用)を全て把握しておく必要がある。
- そもそもやるべきことを指示しないといけない。つまり補完ではない。
- 従来の生成AIによる補完機能も文脈を入力として適切な指示を入力する必要がありましたが、最近は自動補完機能によって編集体験がかなり改善されました。
前置きが長くなりましたが、今回紹介するのは、上記の問題を解決する操作の補完のお話です。
この記事で紹介する操作の補完機能は既にメジャーなテキストエディタに実装されています。とくに、Emacsでの実装は歴史が古く2000 1993年から存在していました。この記事の作者は、そのEmacsの拡張機能を2024年にNeovim 0.10.0を対象に移植しました。
https://github.com/tani/dmacro.nvim
https://github.com/emacs-jp/dmacro
https://github.com/tshino/vscode-dynamic-macro
dmacroは以下のような補完を行うことができます。
テキストエディタの操作は殆どがキーボードからの入力です。これは文字を入力することだけでなく、カーソルの移動やVimでいうところのモードの変換やコマンド実行など、すべての操作がキーボードを通して行われます。
つまり、このキーボードからのキー操作の履歴を監視して、その履歴からもっともらしい操作を予測し補完しています。これはdmacroを発明した増井氏のもっとも重要な発見だと思います。
操作の補完を考えたとき、普通は、どの関数を用いれば良いかという高階の問題として頭を悩ますことになりますが、彼はこれをキーコードの補完という値の補完の問題に還元させました。そして次節で解説する補完アルゴリズムを開発したのです。
dmacroによる操作の補完の予測アルゴリズムは2つあります。1つ目は単純な繰り返し操作に基づく予測です。2つ目は繰り返しの予測に基づく予測です。以下に図と解説を載せます。
-
もし同じ一連のキー操作が二度繰り返されたら、dmacroはそのキー操作を予測に用いる。
graph LR start(( )) --> a1((a)) subgraph 1st a1 --> b1((b)) b1 --> c1((c)) end subgraph 2nd c1 --> a2((a)) a2 --> b2((b)) b2 --> c2((c)) end subgraph 3rd c2 --> dmacro(dmacro) dmacro -.- a3((a)) subgraph MacroExecution a3 -.- b3((b)) b3 -.- c3((c)) end end c3 --> quit(( ))
-
もし現在入力中の一連のキー操作が、過去の一連のキー操作の部分列になっていたら、まず、残りの一連のキー操作を補完候補にする。そして2回目以降は、一連のキー操作全体を補完候補にする。
graph LR start(( )) --> a1((a)) subgraph 1st a1 --> b1((b)) b1 --> c1((c)) end subgraph 2nd c1 --> a2((a)) a2 --> dmacro1(dmacro) dmacro1 -.- b2((b)) subgraph MacroExecution_1 b2 -.- c2((c)) end end subgraph 3rd c2 --> dmacro2(dmacro) dmacro2 -.- a3((a)) subgraph MacroExecution_2 a3 -.- b3((b)) b3 -.- c3((c)) end end c3 --> quit(( ))
すでにMicrosoftのCopilotサービスがWordやExcelで実現していたり、テスラなどの自動車産業が自動運転として実現しているように、テキストエディタの入力支援も、もっと我々の実世界に近い部分での入力支援が行われていくのではないかと、dmacroの開発を通して思いを新たにしました。dmacroは非常に古典的なルールベースの予測アルゴリズムですが、生成AIの速度性能が向上すれば、生成AIベースの操作の補完も登場するのではと期待しています。そのとき、いち早くテキストエディタに実装できるよう、Emacs LispやVim Script、Neovim Luaの修練を積んでおこうと思います。
ぜひdmacroを活用して自動補完の未来を体験してみてください。
テキストエディタに詳しい諸氏からは、dmacroが2002 1993年に既にEmacsで実装されていることから、過去の技術ではないか?と指摘がありそうです。言い訳になりますが、それはEmacsのオーパーツ級の拡張性と増井先生の先見の明があってたまたま実現しただけであって、人類にとってはまだ未来の技術だろうと思い、不誠実ながらこのタイトルをつけました。実は、未来の技術ではなくて過去の偉業を再発明しただけでした。
https://github.com/tani/dmacro.nvim
https://github.com/emacs-jp/dmacro
https://github.com/tshino/vscode-dynamic-macro
:::message 本記事はVim 駅伝の記事の一つとして執筆されました。 https://vim-jp.org/ekiden/ :::