Delen via


Microsoft Agent Framework-werkstromen - Statusisolatie

In echte toepassingen is het goed beheren van de status essentieel bij het verwerken van meerdere taken of aanvragen. Zonder de juiste isolatie kan de gedeelde status tussen verschillende werkstroomuitvoeringen leiden tot onverwacht gedrag, beschadiging van gegevens en racevoorwaarden. In dit artikel wordt uitgelegd hoe u statusisolatie binnen Microsoft Agent Framework-werkstromen kunt garanderen, zodat u inzicht verleent in best practices en veelvoorkomende valkuilen.

Veranderlijke werkstroombouwers versus onveranderbare werkstromen

Werkstromen worden gemaakt door werkstroombouwers. Werkstroombouwers worden over het algemeen als veranderlijk beschouwd, waarbij men de startuitvoering of andere configuraties kan toevoegen of wijzigen nadat de bouwer is gemaakt of zelfs nadat de werkstroom is opgebouwd. Aan de andere kant zijn werkstromen onveranderbaar in dat wanneer een werkstroom is gebouwd, deze niet kan worden gewijzigd (geen openbare API om een werkstroom te wijzigen).

Dit onderscheid is belangrijk omdat dit van invloed is op de manier waarop de status wordt beheerd in verschillende werkstroomuitvoeringen. Het wordt niet aanbevolen om één werkstroomexemplaar opnieuw te gebruiken voor meerdere opdrachten of verzoeken, omdat dit kan leiden tot onbedoeld delen van de toestand. In plaats daarvan wordt u aangeraden een nieuw werkstroomexemplaar te maken van het builder-object voor elke taak of verzoek om de juiste statusisolatie en thread-veiligheid te garanderen.

Statusisolatie garanderen in werkstroombouwers

Wanneer een uitvoerdersexemplaar direct wordt doorgegeven aan een werkstroombouwer, wordt dat exemplaar gedeeld onder alle werkstroomexemplaren die vanuit de bouwer zijn gemaakt. Dit kan leiden tot problemen als de uitvoerderinstantie een status bevat die niet mag worden gedeeld over meerdere workflow-uitvoeringen. Om de juiste statusisolatie en threadveiligheid te garanderen, wordt u aangeraden fabrieksfuncties te gebruiken die een nieuw uitvoerprogramma-exemplaar maken voor elk werkstroomexemplaren.

Binnenkort beschikbaar...

Voorbeeld van niet-thread-veilig:

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

Voorbeeld van thread-safe:

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

Aanbeveling

Om de juiste statusisolatie en threadveiligheid te garanderen, moet u er ook voor zorgen dat uitvoerderexemplaren die door fabrieksfuncties zijn gemaakt, niet de onveranderbare status delen.

Statusbeheer van agent

Agentcontext wordt beheerd via agentthreads. Standaard krijgt elke agent in een werkstroom een eigen thread, tenzij de agent wordt beheerd door een aangepaste uitvoerder. Raadpleeg Werken met agents voor meer informatie.

Agentthreads worden behouden over werkstroomruns. Dit betekent dat als een agent wordt aangeroepen in de eerste uitvoering van een werkstroom, inhoud die door de agent wordt gegenereerd, beschikbaar is in volgende uitvoeringen van hetzelfde werkstroomexemplaren. Hoewel dit handig kan zijn voor het onderhouden van continuïteit binnen één taak, kan dit ook leiden tot onbedoeld delen van statussen als hetzelfde werkstroomexemplaren opnieuw worden gebruikt voor verschillende taken of aanvragen. Om ervoor te zorgen dat elke taak een geïsoleerde agentstatus heeft, gebruik agentfactoryfuncties in uw werkstroomopbouwprogramma om een nieuw werkstroomexemplaar te maken voor elke taak of aanvraag.

Binnenkort beschikbaar...

Voorbeeld van niet-thread-veilig:

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

Voorbeeld van thread-safe:

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

Conclusion

Statusisolatie in Microsoft Agent Framework-werkstromen kan effectief worden beheerd door factoryfuncties te gebruiken met werkstroombouwers om nieuwe uitvoerders en agentexemplaren te maken. Door nieuwe werkstroomexemplaren te maken voor elke taak of aanvraag, kunt u de juiste statusisolatie behouden en onbedoeld delen van statussen voorkomen tussen verschillende werkstroomuitvoeringen.

Volgende stappen