NeovimでAIの力を享受したいと思い、gen.nvimを使ってみました。
gen.nvimは、ローカルでLLMを動かせるOllamaをNeovimで使えるようにするプラグインです。
プラグインの他、curl
とOllama、Ollamaで扱うモデルが必要です。
まずはOllamaをインストールします。OSによって手順は違うため、READMEを確認しましょう。
macOS、Windowsであれば公式サイトからダウンロード、Linuxであれば次のコマンドを実行します。
インストール中、次のようにログが表示されました。
ちなみに筆者の環境はWSLです。上記にNvidia GPU detected.
とあるようにGPUはOllama側が勝手に見つけてくれるようです。
WSL特有の困りごとはありませんでした。
モデルを選んでダウンロードします。
今回は「よーしパパ、Ollama で Llama-3-ELYZA-JP-8B 動かしちゃうぞー」 - Qiitaを参考に、日本語のモデルLlama-3-ELYZA-JP-8B-GGUFを用意しました。
まずGGUFファイルのを開きCopy download link
を押し、ダウンロードリンクをコピーします。
次のコマンドで、コピーしたリンクからGGUFファイルをダウンロードします。
ファイル名やURLは適宜書き換えてください。
Ollamaで使えるようにするための「Modelfileファイル」を用意します。
ファイル名は各自わかりやすい名前にしておきます。筆者は~/models/elyza-model
に配置しました。
前述の「よーしパパ、Ollama で Llama-3-ELYZA-JP-8B 動かしちゃうぞー」を参考に書きます。
1行目のFROMの後./Llama-3-ELYZA-JP-8B-q4_k_m.gguf
がダウンロードしたGGUFファイルの名前です。
オプション-f
にさきほど作成した「Modelfileファイル」の場所を書きます。
elyza:jp8b
の部分が、今回のモデルにつける名前です。後で使います。
実行すると次のようなログが出ます。
作成に成功したようです。
モデルの名前を指定して実行します。
プロンプト>>>
が表示されるまで少し時間がかかります。
適当に質問して確認してみましょう。
終了するにはCtrl+dか/bye
を入力します。
ようやくgen.nvimのインストールです。各自のプラグインマネージャーに合わせて記述します。
筆者は次のように設定しました。デフォルト値以外の行をハイライトしています。
model
に作成したモデルの名前elyza:jp8b
を指定しました。
表示はsplit
を指定しました。プロンプトの表示させています。
:Gen Foo
のようにコマンドで実行します。
たとえば、開いているバッファのコードをレビューしたいならReview_Code
です。
Neovimを立ち上げてから1回目の:Gen Foo
の実行では、起動のために少々時間がかかる点に注意です。
用意されているプロンプトはgen.nvim/lua/gen/prompts.luaから確認できます。
よく使いそうなものを表にまとめました。
名前 | 内容 | バッファの書き換え |
---|
Generate | 入力をそのままモデルに聞く | あり |
Chat | 入力をそのままモデルに聞く | なし |
Ask | バッファの内容に関して質問する | なし |
Summarize | バッファの内容を要約 | なし |
Review_Code | バッファの内容をレビューさせる | なし |
Change_Code | バッファの内容を入力に合わせて書き換える | あり |
Make_List | バッファの内容をMarkdownのリストにする | あり |
Make_Table | バッファの内容をMarkdownのテーブルにする | あり |
バッファの内容に関係するなら:Gen Ask
、関係ないなら:Gen Chat
といった具合です。
プロンプトは自由に変更可能です。
たとえば、次のようにプロンプトを日本語化できます。
「プロンプトを日本語化したほうがいいのか、しない方がいいのか」についてはよく分かっていません。LLM周りで詳しい人いたら教えてください。
次のように独自のプロンプトも追加できます。
あくまでもモデルの学習の範囲内で答えが返ってきます。
gen.nvimで開かれるバッファのfiletypeはMarkdownです。textlintを有効化していると不要な実行・通知が出てきてしまいます。
そこで、LSP側でバッファの名前がgen.nvim
だった場合に無効化する設定を書きます。
たとえばnone-ls.nvimなら次のように設定します。
以上、gen.nvimの使い方でした。