Semantic Kernel 구성 요소

Semantic Kernel 구성 요소

Semantic Kernel은 개별적으로 혹은 함께 사용할 수 있는 여러 컴포넌트를 제공해요. 이 글은 각 컴포넌트가 무엇이고 서로 어떤 관계를 맺고 있는지 전체 그림을 잡아 주는 개요예요. 커널·AI 서비스·벡터스토어·함수/플러그인·프롬프트 템플릿·필터가 어떻게 연결되는지 한눈에 볼 수 있어요.

출처: 공식문서

AI 서비스 커넥터 (AI Service Connectors)

AI 서비스 커넥터는 서로 다른 프로바이더의 여러 AI 서비스 유형을 공통 인터페이스로 노출해 주는 추상화 계층이에요. 지원하는 서비스로는 채팅 완성(Chat Completion), 텍스트 생성(Text Generation), 임베딩 생성(Embedding Generation), 텍스트-투-이미지(Text to Image), 이미지-투-텍스트(Image to Text), 텍스트-투-오디오(Text to Audio), 오디오-투-텍스트(Audio to Text)가 있어요.

구현을 커널에 등록하면, 커널에 대한 어떤 메서드 호출에서도 채팅 완성 또는 텍스트 생성 서비스가 기본으로 사용돼요. 나머지 지원 서비스들은 자동으로 사용되지 않아요.

벡터 스토어(메모리) 커넥터 (Vector Store Connectors)

벡터 스토어 커넥터는 여러 프로바이더의 벡터 스토어를 공통 인터페이스로 노출하는 추상화 계층이에요. 커널은 등록된 벡터 스토어를 자동으로 사용하지는 않지만, 벡터 검색(Vector Search)을 플러그인으로 쉽게 노출해 프롬프트 템플릿과 채팅 완성 AI 모델이 사용할 수 있게 만들 수 있어요.

함수와 플러그인 (Functions and Plugins)

플러그인은 이름이 붙은 함수 컨테이너예요. 하나 이상의 함수를 담을 수 있고, 커널에 등록하면 커널이 두 가지 방식으로 사용해요.

  1. 채팅 완성 AI에 광고해서, AI가 호출할 함수를 고르게 해요.
  2. 템플릿 렌더링 중에 템플릿에서 호출될 수 있게 해요.

함수는 다양한 소스에서 쉽게 만들 수 있어요. 네이티브 코드, OpenAPI 규격, RAG 시나리오용 ITextSearch 구현, 그리고 프롬프트 템플릿까지 모두 함수의 소스가 될 수 있죠.

프롬프트 템플릿 (Prompt Templates)

프롬프트 템플릿을 사용하면 개발자나 프롬프트 엔지니어가 AI에 대한 컨텍스트·지침과 사용자 입력·함수 출력을 섞어 넣은 템플릿을 만들 수 있어요. 예를 들어 템플릿에는 채팅 완성 AI 모델에 대한 지침, 사용자 입력 자리표시자(placeholder), 그리고 채팅 완성 AI 모델을 호출하기 전에 항상 실행돼야 하는 플러그인 호출이 하드코딩으로 들어갈 수 있어요.

프롬프트 템플릿은 두 가지 방식으로 사용할 수 있어요.

  1. 채팅 완성 흐름의 시작점으로 — 커널에 템플릿을 렌더링하게 하고, 그 렌더링 결과로 채팅 완성 AI 모델을 호출해요.
  2. 플러그인 함수로 — 다른 함수와 동일하게 호출할 수 있어요.

프롬프트 템플릿을 쓰면 먼저 렌더링되고, 템플릿이 가진 하드코딩된 함수 참조가 실행돼요. 렌더링된 프롬프트는 채팅 완성 AI 모델로 전달되고, AI가 만든 결과는 호출자에게 돌아가요. 템플릿이 플러그인 함수로 등록됐다면, 그 함수는 채팅 완성 AI 모델이 선택해서 실행할 수도 있고, 이 경우 호출자는 AI 모델을 대신한 Semantic Kernel이 돼요.

이렇게 프롬프트 템플릿을 플러그인 함수로 쓰면 꽤 복잡한 흐름이 생길 수 있어요. 예를 들어 프롬프트 템플릿 A가 플러그인으로 등록돼 있고, 다른 프롬프트 템플릿 B가 채팅 완성 흐름을 시작하도록 커널에 전달됐다고 해 볼게요. BA를 하드코딩으로 호출하면 이런 단계들이 발생해요.

  1. B 렌더링이 시작되고 프롬프트 실행이 A에 대한 참조를 찾아요.
  2. A가 렌더링돼요.
  3. A의 렌더링 결과가 채팅 완성 AI 모델로 전달돼요.
  4. 채팅 완성 AI 모델의 결과가 B로 돌아가요.
  5. B 렌더링이 완료돼요.
  6. B의 렌더링 결과가 채팅 완성 AI 모델로 전달돼요.
  7. 채팅 완성 AI 모델의 결과가 호출자에게 돌아가요.

B에서 A로의 하드코딩 호출이 없는 시나리오도 생각해 볼게요. 함수 호출(function calling)이 켜져 있으면, 채팅 완성 AI 모델이 A가 제공할 수 있는 데이터나 기능이 필요하다고 판단해 A를 호출해야 한다고 결정할 수도 있어요.

프롬프트 템플릿을 플러그인 함수로 등록하면 실제 코드 대신 인간 언어로 설명된 기능을 만들 수 있게 돼요. 기능을 이렇게 플러그인으로 분리하면 AI 모델이 메인 실행 흐름과 별개로 그 기능을 추론할 수 있고, 한 번에 하나의 문제에 집중할 수 있어 성공률이 높아질 수 있어요.

필터 (Filters)

필터는 채팅 완성 흐름 중 특정 이벤트 전후에 사용자 정의 동작을 취하게 해 주는 방법이에요. 대상 이벤트는 다음과 같아요.

  1. 함수 호출 전과 후.
  2. 프롬프트 렌더링 전과 후.

필터는 채팅 완성 흐름 중에 호출되도록 커널에 등록해야 해요.

프롬프트 템플릿은 실행 전에 항상 KernelFunction으로 변환되기 때문에, 프롬프트 템플릿에 대해서도 함수 필터와 프롬프트 필터가 모두 호출돼요. 필터가 하나 이상 있을 때는 중첩(nested)되는데, 함수 필터가 바깥 필터이고 프롬프트 필터가 안쪽 필터예요.

더 알아보기 (Learn more)