【ローカル SLM AI code assistant 編】機密情報が漏れるのが怖い？じゃあローカルでL(S)LMを動かせばいいじゃない

# 目的
皆さん、コーディング時には生成AIを使っていますよね？
1つ、生成AIの活用方法に「**AI code assistant**」というものがあります。
AI code assistantとはその名の通り、コードを書く際に手伝ってくれる便利ツールです。
主にVS Codeなどのエディタ上で動作し、AIとペアプログラミングするイメージをしていただければ早いかと。

代表的なものでいうと以下があげられますね
- [GitHub Copilot](https://github.com/features/copilot)
- [Amazon Q Developer](https://aws.amazon.com/jp/q/developer/?trk=7ab57510-ed87-4585-8c51-9330af2f06c6&sc_channel=ps&s_kwcid=AL!4422!10!71468521572624!71469065751522&ef_id=d4ae0776c7cc1af46bc760ebbb6e77a3:G:s)

その時に課題となってくるのが**機密情報の取り扱い**になるかと思います。
先に上げたブラウザ上やAPI経由で扱う生成AIは、どうしてもやり取りの内容がネット上を経由してしまいます。
加えて、モノによってはやり取りの内容をモデルの学習に使われてしまうのではといった不安もあるかと思います。

:::note warn
機密性での不安から業務活用へ踏み出せない。。。
:::

ここで本日の目的

:::note
### じゃあ「AI code assistant」をローカル環境で完結させたらいいじゃない
:::


# 環境
本日扱うのはこちら
[LM Studio](https://lmstudio.ai/)
[VS Code](https://code.visualstudio.com/)
[Continue (VS Code 拡張機能)](https://marketplace.visualstudio.com/items?itemName=Continue.continue)

# 手順
## LM Studio のインストール
まずローカルで言語モデルを動かすためのツールである[LM Studio](https://lmstudio.ai/)をインストールします。

## モデルのダウンロード
アプリ起動後、サイドバーから検索マークを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/3519886d-a61a-c163-5647-bd66597a64e9.png)

検索窓に[TinySwallow」と入力してください。
いくつか候補が出てきますが、今回はSakanaAIのモデル「**TinySwallow-1.5B-Instruct-GGUF**」をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/728f3b48-32f6-243b-6f84-c164de444835.png)

:::note
[TinySwallow](https://huggingface.co/collections/SakanaAI/tinyswallow-676cf5e57fff9075b5ddb7ec)とは
sakana.aiが開発した日本語対応済みの小規模言語モデル（SLM）です。
ローカルPCでも十分に動くサイズ感のモデル！
詳細はこちら↓
https://sakana.ai/taid-jp/
:::

## モデルをローカルサーバーで動かす
インストール完了後、サイドメニューの開発ツールを開いて下さい。
画面上部の「Select a model to load」より先ほどダウンロードした「**TinySwallow-1.5B-Instruct-GGUF**」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/c67e0f2e-c140-6206-fac5-a8dcccccbcb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/ae293280-0b2d-f1c4-3533-585ff6c992c0.png)

モデルが「READY」状態になったことを確認し、画面上部の「Status:Running」をオンにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/c378a068-a18f-06d0-848b-f0396b66be2d.png)


これでローカルサーバーが「`http://127.0.0.1:1234`」として実行されました。
以下のようなCurlコマンドでモデルとやり取りができるようになります。
```
curl http://localhost:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tinyswallow-1.5b-instruct",
    "messages": [
      { "role": "system", "content": "Always answer in rhymes. Today is Thursday" },
      { "role": "user", "content": "What day is it today?" }
    ],
    "temperature": 0.7,
    "max_tokens": -1,
    "stream": false
}'
```


## VS CodeからAI code assistantとして活用
今回VSCodeの拡張機能の[Continue](https://marketplace.visualstudio.com/items?itemName=Continue.continue)を使います。
> Continueは、主要なオープンソースAIコードアシスタントです。任意のモデルと任意のコンテキストを接続して、VS Code と JetBrains 内でカスタムのオートコンプリートとチャットエクスペリエンスを構築できます

まずはこちらの拡張機能をVSCodeにインストールしてください。

インストール後、Continueの画面を開くとチャットスペースが追加されているかと思います。
指定モデルをプルダウンから「Add Chat model」から変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/c9211245-49c1-3da5-15df-368d5b40a342.png)

Providerには「LM Studio」を、Modelには「Autodetect」（後で編集します。）を選択して**Connect**を押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/d4719d05-f578-0714-5157-1d3463f18d64.png)


その後、画面上部の歯車マークからContinueのconfig.jsonを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/269d668e-96bf-b8d2-c2b1-7bf3d34432ad.png)

先ほど追加したLM Studioに関する記述が追加されています。
これを今回使うモデルに変更します。
```json:config.json
// 変更前
    {
      "apiBase": "http://localhost:1234/v1/",
      "model": "AUTODETECT",
      "title": "Autodetect",
      "provider": "lmstudio"
    }

// 変更後
    {
      "apiBase": "http://localhost:1234/v1/",
      "model": "tinyswallow-1.5b-instruct",
      "title": "tinyswallow-1.5b-instruct",
      "provider": "lmstudio"
    }
```

以上で「AI code assistantをローカル環境で完結」させる手順になります。


## 動かしてみる
エディター上で動かすAI code assistantの強みは、ワークスペース上のコードをもとにチャットを行えることだと思います。
今回の環境も「@ファイル」のように、特定のファイルに対して指示を出してみました。
（内容は適当なので特に解説はしません。）
![{0DDCAD22-523E-4B2E-87AF-F484545CC64E}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/94b8ea01-d7c9-246f-1f3f-bfaf67e21bd2.png)

ちなみにLM Studio上で実行ログが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/8d2174dd-ffcc-de1a-b5bf-9f13a63d4485.png)


# まとめ
近年、スマートフォンなどのエッジデバイスで運用できるレベルの小規模言語モデル（SLM）が開発されてきています。
その分、大規模言語モデル（LLM）と比べると性能はまだまだ劣ってしまいますが、現時点でも特定の領域・タスクに特化した活用方法であれば軽量かつ低コストという大きな恩恵が得られるかと思います。

モデルごとに得意・不得意の領域があるので、自分に合ったモデルを見つけつつ是非ローカルでも動かしてみてください。

これで機密性の不安から生成AIは使わないという言い訳はできなくなりましたね。


# 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421