Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ядро является центральным компонентом семантического ядра. На самом простом этапе ядро — это контейнер внедрения зависимостей, который управляет всеми службами и подключаемыми модулями, необходимыми для запуска приложения ИИ. Если вы предоставляете все службы и подключаемые модули в ядро, они будут легко использоваться ИИ по мере необходимости.
Ядро находится в центре
Так как ядро содержит все службы и подключаемые модули, необходимые для запуска машинного кода и служб ИИ, он используется практически каждым компонентом пакета SDK для семантического ядра для управления агентами. Это означает, что при выполнении любого запроса или кода в семантическом ядре ядро всегда будет доступно для получения необходимых служб и подключаемых модулей.
Это очень мощно, так как это означает, что вы как разработчик имеете одно место, где можно настроить, и, что самое главное, отслеживать агенты ИИ. Например, при вызове запроса из ядра. Когда вы это сделаете, ядро будет...
- Выберите лучшую службу ИИ, чтобы запустить запрос.
- Создайте запрос с помощью предоставленного шаблона запроса.
- Отправьте запрос в службу ИИ.
- Получение и анализ ответа.
- И, наконец, верните ответ LLM в ваше приложение.
На протяжении всего этого процесса можно создавать события и ПО промежуточного слоя, которые активируются на каждом из этих шагов. Это означает, что вы можете выполнять такие действия, как ведение журнала, предоставлять обновления состояния пользователям и, что самое главное, ответственное ИИ. Все из одного места.
Создание ядра со службами и подключаемыми модулями
Прежде чем создавать ядро, необходимо сначала понять два типа компонентов, которые существуют:
| Компонент | Описание |
|---|---|
| Сервисы; | Они состоят из служб ИИ (например, завершения чата) и других служб (например, журналов и HTTP-клиентов), необходимых для запуска приложения. Это было моделировано после шаблона поставщика услуг в .NET, чтобы мы могли поддерживать внедрение зависимостей на всех языках. |
| Подключаемые модули | Это компоненты, которые используются службами ИИ и шаблонами запросов для выполнения работы. Например, службы ИИ могут использовать подключаемые модули для получения данных из базы данных или вызова внешнего 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(). В этом случае можно добавить необходимые службы ИИ и подключаемые модули.
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#, смотрите в примерах концепции.
Следующие шаги
Теперь, когда вы понимаете ядро, вы можете узнать обо всех различных службах ИИ, которые можно добавить в него.