Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le noyau est le composant central du noyau sémantique. À son niveau le plus simple, le noyau est un conteneur d’injection de dépendances qui gère tous les services et plug-ins nécessaires pour exécuter votre application IA. Si vous fournissez tous vos services et plug-ins au noyau, ils seront ensuite utilisés en toute transparence par l’IA en fonction des besoins.
Le noyau est au centre
Étant donné que le noyau dispose de tous les services et plug-ins nécessaires pour exécuter à la fois du code natif et des services IA, il est utilisé par presque tous les composants du SDK de noyau sémantique pour alimenter vos agents. Cela signifie que si vous exécutez une invite ou du code dans le noyau sémantique, le noyau sera toujours disponible pour récupérer les services et plug-ins nécessaires.
Cela est extrêmement puissant, car cela signifie que vous en tant que développeur disposez d’un emplacement unique où vous pouvez configurer, et plus important encore surveiller, vos agents IA. Par exemple, lorsque vous appelez une invite à partir du noyau. Lorsque vous le faites, le noyau sera...
- Sélectionnez le meilleur service IA pour exécuter l’invite.
- Générez l’invite à l’aide du modèle d’invite fourni.
- Envoyez l’invite au service IA.
- Recevez et analysez la réponse.
- Enfin, retournez la réponse du LLM à votre application.
Tout au long de ce processus, vous pouvez créer des événements et des intergiciels déclenchés à chacune de ces étapes. Cela signifie que vous pouvez effectuer des actions telles que la journalisation, fournir des mises à jour d’état aux utilisateurs, et plus important responsable de l’IA. Tout à partir d’un seul endroit.
Créer un noyau avec des services et des plug-ins
Avant de créer un noyau, vous devez d’abord comprendre les deux types de composants qui existent :
| Composant | Description |
|---|---|
| Services | Il s’agit des deux services IA (par exemple, la saisie semi-automatique de conversation) et d’autres services (par exemple, la journalisation et les clients HTTP) nécessaires pour exécuter votre application. Cela a été modélisé après le modèle fournisseur de services dans .NET afin que nous puissions prendre en charge l’injection de dépendances dans toutes les langues. |
| Plug-ins | Il s’agit des composants qui sont utilisés par vos services IA et invitent des modèles à effectuer un travail. Par exemple, les services IA peuvent utiliser des plug-ins pour récupérer des données à partir d’une base de données ou appeler une API externe pour effectuer des actions. |
Pour commencer à créer un noyau, importez les packages nécessaires en haut de votre fichier :
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
Ensuite, vous pouvez ajouter des services et des plug-ins. Voici un exemple de la façon dont vous pouvez ajouter une complétion de conversation Azure OpenAI, un journaliseur et un plugin de gestion du temps.
// 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();
Importez les packages nécessaires :
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.core_plugins.time_plugin import TimePlugin
Ensuite, vous pouvez créer un noyau.
# Initialize the kernel
kernel = Kernel()
Enfin, vous pouvez ajouter les services et plug-ins nécessaires. Voici un exemple de la façon dont vous pouvez ajouter une saisie semi-automatique de conversation Azure OpenAI, un enregistreur d’événements et un plug-in de temps.
# 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",
)
Création d’un serveur MCP à partir de votre noyau
Nous prenons désormais en charge la création d’un serveur MCP à partir de la fonction que vous avez inscrite dans votre instance de noyau sémantique.
Pour ce faire, vous créez votre noyau comme vous le feriez normalement, puis vous pouvez créer un serveur MCP à partir de celui-ci.
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")
L’objet server créé ci-dessus provient du package mcp, vous pouvez l’étendre encore plus loin par exemple en ajoutant des ressources ou d’autres fonctionnalités à celui-ci. Vous pouvez ensuite le mettre en ligne, par exemple pour être utilisé avec 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)
Ou avec 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)
Exposition de modèles d’invite en tant qu’invite MCP
Vous pouvez également tirer parti des différents modèles d’invite de noyau sémantique en les exposant en tant qu’invites MCP, comme suit :
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])
Générer un noyau
Les noyaux peuvent être générés à l’aide d’un Kernel.builder(). Sur ce point, vous pouvez ajouter les services et plug-ins IA requis.
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
Utilisation de l’injection de dépendance
En C#, vous pouvez utiliser l’injection de dépendances pour créer un noyau. Pour ce faire, créez un ServiceCollection service et ajoutez des plug-ins à celui-ci. Voici un exemple de la manière dont vous pouvez créer un noyau en utilisant l’injection de dépendances.
Conseil
Nous vous recommandons de créer un noyau en tant que service temporaire afin qu’il soit supprimé après chaque utilisation, car la collection de plug-ins est mutable. Le noyau est extrêmement léger (car il s’agit simplement d’un conteneur pour les services et les plug-ins), de sorte que la création d’un nouveau noyau pour chaque utilisation n’est pas un problème de performances.
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);
});
Conseil
Pour plus d’exemples sur l’utilisation de l’injection de dépendances en C#, voir les exemples de concepts.
Étapes suivantes
Maintenant que vous comprenez le noyau, vous pouvez en savoir plus sur tous les différents services IA que vous pouvez y ajouter.