シェルにも AI アシスタント!! AI Shell をインストールして Azure OpenAI サービス や Copilot in Azure につないでそれぞれ使ってみた

# シェルにも AI アシスタント!!

2024 年 11 月 19 日に AI Shell のパブリックプレビューが発表されました。

シェルにも AI アシスタントが登場しました。
PowerShell 使い (自称) である筆者には放っておけないニュースです！

https://devblogs.microsoft.com/powershell/announcing-the-public-preview-of-ai-shell/?WT.mc_id=AZ-MVP-5003113

ブログを拝見した限りだと、とてもカンタンに導入できそうです。

この投稿では、Windows 環境で実際に使ってみたことを書いていきます。

ちなみに、先日の [Microsoft Ignite 2024](https://ignite.microsoft.com/en-US/home) でもセッションがありました。ご興味があれば、ご覧ください。

https://ignite.microsoft.com/en-US/sessions/BRK396

※[YouTube](https://youtu.be/z1Hvv32DYBA?si=GI6G0ALmF4Wc9Tcz) にもアップされていますね。


# AI Shell とは

AI Shell は、対話型のシェルで、言語モデルを含むチャット インターフェースを提供します。

https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/get-started/aishell-powershell?WT.mc_id=AZ-MVP-5003113&view=ps-modules

ざっくり説明すると。

- **対話型シェル**
    ユーザーはエージェントと会話形式で対話できます
- **エージェント**
    各 AI アシスタントはエージェントと呼ばれ、さまざまな AI モデルや支援プロバイダーに接続します
    パブリックプレビュー発表時点でのリリースでは、次のふたつのエージェントが含まれています
    - **OpenAI エージェント**
        OpenAI サービスを利用して、広範なクエリ、自然言語の解釈、コード生成などを行う汎用的な支援を提供します
        パブリックな OpenAI サービスまたは Azure OpenAI サービス リソースに接続できます
    - **Copilot in Azure エージェント**
        Azure CLI や Azure PowerShell コマンドを提供し、Azure に特化したタスクの自動化を支援します
        利用するには、事前にアカウントに Copilot in Azure にアクセスするための IAM ロールを割り当て、Azure にサインインします
- **機能**
    コードの直接挿入、複数ステップのコマンド予測、エラー復旧など
- **その他**
    コマンドやモジュールも用意されています
    - [AI Shell コマンド](https://learn.microsoft.com/powershell/utility-modules/aishell/how-to/aishell-reference?WT.mc_id=AZ-MVP-5003113&view=ps-modules)
    - [AI Shell モジュール](https://learn.microsoft.com/powershell/module/aishell/?WT.mc_id=AZ-MVP-5003113&view=ps-modules)

また、AI Shell の起動方法には 2 種類あります。

- **AI Shell (スタンドアローン)**
任意のシェルで AI Shell コマンドの [```aish```](https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/aishell-reference?WT.mc_id=AZ-MVP-5003113&view=ps-modules#command-line-options) コマンドを実行します。エージェントとのやり取りに没頭したい場合に、こちらを使うのでしょうかね。

![aish](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/75ad63ae-e384-2a7e-e41d-bcbbdd46cff1.gif)

https://learn.microsoft.com/en-us/powershell/utility-modules/aishell/get-started/aishell-standalone?WT.mc_id=AZ-MVP-5003113&view=ps-modules

- **AI Shell in PowerShell**
AI Shell モジュールの [```Start-AIShell```](https://learn.microsoft.com/ja-jp/powershell/module/aishell/start-aishell?view=ps-modules&WT.mc_id=AZ-MVP-5003113) コマンドレットを実行します。すると、AI Shell ペインが現れます。こちらのほうが作業を中断せずにエージェントとやり取りできるので、おススメですね。

![Start-AIShell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/9f802189-4d6b-3284-68f1-edc9eb755b6d.gif)

https://learn.microsoft.com/en-us/powershell/utility-modules/aishell/get-started/aishell-powershell?WT.mc_id=AZ-MVP-5003113&view=ps-modules


# AI Shell のインストール

次のドキュメントに従い、「システム要件」を踏まえて、AI Shell をインストールしましょう。

https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/install-aishell?WT.mc_id=AZ-MVP-5003113&view=ps-modules&tabs=windows

Windows や Mac 環境なら、次のスクリプトを実行するだけでインストール完了です！

```powershell
Invoke-Expression "& { $(Invoke-RestMethod 'https://aka.ms/install-aishell.ps1') }"
```


# OpenAI サービスにつないで使ってみた

OpenAI エージェントは、OpenAI サービスを利用して、広範なクエリ、自然言語の解釈、コード生成などを行う汎用的な支援を提供します。

https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/agent-openai?WT.mc_id=AZ-MVP-5003113&view=ps-modules


## 準備

今回は、Azure にデプロイした Azure OpenAI サービスに接続します。

Azure OpenAI サービスへ接続する場合には、OpenAI サービス リソースのエンドポイントとキー、デプロイしたモデルのデプロイ名と採用したモデルの名前が必要です。


### Azure OpenAI サービス リソースを作成してモデルをデプロイ

OpenAI サービス リソースを作成して、モデルをデプロイします。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/create-resource?WT.mc_id=AZ-MVP-5003113&pivots=web-portal

なお、OpenAI エージェントがサポートしているモデルは、次のもののようです。
※執筆時点では
※**太字** は、Azure でもデプロイできるモデル

- **gpt-4o**
- gpt-4-turbo
- gpt-4-32k
- **gpt-4**
- **gpt-35-turbo**
- gpt-3.5-turbo


### セットアップ

次に、エージェントが接続するために必要な次の情報をメモしておきます。


#### OpenAI サービス リソースのエンドポイントとキー

Azure ポータルで、OpenAI サービス リソースの [リソース管理] > [キーとエンドポイント] を開き、**「キー (いずれか)」** と **「エンドポイント」** をメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/4faab433-4aae-97e9-e69a-367dd05b2e90.png)


#### デプロイしたモデルのデプロイ名と採用したモデルの名前

Azure AI Foundry ポータルで、[共有リソース] > [デプロイ] を開き、[モデルデプロイ] タブの一覧からモデルを開きます。[詳細] タブの [配置情報] から **「名前 (デプロイ名)」** と **「モデル名 (採用したモデルの名前)」** をメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ef44eb97-8585-31c6-a67a-7d4bfaf3c711.png)


### エージェントの設定ファイルを編集

AI Shell ペインで [```/agent config```](https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/aishell-reference?WT.mc_id=AZ-MVP-5003113&view=ps-modules#agent-config) コマンドを実行して「設定ファイル (*openai.agent.json*)」を開き、前述でメモした情報を書き込みます。

```json:openai.agent.json
{
  "GPTs": [
    {
      "Name": "ps-az-demo",
      "Description": "A GPT instance with expertise in PowerShell scripting and command line utilities. Use gpt-4o running in Azure.",
      "Endpoint": "https://demo202412.openai.azure.com/",
      "Deployment": "model02",
      "ModelName": "gpt-4o",
      "Key": "<キー>",
      "SystemPrompt": "1. You are a helpful and friendly assistant with expertise in PowerShell scripting and command line.\n2. Assume user is using the operating system \u0060win\u0060 unless otherwise specified.\n3. Use the \u0060code block\u0060 syntax in markdown to encapsulate any part in responses that is code, YAML, JSON or XML, but not table.\n4. When encapsulating command line code, use \u0027\u0060\u0060\u0060powershell\u0027 if it\u0027s PowerShell command; use \u0027\u0060\u0060\u0060sh\u0027 if it\u0027s non-PowerShell CLI command.\n5. When generating CLI commands, never ever break a command into multiple lines. Instead, always list all parameters and arguments of the command on the same line.\n6. Please keep the response concise but to the point. Do not overexplain. and use Japanese language."
    }
  ],
  "Active": "ps-az-demo"
}
```

| 項目1 | 項目2 | 設定内容 |
|:-|:-|:-|
| **GPTs** | - | GPT インスタンスの構成 ※複数可 |
| | **Name** | 名前 ※適当に |
| | **Description** | 説明 ※適当に |
| | **Endpoint** | Azure OpenAI サービス リソースの[エンドポイント](#openai-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8-api-%E3%82%AD%E3%83%BC) |
| | **Deployment** | デプロイしたモデルの[デプロイ名](#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E5%90%8D%E3%81%A8%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%90%8D%E5%89%8D) |
| | **ModelName** | デプロイしたモデルで[採用したモデルの名前](#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E5%90%8D%E3%81%A8%E6%8E%A1%E7%94%A8%E3%81%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%90%8D%E5%89%8D) |
| | **Key** | Azure OpenAI サービス リソースの [キー](#openai-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8-api-%E3%82%AD%E3%83%BC) |
| | **SystemPrompt** | システムプロンプト<br><br>*Note:*<br>AI との対話を円滑に進めるための指示やガイドラインを含む設定。これにより、AI は適切なトーンやスタイルで応答し、特定の安全基準や目的に沿った情報を提供する<br>*Tips:*<br>```and use Japanese language.``` というように追記すると、エージェントと日本語でお話しできる |
| **Active** | - | エージェントが既定で使用する GPT インスタンスの構成の名前を指定 |

その後、設定ファイルを保存して、AI Shell ペインで [```/refresh```](https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/aishell-reference?WT.mc_id=AZ-MVP-5003113&view=ps-modules#chat-commands) コマンドを実行して、セッションをリフレッシュします。

:::note
エージェントが Azure OpenAI サービス リソースへの接続に失敗した時、出力されたエラーメッセージから原因と対処法を探りますが、その時にこちらの投稿がとても参考になりました。感謝！
:::

https://qiita.com/baku2san/items/f0568e527cf57dd40dea


## 使ってみた

では、エージェントに次の質問をしてみました。

> ドキュメントフォルダー配下のファイルをファイルサイズの大きい順で一覧表示する方法を教えてください。

リクエストを実現するためのコマンドを提案してくれました。提示されたコマンドを実行するには、[```/code copy```](https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/aishell-reference?WT.mc_id=AZ-MVP-5003113&view=ps-modules#code-copy) コマンドを実行してクリップボードにコピーして、シェルにペーストして実行します。:thumbsup:

![OpenAI_Agent_01(1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/4c455c42-c592-bc21-c81c-316d91bae2f2.gif)

(↓つづき) 思ったのとちょっと違う場合は、さらにリクエストしましょう。

> サブフォルダー配下のファイルも表示したいです。

![OpenAI_Agent_01 (2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3ce656d7-4c2a-13b1-3cbc-88b690976067.gif)

次に、コマンドを実行した際に出力されたエラーについて、エージェントに解決策を求めてみます。
シェルで [```Resolve-Error```](https://learn.microsoft.com/ja-jp/powershell/module/aishell/resolve-error?WT.mc_id=AZ-MVP-5003113&view=ps-modules) コマンドレットを実行すると、AI Shell ペインにエラー内容が送信され、解決策を丁寧に教えてくれます。:thumbsup:

![OpenAI_Agent_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/e6291133-63f1-53f6-94f9-860bc0c1498b.gif)


# Copilot in Azure につないで使ってみた

Copilot in Azure エージェントは、Azure CLI や Azure PowerShell コマンドを提供し、Azure に特化したタスクの自動化を支援します。

https://learn.microsoft.com/ja-jp/powershell/utility-modules/aishell/how-to/agent-azure?WT.mc_id=AZ-MVP-5003113&view=ps-modules


## 準備

Copilot in Azure エージェントを利用するには、事前にアカウントに Copilot in Azure へアクセスするための IAM ロールを割り当て、そして Azure にサインインします。

まずは、[Azure CLI をインストール](https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli?WT.mc_id=AZ-MVP-5003113)しておきましょう。


### IAM ロールを割り当てる

Azure ポータルで「Copilot in Azure 管理センター」を開きます。
そして、[設定] > [アクセス管理] で、このエージェントを使うアカウントに **「Copilot for Azure User」** ロールを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b3d364c1-d5a1-e5fa-fc19-3fb97f16f915.png)

https://learn.microsoft.com/ja-jp/azure/copilot/manage-access?WT.mc_id=AZ-MVP-5003113


### Azure にサインイン

```az login``` コマンドで Azure にサインインしている状態で、```Start-AIShell``` コマンドレットを実行します。そして、AI Shell シェルで「Copilot in Azure エージェント (Azure)」 を選択します。はい、接続できました。:thumbsup:

![Copilot_Agent_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/2c574589-9c0f-9f68-5ee1-3081c261189a.gif)

:::note warn
Microsoft Azure Copilot の限定パブリックプレビュー中は、出力されたメッセージのとおりの使用制限があります。

- 1 チャットでできるリクエストは 15 回まで
- 8 時間の間にできるチャットは 10 回まで

> Welcome to Microsoft Azure Copilot. Here are a few things you should know before getting started.
Any action taken on more than 10 resources must be performed outside of Copilot. While in limited public preview you can only make 15 requests during any given chat and you only have 10 chats in a 8 hour period. This is chat #1.
:::


## 使ってみた

では、エージェントに次の質問をしてみました。

> Azure CLI で、パブリック IP アドレスリソースの一覧を出力する方法。一覧には、リソースグループ名とリソース名を出力したいです。
> *How to output a list of public IP address resources in Azure CLI. I would like to output the resource group name and resource name in the list.*

提示されたコマンドを ```/code copy``` コマンドでクリップボードにコピーして、シェルで実行してみました。期待どおりの結果を得ることができました！:thumbsup:

![CopilotinAzure_Agent_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/885a965e-fa64-9404-28b2-3b7e5525feca.gif)

次に、同じ操作を Azure PowerShell ではどのように書くか質問してみました。

> この操作を Azure PowerShell で書くには？ 
> *What about Azure PowerShell?*

~~IP アドレスは求めていなかったですが~~ はい、正しいですね！:thumbsup:

![CopilotinAzure_Agent_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/6d30a6e7-ba26-a3ae-84cd-755081992b61.gif)

※事前に Az モジュールをインポートして、```Connect-AzAccount``` コマンドレットで Azure に接続してから実行しました。


# さいごに

シェルの AI アシスタントである「AI Shell」の登場で、作業がとてもはかどることを実感できました。

今までは、悩んだときや困ったときに ChatGPT や Microsoft Copilot との会話で解決して作業を進めていましたが、この時のシェルとブラウザーを行ったり来たり...この手間はちょっとしたことですが、煩わしいと思います。シェルに AI アシスタントがいることで、この煩わしい手間が無くなり、作業を中断せずにより集中して進めることができそうです。

**AI Shell は、アツいツールです！** :sunglasses:

執筆している現在はまだパブリックプレビュー中ですが、今後どんどんより改良されていくことでしょう。とても楽しみです！:yum:

(余談ですが)
今回の AI Shell をきっかけに Azure OpenAI サービスのモデルに触れられたことで、生成モデルについてもちょっとわかった気がして、興味が湧きました。
~~当時はちんぷんかんぷだった~~「Generative AI for Beginners」で改めて勉強しようかなと思いました。:sweat_smile:

https://microsoft.github.io/generative-ai-for-beginners/#/