이전 장에서는 시맨틱 커널의 몇 가지 기본 개념을 살펴보고 일반적인 질문에 응답할 수 있지만 지침을 사용하여 사전 정의된 어조와 목적을 갖춘 작동하는 에이전트로 마무리했습니다.
이 두 번째 장에서는 플러그인을 사용하여 사서에 특정 기술을 추가하겠습니다.
플러그인은 AI 서비스에 노출되는 기능들의 집합입니다. 플러그인은 기능을 캡슐화하여 어시스턴트가 기본 동작의 일부가 아닌 작업을 수행할 수 있도록 합니다.
예를 들어 플러그인을 사용하면 어시스턴트가 API나 데이터베이스에서 일부 데이터를 가져올 수 있습니다. 또한 보조자는 API를 통해 사용자를 대신하여 일부 작업을 수행할 수 있습니다. 또한 어시스턴트는 플러그인을 사용하여 UI의 일부를 업데이트할 수 있습니다.
앞서 말했듯이 플러그인은 다양한 기능으로 구성되어 있습니다. 각 기능은 주로 다음과 같이 정의됩니다.
Semantic Kernel은 다양한 유형의 플러그인을 지원합니다. 이번 포스팅에서는 그 중 Prompt Plugin과 Native Plugin
두 가지에 집중하겠습니다.프롬프트 플러그인은 기본적으로 구체적인 상황에서 호출되는 특정 프롬프트입니다. 일반적인 시나리오에서는 에이전트의 톤, 목적 및 일반적인 동작을 정의하는 복잡한 시스템 프롬프트가 있을 수 있습니다. 그러나 특정 제한 사항과 규칙을 정의해야 하는 경우 에이전트가 구체적인 작업을 수행하기를 원할 수도 있습니다. 이 경우 환각을 줄이고 모델 응답을 관련성 있게 유지하고 제어하기 위해 시스템 프롬프트를 피하여 무한대로 성장하려고 노력할 것입니다. Prompt Plugin을 위한 완벽한 사례입니다:
프롬프트 플러그인은 두 파일로 정의됩니다.
{ "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)
함수 호출 또는 Semantic Kernel에서의 계획은 모델이 커널에 등록된 함수를 호출하는 방법입니다.
각 사용자 메시지에 대해 모델은 응답 방법을 결정하기 위한 계획을 만듭니다. 먼저, 채팅 기록과 함수 정보를 사용하여 어떤 함수를 호출해야 하는지 결정합니다. 호출되면 함수 결과를 기록에 추가하고 사용자 메시지에서 작업을 완료했는지 또는 추가 단계가 필요한지 결정합니다. 완료되지 않은 경우 작업이 완료될 때까지 첫 번째 단계부터 다시 시작하거나 사용자의 도움이 필요합니다.
이 루프 덕분에 모델은 여러 기능에 대한 호출을 연결할 수 있습니다. 예를 들어 user_session(사용자 ID 포함)을 반환하는 함수와 current_user_id를 인수로 요구하는 함수가 있을 수 있습니다. 모델은 첫 번째 함수를 호출하여 사용자 세션을 검색하고, 응답을 구문 분석하고, user_id를 두 번째 함수의 인수로 사용하는 계획을 세웁니다.
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
기존 문헌과 내 경험을 바탕으로 한 몇 가지 제안:
이 장에서는 플러그인과 시맨틱 커널 계획을 사용하여 몇 가지 특정 기술로 라이브러리 에이전트를 강화했습니다.
모든 코드가 이미 내 GitHub 저장소에 있다는 것을 기억하시나요? 시맨틱 커널용 PyChatbot.
다음 장에서는 Inspector를 생성하여 모델이 플러그인을 호출하고 플러그인과 상호 작용하는 방식을 실시간으로 검사할 수 있는 몇 가지 기능을 채팅에 포함할 것입니다.
위 내용은 Semantic Kernel을 사용하여 챗봇 구축 - 파트 플러그인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!