![]()
Bài học này sẽ bao gồm:
Sau khi hoàn thành bài học này, bạn sẽ biết cách:
Mẫu mã nguồn cho Microsoft Agent Framework (MAF) có thể được tìm thấy trong kho lưu trữ này dưới các tệp xx-python-agent-framework và xx-dotnet-agent-framework.

Microsoft Agent Framework (MAF) là framework thống nhất của Microsoft để xây dựng các AI agent. Nó cung cấp sự linh hoạt để giải quyết nhiều trường hợp sử dụng agentic đa dạng được thấy trong môi trường sản xuất và nghiên cứu bao gồm:
Để triển khai AI Agents trong Sản xuất, MAF cũng bao gồm các tính năng cho:
Microsoft Agent Framework cũng tập trung vào tính khả chuyển bằng cách:
Hãy cùng xem cách các tính năng này được áp dụng vào một số khái niệm cốt lõi của Microsoft Agent Framework.

Tạo Agents
Việc tạo agent được thực hiện bằng cách định nghĩa dịch vụ suy luận (Nhà cung cấp LLM), một
bộ hướng dẫn cho AI Agent tuân theo, và một name được gán:
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).create_agent( instructions="You are good at recommending trips to customers based on their preferences.", name="TripRecommender" )
Phía trên sử dụng Azure OpenAI nhưng agent có thể được tạo bằng nhiều dịch vụ khác bao gồm 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.", )
hoặc MiniMax, cung cấp API tương thích OpenAI với cửa sổ ngữ cảnh lớn (lên đến 204K tokens):
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.", )
hoặc agents từ xa sử dụng giao thức A2A:
agent = A2AAgent( name=agent_card.name, description=agent_card.description, agent_card=agent_card, url="https://your-a2a-agent-host" )
Chạy Agents
Agents được chạy bằng các phương thức .run hoặc .run_stream dành cho phản hồi không streaming hoặc streaming.
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)
Mỗi lần chạy agent cũng có thể gồm các tùy chọn để tùy chỉnh các tham số như max_tokens được agent sử dụng, tools mà agent có thể gọi, và thậm chí model dùng cho agent.
Điều này hữu ích trong các trường hợp cần sử dụng các mô hình hoặc công cụ cụ thể để hoàn thành nhiệm vụ của người dùng.
Công cụ (Tools)
Công cụ có thể được định nghĩa khi định nghĩa agent:
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."
# Khi tạo một ChatAgent trực tiếp
agent = ChatAgent( chat_client=OpenAIChatClient(), instructions="You are a helpful assistant", tools=[get_attractions]
và cũng khi chạy agent:
result1 = await agent.run( "What's the best place to visit in Seattle?", tools=[get_attractions] # Công cụ chỉ được cung cấp cho lần chạy này )
Luồng Agent (Agent Threads)
Luồng Agent được dùng để xử lý các cuộc hội thoại nhiều lượt. Luồng có thể được tạo bằng cách:
get_new_thread() cho phép luồng được lưu trữ theo thời gianĐể tạo luồng, mã nguồn như sau:
# Tạo một luồng mới.
thread = agent.get_new_thread() # Chạy đại lý với luồng.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Bạn có thể tuần tự hóa luồng để lưu trữ dùng sau:
# Tạo một luồng mới.
thread = agent.get_new_thread()
# Chạy đại lý với luồng.
response = await agent.run("Hello, how are you?", thread=thread)
# Tuần tự hóa luồng để lưu trữ.
serialized_thread = await thread.serialize()
# Giải tuần tự trạng thái luồng sau khi tải từ lưu trữ.
resumed_thread = await agent.deserialize_thread(serialized_thread)
Middleware của Agent
Agents tương tác với công cụ và LLM để hoàn thành nhiệm vụ người dùng. Trong một số trường hợp, chúng ta muốn thực thi hoặc theo dõi giữa các tương tác này. Middleware của Agent cho phép làm điều này thông qua:
Middleware Hàm
Middleware này cho phép thực thi một hành động giữa agent và một hàm/công cụ mà nó sẽ gọi. Một ví dụ khi dùng middleware này là khi bạn muốn ghi lại nhật ký các cuộc gọi hàm.
Trong mã dưới đây next xác định middleware tiếp theo hoặc hàm thực tế nên được gọi.
async def logging_function_middleware(
context: FunctionInvocationContext,
next: Callable[[FunctionInvocationContext], Awaitable[None]],
) -> None:
"""Function middleware that logs function execution."""
# Tiền xử lý: Ghi nhật ký trước khi thực thi hàm
print(f"[Function] Calling {context.function.name}")
# Tiếp tục tới middleware hoặc thực thi hàm tiếp theo
await next(context)
# Hậu xử lý: Ghi nhật ký sau khi thực thi hàm
print(f"[Function] {context.function.name} completed")
Middleware Chat
Middleware này cho phép thực thi hoặc ghi lại một hành động giữa agent và các yêu cầu giữa LLM.
Điều này chứa thông tin quan trọng như messages được gửi tới dịch vụ AI.
async def logging_chat_middleware(
context: ChatContext,
next: Callable[[ChatContext], Awaitable[None]],
) -> None:
"""Chat middleware that logs AI interactions."""
# Tiền xử lý: Ghi nhật ký trước khi gọi AI
print(f"[Chat] Sending {len(context.messages)} messages to AI")
# Tiếp tục đến middleware hoặc dịch vụ AI tiếp theo
await next(context)
# Hậu xử lý: Ghi nhật ký sau khi nhận phản hồi từ AI
print("[Chat] AI response received")
Bộ nhớ của Agent
Như đã đề cập trong bài học Agentic Memory, bộ nhớ là yếu tố quan trọng để agent hoạt động trên các ngữ cảnh khác nhau. MAF cung cấp nhiều loại bộ nhớ khác nhau:
Bộ nhớ trong luồng (In-Memory Storage)
Đây là bộ nhớ được lưu trong các luồng trong thời gian chạy ứng dụng.
# Tạo một luồng mới.
thread = agent.get_new_thread() # Chạy tác nhân với luồng.
response = await agent.run("Hello, I am here to help you book travel. Where would you like to go?", thread=thread)
Tin nhắn lâu dài (Persistent Messages)
Bộ nhớ này dùng để lưu lịch sử hội thoại qua các phiên khác nhau. Nó được định nghĩa bằng chat_message_store_factory:
from agent_framework import ChatMessageStore
# Tạo một kho lưu trữ tin nhắn tùy chỉnh
def create_message_store():
return ChatMessageStore()
agent = ChatAgent(
chat_client=OpenAIChatClient(),
instructions="You are a Travel assistant.",
chat_message_store_factory=create_message_store
)
Bộ nhớ động (Dynamic Memory)
Bộ nhớ này được thêm vào ngữ cảnh trước khi agent được chạy. Những bộ nhớ này có thể lưu trong dịch vụ bên ngoài như mem0:
from agent_framework.mem0 import Mem0Provider
# Sử dụng Mem0 cho các khả năng bộ nhớ nâng cao
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
)
Khả năng quan sát của Agent
Khả năng quan sát rất quan trọng để xây dựng các hệ thống agentic đáng tin cậy và dễ bảo trì. MAF tích hợp với OpenTelemetry để cung cấp tracing và meters cho khả năng quan sát tốt hơn.
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# làm gì đó
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
MAF cung cấp các quy trình làm việc là các bước được định nghĩa trước để hoàn thành một nhiệm vụ và có các agent AI như thành phần trong các bước đó.
Quy trình làm việc bao gồm các thành phần khác nhau cho phép kiểm soát luồng tốt hơn. Quy trình làm việc cũng hỗ trợ điều phối đa agent và kiểm điểm (checkpointing) để lưu trạng thái quy trình.
Các thành phần chính của quy trình làm việc bao gồm:
Executor
Executor nhận các thông điệp đầu vào, thực hiện nhiệm vụ được giao, và sau đó tạo ra một thông điệp đầu ra. Điều này đẩy quy trình về phía hoàn thành nhiệm vụ lớn hơn. Executor có thể là agent AI hoặc logic tùy chỉnh.
Edges
Edges dùng để định nghĩa luồng thông điệp trong quy trình làm việc. Các loại edges gồm:
Edges trực tiếp - Kết nối đơn giản một-một giữa các executor:
from agent_framework import WorkflowBuilder
builder = WorkflowBuilder()
builder.add_edge(source_executor, target_executor)
builder.set_start_executor(source_executor)
workflow = builder.build()
Edges có điều kiện - Kích hoạt khi một điều kiện nào đó được đáp ứng. Ví dụ, khi phòng khách sạn không còn, executor có thể đề xuất các lựa chọn khác.
Edges chuyển đổi theo điều kiện (Switch-case) - Định tuyến thông điệp đến các executor khác nhau dựa trên các điều kiện đã định nghĩa. Ví dụ, nếu khách du lịch có quyền truy cập ưu tiên, nhiệm vụ của họ sẽ được xử lý qua một quy trình làm việc khác.
Edges phân nhánh ra (Fan-out) - Gửi một thông điệp tới nhiều mục tiêu.
Edges tập hợp vào (Fan-in) - Thu thập nhiều thông điệp từ các executor khác nhau và gửi đến một mục tiêu.
Sự kiện (Events)
Để cung cấp khả năng quan sát tốt hơn vào các quy trình, MAF cung cấp các sự kiện tích hợp sẵn cho việc thực thi bao gồm:
WorkflowStartedEvent - Bắt đầu thực thi quy trình làm việcWorkflowOutputEvent - Quy trình làm việc tạo ra đầu raWorkflowErrorEvent - Quy trình làm việc gặp lỗiExecutorInvokeEvent - Executor bắt đầu xử lýExecutorCompleteEvent - Executor hoàn thành xử lýRequestInfoEvent - Một yêu cầu được phát hànhPhần trên đã bao gồm các khái niệm chính của Microsoft Agent Framework. Khi bạn xây dựng các agent phức tạp hơn, đây là một số mẫu nâng cao nên xem xét:
Mẫu mã nguồn cho Microsoft Agent Framework có thể được tìm thấy trong kho lưu trữ này dưới các tệp xx-python-agent-framework và xx-dotnet-agent-framework.
Tham gia Microsoft Foundry Discord để gặp gỡ các học viên khác, tham dự giờ hành chính và nhận câu trả lời cho các câu hỏi về AI Agents.
Tuyên bố từ chối trách nhiệm:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI Co-op Translator. Mặc dù chúng tôi nỗ lực đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc thiếu sót. Văn bản gốc bằng ngôn ngữ gốc nên được coi là nguồn chính xác và uy tín. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp do con người thực hiện. Chúng tôi không chịu trách nhiệm đối với bất kỳ sự hiểu nhầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.