Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Advertencia
El marco de proceso de kernel semántico es experimental, aún en desarrollo y está sujeto a cambios.
Visión general
El Marco de Procesos del Kernel Semántico es un SDK de orquestación poderoso diseñado para simplificar el desarrollo y la ejecución de procesos con integración de IA. Tanto si administra flujos de trabajo simples como sistemas complejos, este marco le permite definir una serie de pasos que se pueden ejecutar de forma estructurada, lo que mejora las funcionalidades de la aplicación con facilidad y flexibilidad.
Creado para la extensibilidad, el marco de procesos admite diversos patrones operativos, como la ejecución secuencial, el procesamiento paralelo, las configuraciones de entrada y salida, e incluso las estrategias de map-reduce. Esta capacidad de adaptación hace que sea adecuado para una variedad de aplicaciones reales, especialmente aquellas que requieren flujos de trabajo inteligentes de toma de decisiones y varios pasos.
Empezar
El Semantic Kernel Process Framework se puede usar para infundir inteligencia artificial en casi cualquier proceso de negocio que pueda imaginar. Como ejemplo ilustrativo para empezar, echemos un vistazo a la creación de un proceso para generar documentación para un nuevo producto.
Antes de empezar, asegúrese de que tiene instalados los paquetes de kernel semántico necesarios:
// Install the Semantic Kernel Process Framework Local Runtime package
dotnet add package Microsoft.SemanticKernel.Process.LocalRuntime --version 1.46.0-alpha
// or
// Install the Semantic Kernel Process Framework Dapr Runtime package
dotnet add package Microsoft.SemanticKernel.Process.Runtime.Dapr --version 1.46.0-alpha
pip install semantic-kernel==1.20.0
Ejemplo ilustrativo: Generación de documentación para un nuevo producto
En este ejemplo, usaremos el marco de proceso de kernel semántico para desarrollar un proceso automatizado para crear documentación para un nuevo producto. Este proceso comenzará a ser sencillo y evolucionará a medida que vayamos a cubrir escenarios más realistas.
Comenzaremos modelando el proceso de documentación con un flujo muy básico:
-
GatherProductInfoStep: recopile información sobre el producto. -
GenerateDocumentationStep: pida a un LLM que genere documentación a partir de la información recopilada en el paso 1. -
PublishDocumentationStep: publique la documentación.
Ahora que entendemos nuestros procesos, vamos a construirlo.
Definición de los pasos del proceso
Cada paso de un proceso se define mediante una clase que hereda de nuestra clase de paso base. Para este proceso, tenemos tres pasos:
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel;
// A process step to gather information about a product
public class GatherProductInfoStep: KernelProcessStep
{
[KernelFunction]
public string GatherProductInformation(string productName)
{
Console.WriteLine($"{nameof(GatherProductInfoStep)}:\n\tGathering product information for product named {productName}");
// For example purposes we just return some fictional information.
return
"""
Product Description:
GlowBrew is a revolutionary AI driven coffee machine with industry leading number of LEDs and programmable light shows. The machine is also capable of brewing coffee and has a built in grinder.
Product Features:
1. **Luminous Brew Technology**: Customize your morning ambiance with programmable LED lights that sync with your brewing process.
2. **AI Taste Assistant**: Learns your taste preferences over time and suggests new brew combinations to explore.
3. **Gourmet Aroma Diffusion**: Built-in aroma diffusers enhance your coffee's scent profile, energizing your senses before the first sip.
Troubleshooting:
- **Issue**: LED Lights Malfunctioning
- **Solution**: Reset the lighting settings via the app. Ensure the LED connections inside the GlowBrew are secure. Perform a factory reset if necessary.
""";
}
}
// A process step to generate documentation for a product
public class GenerateDocumentationStep : KernelProcessStep<GeneratedDocumentationState>
{
private GeneratedDocumentationState _state = new();
private string systemPrompt =
"""
Your job is to write high quality and engaging customer facing documentation for a new product from Contoso. You will be provide with information
about the product in the form of internal documentation, specs, and troubleshooting guides and you must use this information and
nothing else to generate the documentation. If suggestions are provided on the documentation you create, take the suggestions into account and
rewrite the documentation. Make sure the product sounds amazing.
""";
// Called by the process runtime when the step instance is activated. Use this to load state that may be persisted from previous activations.
override public ValueTask ActivateAsync(KernelProcessStepState<GeneratedDocumentationState> state)
{
this._state = state.State!;
this._state.ChatHistory ??= new ChatHistory(systemPrompt);
return base.ActivateAsync(state);
}
[KernelFunction]
public async Task GenerateDocumentationAsync(Kernel kernel, KernelProcessStepContext context, string productInfo)
{
Console.WriteLine($"[{nameof(GenerateDocumentationStep)}]:\tGenerating documentation for provided productInfo...");
// Add the new product info to the chat history
this._state.ChatHistory!.AddUserMessage($"Product Info:\n{productInfo.Title} - {productInfo.Content}");
// Get a response from the LLM
IChatCompletionService chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
var generatedDocumentationResponse = await chatCompletionService.GetChatMessageContentAsync(this._state.ChatHistory!);
DocumentInfo generatedContent = new()
{
Id = Guid.NewGuid().ToString(),
Title = $"Generated document - {productInfo.Title}",
Content = generatedDocumentationResponse.Content!,
};
this._state!.LastGeneratedDocument = generatedContent;
await context.EmitEventAsync("DocumentationGenerated", generatedContent);
}
public class GeneratedDocumentationState
{
public DocumentInfo LastGeneratedDocument { get; set; } = new();
public ChatHistory? ChatHistory { get; set; }
}
}
// A process step to publish documentation
public class PublishDocumentationStep : KernelProcessStep
{
[KernelFunction]
public DocumentInfo PublishDocumentation(DocumentInfo document)
{
// For example purposes we just write the generated docs to the console
Console.WriteLine($"[{nameof(PublishDocumentationStep)}]:\tPublishing product documentation approved by user: \n{document.Title}\n{document.Content}");
return document;
}
}
// Custom classes must be serializable
public class DocumentInfo
{
public string Id { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
}
El código anterior define los tres pasos que necesitamos para nuestro proceso. Hay algunos puntos que destacar:
- En Kernel semántico, un
KernelFunctiondefine un bloque de código invocable por código nativo o por un LLM. En el caso del marco de proceso,KernelFunctions son los miembros invocables de un paso y cada paso requiere que se defina al menos un kernelFunction. - El Process Framework admite etapas sin estado y con estado. Los pasos con estado registran automáticamente su progreso y mantienen el estado durante múltiples invocaciones.
GenerateDocumentationStepproporciona un ejemplo de esto en el que se usa laGeneratedDocumentationStateclase para conservar elChatHistoryobjeto yLastGeneratedDocument. - Los pasos pueden emitir eventos manualmente llamando a
EmitEventAsyncen el objetoKernelProcessStepContext. Para obtener una instancia deKernelProcessStepContextsimplemente agréguela como parámetro en kernelFunction y el marco lo insertará automáticamente.
import asyncio
from typing import ClassVar
from pydantic import BaseModel, Field
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.contents import ChatHistory
from semantic_kernel.functions import kernel_function
from semantic_kernel.processes import ProcessBuilder
from semantic_kernel.processes.kernel_process import KernelProcessStep, KernelProcessStepContext, KernelProcessStepState
from semantic_kernel.processes.local_runtime import KernelProcessEvent, start
# A process step to gather information about a product
class GatherProductInfoStep(KernelProcessStep):
@kernel_function
def gather_product_information(self, product_name: str) -> str:
print(f"{GatherProductInfoStep.__name__}\n\t Gathering product information for Product Name: {product_name}")
return """
Product Description:
GlowBrew is a revolutionary AI driven coffee machine with industry leading number of LEDs and
programmable light shows. The machine is also capable of brewing coffee and has a built in grinder.
Product Features:
1. **Luminous Brew Technology**: Customize your morning ambiance with programmable LED lights that sync
with your brewing process.
2. **AI Taste Assistant**: Learns your taste preferences over time and suggests new brew combinations
to explore.
3. **Gourmet Aroma Diffusion**: Built-in aroma diffusers enhance your coffee's scent profile, energizing
your senses before the first sip.
Troubleshooting:
- **Issue**: LED Lights Malfunctioning
- **Solution**: Reset the lighting settings via the app. Ensure the LED connections inside the
GlowBrew are secure. Perform a factory reset if necessary.
"""
# A sample step state model for the GenerateDocumentationStep
class GeneratedDocumentationState(BaseModel):
"""State for the GenerateDocumentationStep."""
chat_history: ChatHistory | None = None
# A process step to generate documentation for a product
class GenerateDocumentationStep(KernelProcessStep[GeneratedDocumentationState]):
state: GeneratedDocumentationState = Field(default_factory=GeneratedDocumentationState)
system_prompt: ClassVar[str] = """
Your job is to write high quality and engaging customer facing documentation for a new product from Contoso. You will
be provided with information about the product in the form of internal documentation, specs, and troubleshooting guides
and you must use this information and nothing else to generate the documentation. If suggestions are provided on the
documentation you create, take the suggestions into account and rewrite the documentation. Make sure the product
sounds amazing.
"""
async def activate(self, state: KernelProcessStepState[GeneratedDocumentationState]):
self.state = state.state
if self.state.chat_history is None:
self.state.chat_history = ChatHistory(system_message=self.system_prompt)
self.state.chat_history
@kernel_function
async def generate_documentation(
self, context: KernelProcessStepContext, product_info: str, kernel: Kernel
) -> None:
print(f"{GenerateDocumentationStep.__name__}\n\t Generating documentation for provided product_info...")
self.state.chat_history.add_user_message(f"Product Information:\n{product_info}")
chat_service, settings = kernel.select_ai_service(type=ChatCompletionClientBase)
assert isinstance(chat_service, ChatCompletionClientBase) # nosec
response = await chat_service.get_chat_message_content(chat_history=self.state.chat_history, settings=settings)
await context.emit_event(process_event="documentation_generated", data=str(response))
# A process step to publish documentation
class PublishDocumentationStep(KernelProcessStep):
@kernel_function
async def publish_documentation(self, docs: str) -> None:
print(f"{PublishDocumentationStep.__name__}\n\t Publishing product documentation:\n\n{docs}")
El código anterior define los tres pasos que necesitamos para nuestro proceso. Hay algunos puntos que destacar:
- En Kernel semántico, un
KernelFunctiondefine un bloque de código invocable por código nativo o por un LLM. En el caso del marco de proceso,KernelFunctions son los miembros invocables de un paso y cada paso requiere que se defina al menos un kernelFunction. - El Process Framework admite etapas sin estado y con estado. Los pasos con estado registran automáticamente su progreso y mantienen el estado durante múltiples invocaciones. El
GenerateDocumentationStepproporciona un ejemplo de esto en el que se usa la claseGeneratedDocumentationStatepara conservar el objetoChatHistory. - Los pasos pueden emitir eventos manualmente llamando a
emit_eventen el objetoKernelProcessStepContext. Para obtener una instancia deKernelProcessStepContextsimplemente agréguela como parámetro en kernelFunction y el marco lo insertará automáticamente.
Definición del flujo de proceso
// Create the process builder
ProcessBuilder processBuilder = new("DocumentationGeneration");
// Add the steps
var infoGatheringStep = processBuilder.AddStepFromType<GatherProductInfoStep>();
var docsGenerationStep = processBuilder.AddStepFromType<GenerateDocumentationStep>();
var docsPublishStep = processBuilder.AddStepFromType<PublishDocumentationStep>();
// Orchestrate the events
processBuilder
.OnInputEvent("Start")
.SendEventTo(new(infoGatheringStep));
infoGatheringStep
.OnFunctionResult()
.SendEventTo(new(docsGenerationStep));
docsGenerationStep
.OnFunctionResult()
.SendEventTo(new(docsPublishStep));
Hay algunas cosas que suceden aquí, así que vamos a desglosarlo paso a paso.
Crear el constructor: Los procesos usan un patrón de constructor para simplificar la configuración de todo. El constructor proporciona métodos para gestionar los pasos dentro del proceso y para gestionar el ciclo de vida del proceso.
Agregue los pasos: los pasos se agregan al proceso llamando al método
AddStepFromTypedel generador. Esto permite que Process Framework administre el ciclo de vida de los pasos mediante la instanciación de instancias según sea necesario. En este caso, hemos agregado tres pasos al proceso y hemos creado una variable para cada una. Estas variables nos proporcionan un acceso a la instancia única de cada paso que podemos utilizar a continuación para definir la coordinación de eventos.Orquestar los eventos. Aquí se define el enrutamiento de eventos de un paso a otro. En este caso, tenemos las siguientes rutas:
- Cuando se envía un evento externo con
id = Startal proceso, este evento y sus datos asociados se enviarán al pasoinfoGatheringStep. - Cuando el
infoGatheringSteptermine de ejecutarse, envíe el objeto devuelto al pasodocsGenerationStep. - Por último, cuando el
docsGenerationSteptermine de ejecutarse, envíe el objeto devuelto al pasodocsPublishStep.
- Cuando se envía un evento externo con
Propina
Enrutamiento de eventos del Process Framework: Es posible que se pregunte cómo los eventos enviados a los pasos se enrutan hacia las KernelFunctions dentro del paso. En el código anterior, cada paso ha definido solo una única KernelFunction y cada KernelFunction tiene solo un único parámetro (aparte de Kernel y el contexto del paso, que son especiales; más sobre eso después). Cuando el evento que contiene la documentación generada se envía al docsPublishStep se pasará al parámetro document del kernelFunction de PublishDocumentation del paso docsGenerationStep porque no hay ninguna otra opción. Sin embargo, los pasos pueden incluir varias funciones núcleo y estas funciones pueden tener múltiples parámetros. En estos escenarios avanzados, es necesario especificar la función y el parámetro objetivo.
# Create the process builder
process_builder = ProcessBuilder(name="DocumentationGeneration")
# Add the steps
info_gathering_step = process_builder.add_step(GatherProductInfoStep)
docs_generation_step = process_builder.add_step(GenerateDocumentationStep)
docs_publish_step = process_builder.add_step(PublishDocumentationStep)
# Orchestrate the events
process_builder.on_input_event("Start").send_event_to(target=info_gathering_step)
info_gathering_step.on_function_result().send_event_to(
target=docs_generation_step, function_name="generate_documentation", parameter_name="product_info"
)
docs_generation_step.on_event("documentation_generated").send_event_to(target=docs_publish_step)
# Configure the kernel with an AI service and connection details, if necessary
kernel = Kernel()
kernel.add_service(AzureChatCompletion())
# Build the process
kernel_process = process_builder.build()
Hay algunas cosas que suceden aquí, así que vamos a desglosarlo paso a paso.
Crear el constructor: Los procesos usan un patrón de constructor para simplificar la configuración de todo. El constructor proporciona métodos para gestionar los pasos dentro del proceso y para gestionar el ciclo de vida del proceso.
Agregue los pasos: los pasos se añaden al proceso mediante la llamada al método
add_stepdel constructor, que añade el tipo de paso al constructor. Esto permite que Process Framework administre el ciclo de vida de los pasos mediante la instanciación de instancias según sea necesario. En este caso, hemos agregado tres pasos al proceso y hemos creado una variable para cada una. Estas variables nos proporcionan un acceso a la instancia única de cada paso que podemos utilizar a continuación para definir la coordinación de eventos.Orquestar los eventos. Aquí se define el enrutamiento de eventos de un paso a otro. En este caso, tenemos las siguientes rutas:
- Cuando se envía un evento externo con
id = Startal proceso, este evento y sus datos asociados se enviarán a .info_gathering_step - Cuando
info_gathering_steptermine de ejecutarse, envíe el objeto devuelto adocs_generation_step. - Por último, cuando
docs_generation_steptermine de ejecutarse, envíe el objeto devuelto adocs_publish_step.
- Cuando se envía un evento externo con
Propina
Enrutamiento de eventos del Process Framework: Es posible que se pregunte cómo los eventos enviados a los pasos se enrutan hacia las KernelFunctions dentro del paso. En el código anterior, cada paso ha definido solo una única KernelFunction y cada KernelFunction tiene solo un único parámetro (aparte de Kernel y el contexto del paso, que son especiales; más sobre eso después). Cuando el evento que contiene la documentación generada se envía a docs_publish_step, se pasará al parámetro docs de la KernelFunction del publish_documentationdocs_generation_step porque no hay otra opción. Sin embargo, los pasos pueden incluir varias funciones núcleo y estas funciones pueden tener múltiples parámetros. En estos escenarios avanzados, es necesario especificar la función y el parámetro objetivo.
Compilación y ejecución del proceso
// Configure the kernel with your LLM connection details
Kernel kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion("myDeployment", "myEndpoint", "myApiKey")
.Build();
// Build and run the process
var process = processBuilder.Build();
await process.StartAsync(kernel, new KernelProcessEvent { Id = "Start", Data = "Contoso GlowBrew" });
Compilamos el proceso y llamamos a StartAsync para ejecutarlo. Nuestro proceso también espera un evento externo inicial llamado Start para iniciar las cosas y, como tal, proporcionamos eso. La ejecución de este proceso muestra la salida siguiente en la consola:
GatherProductInfoStep: Gathering product information for product named Contoso GlowBrew
GenerateDocumentationStep: Generating documentation for provided productInfo
PublishDocumentationStep: Publishing product documentation:
# GlowBrew: Your Ultimate Coffee Experience Awaits!
Welcome to the world of GlowBrew, where coffee brewing meets remarkable technology! At Contoso, we believe that your morning ritual shouldn't just include the perfect cup of coffee but also a stunning visual experience that invigorates your senses. Our revolutionary AI-driven coffee machine is designed to transform your kitchen routine into a delightful ceremony.
## Unleash the Power of GlowBrew
### Key Features
- **Luminous Brew Technology**
- Elevate your coffee experience with our cutting-edge programmable LED lighting. GlowBrew allows you to customize your morning ambiance, creating a symphony of colors that sync seamlessly with your brewing process. Whether you need a vibrant wake-up call or a soothing glow, you can set the mood for any moment!
- **AI Taste Assistant**
- Your taste buds deserve the best! With the GlowBrew built-in AI taste assistant, the machine learns your unique preferences over time and curates personalized brew suggestions just for you. Expand your coffee horizons and explore delightful new combinations that fit your palate perfectly.
- **Gourmet Aroma Diffusion**
- Awaken your senses even before that first sip! The GlowBrew comes equipped with gourmet aroma diffusers that enhance the scent profile of your coffee, diffusing rich aromas that fill your kitchen with the warm, inviting essence of freshly-brewed bliss.
### Not Just Coffee - An Experience
With GlowBrew, it's more than just making coffee-it's about creating an experience that invigorates the mind and pleases the senses. The glow of the lights, the aroma wafting through your space, and the exceptional taste meld into a delightful ritual that prepares you for whatever lies ahead.
## Troubleshooting Made Easy
While GlowBrew is designed to provide a seamless experience, we understand that technology can sometimes be tricky. If you encounter issues with the LED lights, we've got you covered:
- **LED Lights Malfunctioning?**
- If your LED lights aren't working as expected, don't worry! Follow these steps to restore the glow:
1. **Reset the Lighting Settings**: Use the GlowBrew app to reset the lighting settings.
2. **Check Connections**: Ensure that the LED connections inside the GlowBrew are secure.
3. **Factory Reset**: If you're still facing issues, perform a factory reset to rejuvenate your machine.
With GlowBrew, you not only brew the perfect coffee but do so with an ambiance that excites the senses. Your mornings will never be the same!
## Embrace the Future of Coffee
Join the growing community of GlowBrew enthusiasts today, and redefine how you experience coffee. With stunning visual effects, customized brewing suggestions, and aromatic enhancements, it's time to indulge in the delightful world of GlowBrew-where every cup is an adventure!
### Conclusion
Ready to embark on an extraordinary coffee journey? Discover the perfect blend of technology and flavor with Contoso's GlowBrew. Your coffee awaits!
# Configure the kernel with an AI service and connection details, if necessary
kernel = Kernel()
kernel.add_service(AzureChatCompletion())
# Build the process
kernel_process = process_builder.build()
# Start the process
async with await start(
process=kernel_process,
kernel=kernel,
initial_event=KernelProcessEvent(id="Start", data="Contoso GlowBrew"),
) as process_context:
_ = await process_context.get_state()
Construimos el proceso y llamamos a start con el administrador de contexto asincrónico para ejecutarlo. Nuestro proceso también espera un evento externo inicial llamado Start para iniciar las cosas y, como tal, proporcionamos eso. La ejecución de este proceso muestra la salida siguiente en la consola:
GatherProductInfoStep
Gathering product information for Product Name: Contoso GlowBrew
GenerateDocumentationStep
Generating documentation for provided product_info...
PublishDocumentationStep
Publishing product documentation:
# GlowBrew AI-Driven Coffee Machine: Elevate Your Coffee Experience
Welcome to the future of coffee enjoyment with GlowBrew, the AI-driven coffee machine that not only crafts the perfect cup but does so with a light show that brightens your day. Designed for coffee enthusiasts and tech aficionados alike, GlowBrew combines cutting-edge brewing technology with an immersive lighting experience to start every day on a bright note.
## Unleash the Power of Luminous Brew Technology
With GlowBrew, your mornings will never be dull. The industry-leading number of programmable LEDs offers endless possibilities for customizing your coffee-making ritual. Sync the light show with the brewing process to create a visually stimulating ambiance that transforms your kitchen into a vibrant café each morning.
## Discover New Flavor Dimensions with the AI Taste Assistant
Leave the traditional coffee routines behind and say hello to personalization sophistication. The AI Taste Assistant learns and adapts to your unique preferences over time. Whether you prefer a strong espresso or a light latte, the assistant suggests new brew combinations tailored to your palate, inviting you to explore a world of flavors you never knew existed.
## Heighten Your Senses with Gourmet Aroma Diffusion
The moment you step into the room, let the GlowBrew’s built-in aroma diffusers captivate your senses. This feature is designed to enrich your coffee’s scent profile, ensuring every cup you brew is a multi-sensory delight. Let the burgeoning aroma energize you before the very first sip.
## Troubleshooting Guide: LED Lights Malfunctioning
Occasionally, you might encounter an issue with the LED lights not functioning as intended. Here’s how to resolve it efficiently:
- **Reset Lighting Settings**: Start by using the GlowBrew app to reset the lighting configurations to their default state.
- **Check Connections**: Ensure that all LED connections inside your GlowBrew machine are secure and properly connected.
- **Perform a Factory Reset**: If the problem persists, perform a factory reset on your GlowBrew to restore all settings to their original state.
Experience the art of coffee making like never before with the GlowBrew AI-driven coffee machine. From captivating light shows to aromatic sensations, every feature is engineered to enhance your daily brew. Brew, savor, and glow with GlowBrew.
¿Qué es lo siguiente?
Nuestro primer borrador del proceso de generación de documentación funciona, pero deja mucho que desear. Como mínimo, una versión de producción necesitaría lo siguiente:
- Un agente de lectura de prueba que calificará la documentación generada y comprobará que cumple nuestros estándares de calidad y precisión.
- Un proceso de aprobación en el que la documentación solo se publica después de que un humano la apruebe (human-in-the-loop).