MS Semantic Kernelを用いたAIアシスタントの作り方（ChatGPT、GPT-4版）【連載第1回】

「Microsoft Semantic Kernel」を「ChatGPT」や「GPT-4」で利用し、以下の動画のようなAIアシスタントを作る方法を解説します（連載記事第1回）。


※本領域は変化が激しいです。内容は23年7月9日時点の情報となります

---

まずはじめに、本連載記事で最終的に完成するアプリケーションの動作の様子を示します。

本連載の最後にはこのような動作をするAIアシスタント（※Jupyter Notebook）が完成します。

<br>

（内容）最初に雑談を交わし、その後、Azureのストレージアカウントを作成してもらいます。動画の最後に、きちんと作成されたかをAzureポータル上で確認します。

<br>

<iframe width="560" height="315" src="https://www.youtube.com/embed/DUDkher5KDM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>




---

**【本記事（第1回）の目次】**

**第1回 Microsoft Semantic Kernelとは**
・Semantic Kernelを一言で表すと？
・Semantic Kernelの公式情報集
・Semantic Kernelの構成要素
・Semantic Kernelを効率良く勉強する方法（Python版）
・Semantic KernelをChatGPT（gpt-35-turbo）、GPT-4で使用する際の注意点

なお、次回以降の予定ですが、

**第2回 Semantic KernelでChatGPTを使用したチャットボットを作成**
・Semantic KernelでChatGPT（gpt-35-turbo）を使用し、チャットをするsemantic Functionを構築 
[[第2回記事へのlink](https://qiita.com/YutaroOgawa2/items/168648a935416f360beb)]



**第3回以降 to be continued**

---

本記事は連載の初回であり、「Semantic Kernelとはどんなものなのか？」について網羅的に解説を試みているため、文章が多いです。また実装もありません。

気になる点だけ読んでいただき、必要に応じて再度読み返していただくことをおすすめします。

<br>

# 第1章 Microsoft Semantic Kernelとは
## Semantic Kernelを一言で表すと？

**Semantic Kernelを一言で説明しますと、「AI orchestration SDK」です**

はい。よく分かりません (><)。

<br>

もう少し分かりやすく説明しますと、


**Semantic Kernelとは「LLM系AIサービス（OpenAI、Azure OpenAI、Hugging Faceなど）と、既存のプログラミング言語（C#やPythonなど）を組み合わせたアプリケーションを構築しやすくするためのSDKです」**

<br>

ちょっと、分かりやすくなった気がしますが、まだピンときません。

角度を変え、どんな内容（目的、困りごと）を、どんな手法で解決するSDKなのか解説します。



---

（1）LLMも利用するアプリケーションを構築する場合、LLMから得た回答内容を変数に代入して、その変数を既存のPython関数などで利用・処理したいです（**【LLM系AIサービスと従来のプログラミングの連結】**）

（2）アプリケーションのバックエンドを疎結合で作成すべく、マイクロサービス化していく際、従来のプログラミングでのサービス（≒各機能≒REST API）と、LLMを利用したサービス（function）がぐちゃぐちゃにならないようにしたいです。そして、アプリケーションやアプリケーション内のエージェント、そして開発者にとって、どちらも同じ様に扱え、同じ階層で整理されている状態にしたいです（**【LLM系AIサービスと従来のプログラミングのマイクロサービス・関数を同様に扱い、整理】**）

(3) せっかく最新のLLMも利用したアプリケーションを構築するので、ユーザーが達成したい目的を、マイクロサービス化している各機能から、どれをどのような順番で使用していくのか、開発者が事前にいちいちルールを実装しておくのではなく、機械学習・ディープラーニング・LLMの利点を活用して、実行計画を動的に構築させたいです（**【Planning機能】**）

（4）せっかく最新のLLMも利用したアプリケーションを構築するので、LLM部分についてユーザーがこれまで利用した（会話として入力した）内容は、セッションが切れても、DBに格納して、覚えておいて欲しいです（**【Memory機能】**）

---

**上記の目的内容**（など）**を各機能を利用して、シームレスに達成できるように実装できるようにしてくれるのが、「MS Semantic Kernel」です。**

<br>

ここまでの解説で、**「LangChainとどう違うの？」** と思われる方もいるかもしれません。

正確に答えるのは難しいのです。

私なりの回答は、

**「同じ様な目的に向かって作られています。そのため、似た機能が多いです。現時点でどこが違うのかを言い切るのは難しく**（実際にはいろいろ細かく機能の違いはありますが）、**こういう場面はLangChainを、こういう場面はSemantic Kernelを使用するのが良いです、と切り分けられる状態ではないです。好きな方を使えば良いと思います」**

となります（※リポジトリのスター数は、LangChainの53.2K、Semantic Kernelが10.7kです。日本では圧倒的にLangChainの方が有名ですが、Semantic Kernelも世界的にはかなり追い上げてきています）


上記に記載したSemantic Kernelの主要機能に関しても、

（1）【LLM系AIサービスと従来のプログラミングの連結】は、そもそも「LangChain」の目的とほぼ同じです

（2）【LLM系AIサービスと従来のプログラミングのマイクロサービス・関数を同様に扱い、整理】は、「LangChain Tools」と似ています

（3）【Planning機能】は、「LangChain Plan and Execute Agent」と似ています

（4）【Memory機能】は、「LangChain Memoryクラス」と似ています

（※私はLangChainをきちんと実装・利用した経験がないです。そのため、認識レベルにおいて上記のように捉えています）

## Semantic Kernelの公式情報集

少しだけSemantic Kernelの全体像が掴めたので、MSの公式情報からさらに理解を深めておきましょう。

<br>

**【1】 動画「Azure OpenAI Developers セミナー（2023/04/19）」の動画**

まずはMS日本のこちらの動画の「1:18:07から1:24:37までの6分間」の解説をご覧ください。
この上なく、非常に分かりやすいです。


https://www.youtube.com/watch?v=tFgqdHKsOME&t=4687s

<br>


**【2】上記動画のPDF**

上記動画のPDFです。Semantic Kernelはp.85からp.89になります。

[202304_Azure OpenAI Developers Seminar.pdf](https://livesend.microsoft.com/i/DApm8A9vtIqNC8R2nfGBLxxaZbjPLUSSIGN2czkp7916hlPvmcknYPLMerjx4VxZ8___vtW3cAKxQqqwwK8r6BkPLUSSIGNaJLSguMDdWHWcewGTZ9iWvKmUb5WcbVgu6aSfdfiSwQyz8bBy)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/eabe36fa-7101-5368-64b6-d82663d7d71e.png)

<br>

**【3】Microsoft Semantic Kernelの公式ドキュメント**

英語のみですが、公式ドキュメントが以下のURLに用意されています。

https://learn.microsoft.com/en-us/semantic-kernel/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/ed0c0a87-a022-9d8e-9c49-031dff9239ea.png)



最初に読むべきページは「Orchestrate your AI with Semantic Kernel: What is Semantic Kernel」です。

https://learn.microsoft.com/en-us/semantic-kernel/overview/

<br>

**【4】Microsoft Developer BlogsのSemantic Kernelタグの記事**

変化が激しい領域なので、Developer Blogsを追っておくのもおすすめです。

https://devblogs.microsoft.com/semantic-kernel/category/semantic-kernel/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/56360fe5-be98-f54f-c0c1-e8635d617777.png)



LLM系の方には、Semantic Kernelだけでなく、Developer Blogsのタグ「chatgpt」、「openai」も、おすすめです。


https://devblogs.microsoft.com/surface-duo/tag/chatgpt/

https://devblogs.microsoft.com/surface-duo/tag/openai/


## Semantic Kernelの構成要素

さきほども紹介しました、MS日本の資料、[202304_Azure OpenAI Developers Seminar.pdf](https://livesend.microsoft.com/i/DApm8A9vtIqNC8R2nfGBLxxaZbjPLUSSIGN2czkp7916hlPvmcknYPLMerjx4VxZ8___vtW3cAKxQqqwwK8r6BkPLUSSIGNaJLSguMDdWHWcewGTZ9iWvKmUb5WcbVgu6aSfdfiSwQyz8bBy) のp.86より、以下図を転載します。

また公式ドキュメントの「overview: What is Sematic Kernel」(https://learn.microsoft.com/en-us/semantic-kernel/overview/) からも同様の図を転載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/ac8a988a-25df-7607-97ed-817af940b938.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/429daddf-49cf-3c6c-08d4-6ff4ca6eb038.png)

上記の2つの図を見ると、さきほど紹介したSemantic Kernelの主要機能がまずまず理解できます。ひとつずつ解説します。


（1）【LLM系AIサービスと従来のプログラミングの連結】はSDKとして「Semantic Kernel」を使用することで実現されます（本連載ではPythonを使用します。C#なども用意されています）

（2）【LLM系AIサービスと従来のプログラミングのマイクロサービス・関数を同様に扱い、整理】するために、上側図の **「スキル」**、「S」と表記されている部分になります。このスキルは、下側図の **「Semantic function」** と **「Native function」** を使用して実装します。

このあたりは「各概念」が非常にややこしいのですが、

- Semantic functionは、LLMを使用して実行する関数
- Native functionは、従来のPythonなどを使用して実装・実行する関数

と、ひとまずご理解いただければと思います。

また注意点として、**これまで「スキル（Skills）」と呼んでいた概念は、最近、「Plugins」という言葉に変更されました。**

MS日本の資料は変更前のものなので「スキル」と表記されています。

ディレクトリ構造下で、「各スキル（Plugins）」、「Semantic function」、「Native function」がどのように整理されるかを見ると理解が早いかもしれません。

https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/native-functions?tabs=python

上記のページに記載のディレクトリ構造に注釈を入れると以下のようになります。

![qiita_semantic_kernel_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/c7efc53d-8776-e313-df32-f1d78a45f51b.jpeg)



<br>

一読でこのあたりの理解は難しいです。

本連載でひとつずつ実装していくことで理解がすすみます。

今は「なんか2つほど種類あるんだなー」程度にご理解ください。

<br>

（3）【Planning機能】は、上側図の「Plannerクラス」もしくは、下側図では「Create a plan」が実現してくれます。

（4）【Memory機能】は、上側図の「M」（メモリー、記憶を管理）、もしくは下側図の「Recall memory」が実現してくれます。

---

最後に、上側図と下側図の違いとして、下側図では全体と **「context」** という変数が繋がっています（上側の図では記載を省略しているだけです）。

**「Semantic Kernel」ではこの「context」というオブジェクトを利用することで一連の処理の変数受け渡しや、情報の一時保存・利用継続を可能にしてくれます。**

こちらの「context」の使用方法についても、連載第2回目以降の記事で実装をし始めると、理解が進むかと思います。


## Semantic Kernelを効率良く勉強する方法（Python版）

**【1】LinedInラーニングのコース**

LinkedIn LearningにSemantic Kernelの開発者らがラーニングコンテンツを用意してくれています。

https://www.linkedin.com/learning/introducing-semantic-kernel-building-ai-based-apps/introducing-semantic-kernel

が、私はLinkedInラーニングに登録していないので内容は未確認です。

コース情報として、「コースの詳細：17分：Intermediate：リリース日: 2023/3/17」と記載されているので、概要説明に近いかもしれません。

<br>

---

**【2】Semantic KernelのPythonのNotebookを実行してみる**


「Semantic Kernel」は最初C#（.Net）で開発が始まり、ついでPython、Javaなどが追随していっています。

そのため機能面も.Netが一番充実しています。ですが、Pythonもかなり充実してきています。

Semantic Kernelを学習・習得するにあたり、個人的なおすすめ手法は

Semantic KernelのGitHubリポジトリの **「semantic-kernel/samples/notebooks/python/」に用意されているJupyterNotebookをひとつずつ実行してみる作戦**、です。

https://github.com/microsoft/semantic-kernel/tree/main/samples/notebooks/python

現時点では00から11まで、12個のNotebookが用意されています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/b49beadb-a74f-4405-5157-1f75ea206539.png)


また、[公式ドキュメントのCreating semantic functions以降](https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/semantic-functions?tabs=python)の解説内容について、実際にPythonで実装するサンプルコードは別のリポジトリ「semantic-kernel-docs」に用意されています。

https://github.com/MicrosoftDocs/semantic-kernel-docs/tree/main/samples/python

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328834/f86235f8-db41-4fdc-da73-ef496ba9f732.png)

<br>

Semantic Kernelを一番手っ取り早く理解するには、これらのNotebookをGoogle Colabで実際に実行してみる方法を私はお勧めします。


## Semantic KernelをChatGPT（gpt-35-turbo）、GPT-4で使用する際の注意点

連載第1回の最後に、ChatGPT（gpt-35-turbo）やGPT-4をSemantic Kernelで使用する際の注意点を解説します。

前節において、Semantic Kernelに関する勉強方法を紹介しました。

ただし注意点があります。

それは、Semantic Kernelに現在用意されている資料や、そもそもの設計がGPT-3までの情報に基づいて作り始められたため、**ChatGPT（gpt-35-turbo）や、GPT-4をLLMとして使用する場合に動作が思い通りにならないことがある、という点です**

ChatGPT（gpt-35-turbo）や、GPT-4以降は、OpenAI側のAPIとして、GPT-3までと使用方法が異なるので、Azure上でもその操作が異なるのは、当然と言えば当然です。

使用方法の差異については、以下のMS公式ドキュメント（日本語）が分かりやすいです。

<br>

https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/chatgpt-quickstart?source=recommendations&tabs=command-line&pivots=programming-language-python

https://learn.microsoft.com/ja-jp/azure/cognitive-services/openai/how-to/chatgpt?source=recommendations&pivots=programming-language-chat-ml


このようなドキュメントが用意されている点からも分かるように、ChatGPT（gpt-35-turbo）や、GPT-4はそれまでのGPT-3系とは使用方法が少し異なるので、「Semantic Kernel」で使用する際にも注意が必要となります。

大雑把には、
- messagesで会話を管理する点
- roleとして、system、user、assistantを扱うという点

が、大きな違いになります。

**この違いに起因する影響が、Plugin（スキル）の「Semantic function」を作成する際に現れます。**

本連載ではChatGPT（gpt-35-turbo）を使用して、「Semantic Kernel」を利用したアプリケーション（実際はNotebookまで）を作ります。

各回で、最新の使い方を紹介していきたいと思います。


# さいごに

連載の初回である本記事では、「Semantic Kernelとはどんなものなのか？」について、網羅的に情報を紹介・解説したため、文章が多く、読み切るのは大変だったかもしれません。

さいごに、「そもそも、Semantic Kernelって、日本語訳するとどんな言葉になるのか？」について紹介します。この点が理解できていれば、Semantic Kernelの役割を理解しやすいです。

Semanticとは日本語で、
>コンピュータに文書や情報の持つ意味を正確に解釈させ、文書の関連付けや情報収集などの処理を自動的に行わせる技術

という意味です [[参考link](https://www.sophia-it.com/content/%E3%82%BB%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF)]。

そして、Kernelとは日本語で、
>システムの中核的な役割を担うもの

という意味です。

そのため「Semantic Kernel」を無理やり日本語に訳すと、
**「文書やユーザーの入力といった情報を、可能な限り正確に解釈し、種々の処理を自動的に実施するシステムにおいて、その中核的役割を担うもの」**
という意味になります。

この感覚を頭の片隅に置いていれば、このあと続く連載の実装も、理解がしやすいかと思います。


次回、第2回では、Semantic KernelでChatGPT（gpt-35-turbo）を使用し、チャットをするsemantic Functionを実装して、チャット機能を実現します。


[[link: 第2回記事はこちら](https://qiita.com/YutaroOgawa2/items/168648a935416f360beb)]


以上、長い文章をご一読いただき、ありがとうございました。


小川 雄太郎

 

<br>

【免責】
本記事の内容は執筆者の意見/発信であり、執筆者が属する企業等の公式見解ではございません