次の方法で共有


方法: 最初のプロセスを作成する

警告

セマンティック カーネル プロセス フレームワーク は、まだ開発中であり、変更される可能性があります。

概要

セマンティック カーネル プロセス フレームワークは、AI 統合プロセスの開発と実行を簡略化するように設計された強力なオーケストレーション SDK です。 単純なワークフローや複雑なシステムを管理する場合でも、このフレームワークを使用すると、構造化された方法で実行できる一連の手順を定義でき、アプリケーションの機能を簡単かつ柔軟性に向上させることができます。

機能拡張のために構築された Process Framework は、シーケンシャル実行、並列処理、ファンイン構成とファンアウト構成、さらにはマップ削減戦略など、さまざまな運用パターンをサポートします。 この適応性により、さまざまな実際のアプリケーション、特にインテリジェントな意思決定とマルチステップワークフローを必要とするアプリケーションに適しています。

始めに

セマンティック カーネル プロセス フレームワークを使用すると、考えられるあらゆるビジネス プロセスに AI を組み込むことができます。 作業を開始する例として、新しい製品のドキュメントを生成するプロセスの構築を見てみましょう。

作業を開始する前に、必要なセマンティック カーネル パッケージがインストールされていることを確認します。

// 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

例示の例: 新しい製品のドキュメントの生成

この例では、セマンティック カーネル プロセス フレームワークを使用して、新しい製品のドキュメントを作成するための自動化されたプロセスを開発します。 このプロセスは単純なものから始まり、より現実的なシナリオに対応するために進化します。

まず、非常に基本的なフローを使用してドキュメント プロセスをモデル化します。

  1. GatherProductInfoStep: 製品に関する情報を収集します。
  2. GenerateDocumentationStep: 手順 1 で収集した情報からドキュメントを生成するように LLM に依頼します。
  3. PublishDocumentationStep: ドキュメントを公開します。

最初のプロセスの フロー図: A[機能ドキュメントの要求] --> B[ドキュメントを書くようにLLMに依頼] --> C[ドキュメントを公開]

プロセスを理解したので、それを構築しましょう。

プロセス ステップを定義する

プロセスの各ステップは、基本ステップ クラスから継承するクラスによって定義されます。 このプロセスには、次の 3 つの手順があります。

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;
}

上記のコードでは、プロセスに必要な 3 つの手順を定義しています。 ここでは、いくつかの点を指摘する必要があります。

  • セマンティック カーネルでは、KernelFunction はネイティブ コードまたは LLM によって呼び出し可能なコード ブロックを定義します。 Process フレームワークの場合、KernelFunctionはステップの呼び出し可能なメンバーであり、各ステップでは少なくとも 1 つの KernelFunction を定義する必要があります。
  • Process Framework では、ステートレスステップとステートフルステップがサポートされています。 ステートフルなステップは、進行状況を自動的にチェックポイントし、複数回の呼び出しにわたって状態を維持します。 GenerateDocumentationStepでは、GeneratedDocumentationState クラスを使用してChatHistoryオブジェクトとLastGeneratedDocument オブジェクトを保持する例を示します。
  • 手順では、EmitEventAsync オブジェクトの KernelProcessStepContext を呼び出すことによって、イベントを手動で生成できます。 KernelProcessStepContext のインスタンスを取得するには、KernelFunction のパラメーターとして追加するだけで、フレームワークによって自動的に挿入されます。
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}")

上記のコードでは、プロセスに必要な 3 つの手順を定義しています。 ここでは、いくつかの点を指摘する必要があります。

  • セマンティック カーネルでは、KernelFunction はネイティブ コードまたは LLM によって呼び出し可能なコード ブロックを定義します。 Process フレームワークの場合、KernelFunctionはステップの呼び出し可能なメンバーであり、各ステップでは少なくとも 1 つの KernelFunction を定義する必要があります。
  • Process Framework では、ステートレスステップとステートフルステップがサポートされています。 ステートフルなステップは、進行状況を自動的にチェックポイントし、複数回の呼び出しにわたって状態を維持します。 GenerateDocumentationStep では、GeneratedDocumentationState クラスを使用して ChatHistory オブジェクトを永続化する例を示します。
  • 手順では、emit_event オブジェクトの KernelProcessStepContext を呼び出すことによって、イベントを手動で生成できます。 KernelProcessStepContext のインスタンスを取得するには、KernelFunction のパラメーターとして追加するだけで、フレームワークによって自動的に挿入されます。

プロセス フローを定義する

// 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));

ここでいくつかのことが起こっているので、段階的に分解しましょう。

  1. ビルダーを作成する: プロセスはビルダー パターンを使用して、すべてを簡単に配線します。 ビルダーは、プロセス内のステップを管理し、プロセスのライフサイクルを管理するためのメソッドを提供します。

  2. ステップを追加します。ステップは、ビルダーの AddStepFromType メソッドを呼び出すことによってプロセスに追加されます。 これにより、プロセス フレームワークは、必要に応じてインスタンスをインスタンス化することで、ステップのライフサイクルを管理できます。 この場合、プロセスに 3 つのステップを追加し、それぞれに変数を作成しました。 これらの変数は、イベントのオーケストレーションを定義するために次に使用できる各ステップの一意のインスタンスへのハンドルを提供します。

  3. イベントを調整する: ここでは、ステップからステップへのイベントのルーティングが定義されます。 この場合、次のルートがあります。

    • id = Start を含む外部イベントがプロセスに送信されると、このイベントとそれに関連付けられているデータが infoGatheringStep ステップに送信されます。
    • infoGatheringStep の実行が完了したら、返されたオブジェクトを docsGenerationStep ステップに送信します。
    • 最後に、docsGenerationStep の実行が完了したら、返されたオブジェクトを docsPublishStep ステップに送信します。

ヒント

Process Framework でのイベント ルーティング: ステップに送信されるイベントが、ステップ内で KernelFunctions にどのようにルーティングされるか疑問に思うかもしれません。 上記のコードでは、各ステップで定義されている KernelFunction は 1 つだけで、各 KernelFunction には 1 つのパラメーターしかありません (カーネルと、後で詳しく説明する特殊なステップ コンテキスト以外)。 生成されたドキュメントを含むイベントが docsPublishStep に送信されると、他の選択肢がないため、document ステップの PublishDocumentation KernelFunction の docsGenerationStep パラメーターに渡されます。 ただし、ステップには複数の KernelFunction を含めることができます。また、KernelFunctions には複数のパラメーターを含めることができます。これらの高度なシナリオでは、ターゲット関数とパラメーターを指定する必要があります。

# 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()

ここでいくつかのことが起こっているので、段階的に分解しましょう。

  1. ビルダーを作成する: プロセスはビルダー パターンを使用して、すべてを簡単に配線します。 ビルダーは、プロセス内のステップを管理し、プロセスのライフサイクルを管理するためのメソッドを提供します。

  2. ステップを追加します。ステップは、ビルダーの add_step メソッドを呼び出すことによってプロセスに追加されます。このメソッドは、ステップの種類をビルダーに追加します。 これにより、プロセス フレームワークは、必要に応じてインスタンスをインスタンス化することで、ステップのライフサイクルを管理できます。 この場合、プロセスに 3 つのステップを追加し、それぞれに変数を作成しました。 これらの変数は、イベントのオーケストレーションを定義するために次に使用できる各ステップの一意のインスタンスへのハンドルを提供します。

  3. イベントを調整する: ここでは、ステップからステップへのイベントのルーティングが定義されます。 この場合、次のルートがあります。

    • id = Startを含む外部イベントがプロセスに送信されると、このイベントとそれに関連付けられているデータがinfo_gathering_stepに送信されます。
    • info_gathering_stepの実行が完了したら、返されたオブジェクトをdocs_generation_stepに送信します。
    • 最後に、 docs_generation_step の実行が完了したら、返されたオブジェクトを docs_publish_stepに送信します。

ヒント

Process Framework でのイベント ルーティング: ステップに送信されるイベントが、ステップ内で KernelFunctions にどのようにルーティングされるか疑問に思うかもしれません。 上記のコードでは、各ステップで定義されている KernelFunction は 1 つだけで、各 KernelFunction には 1 つのパラメーターしかありません (カーネルと、後で詳しく説明する特殊なステップ コンテキスト以外)。 生成されたドキュメントを含むイベントがdocs_publish_stepに送信されると、他の選択肢がないため、docspublish_documentation KernelFunction のdocs_generation_step パラメーターに渡されます。 ただし、ステップには複数の KernelFunction を含めることができます。また、KernelFunctions には複数のパラメーターを含めることができます。これらの高度なシナリオでは、ターゲット関数とパラメーターを指定する必要があります。

プロセスをビルドして実行する

// 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" });

プロセスをビルドし、StartAsync を呼び出して実行します。 私たちのプロセスでは、Start と呼ばれる最初の外部イベントが開始されることを期待しているため、同様に提供します。 このプロセスを実行すると、コンソールに次の出力が表示されます。

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()

プロセスをビルドし、非同期コンテキスト マネージャーで start を呼び出して実行します。 私たちのプロセスでは、Start と呼ばれる最初の外部イベントが開始されることを期待しているため、同様に提供します。 このプロセスを実行すると、コンソールに次の出力が表示されます。

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.

次は何ですか?

ドキュメント生成プロセスの最初のドラフトは機能していますが、多くの作業が必要です。 少なくとも、運用バージョンには次のものが必要です。

  • 生成されたドキュメントを評価し、品質と精度の基準を満たしていることを確認する校正リーダー エージェント。
  • 人間が介入して承認した後にのみドキュメントが公開される承認プロセスです(human-in-the-loop)。