Поделиться через


Рабочие процессы Microsoft Agent Framework — изоляция состояния

В реальных приложениях правильное управление состоянием критически важно при обработке нескольких задач или запросов. Без надлежащей изоляции общее состояние между различными выполнениями рабочих процессов может привести к неожиданному поведению, повреждению данных и условиям гонки. В этой статье объясняется, как обеспечить изоляцию состояния в рабочих процессах Microsoft Agent Framework, предоставляя идеи о наилучших практиках и распространенных подводных камнях.

Изменяемые построители рабочих процессов и неизменяемые рабочие процессы

Рабочие процессы создаются построителями рабочих процессов. Построители рабочих процессов обычно считаются изменяемыми, в которых можно добавлять или изменять начального исполнителя или другие конфигурации после создания построителя или даже после создания рабочего процесса. С другой стороны, рабочие процессы неизменяемы в том, что после создания рабочего процесса его невозможно изменить (общедоступный API для изменения рабочего процесса).

Это различие важно, так как это влияет на управление состоянием в разных выполнениях рабочих процессов. Не рекомендуется повторно использовать один экземпляр рабочего процесса для нескольких задач или запросов, так как это может привести к непреднамеренному общему доступу к состоянию. Вместо этого рекомендуется создавать новый экземпляр потока работ из конструктора для каждой задачи или запроса, чтобы обеспечить правильную изоляцию состояния и безопасность потоков.

Обеспечение изоляции состояния в конструкторах рабочих процессов

При передаче экземпляра компонента выполнения непосредственно в конструктор рабочих процессов, этот экземпляр компонента выполнения разделяется между всеми экземплярами рабочих процессов, созданными из конструктора. Это может привести к проблемам, если экземпляр исполнителя содержит состояние, которое не должно быть общим для нескольких выполнений рабочих процессов. Чтобы обеспечить правильную изоляцию состояния и безопасность потоков, рекомендуется использовать фабричные функции, которые создают новый экземпляр исполнительного механизма для каждого экземпляра рабочего процесса.

Скоро...

Пример, небезопасный для потоков:

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

Пример потокобезопасности:

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

Подсказка

Чтобы обеспечить правильную изоляцию состояния и безопасность потоков, также убедитесь, что экземпляры исполнителей, созданные функциями фабрики, не разделяют изменяемое состояние.

Управление состоянием агента

Контекст агента управляется потоками агента. По умолчанию каждый агент в рабочем процессе получит собственный поток, если агент не управляется пользовательским исполнителем. Дополнительные сведения см. в статье "Работа с агентами".

Потоки агента сохраняются на протяжении выполнения нескольких запусков рабочего процесса. Это означает, что если агент вызывается в первом запуске рабочего процесса, содержимое, созданное агентом, будет доступно в последующих запусках того же экземпляра рабочего процесса. Хотя это может быть полезно для поддержания непрерывности в рамках одной задачи, это также может привести к непреднамеренному совместному использованию состояния, если повторно используется один и тот же экземпляр рабочего процесса для различных задач или запросов. Чтобы убедиться, что каждая задача имеет изолированное состояние агента, используйте функции фабрики агентов в построителе рабочих процессов для создания нового экземпляра рабочего процесса для каждой задачи или запроса.

Скоро...

Пример небезопасного для потоков кода:

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

Пример потокобезопасного кода

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

Изоляция состояния в рабочих процессах Microsoft Agent Framework может эффективно управляться с помощью функций фабрики с построителями рабочих процессов для создания новых экземпляров исполнителя и агента. Создавая новые экземпляры рабочих процессов для каждой задачи или запроса, можно обеспечить правильную изоляцию состояния и избежать непреднамеренного общего доступа к состоянию между различными выполнениями рабочих процессов.

Дальнейшие шаги