![]()
บทเรียนก่อนหน้านี้ได้ขยายขนาดตัวแทน ขึ้น สู่คลาวด์ บทเรียนนี้จะพาพวกเขา ลงมา บนเครื่องเดียว เมื่อจบคุณจะมีผู้ช่วยวิศวกรรมที่ใช้งานได้จริงซึ่งสามารถวิเคราะห์เหตุผล เรียกเครื่องมือ อ่านไฟล์ของคุณ และค้นหาคู่มือเอกสาร — โดยไม่มีการเรียกใช้การอนุมานบนคลาวด์แม้แต่ครั้งเดียว
ทำไมคุณถึงอยากได้แบบนั้น? มีสามเหตุผลที่มักจะพบในการทำงานวิศวกรรมจริง:
ข้อจำกัดคือคุณแลกโมเดลคลาวด์ชั้นแนวหน้าด้วย โมเดลภาษาขนาดเล็ก (SLM) ที่ทำงานบน CPU, GPU หรือ NPU ของคุณ บทเรียนนี้เกี่ยวกับการสร้างตัวแทนที่ ดี ภายในข้อจำกัดนั้น แทนการทำเป็นว่าไม่มีข้อจำกัด
บทเรียนนี้จะครอบคลุม:
เมื่อจบบทเรียนนี้ คุณจะรู้วิธี:
บทเรียนนี้สมมติว่าคุณได้ผ่านบทเรียนก่อนหน้าและคุ้นเคยกับ:
คุณจะต้องมี:
requirements.txt รวมทั้ง foundry-local-sdk, openai และ chromadb สำหรับบทเรียนนี้โมเดลคลาวด์ชั้นแนวหน้ามีพารามิเตอร์หลายแสนล้านตัวและมีศูนย์ข้อมูลขนาดใหญ่เบื้องหลัง ในขณะที่ SLM มีพารามิเตอร์เพียงไม่กี่พันล้านตัวและต้องใส่ใน RAM ของแล็ปท็อปคุณ ความแตกต่างนี้สร้างความคาดหวังที่ชัดเจน
SLM มีความสามารถดีในด้าน:
SLM มีจุดอ่อนในด้าน:
กลยุทธ์ที่ชนะสำหรับตัวแทนท้องถิ่นคือ: ให้ SLM ควบคุมการทำงาน และปล่อยให้เครื่องมือทำงานหนัก โมเดลไม่จำเป็นต้อง รู้ ฐานโค้ดของคุณ — เพียงแค่รู้ว่าเมื่อใดควรเรียก read_file และ search_docs นั่นสอดคล้องกับจุดแข็งของ SLM โดยตรง
flowchart LR
U[นักพัฒนา] --> A[ตัวแทน SLM ภายในเครื่อง]
A -->|ตัดสินใจว่าจะใช้เครื่องมือใด| T1[อ่านไฟล์]
A -->|ตัดสินใจว่าจะใช้เครื่องมือใด| T2[ค้นหาเอกสาร RAG]
A -->|ตัดสินใจว่าจะใช้เครื่องมือใด| T3[วิเคราะห์โค้ด]
T1 --> A
T2 --> A
T3 --> A
A --> R[ตอบกลับ, ทำงานทั้งหมดในอุปกรณ์]
Microsoft Foundry Local เป็นรันไทม์น้ำหนักเบาที่ดาวน์โหลด จัดการ และให้บริการโมเดลทั้งหมดบนเครื่องของคุณ ฟีเจอร์ที่สำคัญที่สุดสำหรับเราคือมันเปิดเผย จุดสิ้นสุด HTTP ที่เข้ากันได้กับ OpenAI — หมายความว่า OpenAI SDK และไคลเอนต์ OpenAI ของ Microsoft Agent Framework สามารถทำงานกับมันได้โดยเปลี่ยนเพียง base_url เท่านั้น ทุกอย่างที่คุณเรียนรู้เกี่ยวกับการสร้างตัวแทนสามารถใช้ได้โดยตรง; มีเพียงจุดสิ้นสุดที่เปลี่ยนจากคลาวด์เป็น localhost
Foundry Local ยังเลือกเวอร์ชันโมเดลที่เหมาะสมที่สุดกับฮาร์ดแวร์ของคุณโดยอัตโนมัติ — สร้างสำหรับ CPU, CUDA/GPU หรือ NPU — คุณไม่ต้องปรับแต่งด้วยตัวเองตามเครื่อง
ติดตั้ง Foundry Local (ดู เอกสาร สำหรับระบบปฏิบัติการของคุณ) จากนั้นตรวจสอบว่าทำงานได้:
# ติดตั้ง (ตัวอย่าง; ปฏิบัติตามเอกสารสำหรับแพลตฟอร์มของคุณ)
winget install Microsoft.FoundryLocal # วินโดวส์
# brew install microsoft/foundrylocal/foundrylocal # macOS
# ดาวน์โหลดและรันโมเดล Qwen แล้วเริ่มบริการภายในเครื่อง
foundry model run qwen2.5-7b-instruct
foundry service status
เมื่อบริการกำลังทำงาน คุณจะมีจุดสิ้นสุด OpenAI-compatible ในเครื่อง (โดยปกติคือ http://localhost:PORT/v1) โน้ตบุ๊กใช้ foundry-local-sdk เพื่อค้นหาจุดสิ้นสุดโดยอัตโนมัติ ดังนั้นคุณไม่ต้องกำหนดพอร์ตแบบรหัสคงที่
ตัวแทนคือตัวแทนก็ต่อเมื่อมันสามารถเรียกใช้เครื่องมือได้ SLM หลายตัวสามารถแชทได้แต่สร้างการเรียกเครื่องมือที่ไม่เสถียรและผิดรูปแบบ โมเดล Qwen ถูกฝึกให้เรียกใช้ฟังก์ชันและสร้างโครงสร้างการเรียกเครื่องมือที่ถูกต้องสม่ำเสมอ — ซึ่งเปลี่ยนโมเดลแชทท้องถิ่นให้กลายเป็น ตัวแทนท้องถิ่น ได้จริง
การทำงานเป็นลูปเรียกใช้งานเครื่องมือแบบมาตรฐานที่คุณรู้จักดี แต่อยู่บนอุปกรณ์:
sequenceDiagram
participant U as ผู้ใช้
participant A as ตัวแทน Qwen (ในเครื่อง)
participant T as เครื่องมือในเครื่อง
U->>A: "auth.py ทำหน้าที่อะไร?"
A->>A: ตัดสินใจ: เรียก read_file
A->>T: read_file("auth.py")
T-->>A: เนื้อหาไฟล์
A->>A: วิเคราะห์เนื้อหา
A-->>U: คำอธิบาย
การค้นหาคู่มือเอกสารคือที่ตัวแทนท้องถิ่นทำเงินแท้จริง แทนที่จะหวังว่า SLM จะจำเอกสารของเฟรมเวิร์กคุณได้ คุณฝังเอกสารเหล่านั้นลงใน ฐานข้อมูลเวกเตอร์ท้องถิ่น และให้ตัวแทนดึงข้อมูลส่วนที่เกี่ยวข้องตามความต้องการ
เราใช้ Chroma ซึ่งเป็นฐานข้อมูลเวกเตอร์ฝังตัวที่ทำงานในกระบวนการเดียวกันโดยไม่มีเซิร์ฟเวอร์จัดการ กระบวนการทั้งหมดเป็นแบบท้องถิ่น: โมเดลฝังตัวในเครื่อง → เวกเตอร์ในเครื่อง → การดึงข้อมูลในเครื่อง → SLM ในเครื่อง
flowchart TB
D[เอกสาร / โค้ดของคุณ] --> E[โมเดลฝังตัวภายในเครื่อง]
E --> V[(ฐานข้อมูลเวกเตอร์ Chroma - บนดิสก์)]
Q[คำถามของเอเจนต์] --> QE[ฝังคำถามภายในเครื่อง]
QE --> V
V -->|ชิ้นส่วนที่ดีที่สุดอันดับต้น ๆ| A[เอเจนต์ Qwen]
A --> Ans[คำตอบที่มีพื้นฐานข้อมูล]
นี่คือรูปแบบ Agentic RAG เดิมจากบทเรียน 5 — การเปลี่ยนแปลงเพียงอย่างเดียวคือทุกส่วนทำงานบนเครื่องของคุณ
MCP เป็นช่องทางการสื่อสาร ไม่ใช่บริการคลาวด์ เซิร์ฟเวอร์ MCP สามารถทำงานเป็นกระบวนการท้องถิ่นบน stdio เปิดเผยเครื่องมือให้ตัวแทนของคุณผ่านโปรโตคอลมาตรฐาน ซึ่งช่วยให้คุณใช้ซ้ำระบบนิเวศของเซิร์ฟเวอร์ MCP ที่มีอยู่ — การเข้าถึงระบบไฟล์, การทำงานกับ git, การสืบค้นฐานข้อมูล — ทั้งหมดเป็นแบบออฟไลน์
ความปลอดภัยแตกต่างจากคลาวด์แต่ไม่ขาดหาย: เซิร์ฟเวอร์ MCP ท้องถิ่นยังทำงานด้วยสิทธิ์ของผู้ใช้คุณ ดังนั้นจำกัดขอบเขตสิ่งที่มันเข้าถึงได้ (เช่น โฟลเดอร์โปรเจค ไม่ใช่โฟลเดอร์บ้านทั้งหมด) และจัดการผลลัพธ์เสมือนเป็นอินพุตเพื่อตรวจสอบ
การเลือกแบบ “ท้องถิ่นก่อน” ไม่ได้หมายความว่าต้องใช้แค่ท้องถิ่น ระบบที่พัฒนาแล้วจะแยกเส้นทางตามความละเอียดอ่อนและความยาก:
| สถานการณ์ | ทำงานที่ไหน |
|---|---|
| โค้ด/ข้อมูลที่ละเอียดอ่อน หรือออฟไลน์ | SLM ท้องถิ่น |
| งานง่ายๆ ที่จำกัดขอบเขต | SLM ท้องถิ่น (ถูกและเร็ว) |
| การให้เหตุผลแบบหลายกระโดดยากๆ บนข้อมูลไม่ละเอียดอ่อน | โมเดลคลาวด์ |
| ทุกสิ่งในช่วงที่ไฟดับ | SLM ท้องถิ่น (ลดความสามารถอย่างราบรื่น) |
สิ่งนี้สะท้อนแนวคิด การจัดเส้นทางโมเดล จากบทเรียน 16 — ยกเว้นว่า “โมเดล” หนึ่งตอนนี้คือเครื่องของคุณเอง การออกแบบที่ทนทานจะถอยกลับสู่ท้องถิ่นเมื่อคลาวด์ไม่พร้อมใช้งาน เพื่อให้ตัวแทนลดคุณภาพลงอย่างช้าๆ แทนที่จะล้มเหลวทันที
flowchart LR
Q[คำขอ] --> S{เป็นข้อมูลละเอียดอ่อนหรือต่อออนไลน์หรือไม่?}
S -->|ใช่| L[SLM ท้องถิ่น]
S -->|ไม่| C{ต้องการการวิเคราะห์เชิงลึกหรือไม่?}
C -->|ไม่| L
C -->|ใช่| Cloud[โมเดลบนคลาวด์]
L --> Out[การตอบกลับ]
Cloud --> Out
เปิด code_samples/17-local-agent-foundry-local.ipynb และทำตาม คุณจะสร้าง ผู้ช่วยวิศวกรรมท้องถิ่น ที่ทำงานทั้งหมดบนเวิร์กสเตชันของคุณและสามารถ:
ไม่มีการใช้การอนุมานบนคลาวด์ในทุกขั้นตอน
ผู้ช่วยเชื่อมต่อกับ Foundry Local ผ่านจุดสิ้นสุด OpenAI-compatible ดังนั้นโค้ดตัวแทนแทบจะเหมือนกับบทเรียนคลาวด์ — มีแต่ไคลเอนต์ที่เปลี่ยน
from foundry_local import FoundryLocalManager
from openai import OpenAI
# Foundry Local ค้นหา/ดาวน์โหลดโมเดลและให้เราใช้งานปลายทางในเครื่อง
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key) # api_key เป็นตัวแทนในเครื่องเฉยๆ
เครื่องมือเป็นฟังก์ชัน Python ธรรมดาที่จำกัดขอบเขตไว้ในโฟลเดอร์โปรเจค:
def read_file(path: str) -> str:
\"\"\"Read a file, but only inside the sandboxed project directory.\"\"\"
full = (PROJECT_ROOT / path).resolve()
if PROJECT_ROOT not in full.parents and full != PROJECT_ROOT:
return \"Access denied: path is outside the project directory.\"
return full.read_text(encoding=\"utf-8\")
สังเกตการตรวจสอบ sandbox — แม้แต่ในเครื่องเอง เครื่องมือที่อ่านเส้นทางใดก็ได้ถือเป็นความเสี่ยง โน้ตบุ๊กจะจำกัดเครื่องมือทั้งหมดไว้ในรากโปรเจคเดียวกัน
ทดสอบความเข้าใจก่อนเข้าสู่การบ้าน
1. อธิบายเหตุผลสองข้อที่ชัดเจนที่ควรใช้ตัวแทนในเครื่องแทนคลาวด์
2. การแบ่งงานระหว่าง SLM กับเครื่องมือในการทำงานแบบตัวแทนในเครื่องควรเป็นอย่างไร และเพราะเหตุใด
3. อะไรทำให้สามารถใช้ซ้ำโค้ดตัวแทนคลาวด์กับ Foundry Local ได้
4. ทำไมเราถึงใช้โมเดลเรียกฟังก์ชัน Qwen โดยเฉพาะ แทน SLM ทั่วไป
5. ในขั้นตอน RAG ท้องถิ่น องค์ประกอบใดบ้างที่ทำงานบนเครื่อง
6. เซิร์ฟเวอร์ MCP ในเครื่องทำงานบนเครื่องคุณ มันปลอดภัยโดยอัตโนมัติหรือ? คุณควรระวังอะไรบ้าง
7. อธิบายนโยบายการจัดเส้นทางแบบผสมที่สมเหตุสมผลซึ่งรวมโมเดลท้องถิ่น
8. ขนาด RAM ขั้นต่ำที่เหมาะสมสำหรับรันตัวแทนท้องถิ่นในบทเรียนนี้คือเท่าไร และ RAM เพิ่มเติมช่วยอะไรได้บ้าง
ขยายผู้ช่วยวิศวกรรมท้องถิ่นเป็น ผู้ตรวจสอบเอกสารท้องถิ่น สำหรับโปรเจคเล็กๆ ที่คุณเลือก (ใช้โฟลเดอร์บทเรียนจากรีโพนี้ก็ได้)
สิ่งที่ต้องส่ง:
เพิ่มเครื่องมือ find_todos ที่สแกนโปรเจคหา comment TODO/FIXME และส่งกลับพร้อมไฟล์และหมายเลขบรรทัด — โดยยังคงการตรวจสอบ sandbox แบบเดียวกับ read_file
จากนั้นเขียนย่อหน้าสั้น ๆ เกี่ยวกับ สิ่งที่คุณจะย้ายไปยังคลาวด์และสิ่งที่คุณจะเก็บไว้ในเครื่อง สำหรับผู้ตรวจสอบนี้ และเหตุผล คุณจะได้รับการประเมินจากว่าคอมโพเนนต์ในเครื่องเชื่อมต่อกันถูกต้องหรือไม่ และตรรกะแบบไฮบริดของคุณสมเหตุสมผลหรือไม่ — ไม่ได้ประเมินคุณภาพของโมเดล
ในบทเรียนนี้คุณได้สร้างตัวแทนที่ทำงานทั้งหมดบนเครื่องของคุณเอง:
นี่คือการปิดเส้นทางการปรับใช้: บทเรียนที่ 16 ขยายตัวแทนไปยัง Microsoft Foundry และบทเรียนนี้ย่อส่วนลงสู่เวิร์กสเตชันเครื่องเดียว บทเรียนถัดไปจะพูดถึงการรักษาความปลอดภัยให้กับตัวแทนที่ปรับใช้แล้ว
ปฏิเสธความรับผิดชอบ: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI Co-op Translator ขณะที่เราพยายามให้ความถูกต้อง โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถูกพิจารณาเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้การแปลโดยมนุษย์มืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความที่ผิดพลาดที่เกิดขึ้นจากการใช้การแปลนี้