Udostępnij przez


Przepływy pracy programu Microsoft Agent Framework — izolacja stanu

W rzeczywistych aplikacjach prawidłowe zarządzanie stanem ma kluczowe znaczenie podczas obsługi wielu zadań lub żądań. Bez odpowiedniej izolacji, stan współdzielony między różnymi wykonaniami przepływu pracy może prowadzić do nieoczekiwanego zachowania, uszkodzenia danych i sytuacji wyścigowych. W tym artykule wyjaśniono, jak zapewnić izolację stanu w przepływach pracy programu Microsoft Agent Framework, zapewniając wgląd w najlepsze rozwiązania i typowe pułapki.

Modyfikowalne narzędzia budowania przepływów pracy a niezmienne przepływy pracy

Przepływy pracy są tworzone przez konstruktorów przepływu pracy. Konstruktory przepływów pracy są zwykle uważane za modyfikowalne, co oznacza, że można dodawać, modyfikować wykonawcę startowego lub inne konfiguracje po utworzeniu konstruktora, a nawet po utworzeniu przepływu pracy. Z drugiej strony przepływy pracy są niezmienne w tym, że po utworzeniu przepływu pracy nie można go modyfikować (nie można modyfikować publicznego interfejsu API w celu zmodyfikowania przepływu pracy).

To rozróżnienie jest ważne, ponieważ wpływa na sposób zarządzania stanem w różnych realizacjach procesu roboczego. Nie zaleca się ponownego użycia pojedynczego wystąpienia przepływu pracy dla wielu zadań bądź próśb, ponieważ może to prowadzić do niezamierzonego dzielenia się stanem. Zamiast tego zaleca się utworzenie nowego wystąpienia przepływu pracy z kreatora dla każdego zadania lub żądania, aby zapewnić prawidłową izolację stanu i bezpieczeństwo wątków.

Zapewnienie izolacji stanu w narzędziach przepływu pracy

Gdy wystąpienie funkcji wykonawczej jest przekazywane bezpośrednio do konstruktora przepływu pracy, wystąpienie funkcji wykonawczej jest współużytkowane przez wszystkie wystąpienia przepływu pracy utworzone na podstawie konstruktora. Może to prowadzić do problemów, jeśli instancja wykonawcy zawiera stan, który nie powinien być dzielony w wielu wykonaniach przepływu pracy. Aby zapewnić właściwą izolację stanu i bezpieczeństwo wątków, zaleca się użycie funkcji fabrycznych, które tworzą nową instancję wykonawcy dla każdej instancji przepływu pracy.

Wkrótce...

Przykład niebezpieczny dla wątków:

executor_a = CustomExecutorA()
executor_b = CustomExecutorB()

workflow_builder = WorkflowBuilder()
# executor_a and executor_b are passed directly to the workflow builder
workflow_builder.add_edge(executor_a, executor_b)
workflow_builder.set_start_executor(executor_b)

# All workflow instances created from the builder will share the same executor instances
workflow_a = workflow_builder.build()
workflow_b = workflow_builder.build()

Przykład bezpieczny dla wątków:

workflow_builder = WorkflowBuilder()
# Register executor factory functions with the workflow builder
workflow_builder.register_executor(factory_func=CustomExecutorA, name="executor_a")
workflow_builder.register_executor(factory_func=CustomExecutorB, name="executor_b")
# Add edges using registered factory function names
workflow_builder.add_edge("executor_a", "executor_b")
workflow_builder.set_start_executor("executor_b")

# Each workflow instance created from the builder will have its own executor instances
workflow_a = workflow_builder.build()
workflow_b = workflow_builder.build()

Wskazówka

Aby zapewnić właściwą izolację stanu i bezpieczeństwo wątków, upewnij się również, że wystąpienia funkcji wykonawczej utworzone przez funkcje fabryki nie współużytkują stanu modyfikowalnego.

Zarządzanie stanem agenta

Kontekst agenta jest zarządzany za pośrednictwem wątków agenta. Domyślnie każdy agent w przepływie pracy otrzyma własny wątek, chyba że agent jest zarządzany przez niestandardową funkcję wykonawcza. Aby uzyskać więcej informacji, zobacz Praca z agentami.

Wątki agenta są utrwalane w ramach przebiegów przepływu pracy. Oznacza to, że jeśli agent jest wywoływany w pierwszym uruchomieniu przepływu pracy, zawartość wygenerowana przez agenta będzie dostępna w kolejnych uruchomieniach tego samego wystąpienia przepływu pracy. Chociaż może to być przydatne do utrzymania ciągłości w ramach jednego zadania, może również prowadzić do niezamierzonego udostępniania stanu, jeśli to samo wystąpienie przepływu pracy jest ponownie używane dla różnych zadań lub żądań. Aby upewnić się, że każde zadanie ma izolowany stan agenta, użyj funkcji fabryki agentów w kreatorze przepływu pracy do utworzenia nowego wystąpienia przepływu pracy dla każdego zadania lub żądania.

Wkrótce...

Przykład niebezpieczny dla wątków:

writer_agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent(
    instructions=(
        "You are an excellent content writer. You create new content and edit contents based on the feedback."
    ),
    name="writer_agent",
)
reviewer_agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent(
    instructions=(
        "You are an excellent content reviewer."
        "Provide actionable feedback to the writer about the provided content."
        "Provide the feedback in the most concise manner possible."
    ),
    name="reviewer_agent",
)

builder = WorkflowBuilder()
# writer_agent and reviewer_agent are passed directly to the workflow builder
builder.add_edge(writer_agent, reviewer_agent)
builder.set_start_executor(writer_agent)

# All workflow instances created from the builder will share the same agent
# instances and agent threads
workflow = builder.build()

Przykład bezpieczny dla wątków:

def create_writer_agent() -> ChatAgent:
    """Factory function to create a Writer agent."""
    return AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent(
        instructions=(
            "You are an excellent content writer. You create new content and edit contents based on the feedback."
        ),
        name="writer_agent",
    )

def create_reviewer_agent() -> ChatAgent:
    """Factory function to create a Reviewer agent."""
    return AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent(
        instructions=(
            "You are an excellent content reviewer."
            "Provide actionable feedback to the writer about the provided content."
            "Provide the feedback in the most concise manner possible."
        ),
        name="reviewer_agent",
    )

builder = WorkflowBuilder()
# Register agent factory functions with the workflow builder
builder.register_agent(factory_func=create_writer_agent, name="writer_agent")
builder.register_agent(factory_func=create_reviewer_agent, name="reviewer_agent")
# Add edges using registered factory function names
builder.add_edge("writer_agent", "reviewer_agent")
builder.set_start_executor("writer_agent")

# Each workflow instance created from the builder will have its own agent
# instances and agent threads
workflow = builder.build()

Podsumowanie

Izolacja stanu w przepływach pracy programu Microsoft Agent Framework może być skutecznie zarządzana przy użyciu funkcji fabrycznych z konstruktorami przepływów pracy w celu utworzenia nowych wystąpień funkcji wykonawczych i agentów. Tworząc nowe instancje przepływu pracy dla każdego zadania lub żądania, można utrzymać właściwą izolację stanu i uniknąć niezamierzonego współdzielenia stanu między różnymi wykonaniami przepływu pracy.

Dalsze kroki