Open32

Windows + GPUでローカルLLMを動かしてみる(LM Studio, Obsidian Copilot, VSCode拡張 continue)

Kesin11Kesin11

友人や同僚で生成AIに関わる人が増えてきたので今さらながらに興味が出てきた。
特に最近はCopilot+PCが発売されるなど今後はLLMをローカルで動かす時代になってきそうなのと、せっかく自分のゲーミングPCにはグラボが付いているのでこれを使ってみたい。

このスクラップはローカルLLMの分野はほぼ知らない状態からスタートしてキャッチアップした記録です。内容は不正確なことが多いでしょうし、ベストプラクティス紹介のような内容でもないです

一応この分野に関する自分の経験値はこんな感じです

  • Chat-GPTなどは無課金の範囲で使ったことがある
  • 勤務先で生成AIを使える環境はあるので要約とか文章整形などはたまに使う
  • GitHub Copilotはちょうど1年ぐらい使っている
  • Chat-GPTなどの生成AI系サービスのAPIを使ったことはない
Kesin11Kesin11

多分あとでちゃんと調べて追記するけど、
LM Studioはライセンス的に商用利用が怪しいっぽいので、趣味はともかく仕事で使えるかどうかは分からないので注意
自分は今のところプライベートで遊んでるだけ

Kesin11Kesin11

ローカルLLMを試してみたいがターミナルで色々なものをダウンロードしてmakeするような手間をかけたいほどではない。macでSuperWhisperを使ったことがあり、いまどきはモデルのダウンロードから実際に使うところまで全て面倒を見てくれるGUIアプリが存在する時代だと分かっているので、Windowsでもきっと何かあるでしょという予想。

そういうツールを探すにもまずある程度は流行りというものを把握する必要があるので、まずはローカルLLMに興味が湧いたきっかけのこの記事を改めて読み直してみる。記事の中でツールっぽいものを書き出して、順に見ていこう
https://soysoftware.sakura.ne.jp/archives/3903

  • Llama.cpp
  • Kobold.cpp
  • ollama
  • ObsidianのCopilotプラグイン

色々なモデル名前も紹介されているが、これらは後でまた見る。まずはモデルを動かすためのツールが先だ。意外とツールっぽいものは少ない。記事中でリンクされていたこっちの記事も見てみる
https://ascii.jp/elem/000/004/198/4198080/

  • LM Studio

LLama.cpp, ollamaあたりは名前を聞いたことがあったがそれ以外は初耳。順に見ていこう

Kesin11Kesin11

Llama.cpp

https://github.com/ggerganov/llama.cpp
https://note.com/kawamou/n/n076231811729

kawamouさんの解説記事が分かりやすかった。
Llama.cppは元々LLaMAのモデルを高速化したものだったが、今や他のLLMモデルを動かすランタイムとなっている。C++で書かれているのでCPUでの実行がPythonよりも高速な上にGPUにも対応している。
Llama.cppのためにモデルをGGUF形式に変換する必要があるが、今やHuggingFaceで色々なモデルが公開されている。

つまりLlama.cppは自分が求めているGUIツールではない

Kesin11Kesin11

ollama

https://ollama.com/
今どきのサイトらしからぬランディングページで何も説明しない系のサイトなので何もわからん。

https://zenn.dev/tanny/articles/705682d88e254e

llama.cpp LlamaをPC上で実行するための実行環境。実行のためにはソースをDLしてビルドする必要があり、手順がやや面倒。Llama以外のモデルも実行可能
ollama これもローカルLLMの実行環境。バックエンドでllama.cppを利用している。インストールや実行が簡単なので、今回はこちらを利用。

なるほど。llama.cppは推論の実行エンジンであって、モデルのダウンロードや実際にチャットのテキストを送るなどの処理を行うのは別のツールが担当することになっていて、ollamaはその1つという立ち位置か。

ollamaはLLMの実行環境ではあるけどGUIは持っていないので、よくあるチャットUIから呼び出したければまた別のollama-uiというChrome拡張などを入れる必要があるのか。

ということは、自分にとって理解しやすい用語の当てはめるとこういう関係になっていそう

  • 実行エンジン:Llama.cpp
  • バックエンド:ollama
  • フロントエンド:ollama-ui
Kesin11Kesin11

ObsidianのCopilotプラグイン

https://github.com/logancyang/obsidian-copilot

obsidianは自分も使っているmarkdownエディタで、これはそのプラグインという立ち位置。
昨今はMSやGitHubのおかげで生成AIによるサポートツールにCopilotという名前を付けがちだけど、まさにそういうプラグインっぽい。

Model selection of OpenAI, Azure, Google, Claude 3, OpenRouter and local models powered by LM Studio and Ollama.
Local model support for offline chat using LM Studio and Ollama.
To use Copilot, you need API keys from one of the LLM providers such as OpenAI, Azure OpenAI, Gemini, OpenRouter (Free!). You can also use it offline with LM Studio or Ollama!

このプラグインのウリはローカルLLMで使えることをアピールしているけど、ローカルLLMだけではなくてクラウドの有名なLLMも使えるらしい。なるほど、クラウドLLMもローカルLLMも能力に差はあれど行える仕事内容は一緒なので切り替えられるようになっているのか。賢い。
そしてLM StudioとOllamaが同じ概念として書かれているように見えるので、まだ調べていないけどLM StudioはおそらくOllamaと似たような機能を持ってそう。

ここでちょっと疑問に思うのはクラウドのLLMは多分API経由で呼び出すのだとして、ローカルのOllamaにとはどうやって連携するのか?

LM Studio and Ollama are the 2 best choices for running local models on your own machine. Please check out the super simple setup guide here. Don't forget to flex your creativity in custom prompts using local models!

連携方法のドキュメントは別ページにあるらしい

https://github.com/logancyang/obsidian-copilot/blob/master/local_copilot.md

LM Studioの方はコマンドを実行したりする必要はないらしく、 CORSについて注意する必要はあるみたいだけどそれ以外の説明が簡単すぎて逆にわからん。Local inference Serverという文字が見えたのでなんとなく想像は付くけど。

逆にollamaの方はCLIなのでもう少し複雑そうだけど、ログを見るとバッチリ Listening on 127.0.0.1:434 という見慣れた文字列が出てきた。
ということはollamaもLM StudioもHTTPサーバーとして立ち上げて、このプラグインはHTTP経由でローカルLLMに仕事を投げて結果を返してもらっているっぽいな。

へーーなるほど。ということは別にこのObsidianのプラグインに限らず、ローカルLLMに仕事を投げたいあらゆるアプリはollama達のHTTPサーバーにリクエストを投げれば済むので、数GBの大きさのモデルをアプリごとに内蔵する必要もないし、モデル自体もollama側でどれを動かすかを差し替えることができるってわけだ。

モデル(Llamaなど)、バックエンド(ollama、LM Studio、その他クラウドLLM)、フロントエンド(Obsidian Copilot)の全てが疎結合になっていて、すでにそういうエコシステムができあがっている時代だったのか。これは面白い

Kesin11Kesin11

LM Studio

https://lmstudio.ai/
https://note.com/catap_art3d/n/na01a94527f40

見た感じLM Studioはollamaと違って完全にGUIのアプリっぽい。GUIからモデルを検索してダウンロードできて、チャットのUIも内蔵されているっぽい。

これこれ、こういうのを求めていたよ!
Windowsのインストーラーも提供されているのでインストールも簡単そう。もしかしたら最終的にはollamaの方がCLIなので細かくカスタムできたりするかもしれないけど、Windowsの環境でとりあえず試すならこっちの方が簡単そう。

(そもそもローカルLLMについてググっているとほとんどの人がmacOSを使っていて、Windowsの記事が少なかったので確証はないが、WindowsはWindowとWSL(Linux)とで内部的にはほとんど別環境なのでWSL側にインストールした場合にCUDAのセットアップが面倒かもしれないと予想していた。なのでWindows側で実行されるWindowsのGUIアプリの方が絶対に簡単だろうと予想していた)

Kesin11Kesin11

LM Studioを起動するといきなり有名モデルをダウンロードする画面が出る

ほとんど知らないモデルだけどLlamaぐらいはさすがに聞いたことがあるのでとりあえずダウンロード済み。ちなみにモデルの詳細を見に行くとこのような画面になる

LLama 3のモデルがいっぱい並んでいて、8BとかQ4_Kとかの意味は先ほどのnoteのLM Studioの解説記事が詳しい。 FULL GPU OFFLOAD POSSIBLEPARTIAL GPU OFFLOAD POSSIBLE は最初意味が分からなかったが、モデルのサイズが大きいほどPARTIALになるのを見るにどうやら自分のグラボのメモリにモデルが乗り切るかどうかで変わるっぽい。
自分のGeForce RTX 3060 Tiは8GBなので、モデルサイズ6GBあたりがメモリに乗り切るかどうかのラインらしい。LM StudioのUIをよく見たら右上の方に Estimated VRAM capacity: 8.00GB と表示されているので多分これを見て判断してくれてそう。
モデルとメモリの関係の知識も0の素人なのでツールが自動で判断してくれるのはありがたい

Kesin11Kesin11

チャットの画面で実際にLlama 3の4.9GBほどのモデルをロードしてみる

Windows標準のタスクマネージャーでGPUの様子を観測してみると、モデルのロードが始まってからゴリッとGPUのメモリが使われる様子が分かる。
実際にチャットしてみるとこんな回答。多分GPT-4oとかには敵わないのだろうけど、結構それっぽい回答な気がする。

そして実際にGPUが使われたのかを見てみると、確かに2回チャットした瞬間にGPUの使用率がいきなり100%近くに到達している様子が分かる。これを見ると本当に自分のPCでLLMが動いたという実感が湧く。

Kesin11Kesin11

右側のUIはプロンプトやContext Lengthなど色々な設定が可能らしいが、今の自分の知識では何が何なのか全然わからん。一番気になるのはGPU Settingsのところで、LOW, 50/50, MAXのボタンがあるということはLLMを動かす際にGPUを何割使うかを設定できるということっぽい?
試しにLowにしてみるとGPUメモリの使用率がガクッと減った

この状態でチャットの Regenerate を押して再回答してもらうと、回答の速度が露骨に遅い。カクカクという感じw GPUの使用率も先ほどよりは全然上がっていないので確かにGPUへ割り振る仕事は大幅に減ったらしい。

Kesin11Kesin11

最初のモデル一覧での FULL GPU OFFLOAD POSSIBLEPARTIAL GPU OFFLOAD POSSIBLE の話と照らし合わせると、本来はGPUメモリに乗り切らない大きなモデルであってもGPUへのオフロード割合を減らせばおそらく使えるということなのだろう。その場合、GPUメモリに乗り切らない分は普通のメモリの方に載せられているのかな?

ということは、生成速度は落ちるけど高性能な大きいサイズのモデルを動かすか、低性能だけどGPUに100%乗る小さなモデルを高速で動かすかのトレードオフを自分で選択できるということになりそう。

よく見るとさっきのチャット画面のUIではプリセットと書かれているので、このGPUへのオフロード割合も含めてこのあたりの設定は自分で作っておいて用途に応じて切り替えるという使い方が想定されているのかな。

Kesin11Kesin11

右側のUIのよく見るとExport Chat Settingsという項目があり、そのSave Settings as Presetを押すと今の設定を保存できた。
一度保存したプリセットをLM Studio上でリネームしたりできるようなUIではなさそうだけど、設定自体はJSONで出力されているので多分エディタなどで適当に編集すれば直せそうな気はする。

LM Studioの使い方は大体わかった

Kesin11Kesin11

ObsidianのCopilotプラグイン

https://github.com/logancyang/obsidian-copilot
https://github.com/logancyang/obsidian-copilot/blob/master/local_copilot.md

obsidian-copilotのドキュメントに従って、CORSの設定をオンにしてLM Studioでローカルサーバーを立ち上げる

Obsidianにプラグインをインストールし、ctrl + pでチャットの画面をオンにして適当に挨拶させてみる

LM Studioのサーバーのログを見るとちゃんとリクエストが送られてきて、それに対して返答した様子が分かる。リクエストされたモデル名がgpt-3.5-turboになってるけど、これは意味ないというかLM Studio側が無視してそう

Kesin11Kesin11

obsidianからチャットが呼び出せるだけならLM Studioを使えばいいのであまり意味がなくて、Copilotが他にどういうことができそうなのかctrl + pで検索してみた

パッと分かりそうな機能として、要約とか翻訳を呼び出せるっぽい。
obsidianのエディタに適当な文章を書いてからctrl + pで要約や翻訳の機能を呼び出してみる

なるほど、要約だろうと翻訳だろうと結局はチャットのUIに集約されるということか。なんかこのあたりもうちょっとシームレスに統合されたUIを期待していたのだけど、チャットのUIをワンボタンでコピーできるならそんなに悪い使い勝手でもないかな

Kesin11Kesin11

他にもツイートに変換してくださいとか、用語を抜き出してくださいなどの機能がctrl + pから呼び出せる。
サーバーのログを見るに、これらが行っているのは結局のところ範囲選択したテキストの前に機能に対応するプロンプトを付けて、サーバーにリクエストしているだけらしい。

なるほどな。これだけで色々な機能を実現できるのがLLMのすごいところだし、この特徴のおかげでAPIの投げ先が各種クラウドのLLMだろうとローカルのLLMだろうと同じように機能するってことか。

ObsidianのCopilotプラグインも大体分かった。LLMにやらせたい仕事は今のところあまり思いつかないけど、何かやらせたくなったらローカルLLMに仕事をさせられるというのは面白いかな。

Kesin11Kesin11

これを調べていたときと関係なくyoutubeに流れてきたObsidian Copilotの動画を見てみたら、embdding modelとRAGについての機能紹介がされていた。
https://youtu.be/NSoKRYNlOls?si=rFFxpbLtU2l5E1EP&t=322

ローカルLLMでもRAGって可能なのか。embdding modelというものがそれを可能にするための技術なのだろうけど、今はその知識が全然無いので一旦後回し。
embddingについて理解したらまた改めてObsidian CopilotのRAGについて調べてみたい

Kesin11Kesin11

continue(VSCode extension)

Obsidian CopilotがローカルLLMを使える仕組みを理解すると、同様の仕組みでGitHub Copilotの代替をVSCode向けに作る人が絶対いるよね?と思って調べてみたら案の定見つかった。多分このcontinueというVSCodeとInteliJに対応しているやつが一番有名っぽい。

https://github.com/continuedev/continue

continueがどういう仕組みでローカルLLMを使うのかなど一番詳しい記事がこれだった
https://qiita.com/SH2/items/1d5ee5b898046ff89458

実際にローカルLLMにチャットで色々聞きながら開発した場合にどれだけやれるのか詳しくまとめてくれている
https://zenn.dev/genie_oh/books/ac400a090c8a09

Kesin11Kesin11

実際に自分でも試してみる。
まずcontinueとGitHub Copilotのタブ補完が競合しないように、自分はVSCodeのプロファイル機能でcontinue用のプロファイルを新規作成してそちらではGitHub Copiotをdisabledにした。

continueの設定は公式ドキュメントがollama推しっぽいのでこれをベースにして、LM Studioの用の設定とマージした。
https://docs.continue.dev/setup/configuration#local-and-offline-configuration
https://docs.continue.dev/reference/Model Providers/lmstudio

{
  "models": [
    {
      "title": "LM Studio",
      "provider": "lmstudio",
      "model": "second-state/StarCoder2-3B-GGUF"
    }
  ],
  "customCommands": [
    {
      "name": "test",
      "prompt": "{{{ input }}}\n\nWrite a comprehensive set of unit tests for the selected code. It should setup, run tests that check for correctness including important edge cases, and teardown. Ensure that the tests are complete and sophisticated. Give the tests just as chat output, don't edit any file.",
      "description": "Write unit tests for highlighted code"
    }
  ],
  "tabAutocompleteModel": {
    "title": "Starcoder 3b",
    "provider": "lmstudio",
    "model": "second-state/StarCoder2-3B-GGUF"
  },
  "allowAnonymousTelemetry": true,
  "embeddingsProvider": {
    "provider": "lmstudio",
    "model": "nomic-embed-text"
  }
}

modelはタブ補完用にオススメされているstarcoderをLM StudioでロードしてAPIサーバーを起動しておく。
https://docs.continue.dev/setup/select-model#autocomplete

チャット、タブ補完、embeddingsのそれぞれで別々のモデルを指定できるっぽいけど、少なくともLM Studioのサーバー機能では1つのモデルしかロードできなかったので、実際には機能ごとにモデルの切り替えはできなさそう?

Kesin11Kesin11

まずはチャットを試してみる。

何か明らかに人間向けじゃない回答してる・・・?一応英語でも質問してみる。

チャットのUIでの表示が崩壊してそう。右に出しているcontinueのログを見ると、回答自体はそれなりに正しい雰囲気を感じる。

このあたりはプロンプトを工夫する必要があるのかな?もしくはstarcoderモデル自体がチャットには不向きなのか。

Kesin11Kesin11

次はタブ補完
config.jsonでタブ補完のモデルを設定しているので動くはずだが、最初はなぜか動かなかった。たしか ctrl + shift + pで Continue: Toggle Auto Complete Enabledをする必要があったかもしれない。


エディタ上で緑のラインが引かれている部分が補完で出してくれた部分。 token, log-level というCLIのオプション名だけを与えて中身を補完で出してもらった。
GPUがゴリゴリ使われている様子が見れて楽しい。チャットだと自分が質問を書いている間はGPUはヒマをしているのに対して、コード補完は常に補完候補を出すために計算をしているっぽい。コード補完の方が意外にGPUをブン回すことになるのかもしれない。

Kesin11Kesin11

他のコードでもちょっとタブ補完を試してみたが、GitHub Copilotと比べるとだいぶ信頼性が低いという印象。それっぽいコードは出してくれるけど存在しないメソッドも普通に出してくる。初期の頃のGitHub Copilotよりもさらに危なっかしい感じ。

実装しようとしている関数にコメントなどを付けておくと、そこから意図を汲み取ろうとしている姿勢は感じ取れる。

一方で補完の速度は割と申し分なし。LM Studioの設定でGPUを100%使う設定にしてるからかな。

Kesin11Kesin11

continue自体にはもっと色々な機能があるようだけど、モデルの性能によって使えるか使えないかが変わってきそうなので、starcoder以外のプログラミング特化のモデルをもう少し揃えておこう

モデル沼だこれは・・・

Kesin11Kesin11

https://docs.continue.dev/features/tab-autocomplete
continueのドキュメントでタブ補完用のモデルとして starcoderdeepseek-coderがオススメされていたのでLM Studioで落としてみたが、タブ補完が動くものと動かないものがあった。
その違いが何なのか、というかそもそもタブ補完ってどういう仕組みで動いているのか?

VSCode上のcontinueのログを見てみると、こういう構造になっていた

Settings:
contextLength: 4096
model: TheBloke/deepseek-coder-6.7B-instruct-GGUF/deepseek-coder-6.7b-instruct.Q4_K_S.gguf
maxTokens: 1024
temperature: 0.01
stop: <|fim▁begin|>,<|fim▁hole|>,<|fim▁end|>,//,<|end▁of▁sentence|>,

,

,/src/,#- coding: utf-8,```,
function,
class,
module,
export,
import
raw: true
log: undefined

############################################

<|fim▁begin|>import dayjs from "dayjs";
import type { WorkflowReport, TestReport } from "../analyzer/analyzer.js";
import type { Exporter } from "./exporter.js";

....

    try {
      await s3.put(outputPath, JSON.stringify(reports));
      this.logger.info(`Export ${type} reports to ${outputPath}`);
    } catch (error) {
  <|fim▁hole|>
      

    }
  }

...

<|fim▁end|>==========================================================================
==========================================================================
Completion:

fim▁begin, fim▁hole,fim▁end このあたりのタグが何やら意味ありげ。ちなみにエディタ上でカーソルが存在している位置は fim▁hole
そして最後の Completion: が空なので補完候補が出てきていないということ。

正しく補完候補を出してくれるモデルの場合、最後のCompletionにこんな感じに何かしらが表示されている。

Completion:


      this.logger.error("Failed to export reports", error);
Kesin11Kesin11

正しく動くモデルとそうでないモデルを見比べたとき、命名規則に違いがあることに気がついた。

動くモデル:lmstudio-community/deepseek-coder-6.7B-kexer-GGUF/deepseek-coder-6.7B-kexer-Q4_K_M.gguf
動かないモデル:TheBloke/deepseek-coder-6.7B-instruct-GGUF/deepseek-coder-6.7b-instruct.Q4_K_S.gguf

タブ補完が動かない方は instruct という名前が追加されている。
調べてみたところ、instructという名前が付いたモデルはおそらくチャット向きのモデルということらしい。starcoderやdeepseek-coderは元々コーディング向けのモデルなので、instructはチャットでコード生成してもらうのに特化したモデル、instructが付いていないのはタブ補完に特化したモデル、ということなのだと思う。

https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-instruct

  1. Model Summary
    deepseek-coder-6.7b-instruct is a 6.7B parameter model initialized from deepseek-coder-6.7b-base and fine-tuned on 2B tokens of instruction data.

huggingfaceのREADMEを見てみたら、instructの方は会話データでfine-tunedされたと書かれている。当たりだった。

ちなみに他のモデルでもチャット用にfine-tunedされたものと2種類用意されていることが多いが、命名規則は必ずしも instruct とは限らないことも分かった。例えばgoogleのcodegemmaでは it と付いているものが他モデルで言うところの instruct らしい。
https://huggingface.co/google/codegemma-1.1-7b-it-GGUF

CodeGemma is a collection of lightweight open code models built on top of Gemma. CodeGemma models are text-to-text and text-to-code decoder-only models and are available as a 7 billion pretrained variant that specializes in code completion and code generation tasks, a 7 billion parameter instruction-tuned variant for code chat and instruction following and a 2 billion parameter pretrained variant for fast code completion.

Kesin11Kesin11

さらに、モデルによってはさっきログで見た補完用のタグっぽい fim▁begin, fim▁hole ,fim▁endなどの名前は統一されていない。

https://docs.continue.dev/features/tab-autocomplete#i-want-better-completions-should-i-use-gpt-4

continueのドキュメントにコード補完用のプロンプトの話が書かれていて、リンクされているcontinueのコードはみるとなかなかすごい。モデルごとに補完用のプロンプトのテンプレートを用意していて、モデル名の文字列でラフにマッチングしてどれを使うか選択しているらしい。

https://github.com/continuedev/continue/blob/d2bc6359e8ebf647892ec953e418042dc7f8a685/core/autocomplete/templates.ts

ということは、continueのconfig.jsonで指定するモデル名とLM Studioのサーバーで動かすモデル名が一致していないとおそらく正しく動かない。
ollamaは分からないが、少なくともLM StudioはAPIのパラメータにモデル名が含まれていたとしてもサーバーで起動するモデルを自動で入れ替えてくれないので、実はcontinueのconfig.jsonのモデル名は適当でもLM Studioは一応何らかの応答は返す。ただタブ補完に関してはモデル名が不一致だと正しく動かない可能性が高いことが分かった。

Kesin11Kesin11

色々なモデルでタブ補完を試してみたけど、モデルの性能以前にそもそも動かないこともある。
別のパターンとして、動きはしていてcontinueのログの Completion に候補も出てるけどエディタになぜか表示されないパターンもあった。
モデルに問題があるのか、continue側に問題があるのか、あるいはたまたま両者の噛み合わせが悪いのかなどの判断が難しい。

さらに言うと、continue側でタブ補完のためのパラメータがたくさん存在する。デフォルトでいい感じになっていると思いたいが、モデルの種類やサイズに色々なバリエーションがあることを考えると真の性能を発揮するためには本当は細かくチューニングする必要がありそうな気がする。
https://docs.continue.dev/features/tab-autocomplete#tabautocompleteoptions

総じて、タブ補完というタスクは意外にもチャットより難しいのでは?という感想を抱いた。
チャットの方が自由度が高いので難しいタスクだと今まで考えていたので、自分の中ではこれはかなり意外だった。

自分のマシンスペックやcontinueとのかみ合わせがたまたま合うモデルが見つかればそこそこ役に立つ補完をしてくれるが、Extensionを入れればまず動いて補完の精度も高いGitHub Copilotと比べると厳しいと言わざるを得ない。

ちなみに自分の環境で一番しっくりきたモデルは second-state/StarCoder2-7B-GGUF/starcoder2-7b-Q3_K_M.gguf でした。

https://huggingface.co/second-state/StarCoder2-7B-GGUF

Kesin11Kesin11

continueのその他の機能

https://docs.continue.dev/customization/context-providers

チャットに渡すコンテキストとして主にVSCodeに表示されているものなどを @ から始まる文字列で指定することができる。本家GitHub Copilotの @workspace などと似ている。

色々種類がありすぎるので少し試してみて特に便利だったものを紹介。

ドキュメント { "name": "docs" }

ドキュメントの内容を元に回答してくれるようになる。有名どころのドキュメントはcontinue側でインデックスしてくれているのですぐ使える。
試しに自分がよく知ってるGitHub Actionのドキュメントの内容を質問してみた。

前半の ubuntu-latest では32コアは使えない、というところまでは正しいが後半はなぜか32bitと64bitの話にすり替わっていて正しくない。Larger runnerについて言及してほしかったが残念。

実はcontinueがあらかじめインデックスしていないドキュメントであっても、 @docs のプルダウンからAdd docsを選ぶとドキュメンㇳのURLと何階層までインデックスするかを選択できる。この後に結構CPUとメモリを持っていかれるが、しばらく待つとドキュメントのインデックスが作成され、自分が付けた名前でそのドキュメントに対して質問できるようになる。

今回は試しにマイナーなビルドツールであるEarthlyのドキュメントを指定してみた。
https://docs.earthly.dev

Earthlyにはdockerには存在しない SAVE ARTIFACE という固有のコマンドがあるのでそのあたりを教えてもらいたかったが、 earthly --artifact のことしか教えてくれなかった。
(というか実は自分はこの--artifactオプションを知らなかったので最初はハルシネーションかと思った)

ちなみに送られているコンテキストのログを見るとこんな感じ。中身的には SAVE ARTIFACT のドキュメントを持ってこれているので、ローカルLLMの性能不足、もしくはコンテキスト長が不足しているのかもしれない。

コンテキスト長はcontinueのconfig.jsonで変更できるらしいので、8192にして再実行。
https://docs.continue.dev/setup/configuration#context-length

今度は SAVE ARTIFACTAS LOCAL についても言及してくれた上に先ほどの --artifact も忘れずに教えてくれた。ただ自分の知る限り、 save-artifact というコマンドは存在しないはず。

このドキュメントに対して質問できる機能はだいぶ面白い。今回の実験では回答にハルシネーションが入ってしまっているが、自分のPCで動かしてるローカルLLMの性能不足という面が結構あるはず。
continue自体はAPIキーを入力すればGPT-4oやClaude 3.5も使えるらしいので、優秀なLLMであればちゃんとした回答を返してくれる可能性はありそう。

Kesin11Kesin11

@docs 以外にも @url@issue あたりは面白そうだったが、これらをタイプしても有効になってそうな見た目に変化しないので使えなさそう?
チャット欄にAdd contextという文字列があるのでそれをクリックするとこのプルダウンが表示され、ここに載っているものであれば @ で呼び出しても有効になりそうな感じがする。

自分の環境に何かが足りていないのか、あるいはcontinue側がドキュメントだけ用意して未実装なのかは分からないが残念。

Kesin11Kesin11

https://docs.continue.dev/customization/slash-commands

GitHub Copilot Chatのようにスラッシュコマンドも用意されている。

/edit

Copilot Chatで言うところのinline chatに近い。コードを選択してコンテキストに送り、どう変更してほしいかを入力するとdiffを作ってくれる。

/cmd

シェルスクリプトを生成してくれる。Copilot Chatで最近よくお世話になっている機能だけど、この程度であればローカルLLMのllama 3.1でもいけるらしい。

生成されたコマンドはターミナルにも自動で送られるので、enterを押せばすぐに実行できる。便利

その他

自分が試した限り、 /edit, /comment, /share, /cmdは動いた。
その他は動かなかった。/commit はなぜかgit diffが検出されなくて使えなかったのと、/issueや/soはそもそもチャット欄に入力してもコマンドとして認識されていなかった。

さっきの @ で指定するコンテキストと同様で、自分のcontinueの設定が足りないのかそれともcontinue側が未実装なのか分かっていない。

Kesin11Kesin11

まとめ

ローカルLLMで遊んでみようの取り組みはとりあえずこんなところ。
一週間ずっとローカルLLMで遊びつつ楽しく体験できたし、用語についてもだいぶ理解できるようになった。

continueは現在のところ、試してみた系の記事以上の内容を書いている人がまだまだ少ないので清書して記事にするかもしれないです。
けど現時点だとGitHub Copilotの優秀さに全然追いついていないので、あえて導入する必要性はないと思う。continueやLLMのパラメータ調整に時間をかけるぐらいならCopilotに課金しちゃった方が絶対お得。

チャットとかObsidian Copilotは、ビデオメモリ8GB程度のGPUでもLlama 3やGemma2などの最新モデルを使えばそれなりの仕事をしてくれる印象でした。
ただ個人的にはチャットというインターフェースでLLMに仕事を任せることには手間的な限界があると思っており、例えばコーディングにおいてはエディタと深く統合できていないと普段使いには厳しいという感覚を改めて感じました。

一方でcontinueを見て分かったこととして、チャット以外のインターフェースでLLMとの統合をちゃんと実現するのは簡単ではない。何をコンテキストに送ればLLMの能力を発揮できるかを考える必要があるし、コンテキストに送るためのアプリのUIも考える必要がある。さらに、continueのタブ補完が使えるモデルと使えないモデルがあったように、汎用に思えるLLMもタスクに特化させるためにはそれ用にちゃんと学習されている必要があることも分かった。

ローカルLLM、いずれは高スペックPCなら誰でも利用する時代は来ると思うので期待している。