Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In realen Anwendungen ist die ordnungsgemäße Verwaltung des Zustands bei der Behandlung mehrerer Aufgaben oder Anforderungen von entscheidender Bedeutung. Ohne ordnungsgemäße Isolierung kann der gemeinsame Zustand zwischen verschiedenen Workflowausführungen zu unerwartetem Verhalten, Datenbeschädigungen und Rennbedingungen führen. In diesem Artikel wird erläutert, wie Sie die Zustandsisolation innerhalb von Microsoft Agent Framework-Workflows sicherstellen und Einblicke in bewährte Methoden und häufige Fallstricke bieten.
Veränderbare Workflow-Generatoren im Vergleich zu unveränderlichen Workflows
Workflows werden von Workflow-Generatoren erstellt. Workflow-Ersteller werden in der Regel als änderbar angesehen, wobei man Konfigurationen wie den Start-Executor oder andere Einstellungen nach der Erstellung des Erstellers oder sogar nachdem ein Workflow gebaut wurde, hinzufügen oder ändern kann. Andererseits sind Workflows unveränderlich, wenn ein Workflow erstellt wurde, kann er nicht mehr geändert werden (keine öffentliche API zum Ändern eines Workflows).
Diese Unterscheidung ist wichtig, da sie sich darauf auswirkt, wie der Zustand in verschiedenen Workflowausführungen verwaltet wird. Es ist nicht ratsam, eine einzelne Workflowinstanz für mehrere Aufgaben oder Anforderungen wiederzuverwenden, da dies zu unbeabsichtigter Zustandsteilung führen kann. Stattdessen wird empfohlen, eine neue Workflowinstanz aus dem Generator für jede Aufgabe oder Anforderung zu erstellen, um eine ordnungsgemäße Zustandsisolation und Threadsicherheit sicherzustellen.
Sicherstellen der Zustandsisolierung in Workflow-Buildern
Wenn eine Executorinstanz direkt an einen Workflow-Generator übergeben wird, wird diese Ausführungsinstanz von allen Workflowinstanzen gemeinsam verwendet, die vom Generator erstellt wurden. Dies kann zu Problemen führen, wenn die Executor-Instanz einen Zustand enthält, der nicht über mehrere Workflow-Ausführungen hinweg geteilt werden soll. Um eine ordnungsgemäße Zustandsisolation und Threadsicherheit sicherzustellen, empfiehlt es sich, Werksfunktionen zu verwenden, die eine neue Ausführungsinstanz für jede Workflowinstanz erstellen.
Demnächst...
Beispiel für ein nicht threadsicheres Beispiel:
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()
Threadsicheres Beispiel:
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()
Tipp
Um eine ordnungsgemäße Zustandsisolation und Threadsicherheit sicherzustellen, stellen Sie außerdem sicher, dass von Factoryfunktionen erstellte Executorinstanzen keinen veränderbaren Zustand aufweisen.
Agentstatusverwaltung
Der Agentkontext wird über Agent-Threads verwaltet. Standardmäßig erhält jeder Agent in einem Workflow seinen eigenen Thread, es sei denn, der Agent wird von einem benutzerdefinierten Executor verwaltet. Weitere Informationen finden Sie unter "Arbeiten mit Agents".
Agentthreads werden über Workflowausführungen hinweg beibehalten. Dies bedeutet, dass Inhalte, die vom Agent generiert werden, in nachfolgenden Ausführungen derselben Workflowinstanz verfügbar sind, wenn ein Agent in der ersten Ausführung eines Workflows aufgerufen wird. Dies kann zwar nützlich sein, um die Kontinuität innerhalb einer einzelnen Aufgabe aufrechtzuerhalten, kann aber auch zu unbeabsichtigter Zustandsfreigabe führen, wenn dieselbe Workflowinstanz für verschiedene Aufgaben oder Anforderungen wiederverwendet wird. Um sicherzustellen, dass jede Aufgabe einen isolierten Agentstatus aufweist, verwenden Sie die Agent-Factoryfunktionen in Ihrem Workflow-Generator, um eine neue Workflowinstanz für jede Aufgabe oder Anforderung zu erstellen.
Demnächst...
Ein Beispiel für Nicht-Thread-Sicherheit:
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()
Threadsicheres Beispiel:
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
Die Statusisolation in Microsoft Agent Framework-Workflows kann effektiv mithilfe von Factoryfunktionen mit Workflow-Generatoren verwaltet werden, um frische Executor- und Agentinstanzen zu erstellen. Durch das Erstellen neuer Workflowinstanzen für jede Aufgabe oder Anforderung können Sie eine ordnungsgemäße Zustandsisolation beibehalten und unbeabsichtigte Zustandsfreigaben zwischen verschiedenen Workflowausführungen vermeiden.