ai-agents-for-beginners

Istraživanje Microsoft Agent Framework

Okvir agenata

Uvod

Ova lekcija će obuhvatiti:

Ciljevi učenja

Nakon završetka ove lekcije, znat ćete kako:

Primjeri koda

Primjeri koda za Microsoft Agent Framework (MAF) nalaze se u ovom spremištu pod datotekama xx-python-agent-framework i xx-dotnet-agent-framework.

Razumijevanje Microsoft Agent Frameworka

Uvod u okvir

Microsoft Agent Framework (MAF) je Microsoftov objedinjeni okvir za izgradnju AI agenata. Nudi fleksibilnost za rješavanje širokog raspona agentskih slučajeva uporabe viđenih i u produkciji i u istraživačkom okruženju, uključujući:

Za isporuku AI agenata u produkciji, MAF također uključuje značajke za:

Microsoft Agent Framework je također usmjeren na interoperabilnost kroz:

Pogledajmo kako se ove značajke primjenjuju na neke od ključnih koncepata Microsoft Agent Frameworka.

Ključni koncepti Microsoft Agent Frameworka

Agenti

Okvir agenata

Stvaranje agenata

Stvaranje agenta odvija se definiranjem usluge za zaključivanje (LLM Provider), skupa uputa koje AI agent treba slijediti, i dodijeljenog name:

agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )

Gore se koristi Azure OpenAI, ali agenti se mogu stvarati koristeći različite 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 Responses, ChatCompletion APIs

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 udaljeni agenti 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 koristeći metode .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 kao što su max_tokens koje agent koristi, tools koje agent može pozivati, pa čak i sam model koji agent koristi.

Ovo je korisno u slučajevima kada su specifični modeli ili alati potrebni za dovršetak zadatka korisnika.

Alati

Alate je moguće 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]

i također pri pokretanju agenta:


result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Alat osiguran samo za ovo izvođenje )

Agentne niti

Agentne niti koriste se za upravljanje višekratnim razgovorima. Niti se mogu stvoriti na sljedeće načine:

Za stvaranje niti, kod izgleda ovako:

# Stvori novu nit.
thread = agent.get_new_thread() # Pokreni agenta s tom niti.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)

Zatim možete serijalizirati nit kako biste je pohranili za kasniju upotrebu:

# Stvori novu nit.
thread = agent.get_new_thread() 

# Pokreni agenta s nitom.

response = await agent.run("Hello, how are you?", thread=thread) 

# Serijaliziraj nit za pohranu.

serialized_thread = await thread.serialize() 

# Deserijaliziraj stanje niti nakon učitavanja iz pohrane.

resumed_thread = await agent.deserialize_thread(serialized_thread)

Agent Middleware

Agenti komuniciraju s alatima i LLM-ovima kako bi dovršili zadatke korisnika. U određenim scenarijima želimo izvršiti ili pratiti radnje između tih interakcija. Agent middleware nam to omogućava kroz:

Funkcijski međusloj

Ovaj međusloj omogućuje nam izvršavanje akcije između agenta i funkcije/alata kojeg će pozivati. Primjer kada bi se koristio je kada želite napraviti zapis (logging) poziva funkcije.

U donjem kodu next definira treba li pozvati sljedeći međusloj ili stvarnu funkciju.

async def logging_function_middleware(
    context: FunctionInvocationContext,
    next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
    """Function middleware that logs function execution."""
    # Predobrada: Zapisivanje u dnevnik prije izvršavanja funkcije
    print(f"[Function] Calling {context.function.name}")

    # Nastavi na sljedeći middleware ili izvršavanje funkcije
    await next(context)

    # Postobrada: Zapisivanje u dnevnik nakon izvršavanja funkcije
    print(f"[Function] {context.function.name} completed")

Chat međusloj

Ovaj međusloj omogućuje nam izvršavanje ili zapisivanje akcije između agenta i zahtjeva prema LLM-u.

Ovo sadrži važne informacije poput messages 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: Zapis prije poziva AI
    print(f"[Chat] Sending {len(context.messages)} messages to AI")

    # Nastavi na sljedeći međusloj ili AI uslugu
    await next(context)

    # Naknadna obrada: Zapis nakon odgovora AI
    print("[Chat] AI response received")

Memorija agenta

Kao što je pokriveno u lekciji Agentic Memory, memorija je važan element koji omogućuje agentu rad u različitim kontekstima. MAF nudi nekoliko različitih tipova memorije:

Pohrana u memoriji

To je memorija pohranjena u nitima tijekom izvođenja aplikacije.

# Stvori novu dretvu.
thread = agent.get_new_thread() # Pokreni agenta s dretvom.
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 pri pohranjivanju povijesti razgovora kroz različite sesije. Definira se pomoću chat_message_store_factory :

from agent_framework import ChatMessageStore

# Stvorite 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čna memorija

Ova memorija se dodaje u kontekst prije pokretanja agenata. Ove memorije mogu se pohraniti u vanjskim 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
)

Observabilnost agenta

Observabilnost je važna za izgradnju pouzdanih i održivih agentskih sustava. MAF se integrira s OpenTelemetry za pružanje praćenja i mjera za bolju observabilnost.

from agent_framework.observability import get_tracer, get_meter

tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
    # uradi nešto
    pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})

Tokovi rada

MAF nudi tokove rada koji su unaprijed definirani koraci za dovršetak zadatka i uključuju AI agente kao komponente tih koraka.

Tokovi rada sastoje se od različitih komponenti koje omogućuju bolji tok kontrole. Tokovi rada također omogućuju orkestraciju s više agenata (multi-agent orchestration) i checkpointing za spremanje stanja toka rada.

Osnovne komponente toka rada su:

Izvršitelji

Izvršitelji primaju ulazne poruke, izvršavaju dodijeljene zadatke i zatim proizvode izlaznu poruku. To pomiče tok rada prema dovršetku većeg zadatka. Izvršitelji mogu biti AI agenti ili prilagođena logika.

Poveznice (Edges)

Poveznice služe za definiranje toka poruka u toku rada. Mogu biti:

Izravne poveznice - 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 poveznice - Aktiviraju se nakon što je zadovoljen određeni uvjet. Na primjer, kada hotelske sobe nisu dostupne, izvršitelj može predložiti druge opcije.

Poveznice tipa switch-case - Usmjeravaju poruke različitim izvršiteljima na temelju definiranih uvjeta. Na primjer, ako putnički korisnik ima prioritetni pristup, njegovi zadaci će se obraditi kroz drugi tok rada.

Fan-out poveznice - Šalju jednu poruku na više odredišta.

Fan-in poveznice - Sakupljaju više poruka od različitih izvršitelja i šalju ih na jedno odredište.

Događaji

Za bolju observabilnost tokova rada, MAF nudi ugrađene događaje za izvođenje uključujući:

Napredni MAF obrasci

Gornji odjeljci pokrivaju ključne koncepte Microsoft Agent Frameworka. Kako budete gradili složenije agente, evo nekoliko naprednih obrazaca koje treba razmotriti:

Primjeri koda

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.

Imate li još pitanja o Microsoft Agent Frameworku?

Pridružite se Microsoft Foundry Discord kako biste se susreli s drugim učenicima, sudjelovali u radnim satima i dobili odgovore na pitanja o svojim AI agentima.


Odricanje odgovornosti: Ovaj dokument preveden je pomoću AI usluge za prevođenje Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na 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šne interpretacije koje proizlaze iz korištenja ovog prijevoda.