커널은 의미 체계 커널의 중심 구성 요소입니다. 가장 간단하게 커널은 AI 애플리케이션을 실행하는 데 필요한 모든 서비스 및 플러그 인을 관리하는 종속성 주입 컨테이너입니다. 커널에 모든 서비스 및 플러그 인을 제공하는 경우 필요에 따라 AI에서 원활하게 사용됩니다.
커널이 가운데에 있습니다.
커널에는 네이티브 코드와 AI 서비스를 모두 실행하는 데 필요한 모든 서비스와 플러그 인이 있으므로 의미 체계 커널 SDK 내의 거의 모든 구성 요소에서 에이전트에 전원을 공급하는 데 사용됩니다. 즉, 의미 체계 커널에서 프롬프트 또는 코드를 실행하는 경우 커널을 항상 사용하여 필요한 서비스 및 플러그 인을 검색할 수 있습니다.
이는 개발자로서 AI 에이전트를 구성하고 가장 중요하게 모니터링할 수 있는 단일 위치를 가지고 있다는 것을 의미하기 때문에 매우 강력합니다. 예를 들어 커널에서 프롬프트를 호출하는 경우를 예로 들어보십시오. 이렇게 하면 커널은 ...
- 프롬프트를 실행할 최상의 AI 서비스를 선택합니다.
- 제공된 프롬프트 템플릿을 사용하여 프롬프트를 빌드합니다.
- AI 서비스에 프롬프트를 보냅니다.
- 응답을 수신하고 구문 분석합니다.
- 마지막으로 LLM의 응답을 애플리케이션에 반환합니다.
이 전체 프로세스에서 이러한 각 단계에서 트리거되는 이벤트 및 미들웨어를 만들 수 있습니다. 즉, 로깅과 같은 작업을 수행하고, 사용자에게 상태 업데이트를 제공하고, 가장 중요한 책임 있는 AI를 제공할 수 있습니다. 모두 한 곳에서.
서비스 및 플러그 인을 사용하여 커널 빌드
커널을 빌드하기 전에 먼저 존재하는 두 가지 유형의 구성 요소를 이해해야 합니다.
구성 요소 | 설명 |
---|---|
서비스 | 이러한 서비스는 애플리케이션을 실행하는 데 필요한 AI 서비스(예: 채팅 완료) 및 기타 서비스(예: 로깅 및 HTTP 클라이언트)로 구성됩니다. 모든 언어에서 종속성 주입을 지원할 수 있도록 .NET의 서비스 공급자 패턴을 기반으로 모델링되었습니다. |
플러그 인 | 이러한 구성 요소는 AI 서비스와 프롬프트 템플릿에서 작업을 수행하는 데 사용되는 구성 요소입니다. 예를 들어 AI 서비스는 플러그 인을 사용하여 데이터베이스에서 데이터를 검색하거나 외부 API를 호출하여 작업을 수행할 수 있습니다. |
커널 만들기를 시작하려면 파일 맨 위에 필요한 패키지를 가져옵니다.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
다음으로 서비스 및 플러그 인을 추가할 수 있습니다. 다음은 Azure OpenAI 채팅 완료, 로거 및 시간 플러그 인을 추가하는 방법의 예입니다.
// Create a kernel with a logger and Azure OpenAI chat completion service
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(LogLevel.Trace));
builder.Plugins.AddFromType<TimePlugin>();
Kernel kernel = builder.Build();
필요한 패키지를 가져옵니다.
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.core_plugins.time_plugin import TimePlugin
다음으로 커널을 만들 수 있습니다.
# Initialize the kernel
kernel = Kernel()
마지막으로 필요한 서비스 및 플러그 인을 추가할 수 있습니다. 다음은 Azure OpenAI 채팅 완료, 로거 및 시간 플러그 인을 추가하는 방법의 예입니다.
# Add the Azure OpenAI chat completion service
kernel.add_service(AzureChatCompletion(model_id, endpoint, api_key))
# Add a plugin
kernel.add_plugin(
TimePlugin(),
plugin_name="TimePlugin",
)
커널에서 MCP 서버 만들기
이제 의미 체계 커널 인스턴스에 등록한 함수에서 MCP 서버 만들기를 지원합니다.
이렇게 하려면 평소처럼 커널을 만든 다음 해당 커널에서 MCP 서버를 만들 수 있습니다.
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import kernel_function
from semantic_kernel.prompt_template import InputVariable, PromptTemplateConfig
kernel = Kernel()
@kernel_function()
def echo_function(message: str, extra: str = "") -> str:
"""Echo a message as a function"""
return f"Function echo: {message} {extra}"
kernel.add_service(OpenAIChatCompletion(service_id="default"))
kernel.add_function("echo", echo_function, "echo_function")
kernel.add_function(
plugin_name="prompt",
function_name="prompt",
prompt_template_config=PromptTemplateConfig(
name="prompt",
description="This is a prompt",
template="Please repeat this: {{$message}} and this: {{$extra}}",
input_variables=[
InputVariable(
name="message",
description="This is the message.",
is_required=True,
json_schema='{ "type": "string", "description": "This is the message."}',
),
InputVariable(
name="extra",
description="This is extra.",
default="default",
is_required=False,
json_schema='{ "type": "string", "description": "This is the message."}',
),
],
),
)
server = kernel.as_mcp_server(server_name="sk")
위에서 만든 개체는 server
mcp 패키지에서 가져온 것이며, 예를 들어 리소스 또는 기타 기능을 추가하여 더 확장할 수 있습니다. 그런 다음, 예를 들어 Stdio와 함께 사용할 수 있도록 온라인 상태로 만들 수 있습니다.
import anyio
from mcp.server.stdio import stdio_server
async def handle_stdin(stdin: Any | None = None, stdout: Any | None = None) -> None:
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
anyio.run(handle_stdin)
또는 SSE를 사용하여 다음을 수행합니다.
import uvicorn
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import Mount, Route
sse = SseServerTransport("/messages/")
async def handle_sse(request):
async with sse.connect_sse(request.scope, request.receive, request._send) as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
starlette_app = Starlette(
debug=True,
routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages/", app=sse.handle_post_message),
],
)
uvicorn.run(starlette_app, host="0.0.0.0", port=8000)
MCP 프롬프트로 프롬프트 템플릿 노출
다음과 같이 MCP 프롬프트로 노출하여 다양한 의미 체계 커널 프롬프트 템플릿을 활용할 수도 있습니다.
from semantic_kernel.prompt_template import InputVariable, KernelPromptTemplate, PromptTemplateConfig
prompt = KernelPromptTemplate(
prompt_template_config=PromptTemplateConfig(
name="release_notes_prompt",
description="This creates the prompts for a full set of release notes based on the PR messages given.",
template=template,
input_variables=[
InputVariable(
name="messages",
description="These are the PR messages, they are a single string with new lines.",
is_required=True,
json_schema='{"type": "string"}',
)
],
)
)
server = kernel.as_mcp_server(server_name="sk_release_notes", prompts=[prompt])
커널 빌드
커널은 .를 Kernel.builder()
사용하여 빌드할 수 있습니다. 여기서 필요한 AI 서비스 및 플러그 인을 추가할 수 있습니다.
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
종속성 주입 사용
C#에서 종속성 주입을 사용하여 커널을 만들 수 있습니다. 이렇게 하려면 서비스 및 플러그 인을 만들고 ServiceCollection
추가합니다. 다음은 종속성 주입을 사용하여 커널을 만드는 방법의 예입니다.
팁
플러그 인 컬렉션이 변경 가능하기 때문에 각 사용 후에 삭제되도록 커널을 임시 서비스로 만드는 것이 좋습니다. 커널은 매우 가벼우므로(서비스 및 플러그 인에 대한 컨테이너일 뿐이므로) 각 사용에 대해 새 커널을 만드는 것은 성능에 문제가 되지 않습니다.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
// Add the OpenAI chat completion service as a singleton
builder.Services.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional; for OpenAI deployment
serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
// Create singletons of your plugins
builder.Services.AddSingleton(() => new LightsPlugin());
builder.Services.AddSingleton(() => new SpeakerPlugin());
// Create the plugin collection (using the KernelPluginFactory to create plugins from objects)
builder.Services.AddSingleton<KernelPluginCollection>((serviceProvider) =>
[
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<LightsPlugin>()),
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<SpeakerPlugin>())
]
);
// Finally, create the Kernel service with the service provider and plugin collection
builder.Services.AddTransient((serviceProvider)=> {
KernelPluginCollection pluginCollection = serviceProvider.GetRequiredService<KernelPluginCollection>();
return new Kernel(serviceProvider, pluginCollection);
});
팁
C#에서 종속성 주입을 사용하는 방법에 대한 자세한 샘플은 개념 샘플을 참조하세요.
다음 단계
이제 커널을 이해했으므로 커널에 추가할 수 있는 다양한 AI 서비스에 대해 알아볼 수 있습니다.