![]()
Bài học trước đã mở rộng các đại lý lên đám mây. Bài này đưa chúng xuống một máy đơn. Đến cuối bài bạn sẽ có một trợ lý kỹ thuật hoạt động được, có khả năng suy luận, gọi công cụ, đọc file của bạn và tìm kiếm tài liệu — mà không cần một lần gọi suy diễn trên đám mây nào.
Tại sao bạn muốn vậy? Ba lý do luôn xuất hiện trong công việc kỹ thuật thực tế:
Điểm hạn chế là bạn đang đánh đổi một mô hình đám mây tiên tiến cho một Mô hình Ngôn ngữ Nhỏ (SLM) chạy trên CPU, GPU, hoặc NPU của bạn. Bài học này là về xây dựng các đại lý tốt trong giới hạn đó thay vì giả vờ không có giới hạn.
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:
Bài học giả định bạn đã hoàn thành các bài trước và thành thạo:
Bạn cũng cần:
requirements.txt, cộng thêm foundry-local-sdk, openai, và chromadb cho bài học này.Mô hình tiên phong trên đám mây có hàng trăm tỷ tham số với trung tâm dữ liệu hỗ trợ. SLM có vài tỷ tham số và phải vừa trong RAM máy tính xách tay của bạn. Sự khác biệt đó đặt ra kỳ vọng rõ ràng.
SLMs giỏi trong việc:
SLMs yếu hơn ở:
Chiến lược thắng cuộc cho đại lý cục bộ là: để SLM điều phối, và giao công cụ làm phần nặng nhọc. Mô hình không cần biết mã nguồn của bạn — mà cần khi nào gọi read_file và search_docs. Điều này rất phù hợp với điểm mạnh của SLM.
flowchart LR
U[Nhà phát triển] --> A[Đại lý SLM cục bộ]
A -->|quyết định công cụ nào| T1[đọc_tệp]
A -->|quyết định công cụ nào| T2[tìm_kiếm_tài_liệu RAG]
A -->|quyết định công cụ nào| T3[phân_tích_mã]
T1 --> A
T2 --> A
T3 --> A
A --> R[Trả lời, hoàn toàn trên thiết bị]
Microsoft Foundry Local là một runtime nhẹ nhàng tải xuống, quản lý và phục vụ mô hình hoàn toàn trên máy của bạn. Tính năng quan trọng nhất với chúng ta là nó cung cấp điểm cuối HTTP tương thích OpenAI — nghĩa là SDK OpenAI và client OpenAI của Microsoft Agent Framework có thể làm việc với nó chỉ bằng cách đổi base_url. Tất cả kiến thức bạn học về xây dựng đại lý chuyển trực tiếp; chỉ điểm cuối dịch chuyển từ đám mây sang localhost.
Foundry Local cũng tự động chọn phiên bản build mô hình phù hợp nhất cho phần cứng của bạn — build CPU, build CUDA/GPU hoặc build NPU — nên bạn không cần tự tối ưu cho từng máy.
Cài đặt Foundry Local (xem tài liệu cho hệ điều hành của bạn), sau đó xác nhận hoạt động:
# Cài đặt (ví dụ; làm theo tài liệu cho nền tảng của bạn)
winget install Microsoft.FoundryLocal # Windows
# brew install microsoft/foundrylocal/foundrylocal # macOS
# Tải xuống và chạy một mô hình Qwen, sau đó khởi động dịch vụ cục bộ
foundry model run qwen2.5-7b-instruct
foundry service status
Khi dịch vụ chạy, bạn có một điểm cuối tương thích OpenAI cục bộ (thường là http://localhost:PORT/v1). Notebook sử dụng foundry-local-sdk để tự động phát hiện điểm cuối, nên bạn không cần cứng mã cổng.
Một đại lý chỉ là đại lý nếu nó có thể gọi công cụ. Nhiều SLM có thể chat nhưng tạo các lệnh gọi công cụ không đáng tin, sai cấu trúc. Qwen được huấn luyện cho gọi hàm và luôn tạo cấu trúc gọi công cụ chuẩn — chính điều đó biến mô hình chat cục bộ thành một đại lý cục bộ.
Quy trình là vòng lặp gọi công cụ tiêu chuẩn mà bạn đã biết, chỉ chạy trên thiết bị:
sequenceDiagram
participant U as Người dùng
participant A as Tác nhân Qwen (cục bộ)
participant T as Công cụ địa phương
U->>A: "auth.py làm gì?"
A->>A: Quyết định: gọi read_file
A->>T: read_file("auth.py")
T-->>A: nội dung tệp
A->>A: Lý giải nội dung
A-->>U: Giải thích
Tìm kiếm tài liệu là nơi đại lý cục bộ phát huy hiệu quả. Thay vì hy vọng SLM nhớ tài liệu framework của bạn, bạn nhúng tài liệu đó vào cơ sở dữ liệu vector cục bộ và để đại lý truy xuất các đoạn liên quan khi cần.
Chúng ta dùng Chroma, một kho vector nhúng chạy trong quá trình mà không cần server quản lý. Quy trình hoàn toàn cục bộ: mô hình nhúng cục bộ → vector cục bộ → truy xuất cục bộ → SLM cục bộ.
flowchart TB
D[Tài liệu / mã của bạn] --> E[Mô hình nhúng cục bộ]
E --> V[(Cơ sở dữ liệu vector Chroma - trên đĩa)]
Q[Truy vấn tác nhân] --> QE[Nhúng truy vấn cục bộ]
QE --> V
V -->|các đoạn top-k| A[Tác nhân Qwen]
A --> Ans[Câu trả lời có căn cứ]
Đây là mẫu Agentic RAG giống bài 5 — chỉ khác là mỗi thành phần chạy trên máy bạn.
MCP là một giao thức truyền tải, không phải dịch vụ đám mây. Máy chủ MCP có thể chạy cục bộ trên stdio, cung cấp công cụ cho đại lý qua giao thức chuẩn. Điều này cho phép bạn tái sử dụng hệ sinh thái máy chủ MCP — truy cập hệ thống tập tin, thao tác git, truy vấn cơ sở dữ liệu — hoàn toàn ngoại tuyến.
Tư thế bảo mật khác với đám mây, nhưng không bị loại bỏ: máy chủ MCP cục bộ vẫn chạy với quyền người dùng của bạn, nên bạn phải giới hạn phạm vi tiếp cận (ví dụ thư mục dự án, không phải toàn bộ thư mục nhà) và coi đầu ra của nó như đầu vào để kiểm tra trước khi xử lý.
Ưu tiên cục bộ không có nghĩa là chỉ dùng cục bộ. Hệ thống trưởng thành định tuyến theo tính nhạy cảm và độ khó:
| Tình huống | Nơi chạy |
|---|---|
| Mã/dữ liệu nhạy cảm, hoặc ngoại tuyến | SLM cục bộ |
| Nhiệm vụ đơn giản, giới hạn | SLM cục bộ (rẻ, nhanh) |
| Lập luận đa bước khó trên dữ liệu không nhạy cảm | Mô hình đám mây |
| Mọi thứ khi mất kết nối | SLM cục bộ (giảm dần mượt mà) |
Điều này phản ánh ý tưởng định tuyến mô hình từ bài 16 — ngoại trừ một trong những “mô hình” giờ là máy tính của bạn. Thiết kế chắc chắn sẽ dự phòng về cục bộ khi đám mây không có, để đại lý giảm chất lượng thay vì lỗi hoàn toàn.
flowchart LR
Q[Yêu cầu] --> S{Nhạy cảm hay ngoại tuyến?}
S -->|có| L[SLM cục bộ]
S -->|không| C{Cần suy luận sâu?}
C -->|không| L
C -->|có| Cloud[Mô hình đám mây]
L --> Out[Phản hồi]
Cloud --> Out
Mở code_samples/17-local-agent-foundry-local.ipynb và làm theo. Bạn sẽ xây dựng trợ lý kỹ thuật cục bộ chạy hoàn toàn trên máy làm việc có thể:
Không sử dụng suy diễn đám mây nào trong quá trình.
Trợ lý kết nối Foundry Local qua điểm cuối tương thích OpenAI, nên mã đại lý gần như giống hệt các bài đám mây — chỉ khác client:
from foundry_local import FoundryLocalManager
from openai import OpenAI
# Foundry Local phát hiện/tải xuống mô hình và cung cấp cho chúng ta một điểm cuối cục bộ.
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key) # api_key là một trình giữ chỗ cục bộ
Các công cụ là hàm Python thông thường phạm vi trong thư mục dự án:
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\")
Lưu ý kiểm tra sandbox — ngay cả khi cục bộ, công cụ đọc đường dẫn tùy tiện là rủi ro. Notebook giữ mọi công cụ phạm vi trong thư mục dự án duy nhất.
Kiểm tra hiểu biết của bạn trước khi chuyển đến bài tập.
1. Đưa ra hai lý do cụ thể để chạy đại lý cục bộ thay vì trên đám mây.
2. Phân công công việc được khuyến nghị giữa SLM và công cụ trong đại lý cục bộ là gì, và tại sao?
3. Điều gì làm cho việc tái sử dụng mã đại lý đám mây với Foundry Local trở nên khả thi?
4. Tại sao chúng ta dùng mô hình gọi hàm Qwen mà không phải bất kỳ SLM nào khác?
5. Trong quy trình RAG cục bộ, các thành phần nào chạy trên máy?
6. Máy chủ MCP cục bộ chạy trên máy bạn. Điều đó có nghĩa nó tự động an toàn? Bạn vẫn nên thực hiện biện pháp phòng ngừa nào?
7. Mô tả quy tắc định tuyến lai hợp lý bao gồm mô hình cục bộ.
8. Kích thước RAM tối thiểu thực tế để chạy đại lý cục bộ bài này là bao nhiêu, và thêm RAM mang lại lợi ích gì?
Mở rộng trợ lý kỹ thuật cục bộ thành một trình xem xét tài liệu cục bộ cho một dự án nhỏ bạn chọn (có thể dùng một thư mục bài học trong repo này).
Yêu cầu bài làm:
Thêm công cụ find_todos quét dự án tìm comment TODO/FIXME và trả về cùng file và số dòng — duy trì kiểm tra sandbox như read_file.
Sau đó viết một đoạn ngắn về những gì bạn sẽ chuyển lên đám mây và những gì bạn sẽ giữ lại cục bộ cho người đánh giá này, và lý do. Bạn được đánh giá dựa trên việc các thành phần cục bộ được kết nối chính xác và liệu suy luận kết hợp của bạn có hợp lý hay không — không phải chất lượng mô hình.
Trong bài học này bạn đã xây dựng một tác tử chạy hoàn toàn trên máy của bạn:
Điều này hoàn tất vòng triển khai: Bài học 16 triển khai tác tử quy mô lớn trên Microsoft Foundry, và bài học này triển khai thu nhỏ chúng xuống một máy trạm đơn. Bài học tiếp theo sẽ xoay quanh việc giữ an toàn cho các tác tử triển khai.
Tuyên bố miễn trừ 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 cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đố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 bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.