![]()
จนถึงตอนนี้ในหลักสูตร คุณได้สร้างตัวแทนที่ทำงานบนแล็ปท็อปของคุณ ภายในโน้ตบุ๊ก โดยใช้ az login และตัวแปรแวดล้อมจำนวนหนึ่ง นั่นคือวิธีที่ถูกต้องในการเรียนรู้ แต่มันไม่ใช่วิธีที่ถูกต้องในการรันตัวแทนที่ลูกค้านับพันรายต้องพึ่งพาในเวลา 3 นาฬิกาตี
บทเรียนนี้เกี่ยวกับช่องว่างระหว่าง “มันทำงานบนเครื่องของฉัน” และ “มันทำงานได้อย่างน่าเชื่อถือและประหยัดในระบบจริง” เราจะปิดช่องว่างนี้โดยใช้ Microsoft Foundry และ Microsoft Foundry Agent Service และเราจะทำโดยการสร้างตัวแทนสนับสนุนลูกค้าจริงที่มีเครื่องมือ การดึงข้อมูล ความจำ การประเมินผล และการตรวจสอบ
บทเรียนนี้จะครอบคลุม:
หลังจากทำบทเรียนนี้เสร็จแล้ว คุณจะรู้วิธี:
บทเรียนนี้สมมุติว่าคุณได้ทำบทเรียนก่อนหน้าและคุ้นเคยกับ:
คุณจะต้องมีเพิ่มเติม:
az login)requirements.txtตัวแทนต้นแบบและตัวแทนผลิตใช้ลูปหลักเดียวกัน — การวิเคราะห์เหตุผล, เรียกใช้เครื่องมือ, ตอบสนอง สิ่งที่เปลี่ยนคือทุกอย่างที่ห่อหุ้มรอบลูปนั้น โมเดลอาจเป็นเพียง 20% ของตัวแทนในระบบผลิต; อีก 80% ที่เหลือคือโครงกระดูกเชิงปฏิบัติการ
| ความกังวล | ตัวต้นแบบ | ระบบผลิต |
|---|---|---|
| โฮสติ้ง | รันในโน้ตบุ๊กของคุณ | รันเป็นบริการโฮสต์ มีเวอร์ชันและเปิดตัว |
| ตัวตน | โทเค็น az login ของคุณ |
ตัวตนที่จัดการด้วย RBAC แบบขอบเขต |
| สถานะ | อยู่ในหน่วยความจำ, หายเมื่อรีสตาร์ท | จัดเก็บภายนอก (คลังเธรด, บริการความจำ) |
| ความล้มเหลว | คุณเห็น traceback | ลองใหม่, เส้นทางสำรอง, จดบันทึกจดหมายล้มเหลว, แจ้งเตือน |
| ค่าใช้จ่าย | “ไม่กี่เซนต์” | ติดตามตามคำขอ, กำหนดเส้นทาง, แคช, กำหนดงบประมาณ |
| คุณภาพ | คุณตรวจสอบผลลัพธ์ด้วยตา | ประเมินอัตโนมัติก่อนการปล่อยทุกครั้ง |
| ความน่าเชื่อถือ | คุณอนุมัติทุกการกระทำ | นโยบาย + มนุษย์ในวงจรสำหรับการกระทำที่มีความเสี่ยง |
จำตารางนี้ไว้ในใจ ส่วนต่าง ๆ ด้านล่างจะสอดคล้องกับแถวในตารางนี้
มีสามรูปแบบที่คุณจะใช้บ่อยครั้งพร้อมกัน
วัตถุตัวแทนอยู่ภายในกระบวนการแอปพลิเคชัน ของคุณ โค้ดของคุณเรียกผู้ให้บริการโมเดลโดยตรง; ลูปวิเคราะห์เหตุผลรันในบริการของคุณ นี่คือสิ่งที่บทเรียนที่ผ่านมาแต่ละบทเรียนได้ทำ
ตัวแทนถูก ลงทะเบียนเป็นทรัพยากร ใน Microsoft Foundry Foundry โฮสต์ลูปวิเคราะห์เหตุผล, จัดเก็บเธรด, บังคับใช้ความปลอดภัยของเนื้อหาและ RBAC, และทำให้ตัวแทนมองเห็นได้ในพอร์ทัล Foundry แอปของคุณจะกลายเป็นไคลเอ็นต์บาง ๆ ที่สร้างเธรดและอ่านการตอบสนอง
ตัวแทนหลายตัว (และเครื่องมือ) ถูกรวบรวมเป็นกราฟที่มีการควบคุมการไหลอย่างชัดเจน — ขั้นตอนตามลำดับ, การแยกสาขา, โหนดอนุมัติของมนุษย์, และจุดตรวจสอบที่ทนทานซึ่งสามารถหยุดชั่วคราวและทำงานต่อได้ นี่คือความสามารถเวิร์กโฟลว์ของ Microsoft Agent Framework ที่ใช้ในระดับการปรับใช้
flowchart TB
subgraph P1[โฮสต์โดยลูกค้า]
A1[กระบวนการแอปของคุณ] --> M1[ผู้ให้บริการแบบจำลอง]
end
subgraph P2[ตัวแทนโฮสต์]
A2[ไคลเอนต์บางเบา] --> F2[บริการตัวแทน Foundry]
F2 --> M2[แบบจำลอง + เครื่องมือ + ร้านสเกลความคิด]
end
subgraph P3[กระบวนการทำงานของตัวแทน]
A3[ผู้จัดการการทำงาน] --> S1[ตัวแทนคัดกรอง]
S1 --> S2[ตัวแทนแก้ไขปัญหา]
S2 --> H[โหนดอนุมัติของมนุษย์]
H --> S3[ตัวแทนปฏิบัติการ]
end
การปรับใช้ตัวแทนไม่ใช่การ push ครั้งเดียว มันเป็นลูป และดูคล้ายกับวงจรการปล่อยซอฟต์แวร์เพราะมันก็คือลักษณะนั้นจริง ๆ
flowchart LR
Create[สร้าง / ผู้เขียน] --> Version[รุ่น]
Version --> Evaluate[ประเมินผลแบบออฟไลน์]
Evaluate -->|ผ่านเกต| Deploy[การปรับใช้แบบโฮสต์]
Evaluate -->|ไม่ผ่านเกต| Create
Deploy --> Observe[สังเกตออนไลน์]
Observe --> Improve[รวบรวมข้อผิดพลาด]
Improve --> Create
Deploy --> Retire[ยกเลิกรุ่นเก่า]
แนวคิดหลักที่นำมาจาก บทเรียน 10 คือ: การประเมินแบบออฟไลน์เป็นเกต ไม่ใช่สิ่งที่คิดไว้ทีหลัง เวอร์ชันตัวแทนใหม่จะไม่ปล่อยเว้นแต่ว่าจะผ่านเกณฑ์การประเมินของคุณ การสังเกตแบบออนไลน์จากนั้นจะป้อนข้อมูลความล้มเหลวในโลกจริงกลับเข้าไปในชุดทดสอบออฟไลน์ นั่นคือลูปทั้งหมด
การปรับขนาดตัวแทนแตกต่างจากการปรับขนาดเว็บ API แบบไร้สถานะ เพราะแต่ละคำขอสามารถกระตุ้นการเรียกโมเดลและเครื่องมือที่มีราคาสูงหลายครั้ง สี่เทคนิคนี้รับภาระส่วนใหญ่
การจัดการคำขอแบบไร้สถานะ อย่ารักษาสถานะผู้ใช้รายบุคคลในหน่วยความจำของกระบวนการของคุณ ให้เก็บรักษาเธรดการสนทนาในคลังเธรด Foundry หรือบริการความจำเพื่อให้ตัวอย่างใด ๆ สามารถรองรับคำขอใด ๆ ได้ นี่คือสิ่งที่ช่วยให้ปรับขนาดในแนวนอน — เพิ่มตัวอย่างได้ ไม่มีเซสชันที่ผูกติดกัน
การกำหนดเส้นทางโมเดล ไม่ใช่ทุกคำขอจำเป็นต้องใช้โมเดลที่มีความสามารถสูงสุด (และราคาแพงที่สุด) กำหนดเส้นทางคำขอที่ง่าย — การจัดหมวดหมู่เจตนา, คำตอบข้อเท็จจริงสั้น ๆ — ไปยังโมเดลเล็กที่เร็ว และสงวนโมเดลใหญ่ไว้สำหรับการวิเคราะห์เหตุผลที่แท้จริง Model Router ของ Foundry สามารถทำสิ่งนี้ให้คุณ หรือคุณสามารถสร้างตัวจัดหมวดหมู่เบา ๆ เอง คุณจะสร้างเวอร์ชัน DIY ในห้องปฏิบัติการ
การแคชการตอบสนอง หลายคำถามสนับสนุนเป็นคำถามซ้ำ (“ฉันจะรีเซ็ตรหัสผ่านได้อย่างไร?”) แคชคำตอบสำหรับคำถามทั่วไปและให้บริการโดยไม่ต้องเรียกโมเดลเลย อัตราการแคชที่แม้จะพอดีสามารถลดค่าใช้จ่ายและความหน่วงได้อย่างมีนัยสำคัญ
ความพร้อมกันและแรงดันกลับ ผู้ให้บริการโมเดลมีข้อจำกัดอัตราการเข้าถึง จำกัดความพร้อมกันของคุณ ใช้การลองใหม่พร้อมการหยุดแบบทวีคูณ และล้มเหลวอย่างเรียบร้อย (การตอบสนอง “เรากำลังดำเนินการ” ในคิวดีกว่าการตอบ 500)
flowchart LR
Q[คำค้นของผู้ใช้] --> C{ถูกแคชหรือไม่?}
C -->|ใช่| R[คืนคำตอบจากแคช]
C -->|ไม่| Router{ความซับซ้อน?}
Router -->|ง่าย| SLM[โมเดลขนาดเล็ก]
Router -->|ซับซ้อน| LLM[โมเดลขนาดใหญ่]
SLM --> Out[การตอบกลับ]
LLM --> Out
Out --> Store[แคช + ติดตามการณ์]
คุณไม่สามารถดำเนินการในสิ่งที่คุณไม่เห็น ตามที่ครอบคลุมในบทเรียน 10, Microsoft Agent Framework ปล่อย OpenTelemetry trace ในตัว — ทุกการเรียกโมเดล, การเรียกเครื่องมือ, และขั้นตอนการจัดลำดับงานกลายเป็น span ในสภาพแวดล้อมจริง คุณส่งออก span เหล่านั้นไปยัง 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")
# การดำเนินการของเอเย่นต์จะถูกติดตามโดยอัตโนมัติภายในช่วงเวลานี้
คุณสมบัติเช่น customer.tier และ routed.model คือสิ่งที่เปลี่ยนผนังของ traces ให้กลายเป็นคำถามที่ตอบได้ (“ลูกค้าองค์กรถูกกำหนดเส้นทางไปยังโมเดลเล็กบ่อยเกินไปหรือไม่?”)
ค่าใช้จ่ายในตัวแทนผลิตถูกครอบงำโดยโทเค็น สามคันโยก ตามลำดับผลกระทบ:
เกตการประเมินและการควบคุมค่าใช้จ่ายเป็นวินัยเดียวกันที่มองจากสองมุม: การประเมินบอกคุณถึง คุณภาพพื้นฐาน, การกำหนดเส้นทางและการแคชช่วยให้คุณอยู่ใกล้กับ ต้นทุน ของพื้นฐานนั้นให้มากที่สุด
การกำกับดูแล Hosted Agents สืบทอด RBAC, ความปลอดภัยเนื้อหา, และการบันทึกการตรวจสอบของ Foundry ให้แต่ละตัวแทนมีตัวตนที่จัดการซึ่งได้รับสิทธิ์น้อยที่สุดที่ต้องการ — การเข้าถึงฐานความรู้แบบอ่านอย่างเดียว, การเข้าถึง API การจัดการตั๋วแบบกำหนดขอบเขต, ไม่เกินนั้น
มนุษย์ในวงจร การกระทำบางอย่างมีผลกระทบมากเกินไปที่จะทำอัตโนมัติทั้งหมด — การคืนเงิน, การลบบัญชี, การยกระดับไปยังทีมกฎหมาย Microsoft Agent Framework รองรับเครื่องมือแบบ ต้องการอนุมัติ: ตัวแทนเสนอการดำเนินการ, การดำเนินการหยุดชั่วคราว, มนุษย์อนุมัติหรือปฏิเสธ, และเวิร์กโฟลว์ทำงานต่อ คุณเคยเห็น primitive ใน บทเรียน 6; ที่นี่คุณจะปรับใช้
MCP ในสภาพแวดล้อมจริง MCP อนุญาตให้ตัวแทนของคุณใช้เครื่องมือภายนอกผ่านอินเทอร์เฟซมาตรฐาน ในการผลิต ให้ถือว่าเซิร์ฟเวอร์ MCP ทุกเครื่องเป็นขอบเขตที่ไม่มีความน่าเชื่อถือ: หมุดเวอร์ชันเซิร์ฟเวอร์, รันด้วยตัวตนที่กำหนดขอบเขต, ตรวจสอบผลลัพธ์, และอย่าเปิดเผยความลับใด ๆ ให้กับมัน เซิร์ฟเวอร์ MCP คือการพึ่งพา และการพึ่งพาได้รับการแก้ไข ตรวจสอบ และจำกัดอัตรา
flowchart TB
subgraph Dev[สถาปัตยกรรมการพัฒนา]
D1[โน้ตบุ๊ก] --> D2[กรอบงานเอเย่นต์]
D2 --> D3[ผู้ให้บริการโมเดล]
D2 --> D4[เครื่องมือในเครื่อง]
end
subgraph Deploy[สถาปัตยกรรมการปรับใช้]
E1[ท่อ CI] --> E2[ประตูการประเมินผล]
E2 -->|ผ่าน| E3[บริการเอเย่นต์ Foundry]
E3 --> E4[เอเย่นต์ที่โฮสต์และมีเวอร์ชัน]
end
subgraph Run[สถาปัตยกรรมรันไทม์]
F1[แอปไคลเอนต์] --> F2[เอเย่นต์ที่โฮสต์]
F2 --> F3[เราเตอร์โมเดล]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[บริการหน่วยความจำ]
F2 --> F6[เครื่องมือ MCP]
F2 --> F7[OTel -> การติดตาม Foundry]
F2 --> F8[การอนุมัติจากมนุษย์]
end
แผนภาพสามอันนั้น — การพัฒนา, การปรับใช้, เวลารันไทม์ — คือสภาพตัวแทนเดียวกันในสามขั้นตอนของชีวิต ห้องปฏิบัติการที่จะตามมาเดินคุณผ่านการสร้างมัน
เปิด code_samples/16-python-agent-framework.ipynb และทำงานผ่านตั้งแต่ต้นจนจบ คุณจะประกอบตัวแทนสนับสนุนลูกค้า Contoso ที่มีข้อกังวลของการผลิตทุกอย่างเชื่อมโยงในนั้น:
โน้ตบุ๊กถูกจัดระเบียบให้แต่ละข้อกังวลของการผลิตเป็นส่วนที่แยกตัว ทำงานได้จบในตัวเอง หัวใจของมันคือการจัดการคำขอด้วยการกำหนดเส้นทางและการแคชควบคู่กัน:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. ให้บริการจากแคชเมื่อเป็นไปได้
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. กำหนดเส้นทางโดยความซับซ้อนเพื่อตรวจสอบค่าใช้จ่าย
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. รันเอเจนต์ภายในสแปนติดตามเพื่อการสังเกต
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. จัดเก็บในแคชและส่งคืน
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 # จะทำการปรับใช้เฉพาะเมื่อเกตผ่านแล้วเท่านั้น
อ่านทุกบรรทัด — โน้ตบุ๊กทำ primitives ให้เล็กอย่างตั้งใจเพื่อไม่มีอะไรซ่อนอยู่หลังการเรียกเฟรมเวิร์ก
เกตการประเมินข้างต้นทำงาน แบบออฟไลน์ กับวัตถุตัวแทนของคุณ เมื่อปรับใช้ตัวแทนเป็น Hosted Agent แล้ว คุณต้องมีการตรวจสอบอีกขั้นหนึ่งที่ถูกกว่ามาก: ปลายทางที่ปรับใช้ตอบสนองจริงหรือไม่?
การปรับใช้ “สำเร็จ” เพียงพิสูจน์ว่าเครื่องควบคุมรับนิยามไว้ — ไม่ได้พิสูจน์ว่าตัวแทนตอบสนองได้ การขาดการพึ่งพา, การกำหนดเส้นทางโมเดลที่ผิด, หรือการเชื่อมต่อหมดอายุ สามารถทำให้เกิดการปรับใช้ที่สำเร็จแต่ไม่ส่งคืนอะไร การทดสอบควันจับเหตุการณ์นี้ได้ในไม่กี่วินาที บนทุกการปรับใช้ โดยไม่ต้องเสียค่าใช้จ่ายของการประเมินเต็มรูปแบบ
ที่เก็บนี้มาพร้อมกับสายการทดสอบควันที่พร้อมใช้สร้างบน GitHub Action AI Smoke Test:
tests/lesson-16-smoke-tests.json มีพรอมต์และการยืนยันสำหรับตัวแทนสนับสนุน Contoso (คำตอบนโยบายที่ยืนยันได้, การค้นหาคำสั่งซื้อ, อยู่ในหัวข้อ, และความต่อเนื่องของเธรดหลายรอบ) แคตตาล็อกสำหรับตัวแทนของบทเรียนอื่น ๆ อยู่เคียงข้างกัน — ดูที่ tests/README.md.github/workflows/smoke-test.yml ล็อกอินด้วย Azure OIDC และ POST พรอมต์แต่ละรายการไปยังปลายทาง Responses ของตัวแทน ล้มเหลวในงานถ้าการยืนยันใดล้มเหลว- 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 เมื่อเอเยนต์ของคุณถูกปรับใช้แล้ว โดยระบุ endpoint โครงการ Foundry และชื่อเอเยนต์ของคุณ ตัวตนแบบ federated ต้องการบทบาท Azure AI User ในขอบเขตโครงการ Foundry ให้คิดถึงเลเยอร์เหล่านี้เหมือนพีระมิด: การทดสอบเบื้องต้น (เข้าถึงได้และตอบสนองไหม?) ดำเนินการทุกครั้งที่ปรับใช้, การประเมินแบบออฟไลน์ (พอที่จะนำส่งได้ไหม?) ดำเนินการก่อนส่งเสริม และการประเมินแบบออนไลน์ (ทำงานดีแค่ไหนในสถานการณ์จริง?) ดำเนินการอย่างต่อเนื่อง
ทดสอบความเข้าใจก่อนที่จะดำเนินการต่อไปยังการมอบหมายงาน
1. โดยประมาณแล้วเอเยนต์ในสภาพแวดล้อมการผลิต มีส่วนประกอบ “โมเดล” เท่าไร และส่วนที่เหลือคืออะไร?
2. เมื่อไรที่คุณจะเลือกใช้ Hosted Agent แทนเอเยนต์ที่โฮสต์โดยลูกค้า?
3. ทำไมเอเยนต์ที่สามารถปรับขนาดได้จึงต้องไม่เก็บสถานะในหน่วยความจำของกระบวนการตัวเอง?
4. การกำหนดเส้นทางโมเดลแก้ไขปัญหาอะไร และเกี่ยวข้องกับการประเมินอย่างไร?
5. “ประตูการประเมิน” คืออะไรและตั้งอยู่ในวงจรชีวิตอย่างไร?
6. ทำไมเซิร์ฟเวอร์ MCP จึงควรถูกมองว่าเป็นเขตแดนที่ไม่น่าเชื่อถือในสภาพแวดล้อมการผลิต?
7. การเปลี่ยนแปลงอย่างเดียวที่มักจะมีผลกระทบมากที่สุดต่อค่าใช้จ่ายของเอเยนต์ในสภาพแวดล้อมการผลิตคืออะไร และเพราะเหตุใด?
8. แอตทริบิวต์ span เช่น customer.tier และ routed.model มีบทบาทอย่างไรในการสังเกตการณ์?
นำเอเยนต์สนับสนุนลูกค้าจากแลปและปรับแต่งให้เหมาะกับสถานการณ์เฉพาะ: เอเยนต์สนับสนุนการเรียกเก็บเงินสมาชิกสำหรับบริษัท SaaS
ผลงานของคุณควร:
get_subscription_status, get_invoice, และ issue_credit (เครดิตที่เกิน $50 ต้องการการอนุมัติจากมนุษย์)เขียนย่อหน้าสั้น ๆ (ในเซลล์มาร์คดาวน์) อธิบายว่ากฎการกำหนดเส้นทางโมเดลที่คุณเลือกคืออะไร และคุณจะตรวจสอบมันกับการจราจรจริงได้อย่างไร ไม่มีคำตอบที่ถูกต้องเดียว — คุณจะถูกประเมินจากความเชื่อมโยงของข้อกังวลการผลิตอย่างสอดคล้องกัน
ในบทเรียนนี้คุณได้ย้ายเอเยนต์จากต้นแบบไปยังการผลิตด้วย Microsoft Foundry:
บทเรียนถัดไปจะเป็นเส้นทางตรงกันข้าม: แทนที่จะปรับขนาดเอเยนต์เข้าไปในคลาวด์ คุณจะนำพวกมัน ลง บนเครื่องนักพัฒนาหนึ่งเครื่องและรันทั้งหมดในเครื่องนั้น
การสร้างเอเยนต์ผู้ใช้คอมพิวเตอร์ (CUA)
ปฏิเสธความรับผิดชอบ: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้