本セッションの登壇者
セッション動画
Microsoftの大川です。今日はSemantic Kernelについてお話をしていければと思います。時間もないので早速進めてまいりたいと思います。
今日お伝えしたいこと、達成したいことですけれども、まずSemantic Kernelって何かを知っていただくことです。もう1つは、基本的な概念を知っていただきたいなと思っています。そしてC#から呼び出す方法を知っていただくこと。私はC#が得意なので、C#でやらせていただきます。最後にSemantic Kernelを使ったアプリケーションを開発しようかなと思っていただけたら、ゴール達成かなと思います。よろしくお願いいたします。
1つのPluginを多様な環境につなげるオープンソースSDK
はじめにSemantic Kernelとその周辺知識の話をしていきたいと思います。
「Semantic Kernelって何ですか?」というと、大規模言語モデル(LLM)を皆様のアプリケーションに素早く簡単に統合するためのSDKです。「Semantic Kernelは誰が作ってますか?」というと、MicrosoftがOSSでベースの部分を作っていまして、それを皆さんに公開して一緒に作っていきましょうという形でやってます。「これを使って何が嬉しいですか?」というと、従来のプログラミング言語とLLMのプロンプトを簡単に組み合わせることが可能になります。
そう聞くと、「Microsoft版のLangChainなんじゃないの?」みたいに思われると思います。
なので、その前にMicrosoftがAIにかける熱い思いが込められたSDKなんですよというところをお話しさせてください。Microsoftは今、すべてのアプリケーションがAIで再発明されると考えています。それによって、以前は実現不可能だった新しいアプリ、たとえば人間の声や言葉を解釈して賢いアプリケーションが出てくるんじゃないかなと思っています。
そういうアプリがいっぱい出てくる環境を作るために「One plugin extensibility model」を提唱しています。このモデルは、Pluginを作るとChatGPT、MicrosoftのOpenAIサービス、本家本元のOpenAIサービスで使えるだけではなくて、Bing Chatにつないだり、Microsoft365のWordやExcel、PowerPointにつないだり、Windowsにつないだり、皆様のアプリケーションにPluginをつないだりして賢い機能を追加していくものです。1つのPluginをいろいろな環境につなげられるようにしていきたいというのがMicrosoftの考え方になります。
簡単、安全に世界とCopilotをつなぐ
そのためにPluginとしてはこういう要件を定義しています。簡単に、かつ安全にAIを皆さんのアプリ、Microsoftのアプリ、サードパーティのアプリにつなげていくことで、やれることの幅を安全に広げていくことが目標です。
Pluginを使っていただくと、あらゆるデジタル世界、物理世界の情報がPluginを介してCopilotにつながっていくというコンセプトです。
そのCopilotの技術面としては、今後こういった技術スタックが整備されます。一番上の部分が皆さんの普段使っているアプリケーションですが、そこから下の方に向かって、AIモデルに対していろんなクエリを行って、有用な結果を得るという形になります。一番上のところが皆さんが開発していただく部分、真ん中の部分はMicrosoftとか、間のPluginを作っているメーカーさんとか、モデルを作るメーカーさんの部分です。それらをつないでいく部分を、GitHubやVisual Studioといったインテリジェントな開発でやっていただけたらいいなというスタックになっています。
AIを使った開発のシンプルさとスピード感の両立を
ここでやっとSemantic Kernelの話が出てくるんですけれども、Semantic Kernelとは何かというと、Copilot Stackの中心になるSDK、ランタイムですよと、Microsoftが6月中旬のドキュメントのアップデートで発表しました。Semantic Kernelは、開発者がPlugin上に独自のCopilotの経験を実装するための軽量のOSS SDKです。図の真ん中のAI Orchestration Layerを担うSDKになってます。このSemantic Kernelを使うことで何が嬉しいかというと、既存の開発スキルや投資を最大限に活用できます。C#、Python、Javaの知識をAIを使ってうまくつないで、アプリケーションを簡単に作れることがポイントになります。Pluginを1つ作ったら、それをいろんな環境につなげられることがもう1つのメリットです。Microsoft365 Copilot、Bing Chat、ChatGPTや皆さんのアプリケーションにもつなげられます。
どうやったらこのSemantic Kernelに、いろいろなところにつなげられる拡張性を確保できるのかという概念図がこちらです。LLMのモデルや、Embedding、メモリなどのLLM寄りのサービスへの接続は、上半分にあたるConnectorという部分がコンポーネントになります。真ん中でSemantic Kernelが仲立ちをして、下側にあるのが現実世界やアプリケーションとの対話の部分です。これに関してはPluginと呼ばれるコンポーネントが外部サービスとの接続を担います。
どうしてこういうモデルを取っているかというと、たとえばメモリとしてRedisを使いたい、OpenAIの機能を使いたい、Embeddingの機能を使いたい、Hagging Faceのモデルを使いたい、などいろいろとつなぎたいところがあると思うんですけれども、アプリケーション開発者からすると、つなぐ先ごとにお作法を勉強してつないでいくのは結構大変です。その部分をConnectorとPluginとしてSemantic Kernelで隠蔽して、ユーザーからはConnectorやPluginの利用方法がわかっていればつないで活用できるようにすることで、AIを使った開発のシンプルさとスピード感の両立をしていこうというコンセプトになっています。
OSのカーネルと同じKernel、2種類の関数で構成するPlugin
では、Semantic Kernelの用語と概念の部分を深堀りしていきましょう。「Semantic Kernelはどの言語で使えますか?」と聞かれるんですけれども、C#は使えます。また、AIの開発において欠かせないPythonも使えます。Javaも近々使えるようになってくると聞いています。こういう形で、従来のプログラミング言語からAIを使ったタスクがこのような形で実行できます。図の中のASKというところが従来のプログラミング言語で問い合わせをかける部分です。カーネルが御用聞きをして裏側でAIを呼び出して、結果を戻します。こういうものがさくっとできてしまうのが、Semantic Kernelの大まかな機能になります。プログラムを始める前に、この図にあるKernel、Planner、Plugin、Memory、Connectorなどの中身の部分を理解していただくとわかりやすいので説明していきたいと思います。
Kernelはその名のとおり、OSのカーネルみたいなものです。Semantic Kernelが知っているConnectorやPluginを組み合わせて、ユーザーがやりたいことを満たすための処理エンジンそのものになります。このKernelの中で、たとえばAzure OpenAIにつなぐ時の接続情報を持ったり、ログの吐き出し先を含むログの情報を持ったりしますので、本当にOSのカーネルと同じようなものだと思っていただいてよいと思います。
Semantic KernelのPluginというのは、AIサービスから呼び出せる関数のグループです。図の右側にあるように、たとえばWriter Pluginという物書きをするためのPluginが提供されていて、その中に、たとえばeメールを送るための関数、翻訳するための関数など、呼び出せる関数機能の一覧が並んでいます。この関数の機能をカーネル側に知らせることで、どういう機能を組み合わせたらユーザーのやりたいことができるかなというのをカーネルで考えることができるようになります。ここは非常に重要なポイントです。
中に入っている関数なんですけれども、2つの種類があります。Semantic FunctionとNative Functionです。Semantic Functionは、基本的には自然言語で書かれたプロンプトと、Completion APIのパラメーターなので、LLMを呼び出す機能になります。LLMが得意な作業をやらせる時に使う関数です。もう1つはNative Functionといって、開発言語で記述された関数です。C#やPythonで書かれています。なぜかというと、算術演算やデータの取得や保存など、LLMがあまり得意じゃない作業もあるんですね。そういうところはこのNative Functionで定義して実行する形になります。
このSemantic Kernelの面白いのは、LangChainも同じですけれども、Chaining、つまり関数をつないでいけるところです。たとえば、「Azureについてのジョークを考えて、それをポエムに変換して、最終的にそれを題材にしたレストランのメニューを考えてください」とお願いすると、ジョークを考える、ポエムを考える、メニューを考える、と順番につないでいきます。ユーザーの願いごとをより効率的に後ろの処理につないでいって、最終的な結果が得られます。
順番を定義するPlanner、「忘れない」ためのMemory
お願いの処理をする順番を自動的に決める機能がPlannerです。Plannerを通すことで、Semantic Kernelが知っている機能の中でどれとどれを呼び出して結果を出すかという順番を作ってくれます。
Memoryはユーザーのクエリに対してコンテキストを提供するための方法です。OpenAIでは過去に問い合わせをしたものは明示的に残さないと忘れてしまいます。それを残したり、Embeddingしたものを覚えたりする機能が必要で、これがMemoryです。
ConnectorはSemantic Kernelの外にある外部APIなどにアクセスするための機能です。Connectors.AI.HuggingFaceなどいろいろありますが、実はこれにはOpenAIのAPIにつなぐ時の機能やHuggingFaceのモデルを呼び出す時の実装などがすでに含まれています。どんどん追加されているのでここにはほんの一例を示しています。こんな形で外部のサービスに対してつながる部分を隠蔽して、Semantic Kernelを使いやすくするのがConnectorの機能です。
デモで動作を確認しよう
では、実際にコードを書いて試してみましょう。VScodeに飛びます。Semantic Kernelを呼び出す時のコードです。単純にSemantic Kernelにアクセスするだけのコードでしたら、var kernel
から始まる正味10行ぐらいです。これでSemantic Kernelにアクセスする初期設定の部分はおしまいです。
今回はデモなのでこの上の処理でAPIキーを環境変数から呼び出してから、var kernel = Kernel.Builder
というところでSemantic KernelにつなげるBuilderを作って、.WithLogger
でロガーの設定をします。今回はコンソールにログを出す設定にしています。そうしてカーネルをビルドして、Semantic Kernelを使えるようになりました、というところですが、Semantic Kernelは今のところConnectorを読み込んでいないのでOpenAIのAPIが呼べません。
そこに対して、kernel.Config.AddAzureChatCompletionService
で、前に読み込んだキーやパラメーターを設定して、Azure OpenAIサービスにつながるモデル、エンドポイント、キーを入れます。これだけでもうSemantic Kernelとして動くようになりました。
実行してLLMの機能を呼び出してみる
では、やってみましょう。わかりやすく下に関数で分けて書きました。
まず、funSkillFunctions
の部分はセマンティック関数を呼び出しています。Pluginの定義がされている "MyPluginDirectory"
から "FunSkill"
というPluginを呼びます。左側のパネルを見るとディレクトリ構造がわかります。自分のルートディレクトリの下に"MyPluginDirectory"があって、"FunSkill"というディレクトリの下に実体があります。
実体はこんな感じです。「以下のトピックに関するジョークまたはユーモラスな話を1つだけ書いてください」として、これを実行します。
実行してTerminalタブを見てみましょう。さっきの関数が呼ばれて、Semantic Kernel側で再構築されてプロンプトが作られて呼び出された結果、「恐竜時代にタイムトラベルする」に対するジョークがここに書かれてきます。こういう感じでLLMの機能を呼び出せます。
ざっと見ていただきましたが、Semantic Kernelって非常に簡単だなと思っていただければ嬉しいです。最後にドキュメントを紹介します。今は英語しかないんですけれども、翻訳機能を使うと結構読み込めますので、ぜひこのドキュメントを読んで試してみてください。
お時間をいただきましてありがとうございました。