hidemium's blog

日々学んだことをアウトプットする。

Visual Studio CodeでContinueとOllamaを使ったAIアシスト機能を試してみる

Visual Studio CodeGitHub Copilotを使うと、生成AIによるコード開発のアシストを行ってくれます。GitHub Copilotは有料のため、ローカル環境で似た環境を構築できないか試してみました。

構成

  • Windows 10 (Visual Studio Code)
    • Continue v0.8.60
  • vCenter 8.0U3
  • ESXi 8.0U3
  • Intel NUC NUC7i3BNH
    • Intel(R) Core(TM) i3-7100U CPU @ 2.40GHz
  • Ubuntu 22.04 (開発サーバー)
    • Remote Developmentの接続先
  • Ubuntu 22.04 (LLMサーバー)
    • provider: ollama 0.5.1
    • model: llama3.2 3B

ContinueやOllamaについて

Continueは、GitHub Copilotのようにコーディング支援を行ってくれるVisual Studio Code拡張機能になります。

Continueは、コーディング支援に利用するAIは、OpenAIやGemini、Llama、Claudeといったサービスや、ローカルにデプロイしたOllamaやLM Studioなど様々なものを利用できそうでした。

ローカルの場合、Llama 3.1 8Bがおすすめなようです。

Ollamaは、ローカル環境で大規模言語モデルを簡単に使用できるツールになります。

コマンドの使用感はdockerと似ているような気がします。

Ollamaのインストール

Ollamaのインストールを行ってみます。sudo権限を付与したユーザーで実行します。

GPUカードがないため、CPU-only modeで実行されます。

$ curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
>>> Downloading Linux amd64 bundle
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

サービスが起動しているか確認してみます。

$ systemctl status ollama.service 
● ollama.service - Ollama Service
     Loaded: loaded (/etc/systemd/system/ollama.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-12-07 12:39:59 JST; 5min ago
   Main PID: 116500 (ollama)
      Tasks: 11 (limit: 4557)
     Memory: 60.9M
        CPU: 723ms
     CGroup: /system.slice/ollama.service
             └─116500 /usr/local/bin/ollama serve

Llama 3.2の3B modelsをダウンロードしてみます。ファイルサイズは2GBです。

llama3.2

$ ollama pull llama3.2
pulling manifest
pulling dde5aa3fc5ff... 100%
:
verifying sha256 digest 
writing manifest 
success

試しに、手元でllamaを動かしてみます。

すごく遅いですが、応答が返ってきます。

1vCPU、4GBメモリの仮想マシンで試しましたが、稼働中はCPU使用率は100%で張り付いていましたが、何とか動いてそうでした。

$ ollama run llama3.2
>>> こんにちは。
こんにちは!どういたして今日ならなにかお話したいことあるかな?

APIからもコールしてみます。こちらも何とか返ってきます。

$ curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "stream": false,
  "messages": [
    { "role": "user", "content": "こんにちは。" }
  ]
}'
{"model":"llama3.2","created_at":"2024-12-07T05:52:36.252910007Z","message":{"role":"assistant","content":"こんにちは!どういたしまして?どんなことについて話したいですか?"},"done_reason":"stop","done":true,"total_duration":5682315698,"load_duration":33451469,"prompt_eval_count":27,"prompt_eval_duration":321000000,"eval_count":17,"eval_duration":5326000000}

Ollamaのローカルマシン以外からのアクセス許可

ローカルマシン以外からもアクセスできるようにunitファイルを編集して、再起動します。

sudo vi /etc/systemd/system/ollama.service
[Service]
+ Environment="OLLAMA_HOST=0.0.0.0"
+ Environment="OLLAMA_ORIGINS=192.168.*"
sudo systemctl daemon-reload
sudo systemctl restart ollama

WindowsPowerShellから実行できるか試してみます。なぜか、PowerShellだと、英語でメッセージが返ってきました。

> Invoke-RestMethod -Uri "http://10.0.50.60:11434/api/chat" -Method Post -Body '{
  "model": "llama3.2",
  "stream": false,
  "messages": [
    { "role": "user", "content": "こんにちは。" }
  ]
}'

model                : llama3.2
created_at           : 2024-12-07T06:27:11.907561159Z
message              : @{role=assistant; content=It looks like you're using a mysterious and colorful character to repr
                       esent your question! Unfortunately, I need a bit more information or context to understand what
                       you're asking about. Could you please rephrase your question in plain text?}
done_reason          : stop
done                 : True
total_duration       : 15139379661
load_duration        : 29423999
prompt_eval_count    : 27
prompt_eval_duration : 323000000
eval_count           : 46
eval_duration        : 14786000000

Continueの設定

Continueをインストールしてみます。

Visual Studio Code拡張機能からContinueを選択し、Installをクリックします。

左側のバーにContinueのアイコンが表示されます。

歯車マークをクリックすると、config.jsonが開くため、modelsの個所に以下のように追加します。

  "models": [
    {
      "title": "Llama 3.2",
      "provider": "ollama",
      "model": "llama3.2",
      "apiBase": "http://IPアドレス:11434"
    }
  ],

チャットのコンソールにコメントを追加すると、 HTTP 500 Internal Server Error from http://IPアドレス:11434/api/chat というえらが返ってきたため、ログを確認すると、以下のエラーがあり、メモリが不足しているようです。

{"error":"model requires more system memory (7.3 GiB) than is available (4.9 GiB)"}

仮想マシンのスペックを2vCPU、8GBメモリに拡張すると動くようになりました。

ちなみに、llama3.1:8bを利用しようすると、10.8GB以上のメモリを求められます。

{"error":"model requires more system memory (10.8 GiB) than is available (7.8 GiB)"}

使い方

コードを選択して、Ctrl+Lでチャット欄にコードを張りつけることができます。

レスポンスはあまり早くはないですが、サンプル的なコードについての説明を求めると、割と分かりやすい解説を返してくれました。

Context selectionという機能があり、 @ をつけてソースコードのファイルを指定したり、ターミナルの情報をベースにして回答をしてくれます。

Autocompleteの設定

続いて、Autocomplete機能を試してみます。

Autocompleteを試すために、qwen2.5-coderの1.5B modelsをダウンロードしてみます。ファイルサイズは986MBです。

qwen2.5-coder

$ ollama pull qwen2.5-coder:1.5b

Continueのconfig.jsonに以下のように追加します。

  "tabAutocompleteModel": {
    "title": "Qwen2.5-Coder 1.5B",
    "model": "qwen2.5-coder:1.5b",
    "provider": "ollama",
    "apiBase": "http://IPアドレス:11434"
  },

コードを選択して、右クリックすると、Continueのメニューが表示され、いくつか機能が表示されます。

試しに、コメントを生成してみると、関数の説明を追加してくれました。

ただし、この処理は重かったのか、CPUがしばらく100%張り付きで稼働していました。

/**
 * Creates a new book in the database.
 *
 * @param ctx The context of the operation.
 * @param book The request to create a new book.
 * @return A new book schema if successful, or an error if not.
 */
func (u *BookUseCase) Create(ctx context.Context, book *book.CreateRequest) (*book.Schema, error) {
    bookID, err := u.bookRepo.Create(ctx, book)
    if err != nil {
        return nil, err
    }
    bookFound, err := u.bookRepo.Read(ctx, bookID)
    if err != nil {
        return nil, err
    }
    return bookFound, err
}

参考

Ollamaを動かすにあたり、最近の動向がまとまっており参考になりました。