ホームページ >バックエンド開発 >Python チュートリアル >セマンティック カーネルを使用したチャットボットの構築 - パーツ プラグイン
前の章では、セマンティック カーネルの基本概念のいくつかを検討し、一般的な質問に応答できる、ただし指示を使用して事前に定義されたトーンと目的を備えた、動作するエージェントで終了しました。
この第 2 章では、プラグインを使用して、ライブラリアンに特定のスキルを追加します。
プラグインは、AI サービスに公開される一連の機能です。プラグインは機能をカプセル化し、アシスタントがネイティブの動作の一部ではないアクションを実行できるようにします。
たとえば、プラグインを使用すると、アシスタントが API またはデータベースからデータをフェッチできるようになります。さらに、アシスタントは、通常は API を通じて、ユーザーに代わっていくつかのアクションを実行できます。さらに、アシスタントはプラグインを使用して UI の一部を更新できるようになります。
前に述べたように、プラグインはさまざまな機能で構成されています。各関数は主に以下によって定義されます:
セマンティック カーネルはさまざまな種類のプラグインをサポートしています。この投稿では、そのうちの 2 つ、プロンプト プラグイン と ネイティブ プラグイン に焦点を当てます。
プロンプト プラグイン は、基本的に、具体的な状況下で呼び出される特定のプロンプトです。一般的なシナリオでは、複雑な システム プロンプト があり、そこでエージェントのトーン、目的、一般的な動作を定義します。ただし、特定の制限やルールを定義する必要がある場合には、エージェントに具体的なアクションを実行してもらいたい場合もあります。その場合、幻覚を減らし、モデル応答の関連性と制御性を維持するために、システム プロンプト が無限に増大することを回避しようとします。これは、プロンプト プラグイン:
に最適なケースです。プロンプト プラグイン は 2 つのファイルによって定義されます:
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
プロンプトプラグインをカーネルに追加するには、フォルダーを指定するだけです。たとえば、フォルダー構造が /plugins/plugin_name/skprompt.txt の場合、プラグインは次のように登録されます:
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
ネイティブ プラグイン を使用すると、モデルでネイティブ コード (Python、C#、または Java) を呼び出すことができます。プラグインはクラスとして表現され、アノテーションを使用して任意の関数をエージェントから呼び出し可能として定義できます。開発者は、名前、説明、引数などの注釈を使用してモデルに情報を提供する必要があります。
ネイティブ プラグインを定義するには、クラスを作成し、対応するアノテーションを追加するだけです:
self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
カーネルにネイティブ プラグインを追加するには、クラスの新しいインスタンスを作成する必要があります。
from datetime import datetime from typing import Annotated from semantic_kernel.functions.kernel_function_decorator import kernel_function class MyFormatterPlugin(): @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable def formate_current_date( self, strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value return datetime.today().strftime(strftime_format)
関数呼び出し、またはプランニングは、カーネルに登録されている関数をモデルが呼び出す方法です。
各ユーザー メッセージに対して、モデルは返信方法を決定する計画を作成します。まず、チャット履歴と関数の情報を使用して、どの関数を呼び出す必要があるかを決定します (存在する場合)。呼び出されると、関数の結果が履歴に追加され、ユーザー メッセージからタスクが完了したか、それともさらに手順が必要かを判断します。完了していない場合は、タスクが完了するまで、またはユーザーの助けが必要になるまで、最初のステップからやり直します。
このループのおかげで、モデルはさまざまな関数への呼び出しを連結できます。たとえば、user_session (ユーザーの ID を含む) を返す関数と、引数として current_user_id を必要とする別の関数があるとします。モデルは、最初の関数を呼び出してユーザー セッションを取得し、応答を解析し、user_id を 2 番目の関数の引数として使用する計画を作成します。
セマンティック カーネルでは、関数呼び出しを使用するようにエージェントに指示する必要があります。これは、関数選択動作を自動として実行設定を定義することで実行されます。
self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
説明が詳細になればなるほど、より多くのトークンが使用されるため、コストが高くなることを強調することが重要です。適切な詳細な説明と使用されるトークンの間のバランスを見つけることが重要です。
関数の概要とその目的が明らかになったので、Librarian エージェントにとって関数を最大限に活用する方法を見てみましょう。
学習目的で、1 つの ネイティブ プラグイン と 1 つの プロンプト プラグイン を定義します:
書籍リポジトリ プラグイン: リポジトリから書籍を取得するための ネイティブ プラグインです。
詩作成プラグイン: 本の最初の文から詩を作成するための プロンプト プラグインです。
私たちはオープンライブラリ API を使用して書籍の情報を取得します。このプラグインは、本のタイトル、著者、最初の文を含む検索結果の上位 5 件を返します。
具体的には、次のエンドポイントを使用して情報を取得します: https://openlibrary.org/search.json?q={user-query}&fields=key,title,author_name,first_sentence&limit=5。
まず、システム内の書籍を表す BookModel を定義します。
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
そして今度は関数の時間です。関数と引数の両方を明確に説明します。この場合、複雑なオブジェクトを応答として使用しますが、モデルはそれを後のさらなる応答で使用できます。
self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
最後に、このプラグインをカーネルに追加できます:
from datetime import datetime from typing import Annotated from semantic_kernel.functions.kernel_function_decorator import kernel_function class MyFormatterPlugin(): @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable def formate_current_date( self, strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value return datetime.today().strftime(strftime_format)
このプラグインは、いくつかの特定の制限付きで プロンプト プラグイン として定義します。プロンプトとその構成は次のようになります:
/plugins/poem-plugin/poem-creator/config.json:
self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
/plugins/poem-plugin/poem-creator/skprompt.txt:
# Create the settings settings = AzureChatPromptExecutionSettings() # Set the behavior as automatic settings.function_choice_behavior = FunctionChoiceBehavior.Auto() # Pass the settings to the agent self.agent = ChatCompletionAgent( service_id='chat_completion', kernel=self.kernel, name='Assistant', instructions="The prompt", execution_settings=settings )
カーネルにプラグインを追加するのは簡単です:
class BookModel(TypedDict): author: str title: str first_sentence: str
既存の文献と私自身の経験に基づいたいくつかの提案:
この章では、プラグインとセマンティック カーネル プランニングを使用して、ライブラリアン エージェントをいくつかの特定のスキルで強化しました。
すべてのコードはすでに私の GitHub リポジトリで利用可能であることを覚えていますか?セマンティック カーネル用の PyChatbot。
次の章では、インスペクターを作成することで、モデルがどのようにプラグインを呼び出し、相互作用するかをリアルタイムで検査するためのいくつかの機能をチャットに組み込みます。
以上がセマンティック カーネルを使用したチャットボットの構築 - パーツ プラグインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。