個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

C# だけで Azure OpenAI の RAG を試してみたい (1)

はじめに

最近 Azure OpenAI の RAG について色々調べていますが、サンプルアプリは Python が多いです。
自分は C# が大好きなので、C# でやってみたいな~と思いました。
 
とりあえず、参考になりそうなサンプルを探してたところ以下のようなものを発見しました。
 
github.com
 
上記サンプルは Python で作成されておりとても素晴らしいもので、このサンプルだけで Azure Open AI の Add your data と組み合わせて独自ナレッジの連携を試せるのですが、逆に全自動すぎて何が行われているか理解できませんでした(笑)。そこで、知見を増やすためにこのサンプルをカスタマイズして何か作ってみて理解を深めることにしました。
 

カスタマイズ方針

  • 言語は C# にする。(Python のサンプルが多いので C# のサンプルを作成したい)
  • ソースデータはファイルとしていつでも開けるように Blob にファイルとして保存する。
  • 各々の処理は関数アプリにして自動化する。
  • あまり複雑にしないで、シンプルに必要な要素を学べるサンプルにしたい。
  • 自分にとって役に立ち、運用できるサンプルにしたい。

 

検討したシステム構成と処理フロー

  1. はてなブログの記事を関数アプリで10分ごとにクロールし、Blob に html として保存します。
  2. Blob にアイテムが追加されると、Event Grid の Blob Trigger の関数アプリで AI Search にベクトルを含むドキュメントを登録する。

注意
  • 自分が利用できるようにはてなブログの記事をソースデータにしていますが、ソースデータはその他ブログでも社内のドキュメントでもなんでもかまいません。
  • 個人的な「遊び」で作ったものなのでセキュリティの対応は省いています。業務利用するなら閉域化などの対応をする必要があります。

 

ソースコードと各プロジェクトの解説

上記構成のサンプルアプリを作ったので興味ある方はソースコードを参照ください。
github.com

プロジェクト名 説明
AIClient Open AI, AI Search などのクライアントの Facade。
AzureAISearchIndexInitializer AI Search のインデックスを(既存インデックスが存在すればいったん削除し)作成するコンソールアプリ。
IndexCreator Blob 項目の追加、更新をトリガーにインデックスを作成・更新する関数アプリ。
TextChunkerSample TextChunker の挙動を確認するためのサンプルアプリ。
WebPageCrawler はてなブログの記事をクロールして Blob にアーカイブする関数アプリ。

Azure Functions デバッグで Azure Blob Storage トリガーのリトライ回数、同時実行数を制御する方法

ブレークポイントやコンソールに出力させてデバッグしたいときに、リトライが発生して、関数が複数実行されると非常にデバッグがやりにくいです。
それを制御する設定です。

なお、この設定値は Source = BlobTriggerSource.EventGridの場合でも有効です。

Azure 上でホストする場合は下記の記事の通りです。
learn.microsoft.com

maxDegreeOfParallelism (1 ~ 8)は特定の関数アプリ内で、BLOB によってトリガーされるすべての関数について、同時呼び出しに許可される数です。
poisonBlobThreshold (1 ~ 5)は、有害キューに移動する前に、メッセージの処理を試行する回数です。

問題は、ローカルデバッグの場合です。
記述方法が違うのでご注意下さい。
Jsonの階層構造をアンダースコア2つ[__]で表現します。

{
  "Values": {
    "AzureFunctionsJobHost__extensions__blobs__maxDegreeOfParallelism": "1",
    "AzureFunctionsJobHost__extensions__blobs__poisonBlobThreshold": "1",
}

GitHub Copilot Chat の AI-Powered Rename Suggestions を試してみた(2)

前回 Visual Studio Preview の既知の問題で時間を溶かしてあまり詳しく挙動を確認できなかったので、再度どれくらいいい感じにリネームしてくれるか確認してみました。
hiro128.hatenablog.jp

 

well-known なアルゴリズム

well-known なアルゴリズムのネーミングを不親切なものにして、Copilot が適切な名前にリネームできるか試してみました
 

リストの逆順並び替え

これは本来

list.Reverse();

で1発ですが、あえてロジックを手書きして確認しました。

public static List<string> aaa01(List<string> a)
{
    var b = new List<string>();
    for (int i = a.Count - 1; i >= 0; i--)
    {
        b.Add(a[i]);
    }
    return b;
}

 

メソッド名


 

パラメーター名


 

戻り値名

少し微妙な感じもしますが、充分適切な名前を提案してくれました。

他にバブルソート、ヒープソートなど試してみましたが、こういう well-known なものに関しては問題なく適切な名前を提案してくれました。
 

バブルソート


 

ヒープソート

パラメータや変数のネーミングが不適切であっても、しっかりコードの中身を見て適切な名前を提案してくれることがわかりました。

GitHub Copilot Chat の AI-Powered Rename Suggestions を試してみた(ら詰みかけた話)

AI-Powered Rename Suggestionsを試しました。以下のブログで紹介されていた記事です。
devblogs.microsoft.com

動作させるのに地獄を見る…

この機能、2023/12/24 現在、Visual Studio 2022 Preview Version 17.9.0 Preview 2 (この時点での最新版)では不具合があり動作しません。

この issue にやられました。基本的に Preview はリリースされたらすぐインストールするので Preview 2 にアップデート済みでした。

さらに、以下の注意書き(Preview 2 では不具合があり動作せず、Preview 1 をでは動作する)を読んでいなかったために、

自分の Preview で動作しないので( 17.9.0 Preview 2 か Preview 1 かは全く意識していなかった)、ひたすら原因を調べた結果 Visual Studio から GitHub Copilot Chat の APIをコールしていないように見えました。少なくとも GitHub Copilot Chat 側の問題ではなさそうと分かりました。

Preview 2 動作していない。そもそも、API リクエストが投げられていない

Preview 1.1 正常動作。API リクエストとレスポンスが確認できる

そこで、Visual Studio の問題かと思い Preview 2 を一旦アンインストールし、再インストールし、再度試しましたがやはり動作しません。

ここで、再度 Microsoft のブログを再度読み直し、 Preview 2 では不具合があり動作せず、Preview 1 をでは動作することを認識しました。

Visual Studio 2022 Preview Version 17.9.0 Preview 2 -> Visual Studio 2022 Preview Version 17.9.0 Preview 1 のロールバックを行おうとしましたが、一度アンインストールして、再インストールしているため、以前のバージョン自体が PC 内に存在せずロールバックできないことに気づきました(詰んだか??)

Visual Studio 2022 Preview Version 17.9.0 Preview 1 のインストーラーを取得できないか調査。それらしきURLに気付き、ダウンロードを試したところ、MS アカウントの認証を求められ、権限がないと拒否されました(もう詰んだと思いました)。

ここで、Mac の Parallels の Windows 上の Visual Studio 2022 Preview があることに気づき、確認したところ、Visual Studio 2022 Preview Version 17.9.0 Preview 1.1 にロールバックできることが判明しましたので、すぐロールバックしました。

公式Blog での記載は Preview 1 であったため、Visual Studio 2022 Preview Version 17.9.0 Preview 1.1 で操作するか一抹の不安はありましたが、試したところ運良く動作!

ここまで6時間溶かしました。疲れた…

教訓:説明は一字一句逃さず読め!!

一応、 Visual Studio Blog に「Visual Studio 2022 Preview Version 17.9.0 Preview 1 のダウンロードURLはどこにあるの」とコメントは残しました。

設定

拡張機能 GitHub Copilot Chat 0.1.1986.61475 以上

[ツール]->[オプション]->[GitHub]->[Copilot チャット]->[Enabele rename suggestions]に✅

使ってみてどうだった…

前置きが長くなりました。動作を試してみましたが、時間溶かしすぎてあまり調べられていません。(追加調査します)

最近、GitHub Copilot / GitHub Coplilot Chat でポーカーを実装してみたので、そのコードで検証してみました。
www.docswell.com

自分の手持ちのカードで「保持」としなかったカードを交換するメソッド、ChangeCards() メソッドのリネームを提案してもらったところ、以下の感じになりました。

確かに、このメソッドのネーミングは、Change より Swap の方がしっくりきます。

次に、自分の手持ちのカードを表示するメソッド、ShowHand()メソッドのリネームを提案してもらったところ、以下の感じになりました。

こちらも、手札の役の開示というよりは、カード自体を表示するだけなので、ShowCards() の方がいいかもしれません。

これはネーミングで悩んだ時にまずは多少いい加減でもいいから命名して後から提案してもらうと、効率が良さそうですし、リファクタリング時にひどいネーミングになっている場合のリネームに役に立ちそうです。

これはかなり使える機能ではないでしょうか。
 
 

ちょっと不完全燃焼に終わったのでもう少し調べてみました。
hiro128.hatenablog.jp

「山東探究塾II中間発表会」に研究助言者として参加してきました。

2023年7月18日に、母校である山形県立山形東高等学校の「山東探究塾II中間発表会」に研究助言者として参加してきました。
 
山東探究塾とは「主体的・協働的で深い学び(探究型学習)による様々な教育プログラムを通して、将来、地域や国内外の課題を解決できる資質・能力の育成を目指す取り組み」です。
 
「山東探究塾II」は高校2年生の生徒さんの取り組みになります。
 
今回は「中間発表会」として、各チームの研究のテーマとそのテーマを選択した背景、研究の進捗状況などを発表する会でした。
 
私はITの専門家ですので、ITをテーマとした取り組みを拝見させていただきました。
 
ITの専門家は何人かいらっしゃいましたが、アカデミック領域の方が多く、ビジネス領域の方は少なかっため、参加できて多少は貢献できたのではないかと考えています。
 
まず、驚かされたのが、デジタルネイティブ世代の今の高校生の方々はごく自然にITの技術に慣れ親しんでいることです。利用者としてスマートフォンやタブレットを使いこなすことができるのは当然なので驚きはなかったのですが、開発者目線として、PC、スマートフォン、クラウド、プログラミング言語、Bluetoothなどが実現できることを理解しており、何を組み合わせればご自身の研究テーマが実現できるかということの大筋は皆さんすでに目処が立っている状況に驚きました。
 
そして、IT技術への理解があるからこそ、生徒さんの設定したテーマも簡単に解決方法が見つかるようなものにとどまらず、すでに世の中に存在するアプリの問題点を深掘りして新たなアプリ作成に挑戦するようなものなど、難易度が高いものが多く見られました。
 
そして「イノベーター」「アーリーアダプター」「キャズム理論」など、大人が業務で使用するような用語が普通に飛び交い目指すゴールが非常に高いことに驚かされました。
 
一方で、ITの実装は基本的に構想時には見えなかった問題点が多く発生するものですので、理想が高いが故に理想通りに進めてしまうと、学校の授業の一環として行うにはあまりにボリュームが大きくなってしまうことが予想されるテーマも見られました。

そういう意味で、探究すべきことの絞り込みを行い、絞り込んだ内容について解像度高く、深く探究することで、成果を出しやすくすることをお勧めしました。

また、実装方式について生徒さん自身で全てを調査するのはあまりに難易度が高い内容がありましたので、いくつかのヒントとなるキーワードをお伝えし、領域を絞って調査できるようなフィードバックをいたしました。

なお、これまでも探究塾にご参加経験のある研究助言者の方々からはかなりレベルの高い厳しめのご意見がたくさん飛び交い、探究塾の本気の度合いと厳しさを目の当たりにしました。

私自身が高校生の時にはこのような探究型の授業はまだ行われておらず、そもそも探究塾のような深い思考をする経験自体がありませんでしたので、教育のレベルが非常に上がっていることを実感するとともに、社会が高校生の皆さんに求めるレベルが格段に上がっており、「今の高校生の生徒さんは本当には高いレベルの取り組みをされているのだな、自分が高校生だった時こんなレベルの高いことが果たしてできただろうか」と思わずにはいられませんでした。

印象的だったのが、先生方が繰り返しおっしゃっていた「技術の進歩によって定型的な仕事はどんどんコンピューターに置き換えられていくため、自分で課題を設定し、仮説を立て検証し、それに基づいて新たな価値を想像する非定型の仕事ができることが社会で求められる」という言葉でした。

これは、私が日々の仕事の中で考えていることそのものであり、今のIT業界を含めた社会全体の課題について危機感を持ち、教育を実践なさってことに感銘を受けました。

私自身としては、今後も探究塾に継続的に貢献したいと考え、プログラムの実装、クラウドの利用方法、設計などについて何か質問があるようでしたら、生徒さんのご質問を継続的にお受けすることをお伝えしました。

冬には成果発表会が開催予定とのことでしたので、生徒さんたちが探究塾を通じて困難な課題に取り組んだ結果を拝見できる機会を頂けることに感謝するとともに、自分自身のモチベーションも高まりましたので、非常に素晴らしい経験をさせていただきました。

最後に、山形県立山形東高等学校の生徒さんおよび先生方にあらためて感謝を申し上げます。ありがとうございました。