fix
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed

This commit is contained in:
Rikuoh Tsujitani 2024-09-30 22:17:10 +09:00
parent 046e554cac
commit db3ab077f8
Signed by: riq0h
GPG key ID: 010F09DEA298C717

View file

@ -5,35 +5,35 @@ draft: false
tags: ['tech'] tags: ['tech']
--- ---
LLMの技術的成果が日に日に突きつけられて喉元まで迫っているのを感じる今日この頃、さすがにろくに使いこなせないのでは困るためついにGithub Copilotを試すことにした。LLMを応用した検索エンジンPerprexyは以前から使っていたが、開発環境と密に統合されるとどんな恩恵が得られるのかはやはり気になるところである。 LLMの技術的成果が日に日に突きつけられて喉元まで迫っているのを感じる今日この頃、さすがにろくに使いこなせないのでは困るためついにGithub Copilotを試すことにした。LLMを応用した検索エンジン[perplexity.ai](perplexity.ai))は以前から使っていたが、開発環境と密に統合されるとどんな具合になるのかはやはり気になるところである。
僕の開発環境はNeovimなのでそれにしたがってCopilotを設定していく。Github Copilotは最低月額10ドルからのサブスクサービスなのだが、契約完了時に送られてきたクイックガイドにNeovim向けのものがあったのには少々驚かせられた。大抵Vim向けの設定は各々が手弁当で勝手に生やしている印象が強かったからだ。なんならNeovimのプラグインも公式で用意されている。 僕の開発環境はNeovimなのでそれに合わせてCopilotを設定していく。Github Copilotは最低月額10ドルからのサブスクリプションサービスなのだが、契約完了時に送られてきたクイックガイドにNeovim向けのものがあったのには少々驚かせられた。大抵Vim向けの設定は各々が手弁当で勝手に生やしている印象が強かったからだ。なんならNeovimのプラグインも公式で用意されている。
だが、本稿ではあえて用いず有志がLuaで書き直したcopilot.luaの方を使う。公式のものと比べて処理の効率化が図られている。プラグインマネージャにはlazy.nvimを使うものとする。まずは下記の通りにプラグインを導入して起動時に読み込まれるように設定する。 だが、本稿ではあえてこれを用いず有志がLuaで書き直した[copilot.lua](https://github.com/zbirenbaum/copilot.lua)の方を使う。公式のものと比べて処理の効率化が図られている。プラグインマネージャには[lazy.nvim](https://github.com/folke/lazy.nvim)を用いる。まずは下記の通りにプラグインを導入して起動時に読み込まれるように設定する。
```lua ```lua
---lazy --lazy
{ "zbirenbaum/copilot.lua", cmd = "Copilot" }, { "zbirenbaum/copilot.lua", cmd = "Copilot" },
---copilot --copilot
require("copilot").setup({ require("copilot").setup({
suggestion = { enabled = false }, suggestion = { enabled = false },
panel = { enabled = false }, panel = { enabled = false },
}) })
``` ```
上記の設定で`suggestion`がfalseな理由は標準とは異なる形でコード支援を受けるためだ。`true`にすると任意のキーでエディタ上にコードの予測が現れる。また、`auto_trigger`を項目に追加して`true`に設定すると自動的に表示されるようになる。しかし、本稿では補完プラグインのnvim-cmpと連携を行うため、これらは無効化しておく必要がある。 上記の設定で`suggestion`が`false`な理由は標準とは異なる形でコード支援を受けるためだ。`true`にすると任意のキーでエディタ上にコードの予測が現れる。また、`auto_trigger`を項目に追加して`true`に設定すると自動的に表示されるようになる。しかし、本稿では補完プラグインの[nvim-cmp](https://github.com/hrsh7th/nvim-cmp)と連携を行うのでこれらは無効化しておく必要がある。
次に、一旦Copilotの認証を済ませる。プラグインが読み込まれた後に`:Copilot auth`を実行すると、時限制のトークンコードと共にGitHubの認証ページ案内される。自前で作成したファイルにsecretを格納する形式かと思っていたので、さすが今時は違うなと素直に感心した次第だ。 次に、一旦Copilotの認証を済ませる。プラグインが読み込まれた後に`:Copilot auth`を実行すると、時限制のトークンコードと共にGitHubの認証ページ案内される。自前で作成したファイルにsecretを格納する形式(誤って公開リポジトリに上げて後で痛い目を見るやつ)かと思っていたので、さすが今時は違うなと素直に感心した次第だ。
続いてnvim-cmpと連携を行う。標準設定ではエディタ上に薄くハイライトされるが、この設定では補完候補の一つとして表示される。個人的には、納得のいかないサジェストが前面にぶわっと出るより補完候補の一つに収まってくれる方が好ましいと感じる。nvim-cmp本体の詳細な設定は割愛させて頂く。 続いてnvim-cmpと連携を行う。標準設定ではエディタ上に薄くハイライトされるが、この設定では補完候補の一つとして表示される。個人的には、時として納得のいかないサジェストが前面にぶわっと出るより補完候補の一つに収まってくれる方が好ましいと感じる。nvim-cmp本体の詳細な設定は割愛させて頂く。
```lua ```lua
---lazy --lazy
{ "zbirenbaum/copilot-cmp", config = true, event = "InsertEnter" }, { "zbirenbaum/copilot-cmp", config = true, event = "InsertEnter" },
---nvim-cmp --nvim-cmp
local cmp = require("cmp") local cmp = require("cmp")
--他の設定は省略 --他の設定は省略
@ -41,7 +41,7 @@ local cmp = require("cmp")
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = "nvim_lsp", max_item_count = 15, keyword_length = 2 }, { name = "nvim_lsp", max_item_count = 15, keyword_length = 2 },
{ name = "vsnip", max_item_count = 15, keyword_length = 2 }, { name = "vsnip", max_item_count = 15, keyword_length = 2 },
{ name = "copilot", max_item_count = 15, keyword_length = 2 }, -- copilotを補完ソースに追加する { name = "copilot", max_item_count = 15, keyword_length = 2 }, --copilotを補完ソースに追加する
{ name = "nvim_lsp_signature_help" }, { name = "nvim_lsp_signature_help" },
{ name = "buffer", max_item_count = 15, keyword_length = 2 }, { name = "buffer", max_item_count = 15, keyword_length = 2 },
}), }),
@ -50,7 +50,7 @@ sources = cmp.config.sources({
local capabilities = require("cmp_nvim_lsp").default_capabilities() local capabilities = require("cmp_nvim_lsp").default_capabilities()
``` ```
`max_item_count`は補完候補の最大量で`keyword_length`は補完が発動する最小のキーワード数を意味する。デフォルト値で差し支えなければ削っても構わない。上記では他にも`sources`に補完ソースが記述されているが、どれも個別に設定していなければ動かない点に留意されたし。 `max_item_count`は補完候補の最大量で`keyword_length`は補完が発動する最小のキーワード数を意味する。デフォルト値で差し支えなければ削っても構わない。上記では他にも補完ソースが記述されているが、当然ながらどれも個別に設定していなければ動かない点に留意されたし。
```lua ```lua
local lspkind = require("lspkind") local lspkind = require("lspkind")
@ -65,7 +65,7 @@ formatting = {
}, },
``` ```
lspkind.nvimを利用している場合は`formatting`に続く項目で補完候補のシンボルに任意の絵文字を配置できる。きれいな絵文字が並んでいるとモチベが上がるのでぜひ設定したい。なお、次候補の選択をTabキーで行っている人は以下の特殊な設定を追記する必要がある [lspkind.nvim](https://github.com/onsails/lspkind.nvim)を利用している場合は補完候補のシンボルに任意の絵文字を配置できる。きれいな絵文字が並んでいるとモチベが上がるのでぜひ設定したい。なお、次候補の選択をTabキーで行っている人は以下の特殊な設定を追記しないとバグるらしい
```lua ```lua
local has_words_before = function() local has_words_before = function()
@ -88,16 +88,16 @@ cmp.setup({
}) })
``` ```
以上の設定でGitHub Copilotの提案が補完候補に表示されるようになる。不要な時は次の候補に飛ばせばいいだけなので使いやすいと思われる。たとえCopilotの重要性が今後増してくるとしても、既存のLSPによる補完が依然有効なのは変わりない。 以上でGitHub Copilotの提案が補完候補に表示されるようになる。不要な時は次の候補に飛ばせばいいだけなので馴染みやすいと思われる。たとえCopilotの重要性が今後増してくるとしても、既存のLSPによる補完が依然有効なのは変わりない。
![](/img/337.png) ![](/img/337.png)
さて、これでCopilotの設定は終わりかと思いきや、実はそうではない。LLM最大の機能と言うべきは対話による改善なので、チャットができないことには魅力半減だ。しかし公式のCopilot.vimにも今回紹介した非公式の方にもチャット機能は備わっていない。そこで、CopiotChat.nvimというさらに別のプラグインを導入する。 さて、これでCopilotの設定は終わりかと思いきや、実はそうではない。LLM最大の機能と言うべきは対話による改善なので、チャットができないことには魅力半減だ。しかし公式プラグインにも今回紹介した非公式の方にもチャット機能は備わっていない。そこで、[CopiotChat.nvim](https://github.com/CopilotC-Nvim/CopilotChat.nvim)というさらに別のプラグインを導入する。
CopilotChat.nvimは名前通りCopilotとの対話機能を提供するプラグインである。数多くの連携プラグインが用意されており設定内容も多岐に渡るが、本稿では自由記述方式と、Telescopeと連携して定型文で質問を行う方法について記す。例によってTelescopeは導入済みとする。 CopilotChat.nvimは名前通りCopilotとの対話機能を提供するプラグインである。数多くの連携プラグインが用意されており設定内容も多岐に渡るが、本稿では自由記述方式と定型文で質問を行う方法について記す。後者には[telescope.nvim](https://github.com/nvim-telescope/telescope.nvim)との連携機能を用いている。
```lua ```lua
---lazy --lazy
{ "CopilotC-Nvim/CopilotChat.nvim", build = "make tiktoken" }, { "CopilotC-Nvim/CopilotChat.nvim", build = "make tiktoken" },
--CopilotChat --CopilotChat
@ -164,14 +164,14 @@ vim.api.nvim_set_keymap(
![](/img/338.png) ![](/img/338.png)
`ShowCopilotChatActionPrompt`ではTelescopeを呼び出す関数が定義されている。この機能のなにが嬉しいのかというとコーディング中に頻繁に用いるであろう質問文をショートカットキーで即時に呼び出せるところだ。質問文が固定されていると回答も一意に定まりやすい。 `ShowCopilotChatActionPrompt`ではtelescope.nvimを呼び出す関数が定義されている。この機能のなにが嬉しいのかというとコーディング中に頻繁に用いるであろう定型文をキーマップで即時に呼び出せるところだ。質問文が固定されていると回答も一意に定まりやすい。仮に定型文が100個くらいに増えてもtelescope.nvim由来の絞り込みで容易に対応できる。
他方、自由記述の入力は`CopilotChatBuffer`によって呼びされる。現在のバッファを対象に具体的な質問を行うことで、より高度な提案を引き出す効果が期待できる。ただし、Copilotはあくまでコーディング支援用のツールなので天気や時事問題、文章の校正などについて尋ねても回答は得られない。 他方、自由記述の入力は`CopilotChatBuffer`によって呼びされる。現在のバッファを対象に具体的な質問を行うことで、より高度な提案を引き出す効果が期待できる。ただし、Copilotはあくまでコーディング支援用のツールなので天気や時事問題、文章の校正などについて尋ねても回答は得られない。
![](/img/339.png) ![](/img/339.png)
たとえば、対応している質問を入力すると上記のような回答が得られる。期待以上に的を射た内容が多く、これがいつでも使えて月額10ドルなら十分割に合うと感じた。業務上のコードをむやみに読み取らせるのは下手をするとインシデントに発展しかねないが、工夫次第では活用できる見込みが高い。 有効な質問を入力すると上記の形式で回答が得られる。期待以上に的を射た内容が多く、これがいつでも使えて月額10ドルなら十分割に合うと感じた。業務上のコードをむやみに読み取らせるのは下手をするとインシデントに発展しかねないが、工夫次第では活用できる見込みが高い。
ホビーユースにおいて成果物そのものが目的の場合には、質問とコピペを繰り返しながら制作するアプローチも今時は考えられるだろう。専門技術を積んでいない人でも個人の需要に即したものが手に入るのはまさしく科学の進歩だと言える。 ホビーユースにおいて成果物自体が目的の場合には、質問とコピペを繰り返しながら制作を進めるアプローチも今時は考えられるだろう。専門技術を積んでいない人でも個人の需要に即したものが手に入るのは望ましい進歩の在り方だと言える。
あるいは勉強目的ですら、極めて短時間のうちに有機的なトライアンドエラーを繰り返せるという意味では、昔の写経プログラミングより効率的な学習効果が得られるかもしれない。いずれにしても、便利な道具の使い方を知っておいて損はない。 あるいは勉強目的ですら、極めて短時間のうちに有機的なトライアンドエラーを繰り返せるという意味では、昔の写経プログラミングより効率的な学習効果が得られるかもしれない。いずれにしても、便利な道具の使い方を知っておいて損はない。