
Cách triển khai đầu ra có cấu trúc với các LLM cục bộ
Tại sao phải sử dụng? Làm thế nào để triển khai? Chúng ta có thể làm gì khi nó thất bại? Bài viết Cách triển khai đầu ra có cấu trúc với LLM cục bộ xuất hiện lần đầu trên Towards Data Science.
Ứng dụng LLM
Cách triển khai đầu ra có cấu trúc với các LLM cục bộ
Tại sao nên sử dụng? Cách triển khai? Chúng ta có thể làm gì khi nó thất bại?
ThS. Shuai Guo
Ngày 9/8/2026
9 phút đọc
Được tạo bởi GPT-Image 2
Đối với việc xây dựng các ứng dụng LLM, các LLM cục bộ là một lựa chọn hấp dẫn.
Chúng cho phép chúng ta giữ an toàn dữ liệu nhạy cảm và giảm sự phụ thuộc vào các API đám mây.
Tuy nhiên, việc chạy mô hình cục bộ chỉ là bước đầu tiên. Trong một ứng dụng thực tế, LLM cục bộ thường là một phần của quy trình làm việc lớn hơn. Điều này có nghĩa là các phản hồi của nó thường cần được một thành phần khác sử dụng.
Trong những tình huống đó, văn bản dạng tự do có thể rất khó xử lý. Chúng ta muốn đầu ra tuân theo một số cấu trúc có thể dự đoán được.
Đó chính xác là mục đích của Đầu ra có cấu trúc.
Chúng ta có thể đạt được điều đó bằng cách xác định trước hình dạng, hoặc lược đồ, mong muốn. Thời gian chạy phục vụ cục bộ sau đó sẽ giới hạn việc tạo LLM để tuân theo lược đồ đó. Cuối cùng, LLM sẽ cung cấp cho chúng ta một đối tượng Python thông thường mà mã của chúng ta có thể dễ dàng phân tích cú pháp.
Trong bài viết này, chúng ta sẽ minh họa mô hình này thông qua một nghiên cứu điển hình cụ thể. Chúng ta sẽ sử dụng Gemma 4 làm LLM cục bộ, Ollama làm thời gian chạy phục vụ và Pydantic để định nghĩa và xác thực lược đồ đầu ra.
1. Làm thế nào để chúng ta triển khai đầu ra có cấu trúc với một LLM cục bộ?
1.1 Một nghiên cứu điển hình về nhà thông minh
Giả sử chúng ta đang xây dựng một ứng dụng nhà thông minh. Người dùng đặt một câu hỏi đơn giản:
Máy rửa bát nên chạy bây giờ hay sau?
Trước khi trả lời, ứng dụng cần trích xuất thông tin thiết bị, các ràng buộc về thời gian và biểu giá điện từ các ghi chú trong gia đình.
Vì những ghi chú này chứa thông tin riêng tư, một LLM cục bộ là một lựa chọn tự nhiên làm bước đầu tiên. Nó có thể chuyển đổi các ghi chú gốc thành một đối tượng có cấu trúc chỉ giữ lại các sự kiện cần thiết cho việc lên lịch trong khi loại bỏ các chi tiết cá nhân không cần thiết.
Sau đó, chúng ta có thể chuyển đối tượng đã được làm sạch này cho một LLM đám mây có khả năng hơn để lập luận và lên lịch. Ở đây, chúng ta hãy tập trung vào bước chuyển đổi cục bộ.
Sau đây là ngữ cảnh gia đình mà chúng ta sẽ sử dụng:
USER_QUESTION = "Máy rửa bát nên chạy bây giờ hay sau?"
SMART_HOME_CONTEXT = """
Hiện tại là 18:30.
Nhật ký hoạt động ghi lại rằng robot hút bụi đã hoàn thành lượt quét bếp hôm nay
lúc 16:10 và quay trở lại đế sạc. Không cần hút bụi thêm hôm nay.
Máy rửa bát có thể bắt đầu sớm nhất lúc 18:30. Một chu trình mất 90 phút và sử dụng khoảng 1,2 kWh.
Nó phải hoàn thành trước bữa sáng lúc 06:30. Vì máy rửa bát ở cạnh
phòng ngủ, nó phải ngừng chạy trước 22:30.
Bộ sạc EV có thể bắt đầu sớm nhất lúc 18:30. Sạc sẽ mất 120 phút và sử dụng khoảng
14 kWh. Xe phải được sạc trước khi người lái xe rời đi lúc 07:00.
Máy sấy có thể bắt đầu sớm nhất lúc 19:00. Chu trình của nó mất 75 phút và sử dụng khoảng
3,2 kWh. Nó chứa bộ đồ bóng đá, phải khô trước 23:00. Máy sấy
quá ồn vào buổi tối muộn, vì vậy nó phải ngừng chạy trước 21:30.
Máy giặt có thể bắt đầu sớm nhất lúc 20:00. Chu trình của nó mất 60 phút và
sử dụng khoảng 0,9 kWh. Nó chứa quần áo đi làm ngày mai và phải hoàn thành trước 05:30.
Một lượt quét bếp với robot hút bụi mất 45 phút và sử dụng khoảng 0,2 kWh.
Robot hút bụi có thể bắt đầu sớm nhất lúc 15:00.
Bộ điều khiển năng lượng gia đình chỉ cho phép một tải linh hoạt chạy cùng một lúc.
Điện có giá 0,45 mỗi kWh từ 17:00 đến 20:00, 0,22 từ 20:00 đến 00:00,
0,12 từ 00:00 đến 06:00 và 0,25 từ 06:00 đến 17:00.
""".strip()
Mục tiêu của LLM cục bộ là giữ lại các thông tin về lịch trình trong khi loại bỏ các chi tiết cá nhân.
1.2 Xác định cấu trúc mong muốn
Tiếp theo, chúng ta cần xác định đối tượng đã được làm sạch sẽ trông như thế nào.
Thành phần hạ nguồn cần thời gian hiện tại, thiết bị được đề cập trong câu hỏi, công suất bộ điều khiển và giá điện. Nó cũng cần các thiết bị vẫn yêu cầu lập lịch, cùng với thời gian chạy và yêu cầu về thời gian của chúng.
Chúng ta có thể biểu diễn điều này bằng cách sử dụng các mô hình Pydantic sau:
from typing import Annotated
from pydantic import BaseModel, Field
ClockTime = Annotated[
str,
Field(
min_length=5,
max_length=5,
description="Clock time in HH:MM format.",
),
]
class DeviceToSchedule(BaseModel):
device_name: str
duration_minutes: int
energy_kwh: float
earliest_start: ClockTime
finish_by: ClockTime | None
class SchedulingContext(BaseModel):
current_time: ClockTime
focus_device: str
max_concurrent_devices: int
current_price_per_kwh: float
off_peak_start: ClockTime
off_peak_end: ClockTime
off_peak_price_per_kwh: float
devices_to_schedule: list[DeviceToSchedule] = Field(
description=(
"Devices that have not completed their work "
"and still need to be scheduled."
)
)
Lưu ý rằng chúng ta có một lược đồ lồng nhau, nhưng cấu trúc tương đối dễ hiểu. SchedulingContext chứa các thông tin chung của hộ gia đình và một danh sách các đối tượng DeviceToSchedule.
Đây là định dạng mà chúng ta muốn LLM cục bộ xuất ra.
1.3 Thiết lập Ollama và LLM cục bộ
Trước khi tiếp tục, hãy đảm bảo rằng Ollama đã được cài đặt và đang chạy cục bộ. Bạn có thể cài đặt Ollama trên Windows:
winget install Ollama.Ollama
Trên macOS hoặc Linux, chạy:
"curl -fsSL https://ollama.com/install.sh | sh"
Sau khi Ollama được cài đặt, chúng ta có thể tải mô hình Gemma 4:
ollama pull gemma4:e4b
Chúng ta cũng cần Ollama Python client và Pydantic:
pip install ollama pydantic
Ở đây, chúng ta sử dụng biến thể 4B nhỏ gọn của mô hình Gemma 4 cho trường hợp nghiên cứu hiện tại.
1.4 Kết nối Pydantic với Ollama
Bây giờ, chúng ta kết nối lược đồ với mô hình cục bộ của mình.
Đây là cách chúng ta có thể thực hiện điều đó:
import ollama
def call_local_llm(schema, instructions, prompt):
response = ollama.chat(
model="gemma4:e4b",
messages=[
{"role": "system", "content": instructions},
{"role": "user", "content": prompt},
],
think="medium",
format=schema.model_json_schema(),
)
return schema.model_validate_json(response.message.content)
Hai điều quan trọng đáng nói ở đây:
model_json_schema() conv
Nguồn tin: Towards Data Science — Tác giả: Shuai Guo. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.