![]()
จนถึงจุดนี้ในคอร์ส คุณได้สร้างเอเจนต์ที่ทำงานบนแล็ปท็อปของคุณ ภายในโน้ตบุ๊ก ใช้ az login และตัวแปรสภาพแวดล้อมบางตัว นั่นคือวิธีที่ถูกต้องในการเรียนรู้ แต่มันไม่ใช่วิธีที่เหมาะสมในการรันเอเจนต์ที่ลูกค้านับพันขึ้นอยู่ด้วยในเวลา 3 โมงเช้า
บทเรียนนี้เกี่ยวกับช่องว่างระหว่าง “มันใช้งานได้บนเครื่องฉัน” กับ “มันใช้งานได้จริง อย่างเชื่อถือได้และคุ้มค่าในสภาพแวดล้อมการผลิต” เราปิดช่องว่างนั้นด้วย Microsoft Foundry และ Microsoft Foundry Agent Service โดยเราจะสร้างเอเจนต์สนับสนุนลูกค้าจริงที่มีเครื่องมือ การดึงข้อมูล ความจำ การประเมินผล และการติดตาม
บทเรียนนี้จะครอบคลุม:
หลังจากทำบทเรียนนี้เสร็จ คุณจะรู้วิธี:
บทเรียนนี้สมมติว่าคุณได้ทำบทเรียนก่อนหน้าและคุ้นเคยกับ:
คุณจะต้องมี:
az login)requirements.txtเอเจนต์ต้นแบบและเอเจนต์การผลิตใช้ลูปแกนเดียวกัน — การใช้เหตุผล, เรียกใช้เครื่องมือ, ตอบสนอง สิ่งที่เปลี่ยนไปคือทุกสิ่งที่อยู่รอบลูปนั้น โมเดลอาจเป็นเพียง 20% ของเอเจนต์ในการผลิต ส่วนอีก 80% คือโครงกระดูกการดำเนินงาน
| ความกังวล | ต้นแบบ | การผลิต |
|---|---|---|
| โฮสต์ | รันในโน้ตบุ๊กของคุณ | รันเป็นบริการโฮสต์, มีเวอร์ชัน และเผยแพร่ |
| ตัวตน | โทเค็น az login ของคุณ |
ตัวตนที่จัดการพร้อม RBAC ขอบเขตจำกัด |
| สถานะ | อยู่ในหน่วยความจำ สูญหายเมื่อรีสตาร์ท | เก็บข้อมูลภายนอก (เก็บกระทู้, บริการความจำ) |
| ข้อผิดพลาด | คุณเห็นแทรซแบ็ค | มีการลองใหม่, สำรองข้อมูล, อีเมลแจ้งเตือน, แจ้งเตือน |
| ค่าใช้จ่าย | “แค่ไม่กี่เซนต์” | ติดตามตามคำขอ, ส่งเส้นทาง, แคช, มีงบประมาณ |
| คุณภาพ | คุณตรวจสอบผลลัพธ์ | ประเมินอัตโนมัติก่อนปล่อยทุกครั้ง |
| ความน่าเชื่อถือ | คุณอนุมัติทุกการกระทำ | นโยบาย + มนุษย์ในกระบวนการสำหรับการกระทำเสี่ยง |
จดจำตารางนี้ไว้ ส่วนแต่ละส่วนด้านล่างจะเกี่ยวข้องกับแถวในตารางนี้
มีสามรูปแบบที่คุณจะใช้ มักใช้รวมกัน
วัตถุเอเจนต์จะอยู่ภายในกระบวนการแอปพลิเคชัน ของคุณ โค้ดของคุณเรียกโมเดลโดยตรง; ลูปเหตุผลทำงานในบริการของคุณ นี่คือสิ่งที่ทุกบทเรียนที่ผ่านมาได้ทำ
เอเจนต์ถูก ลงทะเบียนเป็นทรัพยากร ใน Microsoft Foundry Foundry โฮสต์ลูปเหตุผล เก็บข้อมูลกระทู้ บังคับใช้ความปลอดภัยของเนื้อหาและ RBAC และทำให้เอเจนต์มองเห็นได้ในพอร์ทัล Foundry แอปของคุณกลายเป็นไคลเอนต์บาง ๆ ที่สร้างกระทู้และอ่านการตอบสนอง
เอเจนต์หลายตัว (และเครื่องมือ) รวมกันเป็นกราฟที่มีการควบคุมการไหลชัดเจน — ขั้นตอนต่อเนื่อง, การแยกทางเลือก, โหนดอนุมัติจากมนุษย์, และจุดตรวจสอบทนทานที่สามารถหยุดและทำงานต่อได้ นี่คือความสามารถของ Microsoft Agent Framework Workflows ที่ใช้ในระดับการปรับใช้
flowchart TB
subgraph P1[Client-Hosted]
A1[Your App Process] --> M1[Model Provider]
end
subgraph P2[Hosted Agent]
A2[Thin Client] --> F2[Foundry Agent Service]
F2 --> M2[Model + Tools + Thread Store]
end
subgraph P3[Agent Workflow]
A3[Orchestrator] --> S1[Triage Agent]
S1 --> S2[Resolver Agent]
S2 --> H[Human Approval Node]
H --> S3[Action Agent]
end
การปรับใช้เอเจนต์ไม่ใช่การดำเนินการครั้งเดียว push แต่มันคือวัฏจักร และดูคล้ายกับวงจรการปล่อยซอฟต์แวร์เพราะนั่นคือสิ่งที่มันเป็น
flowchart LR
Create[Create / Author] --> Version[Version]
Version --> Evaluate[Evaluate offline]
Evaluate -->|passes gate| Deploy[Deploy hosted]
Evaluate -->|fails gate| Create
Deploy --> Observe[Observe online]
Observe --> Improve[Collect failures]
Improve --> Create
Deploy --> Retire[Retire old version]
ไอเดียสำคัญที่นำมาจาก บทเรียน 10: การประเมินผลแบบออฟไลน์คือประตู ไม่ใช่ของหลังความคิด เวอร์ชันใหม่ของเอเจนต์จะไม่ปล่อยเว้นแต่ว่าจะผ่านเกณฑ์การประเมินของคุณ การสังเกตการณ์ออนไลน์จะป้อนข้อผิดพลาดในโลกจริงกลับเข้าสู่ชุดทดสอบออฟไลน์ของคุณ นั่นคือวงจรทั้งหมด
การปรับขนาดเอเจนต์แตกต่างจากการปรับขนาดเว็บ API แบบไร้สถานะ เพราะแต่ละคำขออาจกระตุ้นให้เกิดการเรียกโมเดลและเครื่องมือที่มีค่าใช้จ่ายสูงหลายครั้ง สี่เทคนิคหลักรับภาระส่วนใหญ่
การจัดการคำขอแบบไร้สถานะ อย่าเก็บสถานะต่อผู้ใช้ในหน่วยความจำของกระบวนการ ให้เก็บกระทู้สนทนาในที่เก็บกระทู้ของ Foundry หรือบริการความจำ เพื่อให้อินสแตนซ์ใดก็ได้สามารถจัดการคำขอได้ นี่คือสิ่งที่ทำให้คุณปรับขนาดในแนวนอนได้ — เพิ่มอินสแตนซ์โดยไม่ต้องมีเซสชันที่ติดหนึบ
การส่งเส้นทางโมเดล ไม่ใช่ทุกคำขอต้องใช้โมเดลที่มีประสิทธิภาพที่สุด (และแพงที่สุด) ส่งคำขอที่ง่าย — การจำแนกเจตนา ตอบคำถามข้อเท็จจริงสั้น ๆ — ไปยังโมเดลเล็กและรวดเร็ว และสงวนโมเดลใหญ่ไว้สำหรับการใช้เหตุผลจริง ๆ Foundry’s Model Router สามารถทำสิ่งนี้ให้คุณ หรือคุณสามารถสร้างตัวจำแนกน้ำหนักเบาเอง คุณจะสร้างเวอร์ชัน DIY ในห้องปฏิบัติการ
การแคชการตอบกลับ คำถามสนับสนุนหลายคำถามเป็นคำถามซ้ำ (“ฉันจะรีเซ็ตรหัสผ่านได้อย่างไร?”) แคชคำตอบสำหรับคำถามที่พบบ่อยและให้คำตอบโดยไม่ต้องเรียกใช้โมเดลเลยแม้แต่น้อย แม้แต่การแคชที่ถือว่าไม่มากก็ช่วยลดค่าใช้จ่ายและความล่าช้าได้อย่างมีนัยสำคัญ
ความขนานและแรงกดดันย้อนกลับ ผู้ให้บริการโมเดลมีข้อจำกัดอัตราการเรียก คืนค่า concurrency ของคุณ ใช้การลองใหม่แบบ Backoff แบบทวีคูณ และล้มเหลวอย่างนุ่มนวล (การตอบสนองคิวแบบ “เรากำลังดำเนินการ” ดีกว่าข้อผิดพลาด 500)
flowchart LR
Q[User query] --> C{Cache hit?}
C -->|yes| R[Return cached answer]
C -->|no| Router{Complexity?}
Router -->|simple| SLM[Small model]
Router -->|complex| LLM[Large model]
SLM --> Out[Response]
LLM --> Out
Out --> Store[Cache + trace]
คุณไม่สามารถดำเนินการสิ่งที่คุณมองไม่เห็น ดังที่อธิบายในบทเรียน 10 Microsoft Agent Framework ส่งออก OpenTelemetry traces โดยตรง — ทุกการเรียกโมเดล เรียกใช้เครื่องมือ และขั้นตอนการจัดการกลายเป็น span ในสภาพแวดล้อมการผลิต คุณส่งออก spans เหล่านั้นไปยัง Microsoft Foundry (หรือแบ็คเอนด์ที่รองรับ OTel ใด ๆ) เพื่อที่คุณจะได้:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# agent execution is traced automatically inside this span
คุณลักษณะเช่น customer.tier และ routed.model คือสิ่งที่เปลี่ยนแผงของ traces ให้กลายเป็นคำถามที่ตอบได้ (“ลูกค้าองค์กรถูกส่งไปโมเดลเล็กบ่อยเกินไปหรือไม่?”)
ค่าใช้จ่ายในเอเจนต์การผลิตถูกครอบงำด้วยโทเค็น มีสามคันโยก ตามลำดับผลกระทบ:
ประตูการประเมินและการควบคุมค่าใช้จ่ายคือระเบียบวินัยเดียวกันที่มองจากสองมุม: การประเมินบอกคุณถึง พื้นคุณภาพ การส่งเส้นทางและการแคชช่วยให้คุณรักษาค่าใช้จ่ายให้อยู่ใกล้จุด ต่ำสุด นั้น
การกำกับดูแล Hosted Agents สืบทอด RBAC, ความปลอดภัยของเนื้อหา และการบันทึกการตรวจสอบของ Foundry มอบตัวตนที่จัดการให้เอเจนต์แต่ละตัว ด้วยสิทธิ์น้อยที่สุดที่ต้องการ — อ่านฐานความรู้ได้อย่างเดียว เข้าถึง API ตั๋วได้ในขอบเขตที่กำหนด ไม่เกินกว่านี้
มนุษย์ในวงจร การกระทำบางอย่างมีความสำคัญมากเกินกว่าที่จะทำแบบอัตโนมัติโดยตรง — การคืนเงิน การลบบัญชี การยกระดับไปยังทีมกฎหมาย Microsoft Agent Framework รองรับเครื่องมือที่ต้อง อนุมัติ: เอเจนต์เสนอการกระทำ หยุดการดำเนินการ รอการอนุมัติหรือปฏิเสธจากมนุษย์ แล้วกระบวนงานดำเนินต่อ คุณเห็นสิ่งนี้เป็นพื้นฐานใน บทเรียน 6; ที่นี่คุณปรับใช้มัน
MCP ในการผลิต MCP ช่วยให้เอเจนต์ของคุณใช้เครื่องมือภายนอกผ่านอินเทอร์เฟซมาตรฐาน ในการผลิต ให้ถือว่าเซิร์ฟเวอร์ MCP ทุกเครื่องเป็นขอบเขตที่ไม่เชื่อถือ: กำหนดเวอร์ชันเซิร์ฟเวอร์ รันด้วยตัวตนที่มีขอบเขตจำกัด ตรวจสอบผลลัพธ์ และอย่าเปิดเผยความลับให้กับมัน เซิร์ฟเวอร์ MCP เป็นการพึ่งพิง และการพึ่งพาได้รับการแพทช์ ตรวจสอบ และจำกัดอัตรา
flowchart TB
subgraph Dev[Development Architecture]
D1[Notebook] --> D2[Agent Framework]
D2 --> D3[Model Provider]
D2 --> D4[Local tools]
end
subgraph Deploy[Deployment Architecture]
E1[CI pipeline] --> E2[Evaluation gate]
E2 -->|pass| E3[Foundry Agent Service]
E3 --> E4[Versioned hosted agent]
end
subgraph Run[Runtime Architecture]
F1[Client app] --> F2[Hosted agent]
F2 --> F3[Model Router]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Memory service]
F2 --> F6[MCP tools]
F2 --> F7[OTel -> Foundry tracing]
F2 --> F8[Human approval]
end
แผนภาพสามอันนั้น — การพัฒนา การปรับใช้ และการรันไทม์ — คือเอเจนต์เดียวกันในสามขั้นตอนของชีวิต ห้องปฏิบัติการต่อไปจะพาคุณสร้างมัน
เปิด code_samples/16-python-agent-framework.ipynb และทำตามตั้งแต่ต้นจนจบ คุณจะประกอบ เอเจนต์สนับสนุนลูกค้า Contoso ที่มีข้อกังวลในการผลิตทุกอย่างเชื่อมโยง:
โน้ตบุ๊กถูกจัดอย่างเป็นระเบียบโดยแต่ละข้อกังวลในสภาพแวดล้อมการผลิตจะเป็นส่วนที่รันได้แยกกัน ใจกลางคือผู้จัดการคำขอที่รวมการส่งเส้นทางและแคช:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Serve from cache when we can.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Route by complexity to control cost.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Run the agent inside a trace span for observability.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Cache and return.
response_cache.set(normalize(query), response.text)
return response.text
ประตูประเมินที่ปกป้องการปล่อยเวอร์ชันดูเหมือนนี้:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # only deploy if the gate passes
อ่านทุกบรรทัด — โน้ตบุ๊กทำให้โครงสร้างพื้นฐานเล็กจงใจเพื่อให้ไม่มีอะไรซ่อนอยู่หลังการเรียกใช้เฟรมเวิร์ก
ประตูการประเมินข้างต้นทำงาน แบบออฟไลน์ กับวัตถุเอเจนต์ของคุณ เมื่อเอเจนต์ปรับใช้เป็น Hosted Agent คุณยังต้องการการตรวจสอบที่ถูกกว่าหนึ่งอย่าง: จุดปลายที่ปรับใช้จริงตอบสนองไหม?
การปรับใช้ “สำเร็จ” เพียงพิสูจน์ว่าแพลนควบคุมรับนิยาม แต่ไม่พิสูจน์ว่าเอเจนต์ตอบสนอง การขาดการพึ่งพิง การส่งเส้นทางโมเดลผิดพลาด หรือการเชื่อมต่อหมดอายุ อาจทำให้เกิดการปรับใช้สีเขียวที่ไม่คืนค่าอะไร การ ทดสอบ smoke ตรวจจับสิ่งนั้นในไม่กี่วินาที ทุกการปรับใช้ โดยไม่มีค่าใช้จ่ายเท่ากับการประเมินเต็มรูปแบบ
รีโพสิตอรีนี้มีสายงานทดสอบ smoke ที่พร้อมใช้สร้างบน AI Smoke Test GitHub Action:
tests/lesson-16-smoke-tests.json มีพรอมต์และสมมุติฐานสำหรับเอเจนต์สนับสนุน Contoso (คำตอบนโยบายที่ยืนยันฐานความรู้, การค้นหาคำสั่งซื้อ, อยู่ในหัวข้อ และความต่อเนื่องของกระทู้หลายรอบ) แคตตาล็อกสำหรับเอเจนต์บทเรียนอื่น ๆ อยู่ข้างๆ ดู tests/README.md.github/workflows/smoke-test.yml เข้าสู่ระบบด้วย Azure OIDC และ POST ทุกพรอมต์ไปยังจุดตอบสนองของเอเจนต์ หากไม่ผ่านสมมุติฐานใดงานจะล้มเหลว- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
รันจากแท็บ Actions เมื่อเอเจนท์ของคุณถูกติดตั้งแล้ว โดยระบุจุดเชื่อมต่อโปรเจกต์ Foundry และชื่อเอเจนท์ของคุณ ตัวตนแบบ federated ต้องมีบทบาท Azure AI User ในขอบเขตโปรเจกต์ Foundry คิดถึงเลเยอร์เป็นรูปปิรามิด: การทดสอบควัน (เข้าถึงและตอบสนองได้ไหม?) ถูกรันทุกครั้งที่ติดตั้งใหม่, การประเมินแบบออฟไลน์ (ดีพอที่จะส่งมอบไหม?) รันก่อนการโปรโมต, และการประเมินออนไลน์ (ทำงานได้ดีแค่ไหนในสภาพแวดล้อมจริง?) รันอย่างต่อเนื่อง
ทดสอบความเข้าใจก่อนที่จะไปยังงานมอบหมาย
1. โดยประมาณแล้วเอเจนท์ที่ใช้งานจริงมีสัดส่วนเท่าไหร่ที่เป็น “โมเดล” และส่วนที่เหลือคืออะไร?
2. เมื่อไรที่คุณเลือกใช้ Hosted Agent แทนเอเจนท์ที่โฮสต์บนไคลเอนต์?
3. ทำไมเอเจนท์ที่ขยายตัวได้ต้องไม่มีสถานะในหน่วยความจำของกระบวนการของตัวเอง?
4. การกำหนดเส้นทางโมเดลแก้ไขปัญหาอะไร และเกี่ยวข้องกับการประเมินผลอย่างไร?
5. “เกตการประเมิน” คืออะไร และอยู่ในช่วงใดของวงจรชีวิต?
6. ทำไมเซิร์ฟเวอร์ MCP ต้องถูกปฏิบัติเหมือนเป็นขอบเขตที่ไม่เชื่อถือได้ในสภาพแวดล้อมการผลิต?
7. การเปลี่ยนแปลงอย่างเดียวที่มักมีผลกระทบมากที่สุดต่อค่าใช้จ่ายของเอเจนท์ที่ใช้งานจริงคืออะไร และทำไม?
8. แอตทริบิวต์ของสแปนเช่น customer.tier และ routed.model มีบทบาทอย่างไรในด้านการสังเกตการณ์?
นำเอเจนท์สนับสนุนลูกค้าจากห้องทดลองมาเสริมความแข็งแกร่งสำหรับสถานการณ์เฉพาะ: เอเจนท์สนับสนุนบิลค่าสมาชิกสำหรับบริษัท SaaS
การส่งของคุณควร:
get_subscription_status, get_invoice, และ issue_credit (เครดิตมากกว่า $50 ต้องได้รับการอนุมัติจากมนุษย์)เขียนย่อหน้าเล็ก ๆ (ในเซลล์มาร์กดาวน์) อธิบายว่าเลือกกฎการกำหนดเส้นทางโมเดลใดและวิธีที่คุณจะยืนยันกับทราฟฟิกจริง ไม่มีคำตอบที่ถูกต้องเดียว — คุณจะถูกประเมินว่ากังวลเรื่องการผลิตถูกเชื่อมโยงกันอย่างสอดคล้องหรือไม่
ในบทเรียนนี้คุณได้ย้ายเอเจนท์จากต้นแบบไปสู่การผลิตด้วย Microsoft Foundry:
บทเรียนถัดไปจะเดินทางย้อนกลับ: แทนที่จะขยายเอเจนท์ขึ้นในคลาวด์ คุณจะนำพวกมัน ลง บนเครื่องนักพัฒนาคนเดียวและรันทั้งหมดในเครื่องแบบโลคัล
Building Computer Use Agents (CUA)
ปฏิเสธความรับผิดชอบ: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้