⚒️

aoaicli で Azure OpenAI を叩いて遊んでみる

2023/10/07に公開

Intro

aoaicli とは私がついさっき数時間ぐらいかけて書いた Azure OpenAI service の ChatGPT 向けのコマンドラインクライアントで GitHub からダウンロード出来ます。

How to start

.NET SDK がインストール済みであれば Git リポジトリをクローンしたディレクトリで dotnet run するとすぐにコンパイルされて実行出来……ません。

あらかじめ Azure OpenAI ポータルから API エンドポイント情報と API キー情報を取り出してきて、環境変数かコマンドの実行時引数に設定してください。おすすめは環境変数です。

export AOAI_API_URI=[YOUR_AOAI_API_ENDPOINT]
export AOAI_API_KEY=[YOUR_AOAI_API_KEY]

そうしたらエラーなく実行できるようになります。

Play

おすすめの使い方として、他のバッチファイルやシェルスクリプトから呼び出して標準出力を使ってさらに別な処理を動かすと言ったことがあげられます。
むしろそういう使い方を想定して作っているので、チャットの結果はストリーミングせずに全部の結果が返ってきてから一気に出力するようにしています。

例えば、ビジネス文書の中からマスクしたい単語を抽出して一覧化するプログラムを書きたいときには下記のような呼び出し方が出来ます。

$ aoaicli --system '以下の文章から関係者以外に見せるときにマスキングすべき、個人名、会社名、システム名、地名を抽出し、意味を失わない範囲で一般的な名称や仮称 に置き換える対応表をJSONで書いてください。出力形式は {"maskWord":{"マスクすべき単語":"マスクした後に置き換える単語",...}}です。' --user '高知県と高知市は、高知県立図書館(以下「県立図書館」という。)と高知市民図書館(以下「市民図書館」という。)本館を合築により整備し、一体的に運用する新しい図書館(以下「新図書館」という。)を平成27年度に開館することとして いる。このため、県立図書館及び市民図書館(以下「両館」という。)の現行の図書館情報システム(以下「現行システム」という。)を統合し、高知県立図書館・高知市民図書館 新図書館情報シ ステム(以下「新システム」という。)として新たに整備する。
新システムは、図書館利用者の利便性の向上やサービスの充実等を図るため、現行システムの機能に加え、ICタグを活用したセルフ式貸出しや予約資料のセルフ式受取り等の新たな機能を導入する ほか、両館の移動図書館、市民図書館の分館・分室を含めた図書館業務全般の円滑な運営に資するものとして整備することとしており、本業務では、新システムの構築に係る基本設計を行う。
さらに、新図書館は、新点字図書館とこども科学館(仮称)を併せた複合施設として整備することから、インターネット接続回線の共用のほか、複合施設全体のスケジュールや備品等の管理を総合的 に行うための新図書館等複合施設ネットワーク基盤(以下「複合施設ネットワーク」という。)も併せて整備することとしており、本業務において、複合施設ネットワークの構築に係る基本設計も併 せて行う。'

{
  "maskWord": {
    "高知県": "仮称県",
    "高知市": "仮称市",
    "県立図書館": "仮称図書館A",
    "市民図書館": "仮称図書館B",
    "新図書館": "仮称図書館C",
    "現行システム": "仮称システムA",
    "新システム": "仮称システムB",
    "両館": "仮称図書館AB",
    "新点字図書館": "仮称点字図書館",
    "こども科学館(仮称)": "こども科学館(仮称)",
    "複合施設ネットワーク基盤": "仮称施設ネットワーク基盤"
  }
}

ビジネス文書の例として 高知県立図書館・高知市民図書館 新図書館情報システム等構築等委託業務仕様書(案) の冒頭をありがたく使わせていただきました。

さらに .NET の System.CommandLine の便利機能である 応答ファイル (RSP) を使うともっと構造化した呼び出しを実施することが出来ます。

sample.rsp
--system
"以下の文章から関係者以外に見せるときにマスキングすべき、個人名、会社名、システム名、地名を抽出し、意味を失わない範囲で一般的な名称や仮称 に置き換える対応表をJSONで書いてください。出力形式は {"maskWord":{"マスクすべき単語":"マスクした後に置き換える単語",...}}です。"
--user
"高知県と高知市は、高知県立図書館(以下「県立図書館」という。)と高知市民図書館(以下「市民図書館」という。)本館を合築により整備し、一体的に運用する新しい図書館(以下「新図書館」という。)を平成27年度に開館することとして いる。このため、県立図書館及び市民図書館(以下「両館」という。)の現行の図書館情報システム(以下「現行システム」という。)を統合し、高知県立図書館・高知市民図書館 新図書館情報シ ステム(以下「新システム」という。)として新たに整備する。
新システムは、図書館利用者の利便性の向上やサービスの充実等を図るため、現行システムの機能に加え、ICタグを活用したセルフ式貸出しや予約資料のセルフ式受取り等の新たな機能を導入する ほか、両館の移動図書館、市民図書館の分館・分室を含めた図書館業務全般の円滑な運営に資するものとして整備することとしており、本業務では、新システムの構築に係る基本設計を行う。
さらに、新図書館は、新点字図書館とこども科学館(仮称)を併せた複合施設として整備することから、インターネット接続回線の共用のほか、複合施設全体のスケジュールや備品等の管理を総合的 に行うための新図書館等複合施設ネットワーク基盤(以下「複合施設ネットワーク」という。)も併せて整備することとしており、本業務において、複合施設ネットワークの構築に係る基本設計も併 せて行う。"
$ aoaicli @sample.rsp
{
  "maskWord": {
    "高知県": "仮称県",
    "高知市": "仮称市",
    "県立図書館": "仮称図書館A",
    "市民図書館": "仮称図書館B",
    "新図書館": "仮称図書館C",
    "両館": "仮称図書館AB",
    "現行システム": "仮称システムA",
    "新システム": "仮称システムB",
    "図書館利用者": "利用者",
    "ICタグ": "ICタグ",
    "セルフ式貸出し": "セルフ貸出し",
    "予約資料のセルフ式受取り": "予約資料のセルフ受取り",
    "移動図書館": "移動図書館",
    "市民図書館の分館・分室": "仮称図書館Bの分館・分室",
    "図書館業務全般": "図書館業務",
    "新点字図書館": "仮称点字図書館",
    "こども科学館(仮称)": "仮称こども科学館",
    "複合施設ネットワーク基盤": "仮称施設ネットワーク"
  }
}

End

コマンドラインから Azure OpenAI を呼び出せる、かつ 応答ファイル(RSP) を使うことでよりプログラムから定型的に使えるようになることで、Python などのプログラムを書く必要が少なくなれば、より業務的な活用しやすくなると思いますのでご活用ください。

Discussion