![]()
У овој лекцији ћете научити:
Након завршетка ове лекције, знаћете како да:
Примери кода за 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.

Креирање агената
Креирање агената се врши дефинисањем сервисa за закључивање (LLM провајдера), скупа инструкција које AI агент треба да следи и додељеног имена:
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
OpenAI Responses, ChatCompletion API-ји
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.", )
или MiniMax, који пружа OpenAI-компатибилан API са великим контекстуалним прозорима (до 204К токена):
agent = OpenAIChatClient(base_url="https://api.minimax.io/v1", api_key=os.environ["MINIMAX_API_KEY"], model_id="MiniMax-M2.7").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)
Посредници агената
Агенти комуницирају са алаткама и LLM-овима да би завршили корисничке задатке. У неким сценаријима желимо да извршимо или пратимо између ове интеракције. Посредници агената нам омогућавају да то урадимо кроз:
Функцијски посредници
Ови посредници нам омогућавају да извршимо радњу између агента и функције/алата које ће агент позвати. Пример коришћења је када пожелите да реализујете неку евиденцију о позиву функције.
У коду испод, next дефинише да ли ће бити позван следећи посредник или сама функција.
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}")
# Настави на следећи middleware или извршење функције
await next(context)
# Пост-обрада: Запиши након извршења функције
print(f"[Function] {context.function.name} completed")
Ћаскање посредници
Ови посредници омогућавају извршавање или евидентирање радње између агента и захтева ка 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 нуди неколико различитих типова меморије:
Складиштење у меморији
Ово је меморија сачувана у нитима током рада апликације.
# Креирај нови нит.
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)
Постојеће поруке
Ова меморија се користи за чување историје разговора преко различитих сесија. Дефинише се помоћу фабрике 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
)
Динамична меморија
Ова меморија се додаје у контекст пре него што агенти почну да раде. Ове меморије могу бити сачуване у екстерним сервисима као мем0:
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 агенте као компоненте тих корака.
Радни токови се састоје из различитих елемената који омогућавају бољу контролу тока. Такође омогућавају мулти-агентску оркестрацију и чување стања ради спремања статуса радног тока.
Основни елементи радног тока су:
Извршиоци
Извршиоци примају улазне поруке, извршавају додељене задатке, а затим производе излазну поруку. Ово помера радни ток напред ка завршетку већег задатка. Извршиоци могу бити AI агенти или прилагођена логика.
Везе
Везе се користе за дефинисање тока порука у радном току. Оне могу бити:
Директне везе - Једноставне везе један-на-један између извршилаца:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Условне везе - Активирају се након што се испуни одређени услов. На пример, када собе у хотелу нису доступне, извршилац може предложити друге опције.
Штафетне везе - Рутрирају поруке ка различитим извршиоцима на основу дефинисаних услова. На пример, ако путнички корисник има приоритетни приступ, задаци ће бити обрађени кроз други радни ток.
Везе распрскавања - Слање једне поруке више одредишта.
Везе прикупљања - Прикупљање више порука од различитих извршиоца и слање једном одредишту.
Догађаји
Да би се обезбедило боље посматрање радних токова, 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 агентима.
Ограничење одговорности: Овај документ је преведен коришћењем AI услуге за превођење Co-op Translator. Иако се трудимо да буде тачно, молимо имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитетним извором. За критичне информације препоручује се професионални људски превод. Не сносимо одговорност за било каква неспоразума или погрешна тумачења која произлазе из коришћења овог превода.