В этом уроке мы рассмотрим:
После завершения урока вы сможете:
Примеры кода для Microsoft Agent Framework (MAF) можно найти в этом репозитории в файлах xx-python-agent-framework
и xx-dotnet-agent-framework
.
Microsoft Agent Framework (MAF) основан на опыте и знаниях, полученных от Semantic Kernel и AutoGen. Он предлагает гибкость для решения широкого спектра агентных сценариев, встречающихся как в производственных, так и в исследовательских средах, включая:
Для внедрения AI-агентов в производство MAF также включает функции:
Microsoft Agent Framework также ориентирован на совместимость:
Давайте рассмотрим, как эти функции применяются к основным концепциям Microsoft Agent Framework.
Создание агентов
Создание агента осуществляется путем определения сервиса вывода (провайдера LLM), набора инструкций для выполнения AI-агентом и присвоения имени name
:
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
В приведенном выше примере используется Azure OpenAI
, но агенты могут быть созданы с использованием различных сервисов, включая Azure AI 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."
# When creating a ChatAgent directly
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] # Tool provided for this run only )
Потоки агентов
Потоки агентов используются для обработки многократных разговоров. Потоки могут быть созданы либо с помощью:
get_new_thread()
, что позволяет сохранять поток со временем.Для создания потока код выглядит следующим образом:
# Create a new thread.
thread = agent.get_new_thread() # Run the agent with the thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Затем вы можете сериализовать поток для его сохранения и использования позже:
# Create a new thread.
thread = agent.get_new_thread()
# Run the agent with the thread.
response = await agent.run("Hello, how are you?", thread=thread)
# Serialize the thread for storage.
serialized_thread = await thread.serialize()
# Deserialize the thread state after loading from storage.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Промежуточное ПО для агентов
Агенты взаимодействуют с инструментами и LLM для выполнения задач пользователя. В определенных сценариях мы хотим выполнить или отслеживать действия между этими взаимодействиями. Промежуточное ПО для агентов позволяет нам это делать через:
Function Middleware
Это промежуточное ПО позволяет выполнять действие между агентом и функцией/инструментом, который он будет вызывать. Примером использования может быть логирование вызова функции.
В приведенном ниже коде next
определяет, следует ли вызывать следующее промежуточное ПО или саму функцию.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Pre-processing: Log before function execution
print(f"[Function] Calling {context.function.name}")
# Continue to next middleware or function execution
await next(context)
# Post-processing: Log after function execution
print(f"[Function] {context.function.name} completed")
Chat Middleware
Это промежуточное ПО позволяет выполнять или логировать действие между агентом и запросами между LLM.
Оно содержит важную информацию, такую как messages
, отправляемые в AI-сервис.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Pre-processing: Log before AI call
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Continue to next middleware or AI service
await next(context)
# Post-processing: Log after AI response
print("[Chat] AI response received")
Память агента
Как было рассмотрено в уроке Agentic Memory
, память является важным элементом, позволяющим агенту работать в различных контекстах. MAF предлагает несколько различных типов памяти:
Хранение в памяти
Это память, хранящаяся в потоках во время выполнения приложения.
# Create a new thread.
thread = agent.get_new_thread() # Run the agent with the thread.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Сохранение сообщений
Эта память используется для хранения истории разговоров между различными сессиями. Она определяется с использованием chat_message_store_factory
:
from agent_framework import ChatMessageStore
# Create a custom message store
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
Динамическая память
Эта память добавляется в контекст перед запуском агентов. Эти данные могут быть сохранены во внешних сервисах, таких как mem0:
from agent_framework.mem0 import Mem0Provider
# Using Mem0 for advanced memory capabilities
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"):
# do something
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF предлагает рабочие процессы, которые представляют собой заранее определенные шаги для выполнения задачи и включают AI-агентов как компоненты этих шагов.
Рабочие процессы состоят из различных компонентов, которые позволяют лучше управлять потоком данных. Рабочие процессы также поддерживают оркестрацию нескольких агентов и контрольные точки для сохранения состояния рабочего процесса.
Основные компоненты рабочего процесса:
Исполнители
Исполнители получают входные сообщения, выполняют назначенные задачи и затем создают выходное сообщение. Это продвигает рабочий процесс к выполнению более крупной задачи. Исполнители могут быть как AI-агентами, так и пользовательской логикой.
Ребра
Ребра используются для определения потока сообщений в рабочем процессе. Они могут быть:
Прямые ребра - Простые соединения один-к-одному между исполнителями:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Условные ребра - Активируются после выполнения определенного условия. Например, когда номера в отелях недоступны, исполнитель может предложить другие варианты.
Ребра switch-case - Направляют сообщения к различным исполнителям на основе определенных условий. Например, если у клиента есть приоритетный доступ, его задачи будут обработаны через другой рабочий процесс.
Ребра fan-out - Отправляют одно сообщение нескольким целям.
Ребра fan-in - Собирают несколько сообщений от разных исполнителей и отправляют одной цели.
События
Для улучшения наблюдаемости рабочих процессов MAF предлагает встроенные события выполнения, включая:
WorkflowStartedEvent
- Начало выполнения рабочего процессаWorkflowOutputEvent
- Рабочий процесс создает выходные данныеWorkflowErrorEvent
- Рабочий процесс сталкивается с ошибкойExecutorInvokeEvent
- Исполнитель начинает обработкуExecutorCompleteEvent
- Исполнитель завершает обработкуRequestInfoEvent
- Запрос выполненУпрощенное создание агентов
Semantic Kernel требует создания экземпляра Kernel для каждого агента. MAF использует упрощенный подход с использованием расширений для основных провайдеров.
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at reccomending trips to customers based on their preferences.", name="TripRecommender" )
Создание потоков агентов
Semantic Kernel требует ручного создания потоков. В MAF агенту напрямую назначается поток.
thread = agent.get_new_thread() # Run the agent with the thread.
Регистрация инструментов
В Semantic Kernel инструменты регистрируются в Kernel, который затем передается агенту. В MAF инструменты регистрируются непосредственно при создании агента.
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
Команды vs Рабочие процессы
Команды
представляют собой структуру событий для событийной активности с агентами в AutoGen. MAF использует Рабочие процессы
, которые направляют данные к исполнителям через архитектуру графов.
Создание инструментов
AutoGen использует FunctionTool
для обертки функций, которые агенты могут вызывать. MAF использует @ai_function, который работает аналогично, но также автоматически определяет схемы для каждой функции.
Поведение агентов
Агенты по умолчанию являются одноразовыми в AutoGen, если max_tool_iterations
не установлен на более высокое значение. В MAF ChatAgent
является многоразовым по умолчанию, что означает, что он будет продолжать вызывать инструменты до тех пор, пока задача пользователя не будет выполнена.
Примеры кода для Microsoft Agent Framework можно найти в этом репозитории в файлах xx-python-agent-framework
и xx-dotnet-agent-framework
.
Присоединяйтесь к Azure AI Foundry Discord, чтобы встретиться с другими учащимися, посетить офисные часы и получить ответы на ваши вопросы о AI-агентах.
Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.