첫 프로세스 만들기
How-To: 첫 프로세스 만들기
[!WARNING] _Semantic Kernel Process Framework_는 실험 단계이고, 아직 개발 중이며 언제든 바뀔 수 있습니다.
개요
Semantic Kernel Process Framework는 AI가 통합된 프로세스의 개발과 실행을 단순화하도록 설계된 강력한 오케스트레이션 SDK입니다. 단순한 워크플로든 복잡한 시스템이든, 이 프레임워크는 구조화된 방식으로 실행될 수 있는 일련의 단계를 정의하게 해줘서 애플리케이션의 역량을 쉽고 유연하게 확장해 줍니다.
확장성을 염두에 두고 만들어진 Process Framework는 순차 실행, 병렬 처리, fan-in·fan-out 구성, 그리고 map-reduce 전략 같은 다양한 운영 패턴을 지원합니다. 이런 적응성 덕분에 다양한 실제 애플리케이션, 특히 지능적인 의사 결정과 다단계 워크플로가 필요한 곳에 잘 맞습니다.
시작하기
Semantic Kernel Process Framework는 생각할 수 있는 거의 모든 비즈니스 프로세스에 AI를 불어넣는 데 쓸 수 있어요. 시작을 위한 예시로, 신제품 문서를 생성하는 프로세스를 만들어 보겠습니다.
시작하기 전에 필요한 Semantic Kernel 패키지가 설치되어 있는지 확인하세요.
::: zone pivot="programming-language-csharp"
// 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
::: zone-end
::: zone pivot="programming-language-python" pip install semantic-kernel==1.20.0 ::: zone-end
::: zone pivot="programming-language-java" ::: zone-end
예시: 신제품 문서 생성
이 예시에서는 Semantic Kernel Process Framework로 신제품 문서를 만드는 자동화 프로세스를 개발해 볼게요. 이 프로세스는 단순하게 시작해서, 더 현실적인 시나리오를 다루도록 점차 발전시킬 거예요.
먼저 문서 프로세스를 아주 기본적인 흐름으로 모델링해 봅시다.
GatherProductInfoStep: 제품에 대한 정보를 수집합니다.GenerateDocumentationStep: 1단계에서 수집한 정보로 LLM에게 문서 생성을 요청합니다.PublishDocumentationStep: 문서를 게시합니다.
![첫 프로세스의 흐름도: A[기능 문서 요청] --> B[LLM에게 문서 작성 요청] --> C[문서를 공개 게시]](../../../media/first-process-flow.png)
이제 우리 프로세스를 이해했으니, 직접 만들어 보겠습니다.
프로세스 단계 정의하기
프로세스의 각 단계는 기본 단계 클래스를 상속받는 클래스로 정의됩니다. 이 프로세스에는 단계가 세 개 있습니다.
::: zone pivot="programming-language-csharp"
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;
}
위 코드가 우리 프로세스에 필요한 세 단계를 정의합니다. 여기서 짚고 넘어갈 점이 몇 가지 있어요.
- Semantic Kernel에서
KernelFunction은 네이티브 코드나 LLM이 호출할 수 있는 코드 블록을 정의합니다. Process 프레임워크의 경우KernelFunction들이 Step의 호출 가능한 멤버가 되고, 각 Step은 최소 하나의 KernelFunction을 정의해야 합니다. - Process Framework는 무상태(stateless)와 상태 보존(stateful) Step을 모두 지원합니다. 상태 보존 Step은 진행 상황을 자동으로 체크포인트에 저장하고 여러 번의 호출에 걸쳐 상태를 유지해요.
GenerateDocumentationStep이 그 예시인데,GeneratedDocumentationState클래스로ChatHistory와LastGeneratedDocument객체를 유지합니다. - Step은
KernelProcessStepContext객체에서EmitEventAsync를 호출해 이벤트를 수동으로 발생시킬 수 있어요.KernelProcessStepContext인스턴스를 얻으려면 KernelFunction에 파라미터로 추가하기만 하면 프레임워크가 자동으로 주입해 줍니다.
::: zone-end
::: zone pivot="programming-language-python"
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}")
위 코드가 우리 프로세스에 필요한 세 단계를 정의합니다. 여기서 짚고 넘어갈 점이 몇 가지 있어요.
- Semantic Kernel에서
KernelFunction은 네이티브 코드나 LLM이 호출할 수 있는 코드 블록을 정의합니다. Process 프레임워크의 경우KernelFunction들이 Step의 호출 가능한 멤버가 되고, 각 Step은 최소 하나의 KernelFunction을 정의해야 합니다. - Process Framework는 무상태(stateless)와 상태 보존(stateful) Step을 모두 지원합니다. 상태 보존 Step은 진행 상황을 자동으로 체크포인트에 저장하고 여러 번의 호출에 걸쳐 상태를 유지해요.
GenerateDocumentationStep이 그 예시인데,GeneratedDocumentationState클래스로ChatHistory객체를 유지합니다. - Step은
KernelProcessStepContext객체에서emit_event를 호출해 이벤트를 수동으로 발생시킬 수 있어요.KernelProcessStepContext인스턴스를 얻으려면 KernelFunction에 파라미터로 추가하기만 하면 프레임워크가 자동으로 주입해 줍니다.
::: zone-end
프로세스 흐름 정의하기
::: zone pivot="programming-language-csharp"
// 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));
여기서 일어나는 일이 몇 가지 있으니 단계별로 나눠 볼게요.
-
빌더 만들기: 프로세스는 빌더 패턴을 사용해 모든 배선을 단순화합니다. 빌더는 프로세스 안의 단계를 관리하고 프로세스의 수명주기를 관리하는 메서드를 제공해요.
-
단계 추가하기: 단계는 빌더의
AddStepFromType메서드를 호출해 프로세스에 추가합니다. 이 덕분에 Process Framework가 필요할 때 인스턴스를 만들어 단계의 수명주기를 관리할 수 있어요. 이 경우 프로세스에 세 단계를 추가하고 각각에 변수를 만들었습니다. 이 변수들은 각 단계의 고유 인스턴스를 가리키는 핸들이 되어, 다음에 이벤트 오케스트레이션을 정의할 때 사용합니다. -
이벤트 오케스트레이션: 여기가 단계에서 단계로의 이벤트 라우팅이 정의되는 곳입니다. 이 경우 라우트가 다음과 같습니다.
id = Start인 외부 이벤트가 프로세스로 전송되면, 이 이벤트와 관련 데이터가infoGatheringStep으로 전송됩니다.infoGatheringStep실행이 끝나면 반환된 객체를docsGenerationStep으로 보냅니다.- 마지막으로
docsGenerationStep실행이 끝나면 반환된 객체를docsPublishStep으로 보냅니다.
[!TIP] Process Framework의 이벤트 라우팅: 단계로 전송된 이벤트가 단계 안의 KernelFunction에 어떻게 라우팅되는지 궁금할 수 있어요. 위 코드에서는 각 단계에 단일 KernelFunction만 정의했고, 각 KernelFunction도(Kernel과 단계 컨텍스트는 특별 취급되므로 제외하고) 단일 파라미터만 가집니다. 생성된 문서가 담긴 이벤트가
docsPublishStep으로 전송되면, 선택지가 없으므로docsGenerationStep의PublishDocumentationKernelFunction의document파라미터로 전달됩니다. 하지만 단계는 여러 KernelFunction을 가질 수 있고 KernelFunction은 여러 파라미터를 가질 수 있으므로, 그런 고급 시나리오에서는 대상 함수와 파라미터를 명시해야 합니다.
::: zone-end
::: zone pivot="programming-language-python"
# 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()
여기서 일어나는 일이 몇 가지 있으니 단계별로 나눠 볼게요.
-
빌더 만들기: 프로세스는 빌더 패턴을 사용해 모든 배선을 단순화합니다. 빌더는 프로세스 안의 단계를 관리하고 프로세스의 수명주기를 관리하는 메서드를 제공해요.
-
단계 추가하기: 단계는 빌더의
add_step메서드를 호출해 프로세스에 추가하며, 이 메서드가 단계 유형을 빌더에 추가합니다. 이 덕분에 Process Framework가 필요할 때 인스턴스를 만들어 단계의 수명주기를 관리할 수 있어요. 이 경우 프로세스에 세 단계를 추가하고 각각에 변수를 만들었습니다. 이 변수들은 각 단계의 고유 인스턴스를 가리키는 핸들이 되어, 다음에 이벤트 오케스트레이션을 정의할 때 사용합니다. -
이벤트 오케스트레이션: 여기가 단계에서 단계로의 이벤트 라우팅이 정의되는 곳입니다. 이 경우 라우트가 다음과 같습니다.
id = Start인 외부 이벤트가 프로세스로 전송되면, 이 이벤트와 관련 데이터가info_gathering_step으로 전송됩니다.info_gathering_step실행이 끝나면 반환된 객체를docs_generation_step으로 보냅니다.- 마지막으로
docs_generation_step실행이 끝나면 반환된 객체를docs_publish_step으로 보냅니다.
[!TIP] Process Framework의 이벤트 라우팅: 단계로 전송된 이벤트가 단계 안의 KernelFunction에 어떻게 라우팅되는지 궁금할 수 있어요. 위 코드에서는 각 단계에 단일 KernelFunction만 정의했고, 각 KernelFunction도(Kernel과 단계 컨텍스트는 특별 취급되므로 제외하고) 단일 파라미터만 가집니다. 생성된 문서가 담긴 이벤트가
docs_publish_step으로 전송되면, 선택지가 없으므로docs_generation_step의publish_documentationKernelFunction의docs파라미터로 전달됩니다. 하지만 단계는 여러 KernelFunction을 가질 수 있고 KernelFunction은 여러 파라미터를 가질 수 있으므로, 그런 고급 시나리오에서는 대상 함수와 파라미터를 명시해야 합니다.
::: zone-end
::: zone pivot="programming-language-java" ::: zone-end
프로세스 빌드하고 실행하기
::: zone pivot="programming-language-csharp"
// 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라는 초기 외부 이벤트를 기대하므로 그걸 함께 제공했습니다. 이 프로세스를 실행하면 Console에 다음 출력이 나타납니다.
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!
::: zone-end
::: zone pivot="programming-language-python"
# 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라는 초기 외부 이벤트를 기대하므로 그걸 함께 제공했습니다. 이 프로세스를 실행하면 Console에 다음 출력이 나타납니다.
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.
::: zone-end
::: zone pivot="programming-language-java" ::: zone-end
무엇이 남았나?
우리가 만든 문서 생성 프로세스의 첫 초안은 잘 동작하지만 아직 아쉬운 점이 많아요. 최소한 프로덕션 버전에는 다음이 필요합니다.
- 생성된 문서를 평가하고 품질·정확성 기준을 통과했는지 검증해 줄 교정(proofreader) 에이전트.
- 사람이 승인한 뒤에만 문서를 게시하는 승인 절차(human-in-the-loop).
[!div class="nextstepaction"] 우리 프로세스에 교정 에이전트 추가하기...