$30 off During Our Annual Pro Sale. View Details »

ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた

ローカルLLMを⽤いてコード補完を⾏う VSCode拡張機能を作ってみた

2025年12月5日に開催された「第136回NearMe技術勉強会」の登壇資料です。

身近な生成AIサービスをローカルLLMで代替する試みとして、Ollama(Llama 3.2:1b)を利用したVSCodeのコード補完(インライン入力補完)拡張機能を作成しました。

【アジェンダ】
・VSCode拡張機能の作り方入門
・yo code ジェネレーターを使ったプロジェクト作成
・拡張機能のデバッグ方法
・ローカルLLM連携の実装
・Ollamaを用いた推論の実行
・Fill-in-the-Middle (FIM) 形式でのプロンプト設計
・カーソル前後のコンテキスト取得(Prefix/Suffix)と重複除去ロジック
・作ってみてわかったこと
・モデルの選定(Reasoningモデル vs 軽量モデル)
・前処理・後処理の重要性

【関連リンク】

ソースコード: https://github.com/asakaicode/local-llm-code-completion

More Decks by NearMeの技術発表資料です

Other Decks in Programming

Transcript

  1. 2 まずそもそもVSCodeの拡張機能はどう作るか? 1. 以下のコマンドを実⾏ 2. ターミナルの指⽰に従って選択する - What type of

    extension do you want to create? - New Extension (TypeScript) - What's the name of your extension? - hello(何でも良い) - What's the identifier of your extension? - hello(何でも良い) - What's the description of your extension? - ⼀旦無し … npx --package yo --package generator-code -- yo code
  2. 3 まずそもそもVSCodeの拡張機能はどう作るか? 3. ⽣成された extension.ts を以下のように修正する • 拡張機能有効時に Hello World!

    と出⼒ import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { console.log('Extension "hello" is now active!'); const disposable = vscode.commands.registerCommand( 'hello.helloWorld', () => { vscode.window.showInformationMessage('Hello World!'); } ); context.subscriptions.push(disposable); } export function deactivate() {}
  3. 4 まずそもそもVSCodeの拡張機能はどう作るか? 4. .vscode/launch.json を以下に変更 • preLaunchTaskを "npm: compile" に変更しないとうまく動かない

    ことがある。 { "version": "0.2.0", "configurations": [ { "name": "Run Extension", "type": "extensionHost", "request": "launch", "args": [ "--extensionDevelopmentPath=${workspaceFolder}" ], "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" } ] }
  4. 14 作ってて感じたこと • gpt-oss-20bなどの reasoning モデルはコード補完にはあまり向いていない? ◦ 処理に時間がかかる ◦ llama3.2:1b

    でも⼗分に機能する ◦ それこそ、Antigravity などのような計画して Agent モードのようにやらせるなら ば gpt-oss-20b はアリ? • 前処理と後処理がちょっと⾯倒 ◦ LLMに投げた結果をそのまま返すのではなく、使いやすくするには別途トリミング をしないといけない • VSCode拡張機能は簡単に作れる