ホームページ >バックエンド開発 >Python チュートリアル >セマンティック カーネルを使用したチャットボットの構築 - パーツ プラグイン

セマンティック カーネルを使用したチャットボットの構築 - パーツ プラグイン

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 07:33:15624ブラウズ

前の章では、セマンティック カーネルの基本概念のいくつかを検討し、一般的な質問に応答できる、ただし指示を使用して事前に定義されたトーンと目的を備えた、動作するエージェントで終了しました。

この第 2 章では、プラグインを使用して、ライブラリアンに特定のスキルを追加します。

プラグインとは何ですか?

プラグインは、AI サービスに公開される一連の機能です。プラグインは機能をカプセル化し、アシスタントがネイティブの動作の一部ではないアクションを実行できるようにします。

たとえば、プラグインを使用すると、アシスタントが API またはデータベースからデータをフェッチできるようになります。さらに、アシスタントは、通常は API を通じて、ユーザーに代わっていくつかのアクションを実行できます。さらに、アシスタントはプラグインを使用して UI の一部を更新できるようになります。

前に述べたように、プラグインはさまざまな機能で構成されています。各関数は主に以下によって定義されます:

  • 説明: 関数の目的といつ呼び出す必要があるか。 関数呼び出しのセクションで説明するように、モデルがいつ呼び出すかを決定するのに役立ちます。
  • 入力変数: 関数をパラメータ化して再利用できるようにするために使用されます。

セマンティック カーネルはさまざまな種類のプラグインをサポートしています。この投稿では、そのうちの 2 つ、プロンプト プラグインネイティブ プラグイン に焦点を当てます。

プロンプトプラグイン

プロンプト プラグイン は、基本的に、具体的な状況下で呼び出される特定のプロンプトです。一般的なシナリオでは、複雑な システム プロンプト があり、そこでエージェントのトーン、目的、一般的な動作を定義します。ただし、特定の制限やルールを定義する必要がある場合には、エージェントに具体的なアクションを実行してもらいたい場合もあります。その場合、幻覚を減らし、モデル応答の関連性と制御性を維持するために、システム プロンプト が無限に増大することを回避しようとします。これは、プロンプト プラグイン:

に最適なケースです。
  1. システム プロンプト: トーン、目的、一般的な動作。
  2. 要約プロンプト: 要約の方法に関するルールと制限が含まれます。たとえば、2 段落を超えてはいけません。

プロンプト プラグイン は 2 つのファイルによって定義されます:

  • config.json: 説明、変数、実行設定を含む構成ファイル:
{
    "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": ""
        }
    ]
}
  • skprompt.txt: プレーンテキストのプロンプトコンテンツ。構成ファイルの変数には、構文 {{$parameter_1}} を使用してアクセスできます。

プロンプトプラグインをカーネルに追加するには、フォルダーを指定するだけです。たとえば、フォルダー構造が /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 番目の関数の引数として使用する計画を作成します。

Building a chatbot with Semantic Kernel - Part Plugins

セマンティック カーネルでは、関数呼び出しを使用するようにエージェントに指示する必要があります。これは、関数選択動作を自動として実行設定を定義することで実行されます。

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

良い習慣

既存の文献と私自身の経験に基づいたいくつかの提案:

  • .NET または Java であっても、Python 構文を使用して関数を記述します。モデルは通常、トレーニングされたデータにより Python の方が熟練します?
  • 機能、特に説明に焦点を当ててください。 1 つの機能、1 つの目的。あまりにも多くのことを行う 1 つの関数を作成しようとしないでください。逆効果になります?
  • 引数が単純で数が少ない。単純で数が少ないほど、モデルから関数への呼び出しの信頼性が高くなります?
  • 多くの関数がある場合は、説明を注意深く確認して、モデルを混乱させる可能性のある潜在的な競合がないことを確認してください。
  • 関数の説明について (chatgpt などを介して) モデルにフィードバックを求めます。通常、それらは改善点を見つけるのに非常に適しています。ちなみに、これはプロンプト開発全般にも当てはまります❓
  • テスト、テスト、テスト。特にビジネス ソフトウェアのケースでは、信頼性が重要です。アノテーション経由で提供した情報を使用してモデルが期待される関数を呼び出せることを確認してください?

まとめ

この章では、プラグインとセマンティック カーネル プランニングを使用して、ライブラリアン エージェントをいくつかの特定のスキルで強化しました。

すべてのコードはすでに私の GitHub リポジトリで利用可能であることを覚えていますか?セマンティック カーネル用の PyChatbot。

次の章では、インスペクターを作成することで、モデルがどのようにプラグインを呼び出し、相互作用するかをリアルタイムで検査するためのいくつかの機能をチャットに組み込みます。

以上がセマンティック カーネルを使用したチャットボットの構築 - パーツ プラグインの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。