Lập trình
xử lý dữ liệu

Học kì 1, năm học 2026–2027

Viện Trí tuệ nhân tạo, Trường ĐH Công nghệ, ĐHQGHN

Bài 11
Xử lý dữ liệu phi cấu trúc bằng LLM

Bài trước

  • Làm sạch dữ liệu có cấu trúc: giá trị thiếu, ngoại lai, trùng lặp.
  • Đóng gói các kiểm tra thành bộ quy tắc QA chạy lại được.

Bài này: đến lượt phần dữ liệu mà các quy tắc đó không xử lý được.

Tổng quan

  1. Dữ liệu phi cấu trúc
  2. Phương pháp đối chứng không dùng LLM
  3. Gọi LLM từ Python
  4. Đầu ra có cấu trúc & xử lý hàng loạt
  5. Đánh giá chất lượng, chi phí & cạm bẫy
  6. Làm việc với AI thì sao?

1.
Dữ liệu phi cấu trúc

Cột khó xử lý nhất trong bảng thường là cột chứa văn bản tự do.

Một cột không giống các cột còn lại

Bảng reviews của Inside Airbnb tại Santiago có khoảng 690 nghìn đánh giá:

Có thể lọc theo date và nối bảng theo listing_id; riêng comments chưa thể đưa thẳng vào groupby.

Câu hỏi thật mà bảng này phải trả lời

Yêu cầu phân tích
"Trong 2.000 đánh giá gần nhất, khách chê điều gì nhiều nhất — và khu vực nào bị chê về độ ồn nhiều nhất?"

Không có cột complaint nào để value_counts() cả. Câu trả lời nằm bên trong văn bản.

Phổ dữ liệu: từ bảng đến văn bản

Có cấu trúc
bảng, cột có kiểu
listings.csv
→
Bán cấu trúc
JSON, log, HTML
API bài 6
→
Phi cấu trúc
văn bản tự do, ảnh, âm thanh
bảng reviews

Càng sang phải càng giàu thông tin; càng khó đưa vào groupby. Phần lớn dữ liệu doanh nghiệp nằm ở phía phải.

Chiến lược: không phân tích; hãy biến đổi văn bản

Văn bản
"Phòng sạch nhưng ồn quá…"
→
Trích xuất
dùng luật / LLM
→
Bảng nhãn
sentiment, aspects, language
→
pandas
groupby, pivot, plot
Quan trọng Chuyển dữ liệu phi cấu trúc thành bảng, rồi dùng lại các công cụ pandas đã học từ bài 4–10.

Bài toán của bài này

Với mỗi đánh giá, mục tiêu là tạo được một dòng như sau:

comments (đầu vào) sentiment aspects_khen aspects_chê lang
"Great location, but so noisy at night…" mixed location noise en
"Depto impecable, anfitrión atento." positive cleanliness, host — es

Có bảng này rồi thì câu hỏi ở đầu bài chỉ còn là một groupby.

2.
Phương pháp
đối chứng
không dùng LLM

Trước khi dùng LLM, hãy bắt đầu bằng công cụ đã học ở bài 7.

Trích xuất khía cạnh bằng từ khoá

Mỗi khía cạnh một bộ từ khoá, quét bằng str.contains:

Đoạn mã ngắn này có thể xử lý 690 nghìn đánh giá trong vài giây.

Trích xuất cảm xúc bằng từ điển

Đếm từ tích cực trừ từ tiêu cực — thô nhưng có ngay con số:

Các từ điển đầy đủ hơn, như VADER, vẫn dựa trên cùng nguyên lý đếm từ.

Phương pháp đối chứng làm tốt gì, hạn chế gì?

Làm tốt

  • Nhanh: cả bảng trong vài giây.
  • Miễn phí, chạy lại ra đúng kết quả cũ.
  • Giải thích được từng kết quả.

Hạn chế

  • "not clean at all" → dính từ khoá clean.
  • Mỗi ngôn ngữ phải soạn lại từ khoá.
  • Khó xử lý câu mỉa mai, viết tắt hoặc sai chính tả.

Vai trò của phương pháp đối chứng

Quan trọng Phương pháp đối chứng (baseline) là mốc so sánh để xác định LLM có cải thiện kết quả đủ nhiều so với chi phí hay không.

Xây dựng phương pháp đối chứng trước, rồi đánh giá cả hai phương pháp trên cùng một bộ dữ liệu gán nhãn (phần 5).

3.
Gọi LLM từ Python

LLM có thể xử lý nội dung văn bản và được gọi từ mã nguồn như các API ở bài 6.

Chat và API: 2 cách dùng một mô hình

Giao diện chat

  • Người gõ, người đọc.
  • Tiện lợi cho việc khám phá, hỏi đáp.
  • Không lặp lại được hàng ngàn lần.

Gọi qua API

  • Mã nguồn gửi yêu cầu và nhận phản hồi.
  • Nằm trong pipeline, chạy hàng loạt.
  • Cách dùng của môn này.

Gemini API: Có gói miễn phí

  • Lấy khóa API (API key) ở Google AI Studio (aistudio.google.com) — gói miễn phí, không cần thẻ.
  • Các mô hình dùng trong môn:
Mô hình Hợp với Giá trả phí (1M token vào/ra)
gemini-3.1-flash-lite trích xuất hàng loạt — hạn mức miễn phí cao $0.25 / $1.50
gemini-3.5-flash văn bản khó, cần suy luận $1.50 / $9.00

Gói miễn phí có hạn mức theo ngày và theo phút. Xem mức hiện hành trong AI Studio, mục Rate limits, vì các con số này có thể thay đổi.

Khóa API cần được bảo mật như mật khẩu

Cẩn thận Không viết khóa thẳng vào mã nguồn, không commit lên GitHub và không dán vào chat hoặc ảnh chụp màn hình. Nếu khóa bị lộ, người khác có thể dùng hạn mức hoặc tài khoản trả phí của bạn.

Lần gọi đầu tiên

Mỗi lời gọi gửi một yêu cầu và nhận một phản hồi. Cách làm tương tự requests.get() ở bài 6, nhưng API này xử lý nội dung văn bản.

Prompt = hướng dẫn + dữ liệu

Văn tự do chưa thể đưa thẳng vào bảng

Chạy lại 3 lần, nhận 3 kiểu trả lời:

Cả ba câu trả lời có nội dung tương đương nhưng không thể chuyển ổn định thành các cột. Vì vậy, mô hình cần trả lời theo một mẫu cố định → phần 4.

4.
Đầu ra có cấu trúc
& xử lý hàng loạt

Yêu cầu LLM điền biểu mẫu thay vì trả lời bằng văn xuôi.

Khai báo mẫu trả lời bằng Pydantic

Khai báo biểu mẫu mà mô hình phải điền, gồm kiểu dữ liệu và tập giá trị được phép:

Literal = enum: ngoài danh sách này là không hợp lệ.

Truyền schema vào lời gọi API

Từ chuỗi JSON, model_validate_json tạo đối tượng và đồng thời kiểm tra kiểu dữ liệu.

Schema + enum: tầng kiểm tra đầu tiên

  • Mô hình tạo nhãn ngoài danh mục ("wifi_speed") → bước validation từ chối, không đưa kết quả vào bảng.
  • Thiếu trường, sai kiểu → lỗi ngay tại chỗ, không âm thầm thành NaN.
Quan trọng Ràng buộc trước bằng schema và enum hiệu quả hơn nhiều so với làm sạch sau. Đây là tư duy QA của bài 10 áp dụng cho đầu ra của LLM.

Chạy hàng loạt: vòng lặp có kỷ luật

Gói miễn phí giới hạn số yêu cầu mỗi phút. Nếu không có khoảng chờ sleep, chương trình có thể gặp lỗi 429 khi đang chạy.

Bộ nhớ đệm: không gọi lại kết quả đã có

  • Bộ nhớ đệm (cache) giúp tiết kiệm hạn mức; chạy lại notebook không tạo thêm yêu cầu.
  • Trong bài tập lớn: người chấm có thể chạy pipeline với --skip-llm — đọc cache, không cần khóa API.

Chuyển kết quả về DataFrame

Câu hỏi mở đầu ("khách chê gì nhiều nhất?") giờ là một groupby bình thường.

5.
Đánh giá, chi phí
& cạm bẫy

"Trông có vẻ đúng" chưa phải là đúng.

LLM có thể bịa thông tin

Ba lỗi bịa thông tin (hallucination) ghi nhận khi soạn bài:

  • Chỉ khen vị trí → mô hình thêm cleanliness.
  • Chỉ có 4 từ → mô hình suy ra cảm xúc và 3 khía cạnh.
  • Viết bằng tiếng Tây Ban Nha → mô hình trả nhãn "pt".
Cẩn thận Đầu ra của LLM có thể trôi chảy dù sai. Câu chữ mạch lạc không chứng minh kết quả đúng.

Bộ đánh giá: ~100 nhãn gán tay

  1. Rút ~100 đánh giá theo phương pháp ngẫu nhiên và bảo đảm đủ các ngôn ngữ chính.
  2. Cả nhóm tự đọc, tự gán nhãn theo đúng schema; bất đồng thì thảo luận, chốt hướng dẫn gán.
  3. Chạy LLM và phương pháp đối chứng trên đúng 100 đánh giá đó, rồi so với nhãn tay.
Quan trọng Bộ nhãn tay đóng vai trò như bộ kiểm thử của dữ liệu. Nếu thiếu bộ này, nhận xét về chất lượng chỉ dựa trên cảm nhận.

Đo xong mới biết ai hơn ai, hơn ở đâu

Kết quả minh hoạ trên 100 nhãn tay (notebook bài này làm bản nhỏ hơn):

Cảm xúc (accuracy) Khía cạnh (F1) Ngôn ngữ (accuracy)
Đối chứng bằng từ khoá 0.62 0.48 0.71
LLM (flash-lite) 0.89 0.81 0.97

Chênh lệch lớn nhất nằm ở phủ định và dữ liệu đa ngôn ngữ. Đây là phần giá trị gia tăng của LLM trong ví dụ này.

Phân tích lỗi

  • Liệt kê các đánh giá bị LLM gán sai → chúng có chung kiểu lỗi nào không (văn bản dài, mỉa mai hay thuộc một ngôn ngữ cụ thể)?
  • Sửa prompt hoặc enum theo kiểu lỗi tìm được → đo lại trên đúng bộ 100.
Cách làm tốt Quy trình lặp: đo → xem lỗi → sửa prompt/schema → đo lại. Mỗi thay đổi prompt đều phải được kiểm tra trên cùng một bộ nhãn, tương tự việc chạy lại test sau khi sửa mã nguồn.

Chi phí tính bằng token

Mỗi lần tương tác trả về số token đã dùng:

Ước tính cho 100.000 đánh giá (trung bình đo trên dữ liệu minh hoạ: ~175 token vào, ~36 token ra) với flash-lite ($0.25 / $1.50 mỗi 1M token):

17,5M token vào ≈ $4.4  +  3,6M token ra ≈ $5.4 → ~$9.8

Gói miễn phí có thể xử lý mẫu vài nghìn đánh giá nếu chạy trong nhiều ngày. Với bài tập lớn, cần chọn mẫu phù hợp và lưu kết quả vào cache.

Khi nào dùng gì?

Tình huống Công cụ hợp lý
Mẫu rõ ràng (mã bưu điện, giá, ngày…) biểu thức chính quy — bài 7
Ngữ nghĩa, đa ngôn ngữ, quy mô vừa LLM + schema + bộ nhãn tay
Quyết định hệ trọng từng ca (pháp lý, y tế…) con người thẩm định — LLM chỉ hỗ trợ sàng lọc

Luôn tự hỏi: sai 10% thì phân tích của bạn còn đứng vững không?

Tổng kết

  • Dữ liệu phi cấu trúc: đổi dạng thành bảng rồi mới phân tích.
  • Phương pháp đối chứng trước, LLM sau — cả hai cùng được đo trên một bộ nhãn tay.
  • Pipeline LLM cần có schema, enum, giới hạn tốc độ và cache.
  • Chất lượng đo bằng nhãn tay, chi phí đo bằng token — không đo thì không kết luận.

Làm việc với AI thì sao?

🤖 Làm việc với AI
AI làm tốt Viết mã nguồn gọi API, đề xuất danh mục khía cạnh và sinh đánh giá giả để thử schema.
AI hay sai Bịa tham số SDK (SDK Gemini đổi lớn năm 2026 — code mẫu cũ trên mạng rất nhiều); bỏ qua giới hạn tốc độ; tự thay đổi enum trong quá trình xử lý.

Kiểm chứng thế nào?

🤖 Làm việc với AI
  • Mã nguồn gọi API: đối chiếu tài liệu chính thức; thử trên 1–2 mẫu trước khi chạy hàng loạt.
  • Nhãn do AI gán: đo trên bộ nhãn tay trước khi sử dụng trong phân tích.

Đây là quy trình kiểm chứng AI mà chính sách môn yêu cầu.

Đọc thêm

  • Gemini API — Structured output, Rate limits, Pricing: ai.google.dev/gemini-api/docs
  • Đề bài tập lớn — mục "Hợp phần LLM": yêu cầu đầy đủ về phương pháp đối chứng, bộ nhãn tay ≥100 và chi phí.
  • Bài 7 (biểu thức chính quy) và bài 10 (bộ quy tắc QA) bổ sung hai thành phần còn lại của pipeline trong bài này.