Chuyển đến nội dung chính

Hướng dẫn PostgresML: Thực hiện Machine Learning với SQL

Bài viết nhập môn về cách thực hiện machine learning bằng các câu lệnh SQL trong PostgresML.
Đã cập nhật 5 thg 10, 2026  · 11 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Xu hướng bao quát trong machine learning là di chuyển dữ liệu đến môi trường của mô hình để huấn luyện. Nhưng nếu làm ngược lại thì sao? Vì cơ sở dữ liệu ngày nay lớn hơn mô hình machine learning hàng bậc độ lớn, chẳng phải sẽ dễ hơn nhiều nếu chúng ta mang mô hình đến với các tập dữ liệu?

Đó là ý tưởng cốt lõi đằng sau PostgresML — dữ liệu giữ nguyên tại chỗ, bạn mang mã của mình vào cơ sở dữ liệu. Kiểu machine learning “đảo ngược logic” này mang lại hàng loạt lợi ích thực tế, khiến bạn phải nghĩ lại về khái niệm “cơ sở dữ liệu.”

PostgresML là gì và vì sao nên chọn?

PostgresML là một nền tảng machine learning toàn diện được xây dựng trên cơ sở dữ liệu PostgreSQL phổ biến. Nó giới thiệu một mô hình mới gọi là machine learning “trong cơ sở dữ liệu”, cho phép bạn thực hiện nhiều tác vụ ML bằng SQL mà không cần công cụ riêng ở mỗi bước.

Minh họa so sánh AI truyền thống với PostgresML

Dù còn khá mới, PostgresML hứa hẹn những lợi ích rõ ràng sau:

  • ML trong cơ sở dữ liệu: Bạn có thể huấn luyện, triển khai và chạy mô hình ML trực tiếp trong cơ sở dữ liệu PostgreSQL. Điều này loại bỏ việc liên tục di chuyển dữ liệu giữa DB và các framework ML bên ngoài, giúp tăng hiệu suất và giảm độ trễ ở mỗi bước.
  • SQL API: Nếu bạn yêu thích cả SQL lẫn machine learning, postgresml.org có thể trở thành trang web yêu thích của bạn. Nền tảng cho phép huấn luyện, tinh chỉnh và triển khai mô hình ML chỉ với các câu lệnh SQL SELECT. Với các nhà phân tích và khoa học dữ liệu không rành nửa tá framework ML, tính năng này có thể định nghĩa lại hoàn toàn quy trình làm việc hằng ngày.
  • Mô hình huấn luyện sẵn: PostgresML tích hợp dễ dàng với HuggingFace, nhờ đó truy cập được hàng trăm mô hình đã huấn luyện sẵn như Llama, Falcon, Bert, Mistral, v.v.
  • Tùy biến và linh hoạt: PostgresML hỗ trợ hơn 50+ thuật toán từ Scikit-learn, XGBoost, LGBM, PyTorch và TensorFlow. Nhờ đó, bạn có thể huấn luyện và triển khai mô hình ML cho nhiều bài toán học có giám sát ngay từ cơ sở dữ liệu.
  • Tích hợp với hệ sinh thái sẵn có: Vì PostgresML về bản chất là một cơ sở dữ liệu, bạn có thể tương tác với nó trong bất kỳ môi trường nào hỗ trợ Postgres (gần như ở mọi nơi). Nền tảng cũng cung cấp SDK cho 16 ngôn ngữ nếu làm ML bằng SQL khiến bạn thấy “lạ tay” (JavaScript, Python và Rust được hỗ trợ tốt nhất).

Ưu điểm của PostgresML

Chúng ta sẽ lái thử tất cả các tính năng này trong hướng dẫn bằng cách theo một quy trình machine learning điển hình:

  1. Nạp dữ liệu
  2. Tiền xử lý dữ liệu
  3. Huấn luyện mô hình
  4. Tinh chỉnh siêu tham số
  5. Triển khai vào sản xuất

…tất cả đều bên trong cơ sở dữ liệu Postgres. Bắt đầu thôi!

Quy trình học có giám sát end-to-end với PostgresML

Trước khi bắt đầu: Đăng ký gói miễn phí PostgresML

Trước hết, hãy tạo tài khoản miễn phí tại https://postgresml.org/signup:

Trang đăng ký PostgresML

Sau đó, chọn gói miễn phí với tài nguyên khá hào phóng:

Các gói PostgresML cung cấp

Sau khi đăng ký, bạn sẽ vào bảng điều khiển PostgresML. Đây là nơi bạn quản lý các dự án “ML trong cơ sở dữ liệu” và tài nguyên liên quan.

Trang đích của bảng điều khiển PostgresML với một cơ sở dữ liệu đã được tạo

Nếu vào mục “Manage”, bạn có thể mở rộng môi trường theo nhu cầu tính toán của mình:

GIF cho thấy cách scale môi trường PostgresML theo yêu cầu tính toán.

1. Cài đặt và thiết lập Postgres

Đúng như tên gọi, chúng ta cần cài PostgreSQL trên hệ thống để dùng PostgresML. Nếu bạn chưa biết Postgres là gì, đó là cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới (theo lời giới thiệu trên website của họ).

Dưới đây là các hướng dẫn cài đặt PostgreSQL theo nền tảng:

Tôi dùng WSL2 nên chỉ cần làm như sau:

$ sudo apt update
$ sudo apt install postgresql postgresql-contrib
$ sudo passwd postgres  # Set a new Postgres password
# Close and reopen your terminal and done!

Sau đó, xác minh việc cài đặt bằng:

$ psql --version
psql (PostgreSQL) 12.18 (Ubuntu 12.18-0ubuntu0.20.04.1)

psql là client chính thức của Postgres để kết nối và quản trị cơ sở dữ liệu trong terminal.

Tôi hiểu rằng với đa số, việc chạy SQL trong terminal “xấu xí” không lý tưởng, nên bạn cũng có thể cài tiện ích mở rộng VSCode sau khi cài Postgres:

Trang tiện ích mở rộng PostgreSQL trong VSCode

2. Kết nối tới cơ sở dữ liệu

Nhớ trang đích của bảng điều khiển PostgresML chứ? Hãy mở nó ở một thẻ riêng:

Trang bảng điều khiển PostgresML.

Bây giờ, dùng psql, bạn có thể gõ lệnh dưới đây với thông tin xác thực của mình để kết nối tới máy chủ PostgresML:

$ psql -h "host" \
      -U "username" \
      -p 6432 \
      -d "database_name"

Nếu dùng tiện ích VSCode, hãy làm theo các bước sau (trích từ trang cài tiện ích) để làm điều tương tự:

  1. Mở Command Palette (Ctrl + Shift + P).
  2. Tìm và chọn ‘PostgreSQL: New Query’
  3. Trong Command Palette, chọn ‘Create Connection Profile’. Làm theo hướng dẫn để nhập hostname, database, username và password của phiên bản Postgres của bạn.

Và bạn sẽ được kết nối tới cơ sở dữ liệu PostgresML của mình.

Bước tiếp theo là tạo tiện ích mở rộng pgml để chạy các hàm PostgresML:

CREATE EXTENSION IF NOT EXISTS pgml;

NOTICE:  extension "pgml" already exists, skipping
CREATE EXTENSION
-- Your output may be different.

Kiểm tra mọi thứ đã thành công bằng cách in phiên bản pgml:

SELECT pgml.version();

2.8.2 (98f114891db58acd472e068c44272b198274b11d)

3. Nạp dữ liệu

Bây giờ, hãy nạp một ít dữ liệu vào cơ sở dữ liệu. Để đơn giản, chúng ta sẽ chỉ tạo một bảng duy nhất dùng bộ dữ liệu Diamonds từ Kaggle. Bạn có thể tải CSV từ website hoặc dùng đoạn Python dưới đây:

import seaborn as sns

diamonds = sns.load_dataset("diamonds")
diamonds.to_csv("diamonds.csv", index=False)

Sau đó, chạy lệnh CREATE sau với schema đúng:

CREATE TABLE IF NOT EXISTS diamonds (
   index SERIAL PRIMARY KEY,
   carat FLOAT,
   cut VARCHAR(255),
   color VARCHAR(255),
   clarity VARCHAR(255),
   depth FLOAT,
   table_ FLOAT,
   price INT,
   x FLOAT,
   y FLOAT,
   z FLOAT
)

Lệnh trên sẽ tạo bảng tên diamonds để chúng ta có thể nạp các dòng từ file CSV:

INSERT INTO diamonds
   (carat, cut, color, clarity, depth, table_, price, x, y, z)
   FROM '~/full/path/to/diamonds.csv'
   DELIMITER ','
   CSV HEADER;

Cuối cùng, in phần đầu bảng để xác nhận lệnh vừa chạy đã thành công:

SELECT * FROM diamonds
LIMIT 10;

Ảnh chụp năm dòng đầu của bộ dữ liệu diamonds

Giờ thì chúng ta sẵn sàng huấn luyện mô hình!

4. Huấn luyện mô hình

Huấn luyện cơ bản

Huấn luyện mô hình machine learning cho bài toán giám sát được thực hiện bằng hàm pgml.train. Cấu trúc cơ bản như sau:

SELECT pgml.train(
 project_name => 'Diamond prices prediction',
 task => 'regression',
 relation_name => 'diamonds',
 y_column_name => 'price',
 algorithm => 'xgboost'
);

Câu lệnh SQL trên khớp một bộ hồi quy XGBoost với bảng diamonds để dự đoán giá kim cương. Bạn sẽ thấy lệnh chạy rất nhanh (gần như tức thời) dù có hơn 50 nghìn dòng.

Bạn cũng có thể dễ dàng chuyển đổi tác vụ. Đây là cách khớp một bộ phân loại đa lớp (đừng quên đổi tên dự án):

SELECT pgml.train(
 project_name => 'Diamond cut quality prediction',
 task => 'classification',
 relation_name => 'diamonds',
 y_column_name => 'cut',
 algorithm => 'xgboost',
 test_size => 0.1
);

Lưu ý lần này chúng ta chỉ định tham số test_size - cũng hỗ trợ tách tập tùy chỉnh!

Chúng ta cũng đã đổi thuật toán mặc định linear sang xgboost, nhưng có thể là bất kỳ mô hình nào khác từ Scikit-learn hoặc framework được hỗ trợ.

Tiền xử lý

Hãy thử khớp một mô hình random forest lần này:

…

Nhưng khoan! Bộ dữ liệu diamonds có các đặc trưng dạng văn bản cần được mã hóa. Vì XGBoost hỗ trợ mã hóa biến loại bản địa, chúng ta không gặp lỗi ở các truy vấn trước. Điều này có thể không đúng với random forest. Vậy nên, hãy thêm một số bước tiền xử lý vào truy vấn:

SELECT pgml.train(
   project_name => 'Diamond prices prediction',
   task => 'regression',
   relation_name => 'diamonds',
   y_column_name => 'price',
   algorithm => 'random_forest',
   preprocess => '{
       "carat": {"scale": "standard"},
       "depth": {"scale": "standard"},
       "table_": {"scale": "standard"},
       "cut": {"encode": "target", "scale": "standard"},
       "color": {"encode": "target", "scale": "standard"},
       "clarity": {"encode": "target", "scale": "standard"}
   }'::JSONB
);

Logic tiền xử lý được định nghĩa trong một đối tượng JSONB ánh xạ các cột với bước biến đổi. Với đặc trưng số, chúng ta dùng chuẩn hóa (dù với RF thì không nhất thiết). Với cột phân loại, chúng ta dùng target encoding rồi chuẩn hóa.

PostgresML cũng cung cấp các hàm tiền xử lý thay thế khác. Đây là danh sách đầy đủ các tùy chọn mã hóa có sẵn:

Danh sách các hàm mã hóa biến phân loại trong PostgresML

pgml cũng hỗ trợ các kỹ thuật điền khuyết giá trị tiêu chuẩn:

Danh sách các phương pháp điền khuyết giá trị trong PostgresML

Và đây là danh sách các bộ biến đổi tỷ lệ:

Danh sách các hàm chuẩn hóa có trong POstgresML

Dù không có bộ tiền xử lý đồ sộ như Scikit-learn, chừng đó là đủ cho hầu hết bài toán học có giám sát.

Chỉ định siêu tham số

Đến giờ, chúng ta dùng tham số mặc định của thuật toán. Tuy nhiên, mặc định gần như không phải lựa chọn tối ưu cho bài toán thực tế. Để chỉ định giá trị tùy chỉnh, ta dùng tham số hyperparams của pgml.train:

SELECT pgml.train(
   project_name => 'Diamond prices prediction',
   task => 'regression',
   relation_name => 'diamonds',
   y_column_name => 'price',
   algorithm => 'xgboost',
   hyperparams => '{
       "n_estimators": 1000, "max_depth": 5, "eta": 0.01, "subsample": 0.7
   }'::JSONB
);

Lần này, chúng ta khớp bộ hồi quy XGBoost với 1000 cây, độ sâu tối đa 5 và tốc độ học 0,01. Hiện tại, ta chỉ “bắn thử trong bóng tối”, nên các siêu tham số này có thể không cho kết quả chính xác.

Tinh chỉnh siêu tham số

Để tối đa hóa kết quả, ta luôn cần tinh chỉnh siêu tham số trong các bài toán có giám sát. Quy trình này cũng được hỗ trợ trong pgml ngay trong hàm train. Đây là cách thực hiện grid search trên một tập nhỏ tổ hợp siêu tham số:

SELECT pgml.train(
   'Diamond prices prediction',
   algorithm => 'xgboost',
   search => 'grid',
   search_params => '{
       "max_depth": [5, 7],
       "n_estimators": [1000, 1500],
       "eta": [0.1, 0.01, 0.001]
   }'::JSONB
);

Đến đây, tôi chỉ muốn bạn “thưởng thức” điều chúng ta đang làm. Chúng ta đang tinh chỉnh siêu tham số của một bộ hồi quy XGBoost bằng SQL! Câu này tôi chưa từng nghĩ sẽ viết ra.

5. Đánh giá mô hình

Tại thời điểm viết hướng dẫn này, PostgresML chưa có bộ công cụ đánh giá đủ trưởng thành. Chúng ta chỉ có hàm predict. Đây là cách dùng nó để dự đoán trên một mẫu mới, đơn lẻ:

SELECT pgml.predict(
   project_name => 'Diamond prices prediction',
   features => ARRAY[0.7, "Ideal", "A", "IF", 67.9, 56.9, 7024, 5.85, 5.87, 3.71]
);

predict sẽ tự động dùng mô hình có hiệu năng tốt nhất từ các thí nghiệm của bạn. Với hồi quy, đó là mô hình có R-squared cao nhất, còn phân loại thì dùng mô hình có F1-score cao nhất.

Để dùng một mô hình cụ thể cho suy luận, bạn có thể chỉ định ID của nó:

SELECT pgml.predict(
  2' -- Use model with ID of 2,
   features => ARRAY[0.7, "Ideal", "A", "IF", 67.9, 56.9, 7024, 5.85, 5.87, 3.71]
)

Nhưng làm sao tìm được ID mô hình? Đây là đoạn truy vấn in ra một bảng gọn gàng với đúng thông tin đó:

SELECT models.id, models.algorithm, models.metrics
FROM pgml.models
JOIN pgml.projects
 ON projects.id = models.project_id
WHERE projects.name = 'Diamond prices prediction';

Từ câu lệnh này, bạn có thể khám phá nhiều biến và chỉ số về pgml như models.id, pgml.models, pgml.projects, v.v. Hãy thử các câu `SELECT` trên chúng để làm quen.

6. Triển khai mô hình

Không giống MLOps truyền thống, bước này là dễ nhất trong PostgresML. Tiện ích mở rộng pgml tự động “lộ diện” mô hình có hiệu năng tốt nhất từ các thí nghiệm làm mô hình mặc định. Vì vậy, mọi câu lệnh SELECT pgml.predict người dùng gửi đến máy chủ sẽ dùng mô hình đó để suy luận.

Nếu bạn muốn kiểm soát chi tiết hơn mô hình nào được đưa vào sản xuất, bạn có thể điều khiển bằng hàm pgml.deploy. Cấu trúc như sau:

SELECT * FROM pgml.deploy(
   project_name TEXT,
   strategy TEXT DEFAULT 'best_score',
   algorithm TEXT DEFAULT NULL
)

Ngoài best_score, còn có các chiến lược triển khai most_recent và rollback:

Danh sách chiến lược triển khai mô hình trong PostgresML

Bằng cách kết hợp tham số strategy và algorithm, bạn có thể thu hẹp việc triển khai hơn nữa. Ví dụ, câu lệnh dưới đây triển khai mô hình XGBoost có điểm số tốt nhất, không phải mô hình tốt nhất của toàn bộ dự án.

SELECT * FROM pgml.deploy(
   project_name => 'Diamond prices prediction',
   strategy => 'best_score',
   algorithm => 'xgboost'
)

Bạn còn có thể làm gì với PostgresML?

Học có giám sát chỉ là một phần nhỏ của PostgresML. Thực tế, đề xuất giá trị cốt lõi của PostgresML là “Xây dựng ứng dụng AI trong Postgres.” Để minh họa, họ thậm chí đặt một trình soạn thảo SQL nhỏ ngay trên trang chủ:

Ảnh chụp màn hình trang chủ PostgresML

Bạn có thể chạy các ví dụ đó trực tiếp trong môi trường bạn đã dùng trong hướng dẫn này!

Vậy, nếu muốn xây dựng một dịch vụ machine learning hướng người dùng bằng PostgresML, bạn sẽ làm thế nào? Dưới đây là một số bước có thể có (sau khi bạn đã có mô hình sẵn sàng):

  1. Xây dựng giao diện người dùng — nhiều khả năng là một website. Hiện nay, bạn có thể dựng website trong vài giờ với các công cụ như Streamlit và Taipy được thiết kế riêng cho ứng dụng ML.
  2. Triển khai thành phần backend bằng ngôn ngữ phía máy chủ như Python hoặc Node.js (tùy cách bạn xây dựng giao diện người dùng).
  3. Dùng thư viện như psycopg2 (Python) hoặc pg-promise (JavaScript) để kết nối tới cơ sở dữ liệu PostgresML.
  4. Truy xuất dữ liệu cần thiết cho dự đoán từ các bảng của bạn bằng các truy vấn SQL.
  5. Thực hiện các bước tiền xử lý dữ liệu cần thiết trong mã backend trước khi đưa vào mô hình machine learning.
  6. Khi người dùng tương tác với UI và kích hoạt dự đoán, máy chủ backend nhận thông tin liên quan và gọi pgml.predict.

Đây là phác thảo tổng quan có thể thay đổi đáng kể tùy trường hợp sử dụng.

Kết luận

PostgresML giới thiệu một mô hình hoàn toàn mới trong machine learning, nên cần nhiều hơn một hướng dẫn để làm chủ. Để củng cố hiểu biết và khám phá các cách dùng khác của PostgresML, hãy đọc phần use-cases trong tài liệu PostgresML.

Nếu kỹ năng SQL của bạn hơi “rỉ sét”, bạn có thể học khóa ngắn của DataCamp về tạo cơ sở dữ liệu PostgreSQL hoặc cả lộ trình Data Analyst in SQL.

Vì PostgresML tập trung mạnh vào AI, bạn cũng có thể học một số nền tảng AI:


Bexruz (Bex) Tuychiev's photo
Author
Bexruz (Bex) Tuychiev
LinkedIn

Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn. 

Chủ đề
Trí tuệ Nhân tạo
SQL

Tiếp tục hành trình AI của bạn ngay hôm nay!

Khóa học

Các khái niệm về Large Language Models (LLMs)

2 giờ
113.3K
Khám phá toàn bộ tiềm năng của LLM với khóa học khái niệm của chúng tôi, bao gồm các ứng dụng LLM, phương pháp đào tạo, cân nhắc đạo đức và nghiên cứu mới nhất.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm