Sdílet prostřednictvím


Pracovní postupy rozhraní Microsoft Agent Framework – Izolace stavu

V reálných aplikacích je při zpracování více úloh nebo požadavků důležitá správná správa stavu. Bez správné izolace může sdílený stav mezi různými spuštěními pracovního postupu vést k neočekávanému chování, poškození dat nebo stavovým podmínkám závodu. Tento článek vysvětluje, jak zajistit izolaci stavu v rámci pracovních postupů rozhraní Microsoft Agent Framework a poskytuje přehled o osvědčených postupech a běžných nástrahách.

Tvůrce proměnlivých pracovních postupů vs. Neměnné pracovní postupy

Pracovní postupy vytvářejí tvůrci pracovních postupů. Tvůrci pracovních postupů se obecně považují za proměnlivé, a je možné přidávat nebo upravovat spouštěcí mechanismus či jiné konfigurace po vytvoření tvůrce nebo dokonce i po vytvoření pracovního postupu. Pracovní postupy jsou naopak neměnné v tom, že po vytvoření pracovního postupu není možné ho změnit (žádné veřejné rozhraní API pro úpravu pracovního postupu).

Tento rozdíl je důležitý, protože ovlivňuje způsob správy stavu napříč různými prováděními pracovních postupů. Nedoporučuje se opakovaně používat jednu instanci pracovního postupu pro více úkolů nebo požadavků, protože to může vést k nezamýšleným sdílením stavu. Místo toho doporučujeme vytvořit novou instanci pracovního postupu od tvůrce pro každý úkol nebo požadavek, aby se zajistila správná izolace stavu a bezpečnost vláken.

Zajištění izolace stavu v tvůrcích pracovních postupů

Když je instance exekutoru předána přímo tvůrci pracovních postupů, tato instance exekutoru se sdílí mezi všemi instancemi pracovního postupu vytvořenými z tvůrce. To může vést k problémům, pokud instance exekutoru obsahuje stav, který by se neměl sdílet napříč několika prováděními pracovních postupů. Pokud chcete zajistit správnou izolaci stavu a bezpečnost vláken, doporučujeme používat funkce továrny, které vytvoří novou instanci exekutoru pro každou instanci pracovního postupu.

Již brzy...

Příklad bez zajištění bezpečnosti vlákna

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

Příklad bezpečného vlákna:

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

Návod

Aby se zajistila správná izolace stavu a bezpečnost vláken, ujistěte se také, že instance exekutoru vytvořené funkcemi továrny nesdílejí proměnlivý stav.

Správa stavu agenta

Kontext agenta se spravuje prostřednictvím vláken agenta. Ve výchozím nastavení každý agent v pracovním postupu získá vlastní vlákno, pokud agenta nespravuje vlastní exekutor. Další informace najdete v tématu Práce s agenty.

Vlákna agenta jsou uchovávána mezi jednotlivými spuštěními pracovního postupu. To znamená, že pokud je agent vyvolán při prvním spuštění pracovního postupu, bude obsah vygenerovaný agentem dostupný v následných spuštěních stejné instance pracovního postupu. I když to může být užitečné pro zachování kontinuity v rámci jednoho úkolu, může to také vést k nezamýšlenému sdílení stavu, pokud je stejná instance pracovního postupu znovu použita pro různé úlohy nebo požadavky. Pokud chcete zajistit, aby každá úloha byla v izolovaném stavu agenta, použijte funkce agenta factory v tvůrci pracovních postupů k vytvoření nové instance pracovního postupu pro každou úlohu nebo požadavek.

Již brzy...

Příklad nepodporující práci s vlákny:

writer_agent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_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()).as_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()

Příklad bezpečného vlákna:

def create_writer_agent() -> ChatAgent:
    """Factory function to create a Writer agent."""
    return AzureOpenAIChatClient(credential=AzureCliCredential()).as_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()).as_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

Izolaci stavu v pracovních postupech v Microsoft Agent Framework lze efektivně řídit pomocí továrních funkcí spolu s tvůrci pracovních postupů k vytváření nových instancí exekutorů a agentů. Vytvořením nových instancí pracovního postupu pro každý úkol nebo požadavek můžete zachovat správnou izolaci stavu a vyhnout se nezamýšlenému sdílení stavu mezi různými spuštěními pracovního postupu.

Další kroky