![]()
Ova lekcija obuhvaća:
Nakon završetka ove lekcije znat ćete kako:
Primjeri koda za Microsoft Agent Framework (MAF) mogu se pronaći u ovom spremištu u datotekama xx-python-agent-framework i xx-dotnet-agent-framework.

Microsoft Agent Framework (MAF) je Microsoftov jedinstveni okvir za izgradnju AI agenata. Nudi fleksibilnost za rješavanje širokog spektra agentskih slučajeva upotrebe viđenih u produkcijskim i istraživačkim okruženjima, uključujući:
Za isporuku AI agenata u produkciji, MAF također uključuje značajke za:
Microsoft Agent Framework također je usmjeren na interoperabilnost kroz:
Pogledajmo kako se ove značajke primjenjuju na neke od osnovnih koncepata Microsoft Agent Frameworka.

Kreiranje agenata
Kreiranje agenta postiže se definiranjem usluge zaključivanja (LLM pružatelj), skupa uputa koje AI agent treba slijediti, te dodjelom imena:
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
Gornji primjer koristi Azure OpenAI, ali agenti se mogu stvarati koristeći razne usluge uključujući Microsoft Foundry Agent Service:
AzureAIAgentClient(async_credential=credential).create_agent( name="HelperAgent", instructions="You are a helpful assistant." ) as agent
OpenAI API-je Responses i 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.", )
ili MiniMax koji pruža OpenAI-kompatibilan API s velikim kontekstnim prozorima (do 204K tokena):
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.", )
ili udaljene agente koristeći A2A protokol:
agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )
Pokretanje agenata
Agenti se pokreću korištenjem metoda .run ili .run_stream za ne-streaming ili streaming odgovore.
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)
Svako pokretanje agenta također može imati opcije za prilagodbu parametara poput max_tokens koje agent koristi, alate koje agent može pozvati, pa čak i sam model koji se koristi za agenta.
Ovo je korisno u slučajevima kada su potrebni specifični modeli ili alati za dovršetak korisničkog zadatka.
Alati
Alati se mogu definirati i prilikom definiranja agenta:
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."
# Prilikom izravnog stvaranja ChatAgenta
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
kao i prilikom pokretanja agenta:
result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Alat osiguran samo za ovo izvođenje )
Agent Threads
Agent Threads koristite za rukovanje višekratnim razgovorima. Threads se mogu kreirati na sljedeće načine:
get_new_thread() što omogućuje spremanje thread-a tijekom vremenaZa kreiranje thread-a kod izgleda ovako:
# Kreiraj novi thread.
thread = agent.get_new_thread() # Pokreni agenta s threadom.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Thread se potom može serijalizirati za pohranu i kasniju upotrebu:
# Kreirajte novi thread.
thread = agent.get_new_thread()
# Pokrenite agenta s threadom.
response = await agent.run("Hello, how are you?", thread=thread)
# Serijalizirajte thread za pohranu.
serialized_thread = await thread.serialize()
# Deserijalizirajte stanje threada nakon učitavanja iz pohrane.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Agent Middleware
Agenti komuniciraju s alatima i LLM-ovima za izvršenje korisničkih zadataka. U određenim scenarijima želimo izvršiti ili pratiti radnje između tih interakcija. Agent middleware to omogućava kroz:
Middleware funkcija
Ovaj middleware omogućava izvršavanje radnje između agenta i funkcije/alata koju agent poziva. Primjer upotrebe je kad želite obaviti zapisivanje (logiranje) poziva funkcije.
U donjem kodu next definira treba li pozvati sljedeći middleware ili stvarnu funkciju.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Predobrada: Započnite zapis prije izvršavanja funkcije
print(f"[Function] Calling {context.function.name}")
# Nastavi na sljedeći middleware ili izvršenje funkcije
await next(context)
# Postobrada: Započnite zapis nakon izvršavanja funkcije
print(f"[Function] {context.function.name} completed")
Chat Middleware
Ovaj middleware omogućuje izvršavanje ili zapisivanje radnje između agenta i zahtjeva prema LLM-u.
Sadrži važne informacije kao što su poruke koje se šalju AI usluzi.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Predobrada: Zabilježi prije poziva AI-ja
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Nastavi na sljedeći middleware ili AI uslugu
await next(context)
# Naknadna obrada: Zabilježi nakon odgovora AI-ja
print("[Chat] AI response received")
Agent Memory
Kao što je objašnjeno u lekciji Agentic Memory, memorija je važan element za omogućavanje rada agenta kroz različite kontekste. MAF nudi nekoliko različitih tipova memorije:
Memorija u memoriji (In-Memory Storage)
Ova memorija je pohranjena u threadovima tijekom izvođenja aplikacije.
# Kreirajte novu nit.
thread = agent.get_new_thread() # Pokrenite agenta s niti.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Trajne poruke
Ova memorija se koristi za pohranu povijesti razgovora preko različitih sesija. Definira se pomoću chat_message_store_factory:
from agent_framework import ChatMessageStore
# Kreirajte prilagođenu pohranu poruka
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
Dinamička memorija
Ova memorija dodaje se u kontekst prije pokretanja agenata. Ove memorije mogu se pohraniti u eksternim uslugama kao što je mem0:
from agent_framework.mem0 import Mem0Provider
# Korištenje Mem0 za napredne memorijske mogućnosti
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
)
Agent Observability
Nadzor je važan za izgradnju pouzdanih i održivih agentskih sustava. MAF se integrira s OpenTelemetry za pružanje praćenja i mjernih instrumenata za bolju vidljivost.
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# napravi nešto
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF nudi radne tijekove koji su unaprijed definirani koraci za dovršetak zadatka i uključuju AI agente kao komponente tih koraka.
Radni tijekovi se sastoje od različitih komponenti koje omogućuju bolju kontrolu toka. Radni tijekovi također omogućuju multi-agent orkestraciju i checkpointing za spremanje stanja radnog tijeka.
Osnovne komponente radnog tijeka su:
Izvršitelji
Izvršitelji primaju ulazne poruke, izvršavaju dodijeljene zadatke i proizvode izlaznu poruku. Time se radni tijek kreće prema dovršetku većeg zadatka. Izvršitelji mogu biti AI agent ili prilagođena logika.
Veze (Edges)
Veze se koriste za definiranje toka poruka u radnom tijeku. One mogu biti:
Izravne veze - Jednostavne veze jedan-na-jedan između izvršitelja:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Uvjetne veze - Aktiviraju se nakon ispunjenja određenog uvjeta. Na primjer, kada hotelske sobe nisu dostupne, izvršitelj može predložiti druge opcije.
Prekidačke veze (switch-case) - Usmjeravaju poruke različitim izvršiteljima na temelju definiranih uvjeta. Na primjer, ako putnički korisnik ima prioritetni pristup, njihovi će zadaci biti obrađeni kroz drugi radni tijek.
Dijeljenje veza (fan-out) - Šalje jednu poruku prema više odredišta.
Spajanje veza (fan-in) - Prikuplja više poruka od različitih izvršitelja i šalje ih jednom odredištu.
Događaji
Za bolji nadzor radnih tijekova, MAF nudi ugrađene događaje za izvršenje uključujući:
WorkflowStartedEvent - Početak izvršavanja radnog tijekaWorkflowOutputEvent - Radni tijek proizvodi izlazWorkflowErrorEvent - Radni tijek susreće pogreškuExecutorInvokeEvent - Izvršitelj počinje s obradomExecutorCompleteEvent - Izvršitelj završava obraduRequestInfoEvent - Izdan je zahtjevGornji dijelovi opisuju ključne koncepte Microsoft Agent Frameworka. Kako gradite složenije agente, ovdje su neki napredni obrasci koje treba razmotriti:
Primjeri koda za Microsoft Agent Framework mogu se pronaći u ovom spremištu u datotekama xx-python-agent-framework i xx-dotnet-agent-framework.
Pridružite se Microsoft Foundry Discordu za susret s drugim učenicima, sudjelovanje u radnim satima i odgovore na vaša pitanja o AI agentima.
Izjava o odricanju odgovornosti: Ovaj dokument preveden je korištenjem AI usluge za prevođenje Co-op Translator. Iako nastojimo postići točnost, molimo vas da imate na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na njegovom izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni ljudski prijevod. Ne snosimo odgovornost za bilo kakve nesporazume ili pogrešna tumačenja koja proizlaze iz upotrebe ovog prijevoda.