![]()
В этом уроке будут рассмотрены:
После прохождения этого урока вы будете уметь:
Примеры кода для Microsoft Agent Framework (MAF) можно найти в этом репозитории в файлах xx-python-agent-framework и xx-dotnet-agent-framework.

Microsoft Agent Framework (MAF) — это унифицированный фреймворк от Microsoft для создания AI-агентов. Он предоставляет гибкость для решения широкого спектра агентных сценариев, встречающихся как в производственной, так и в исследовательской среде, включая:
Для развертывания AI-агентов в продакшене MAF также включает функции для:
Microsoft Agent Framework также ориентирован на совместимость за счёт:
Давайте рассмотрим, как эти функции применяются к некоторым ключевым концепциям Microsoft Agent Framework.

Создание агентов
Создание агента осуществляется путем определения inference service (LLM Provider), набора инструкций для агента и присвоения name:
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
Выше используется Azure OpenAI, но агенты можно создавать с использованием различных сервисов, включая Microsoft Foundry Agent Service:
AzureAIAgentClient(async_credential=credential).create_agent( name="HelperAgent", instructions="You are a helpful assistant." ) as agent
API OpenAI Responses, ChatCompletion
agent = OpenAIResponsesClient().create_agent( name="WeatherBot", instructions="You are a helpful weather assistant.", )
agent = OpenAIChatClient().create_agent( name="HelpfulAssistant", instructions="You are a helpful assistant.", )
или удалённых агентов с использованием протокола A2A:
agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )
Запуск агентов
Агенты запускаются с помощью методов .run или .run_stream для нестриминговых или стриминговых ответов.
result = await agent.run("What are good places to visit in Amsterdam?")
print(result.text)
async for update in agent.run_stream("What are the good places to visit in Amsterdam?"):
if update.text:
print(update.text, end="", flush=True)
Каждый запуск агента также может иметь опции для настройки параметров, таких как max_tokens, используемые агентом, tools, которые агент может вызывать, и даже сам model, используемый агентом.
Это полезно в случаях, когда для выполнения задачи пользователя требуются конкретные модели или инструменты.
Инструменты
Инструменты можно задавать как при определении агента:
def get_attractions( location: Annotated[str, Field(description="The location to get the top tourist attractions for")], ) -> str: """Get the top tourist attractions for a given location.""" return f"The top attractions for {location} are."
# При прямом создании ChatAgent
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
таким и при запуске агента:
result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Инструмент предоставлен только для этого запуска )
Потоки агента
Потоки агента используются для обработки многошаговых разговоров. Треды могут создаваться либо:
get_new_thread(), которое позволяет сохранять поток со временемЧтобы создать поток, код выглядит так:
# Создайте новый поток.
thread = agent.get_new_thread() # Запустите агента в этом потоке.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Затем вы можете сериализовать поток для хранения и последующего использования:
# Создать новый поток.
thread = agent.get_new_thread()
# Запустить агента в этом потоке.
response = await agent.run("Hello, how are you?", thread=thread)
# Сериализовать поток для хранения.
serialized_thread = await thread.serialize()
# Десериализовать состояние потока после загрузки из хранилища.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Middleware агента
Агенты взаимодействуют с инструментами и LLM для выполнения задач пользователей. В определённых сценариях мы хотим выполнять действия или отслеживать события между этими взаимодействиями. Middleware агента позволяет делать это посредством:
Function Middleware
Этот middleware позволяет выполнять действие между агентом и функцией/инструментом, который он будет вызывать. Пример использования — логирование вызова функции.
В коде ниже next определяет, должен ли быть вызван следующий middleware или реальная функция.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Предварительная обработка: запись в журнал перед выполнением функции
print(f"[Function] Calling {context.function.name}")
# Продолжить к следующему промежуточному обработчику или к выполнению функции
await next(context)
# Постобработка: запись в журнал после выполнения функции
print(f"[Function] {context.function.name} completed")
Chat Middleware
Этот middleware позволяет выполнять или логировать действие между агентом и запросами к LLM.
Он содержит важную информацию, такую как messages, которые отправляются в AI-сервис.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Предобработка: логирование перед вызовом ИИ
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Продолжить к следующему промежуточному ПО или сервису ИИ
await next(context)
# Постобработка: логирование после ответа ИИ
print("[Chat] AI response received")
Память агента
Как было рассмотрено в уроке Agentic Memory, память является важным элементом, позволяющим агенту работать в разных контекстах. MAF предлагает несколько разных типов памяти:
In-Memory Storage
Это память, хранимая в потоках во время выполнения приложения.
# Создать новый поток.
thread = agent.get_new_thread() # Запустить агента в этом потоке.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Persistent Messages
Эта память используется для хранения истории бесед между разными сессиями. Она определяется с помощью chat_message_store_factory :
from agent_framework import ChatMessageStore
# Создать пользовательское хранилище сообщений
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
Dynamic Memory
Эта память добавляется в контекст перед запуском агентов. Эти виды памяти могут храниться во внешних сервисах, таких как mem0:
from agent_framework.mem0 import Mem0Provider
# Использование Mem0 для расширенных возможностей памяти
memory_provider = Mem0Provider(
api_key="your-mem0-api-key",
user_id="user_123",
application_id="my_app"
)
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a helpful assistant with memory.",
context_providers=memory_provider
)
Наблюдаемость агента
Наблюдаемость важна для построения надежных и удобных в сопровождении агентных систем. MAF интегрируется с OpenTelemetry для предоставления трассировки и метрик для лучшей наблюдаемости.
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# сделать что-то
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF предлагает рабочие процессы — заранее определённые шаги для выполнения задачи, в которые включаются AI-агенты как компоненты.
Рабочие процессы состоят из различных компонентов, которые обеспечивают лучший контроль потока. Рабочие процессы также позволяют реализовать многоагентную оркестрацию и контрольные точки (checkpointing) для сохранения состояний рабочего процесса.
Основные компоненты рабочего процесса:
Executors
Исполнители получают входные сообщения, выполняют назначенные задачи и затем формируют выходное сообщение. Это продвигает рабочий процесс к выполнению более крупной задачи. Исполнителями могут быть либо AI-агенты, либо пользовательская логика.
Переходы (Edges)
Переходы используются для определения потока сообщений в рабочем процессе. Они могут быть:
Прямые переходы (Direct Edges) - простые связи один-к-одному между исполнителями:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Условные переходы (Conditional Edges) - активируются после выполнения определённого условия. Например, когда номера в отеле недоступны, исполнитель может предложить другие варианты.
Switch-case Edges - направляют сообщения к разным исполнителям в зависимости от заданных условий. Например: если у клиента приоритетный доступ, его задачи будут обрабатываться в другом рабочем процессе.
Fan-out Edges - отправляют одно сообщение нескольким целям.
Fan-in Edges - собирают несколько сообщений от разных исполнителей и отправляют их одному получателю.
События
Для лучшей наблюдаемости рабочих процессов MAF предоставляет встроенные события для выполнения, включая:
WorkflowStartedEvent - Выполнение рабочего процесса начинаетсяWorkflowOutputEvent - Рабочий процесс формирует выходные данныеWorkflowErrorEvent - Во время выполнения рабочего процесса возникает ошибкаExecutorInvokeEvent - Исполнитель начинает обработкуExecutorCompleteEvent - Исполнитель завершил обработкуRequestInfoEvent - Отправлен запросРазделы выше охватывают ключевые концепции Microsoft Agent Framework. По мере создания более сложных агентов, рассмотрите следующие продвинутые паттерны:
Примеры кода для Microsoft Agent Framework можно найти в этом репозитории в файлах xx-python-agent-framework и xx-dotnet-agent-framework.
Присоединяйтесь к Microsoft Foundry Discord , чтобы общаться с другими учащимися, посещать консультации и получить ответы на вопросы по вашим AI-агентам.
Отказ от ответственности: Этот документ был переведен с помощью сервиса перевода на основе ИИ Co-op Translator (https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, обратите внимание, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на исходном языке следует считать авторитетным источником. Для критически важной информации рекомендуется пользоваться услугами профессионального переводчика. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.