>백엔드 개발 >파이썬 튜토리얼 >Semantic Kernel을 사용하여 챗봇 구축 - 파트 플러그인

Semantic Kernel을 사용하여 챗봇 구축 - 파트 플러그인

Linda Hamilton
Linda Hamilton원래의
2024-12-06 07:33:15626검색

이전 장에서는 시맨틱 커널의 몇 가지 기본 개념을 살펴보고 일반적인 질문에 응답할 수 있지만 지침을 사용하여 사전 정의된 어조와 목적을 갖춘 작동하는 에이전트로 마무리했습니다.

이 두 번째 장에서는 플러그인을 사용하여 사서에 특정 기술을 추가하겠습니다.

플러그인이란 무엇입니까?

플러그인은 AI 서비스에 노출되는 기능들의 집합입니다. 플러그인은 기능을 캡슐화하여 어시스턴트가 기본 동작의 일부가 아닌 작업을 수행할 수 있도록 합니다.

예를 들어 플러그인을 사용하면 어시스턴트가 API나 데이터베이스에서 일부 데이터를 가져올 수 있습니다. 또한 보조자는 API를 통해 사용자를 대신하여 일부 작업을 수행할 수 있습니다. 또한 어시스턴트는 플러그인을 사용하여 UI의 일부를 업데이트할 수 있습니다.

앞서 말했듯이 플러그인은 다양한 기능으로 구성되어 있습니다. 각 기능은 주로 다음과 같이 정의됩니다.

  • 설명: 함수의 목적과 호출 시점. 함수 호출 섹션에서 볼 수 있듯이 이는 모델이 언제 호출할지 결정하는 데 도움이 됩니다.
  • 입력 변수: 재사용이 가능하도록 함수를 매개변수화하는 데 사용됩니다.

Semantic Kernel은 다양한 유형의 플러그인을 지원합니다. 이번 포스팅에서는 그 중 Prompt PluginNative Plugin

두 가지에 집중하겠습니다.

프롬프트 플러그인

프롬프트 플러그인은 기본적으로 구체적인 상황에서 호출되는 특정 프롬프트입니다. 일반적인 시나리오에서는 에이전트의 톤, 목적 및 일반적인 동작을 정의하는 복잡한 시스템 프롬프트가 있을 수 있습니다. 그러나 특정 제한 사항과 규칙을 정의해야 하는 경우 에이전트가 구체적인 작업을 수행하기를 원할 수도 있습니다. 이 경우 환각을 줄이고 모델 응답을 관련성 있게 유지하고 제어하기 위해 시스템 프롬프트를 피하여 무한대로 성장하려고 노력할 것입니다. Prompt Plugin을 위한 완벽한 사례입니다:

  1. 시스템 프롬프트: 어조, 목적 및 일반적인 동작.
  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)

함수 호출

함수 호출 또는 Semantic Kernel에서의 계획은 모델이 커널에 등록된 함수를 호출하는 방법입니다.

각 사용자 메시지에 대해 모델은 응답 방법을 결정하기 위한 계획을 만듭니다. 먼저, 채팅 기록과 함수 정보를 사용하여 어떤 함수를 호출해야 하는지 결정합니다. 호출되면 함수 결과를 기록에 추가하고 사용자 메시지에서 작업을 완료했는지 또는 추가 단계가 필요한지 결정합니다. 완료되지 않은 경우 작업이 완료될 때까지 첫 번째 단계부터 다시 시작하거나 사용자의 도움이 필요합니다.

이 루프 덕분에 모델은 여러 기능에 대한 호출을 연결할 수 있습니다. 예를 들어 user_session(사용자 ID 포함)을 반환하는 함수와 current_user_id를 인수로 요구하는 함수가 있을 수 있습니다. 모델은 첫 번째 함수를 호출하여 사용자 세션을 검색하고, 응답을 구문 분석하고, user_id를 두 번째 함수의 인수로 사용하는 계획을 세웁니다.

Building a chatbot with Semantic Kernel - Part Plugins

Semantic Kernel에서는 에이전트에게 함수 호출을 사용하도록 지시해야 합니다. 이는 기능 선택 동작을 자동으로 실행 설정을 정의하여 수행됩니다.

self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")

설명이 자세할수록 더 많은 토큰이 사용되므로 비용이 더 많이 든다는 점을 강조하는 것이 중요합니다. 좋은 상세 설명과 사용된 토큰 사이의 균형을 찾는 것이 중요합니다.

우리 사서를 위한 플러그인

이제 기능과 목적이 무엇인지 알았으니 Librarian 에이전트가 이를 최대한 활용할 수 있는 방법을 살펴보겠습니다.

학습 목적으로 하나의 네이티브 플러그인과 하나의 프롬프트 플러그인을 정의하겠습니다.

  • 책 저장소 플러그인: 저장소에서 책을 검색하는 네이티브 플러그인입니다.

  • Poem creator Plugin: 책의 첫 문장부터 시를 만들어주는 Prompt Plugin입니다.

도서 저장소 플러그인

저희는 도서 정보를 검색하기 위해 Open library 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

모범 사례

기존 문헌과 내 경험을 바탕으로 한 몇 가지 제안:

  • Python 구문을 사용하여 .NET 또는 Java에서도 함수를 설명하세요. 훈련된 데이터로 인해 모델은 일반적으로 Python에 더 능숙합니다.
  • 기능, 특히 설명에 집중하세요. 하나의 기능, 하나의 목적. 너무 많은 것을 만드는 하나의 기능을 만들려고 하지 마세요. 오히려 역효과를 낳을 것입니다 ?
  • 간단한 인수와 적은 수입니다. 더 간단하고 적을수록 모델에서 함수에 대한 호출이 더 안정적으로 이루어지나요?
  • 기능이 많은 경우 설명을 주의 깊게 검토하여 모델을 혼란스럽게 할 수 있는 충돌 가능성이 없는지 확인하세요.
  • 모델에게 (chatgpt 등을 통해) 기능 설명에 대한 피드백을 요청하세요. 일반적으로 개선 사항을 찾는 것이 매우 좋습니다. 그건 그렇고, 이것은 일반적인 프롬프트 개발에도 적용됩니다 ❓
  • 테스트하고, 테스트하고, 테스트하세요. 특히 비즈니스 소프트웨어의 경우 신뢰성이 핵심입니다. 주석을 통해 모델에 제공한 정보를 사용하여 모델이 예상 기능을 호출할 수 있는지 확인하세요.

요약

이 장에서는 플러그인과 시맨틱 커널 계획을 사용하여 몇 가지 특정 기술로 라이브러리 에이전트를 강화했습니다.

모든 코드가 이미 내 GitHub 저장소에 있다는 것을 기억하시나요? 시맨틱 커널용 PyChatbot.

다음 장에서는 Inspector를 생성하여 모델이 플러그인을 호출하고 플러그인과 상호 작용하는 방식을 실시간으로 검사할 수 있는 몇 가지 기능을 채팅에 포함할 것입니다.

위 내용은 Semantic Kernel을 사용하여 챗봇 구축 - 파트 플러그인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.