🐥

Semantic Kernelのネイティブプラグインで知識拡張をしてみる

2024/12/11に公開

通常知識拡張(RAG)をする手段と言えば

RAGの仕組みは前半のデータの準備と後半の回答生成を行う2つのフェイズに分かれるがざっくりといって次のような工程が必要になる。

  • データを分割
  • ベクトル化
  • ベクトル化した近似値を検索
  • 検索結果で回答生成

そして、ここでベクトル化したデータを格納するためにこれに対応したデータベースが必要になる。
有名どころではAI SearchとかCosmos DBあたりだろう。他にもいろいろある。

知識拡張は便利でも余計にコストをかけたくない!

今回対象となるシステムはこうだ。

  • Windows Server 2016上のIIS
  • .NET 9

まあ、App Serviceなどに置き換えて考えてみてもいい。単にアプリケーションサーバーのみがある状態と思ってもらいたい。

Semantic Kernelのネイティブプラグインでそれっぽいことできないか?

あくまでもそれっぽいということなので完全に代替になるわけではないことに注意が必要です。

前提として自力でいい感じに分割します。
手動で分割するので意味のあるところで1kくらいで分割できるとよいでしょう。
プラグインのDesctiptionにデーターの要約文を書きます。このあたり、ChatGPTの力を借りてもよいかも知れません。また、見出しのようなものがあればそれを含めるのもよいアイディアと思います。
そして、データ本文をそのままメソッドの戻り値としてreturnします。
あとはよしなにLLMくんが頑張ってくれると期待してます。

あとは、Semantic Kernelのネイティブプラグインを自動呼び出しです。

https://zenn.dev/tomokusaba/articles/da47d606e339d6

https://zenn.dev/tomokusaba/articles/e667217a2045cc

https://learn.microsoft.com/semantic-kernel/concepts/plugins/adding-native-plugins?pivots=programming-language-csharp&WT.mc_id=%3Fwt.mc_id%3DDT-MVP-5004827

このあたりは過去記事または公式ドキュメントを参照してください。

結果

試してみた結果良好です。

単純にDesctiptionにあることを聞いてみた結果はきちんと回答します。

また、それにないような事柄でもそれなりに検索して予想以上に回答してくれているように感じます。

(弱点)すべてはDesctiptionにあることがすべてですのでこの要約文がすべてです。
この品質がこの手法の精度にかかってくるように感じました。

また、MaxTokensは大きめに設定しておいた方が良さそうです。

というわけで鋭意開発続行中

https://github.com/tomokusaba/BlazorServerChat2

参考

https://speakerdeck.com/tomokusaba/semantic-kernelnoneiteibupuraguindezhi-shi-kuo-zhang-wositemiru

Discussion