Bỏ qua, đến nội dung
Kawa Notes
Quay lại

02 · Nhờ AI đọc và tóm tắt tài liệu ngay trên máy

Các bài trong chủ đề

Lộ trình cốt lõi dành cho Kỹ sư AI: Kỹ thuật Mô hình Ngôn ngữ Lớn (LLM), RAG, QLoRA và AI Agents

  1. 01 · Chạy LLM trên máy tính của bạn với Ollama
  2. 02 · Nhờ AI đọc và tóm tắt tài liệu ngay trên máy
Minh họa việc nhờ model local tóm tắt một thông báo tiếng Việt. Đây là tranh minh họa, không phải ảnh của đoạn thông báo dùng trong bài.
Minh họa việc nhờ model local tóm tắt một thông báo tiếng Việt. Đây là tranh minh họa, không phải ảnh của đoạn thông báo dùng trong bài.

Bạn có một thông báo, email, hoặc đoạn tài liệu tiếng Việt cần đọc kỹ — tóm tắt ngắn, chỉ ra việc phải làm — nhưng không muốn dán nguyên văn vào một chatbot trên trình duyệt?

Đây là việc hợp để làm với model local: đoạn văn không cần rời khỏi máy, và bạn xem được model nhỏ và model lớn hơn xử lý khác nhau ra sao. Ollama từ bài trước đã đủ để bắt đầu; bài này thêm cách đặt vai và đưa tài liệu vào prompt.

Đi hết bài, bạn sẽ nhờ được một LLM tóm tắt một thông báo tiếng Việt trên máy mình, biết khi nào cần siết system prompt, và thấy thinking model tách mạch suy nghĩ khỏi câu trả lời thế nào.

Việc cần làm

Bài trước, 01 · Chạy LLM trên máy tính của bạn với Ollama, giúp bạn cài Ollama và chạy được một LLM trên máy. Bài này dùng đúng setup đó cho một việc cụ thể: đọc một thông báo tiếng Việt, tóm tắt thành vài ý cư dân cần biết và cần làm.

Mình chọn việc này vì đây là kiểu văn bản hay gặp — thông báo tòa nhà, email nội bộ, hướng dẫn ngắn — và vì mình có thể đối chiếu từng câu trả lời với văn bản gốc. Đoạn thông báo trong bài là ví dụ mình viết sẵn để chạy lệnh, không phải một thông báo thật của tòa nhà mình ở. Cách làm giống nhau với email hoặc tài liệu của bạn: đưa nguyên văn vào prompt, yêu cầu rõ output, rồi tự kiểm tra sự kiện.

Những khái niệm dùng trong bài

Phần cài đặt, RAM, quantization và context window đã có ở bài trước, nên mình không nhắc lại. Ở đây chỉ thêm vài ý sẽ dùng ngay.

Khi nhờ model làm một việc lặp lại, mình tách vai trò khỏi nội dung lần này. Vai trò (giọng, định dạng, điều được phép và không được phép) để ở system prompt. Đoạn tài liệu và yêu cầu cụ thể để ở tin nhắn của user. Trong terminal, lệnh /set system gắn system prompt cho phiên đang mở. Qua API, đó là một phần tử "role": "system" trong danh sách messages.

Một số model trên Ollama là thinking model: trước khi đưa câu trả lời, chúng sinh ra một mạch suy nghĩ riêng. Trên CLI, mạch đó hiện giữa Thinking... và ...done thinking. Trong JSON của API, trường thinking tách khỏi content. Thinking không tự biến câu trả lời thành đúng hơn — lát nữa mình sẽ cho xem một lần chạy thật, khi mạch suy nghĩ còn lệch sự kiện dù ba gạch đầu dòng trông gọn.

Nếu chưa rõ model trên máy hỗ trợ thinking hay không, hỏi chính Ollama:

ollama show qwen3:0.6b

Trong phần capabilities, nếu có thinking thì model đó bật được chế độ này.

Chuẩn bị

Cần Ollama đã chạy như trong bài trước, và còn chỗ trên ổ đĩa cùng RAM cho model bạn chọn. Các số liệu dưới đây lấy từ library của Ollama tại thời điểm viết, và có thể thay đổi.

ModelDung lượng file (khoảng)Việc dùng trong bài
gemma3:270mkhoảng 292 MBBaseline: đã có từ bài trước
phi3khoảng 2,2 GBSo sánh với bản nhỏ trên cùng một thông báo
qwen3:0.6bkhoảng 523 MBThinking model, nhẹ, phù hợp máy không dư RAM
gpt-oss:20bkhoảng 14 GBThinking model lớn hơn, chỉ khi máy đủ mạnh

Máy đủ mạnh (RAM khoảng 16 GB trở lên, hoặc GPU phù hợp) thì có thể chạy ollama run gpt-oss:20b. Máy yếu hơn thì dùng qwen3:0.6b với cờ --think, như trong ảnh ở phần thinking. Không cần cả bốn model để đọc bài; ít nhất hãy có gemma3:270m, rồi thêm một bản khác nếu máy còn chỗ.

Download model chưa có:

ollama pull phi3
ollama pull qwen3:0.6b

Đoạn thông báo dùng trong bài

Mình dùng một thông báo cắt nước và dừng thang máy, viết theo kiểu văn bản ban quản lý tòa nhà hay gửi cư dân. Ngày tháng trong ví dụ là 17–18/11/2026, chỉ để có mốc cụ thể mà đối chiếu.

Tạo một file tên prompt-tom-tat.txt trong thư mục đang mở của terminal, với đúng nội dung sau — gồm cả yêu cầu và thông báo:

Đọc thông báo sau. Tóm tắt thành đúng 3 gạch đầu dòng bằng tiếng Việt. Chỉ nêu việc cư dân cần biết và cần làm. Không thêm thông tin không có trong thông báo.

Thông báo từ ban quản lý tòa nhà:

Từ 8 giờ đến 16 giờ ngày 18/11/2026, hệ thống cấp nước sẽ tạm ngưng để thay van tổng tại tầng hầm B1. Cư dân vui lòng trữ nước sinh hoạt từ tối 17/11. Thang máy số 2 sẽ dừng hoạt động trong cùng khung giờ để phục vụ vận chuyển thiết bị; thang máy số 1 vẫn chạy bình thường.

Nếu hộ gia đình có người già hoặc trẻ nhỏ, ban quản lý sẽ bố trí hai bình nước 20 lít tại sảnh tầng 1, nhận từ 7 giờ sáng. Liên hệ số nội bộ 103 trước 20 giờ ngày 17/11 để đăng ký. Sau 16 giờ ngày 18/11, nếu nước chưa về, vui lòng không tự ý chỉnh van trong căn hộ — hãy gọi lại số 103.

Ban quản lý xin lỗi vì sự bất tiện này.

Ba việc dễ kiểm tra khi đọc câu trả lời:

  • Nước tạm ngưng 8–16 giờ ngày 18/11/2026; trữ nước từ tối 17/11.
  • Thang máy số 2 dừng trong cùng khung giờ; thang máy số 1 vẫn chạy.
  • Hộ có người già hoặc trẻ nhỏ đăng ký số nội bộ 103 trước 20 giờ ngày 17/11 để nhận nước tại sảnh tầng 1; sau 16 giờ ngày 18/11, nếu nước chưa về thì không tự chỉnh van, hãy gọi lại 103.

Bước 1: Tóm tắt với model đã có sẵn

Chạy gemma3 bản 270 triệu parameters — model mình đã dùng để chào trong bài trước:

ollama run gemma3:270m "$(cat prompt-tom-tat.txt)"

Lần chạy trên máy mình cho ra một đoạn văn liền, không phải ba gạch đầu dòng:

Lần chạy thật với gemma3:270m và file prompt-tom-tat.txt: câu trả lời trôi nhưng đảo sự kiện thang máy số 2.
Lần chạy thật với gemma3:270m và file prompt-tom-tat.txt: câu trả lời trôi nhưng đảo sự kiện thang máy số 2.

Câu tiếng Việt trôi, hầu hết các mốc thời gian và số 103 còn đó, nhưng có ít nhất hai chỗ lệch. Prompt xin đúng 3 gạch đầu dòng, model trả về một đoạn văn. Và câu “Thang máy số 2 sẽ hoạt động bình thường” đảo ngược sự kiện: thông báo nói số 2 dừng, số 1 mới chạy bình thường. “Rà soát trữ nước” cũng không phải đúng lời thông báo (“vui lòng trữ nước”).

Đây là lý do mình không dừng ở lời chào. Bản nhỏ có thể viết trôi mà vẫn sai một chi tiết mà cư dân cần biết.

Bước 2: Thử một model khác trên cùng thông báo

Cùng file prompt, lần này với Phi-3 Mini (khoảng 3,8 tỷ parameters, file khoảng 2,2 GB):

ollama run phi3 "$(cat prompt-tom-tat.txt)"
Lần chạy thật với phi3 trên cùng file prompt: tiếng Việt gần như khó dùng, dù một vài chi tiết vẫn còn.
Lần chạy thật với phi3 trên cùng file prompt: tiếng Việt gần như khó dùng, dù một vài chi tiết vẫn còn.

Output lần này gần như khó dùng: câu tiếng Việt gãy, trộn từ không liên quan (“đem lại khám phá”, “đầu mươi tuổi học”), mặc dù vài mảnh đúng vẫn còn (thang máy số 2 dừng, hai bình 20 lít tại sảnh tầng 1, số 103). Model nặng hơn bản 270 triệu parameters, vậy mà trên đúng việc này lại kém hơn rõ.

Mình giữ lại kết quả này vì nó phá một kỳ vọng dễ có: chọn model chỉ vì số parameters. Phi-3 Mini chủ yếu mạnh ở tiếng Anh; trên máy mình, cùng một việc “xin dời lịch họp”, bản tiếng Anh của phi3 bám yêu cầu hơn bản tiếng Việt. Khi việc của bạn là đọc tài liệu tiếng Việt, hãy thử trên đúng ngôn ngữ đó, rồi mới kết luận model nào vừa.

Siết vai trò bằng system prompt

Prompt vừa rồi nhồi cả vai trò lẫn thông báo vào một tin nhắn. Khi mình muốn lặp lại cùng một khuôn — luôn 3 gạch đầu dòng, không bịa, giữ nguyên ngày giờ — thì tách vai trò ra system prompt cho gọn.

Trong một phiên tương tác:

ollama run gemma3:270m

Rồi gõ:

/set system Bạn là trợ lý đọc tài liệu tiếng Việt. Chỉ tóm tắt thành đúng 3 gạch đầu dòng. Chỉ nêu việc người đọc cần biết và cần làm. Không thêm thông tin không có trong văn bản. Nếu một chi tiết không chắc, hãy nói là không rõ chứ đừng suy ra.

Sau đó dán thông báo vào, không cần nhắc lại toàn bộ quy tắc mỗi lần. /set system chỉ có hiệu lực trong phiên đang mở; thoát bằng Ctrl+D thì mất. Muốn giữ lâu dài, dùng API với một tin nhắn system, hoặc tạo một model tùy chỉnh bằng Modelfile.

System prompt giúp model bám khuôn hơn, nhưng không đảm bảo hết lỗi sự kiện. Vẫn đối chiếu với văn bản gốc — nhất là số, ngày, và chi tiết như “thang máy nào dừng”.

Thinking model: tách mạch suy nghĩ khỏi câu trả lời

Một hướng khác là dùng model có chế độ thinking: nó suy nghĩ một đoạn, rồi mới viết câu trả lời cuối.

Minh họa thinking model: mạch suy nghĩ hiện riêng, rồi mới đến câu trả lời — ở đây là một bản tóm tắt.
Minh họa thinking model: mạch suy nghĩ hiện riêng, rồi mới đến câu trả lời — ở đây là một bản tóm tắt.

Máy đủ mạnh thì chạy:

ollama run gpt-oss:20b

Máy yếu hơn thì dùng bản nhẹ có thinking, đúng lệnh mình đã chạy trên máy:

ollama run qwen3:0.6b --think "$(cat prompt-tom-tat.txt)"

Bài này minh họa thinking bằng qwen3:0.6b: lệnh và ảnh dưới đây là lần chạy thật trên máy. Nếu máy bạn đủ điều kiện trong bảng chuẩn bị, hãy tự chạy gpt-oss:20b với cùng file prompt và so kết quả — mình không gắn output của bản 20b vào đây.

Lần chạy thật: ollama run qwen3:0.6b --think với cùng file prompt. Cả mạch thinking và ba gạch đầu dòng đều hiện trên terminal.
Lần chạy thật: ollama run qwen3:0.6b --think với cùng file prompt. Cả mạch thinking và ba gạch đầu dòng đều hiện trên terminal.

Ba gạch đầu dòng đã ra, và gạch thứ hai đúng việc: liên hệ số 103 trước 20 giờ ngày 17/11 để đăng ký nhận nước. Đó là điểm gemma3:270m không làm được ở lần chạy trước (nó không dùng gạch đầu dòng).

Nhưng chưa phải lần chạy sạch. Mạch thinking vẫn sai sự kiện: nó viết cả hai thang máy đều dừng, và ghi hạn đăng ký thành “20-11-17”. Câu trả lời cuối cũng còn chỗ lệch: gạch thứ nhất chỉ nói chung “thời gian nước tạm dừng” mà không ghi 8–16 giờ ngày 18/11, không nói thang máy nào chạy; gạch thứ ba đọc như “gọi 103 sau 16 giờ để không tự ý chỉnh van”, trong khi thông báo nói nếu nước chưa về thì đừng tự chỉnh van, hãy gọi lại 103.

Vậy thinking cho mình một cửa sổ để bắt lỗi, chứ không phải tem đảm bảo. Hãy đọc cả hai phần trước khi dùng.

Trong phiên tương tác, bật hoặc tắt thinking bằng /set think và /set nothink. Muốn chạy một lần mà ẩn mạch suy nghĩ trên màn hình:

ollama run qwen3:0.6b --think --hidethinking "$(cat prompt-tom-tat.txt)"

Qua API, gửi "think": true (hoặc false) và đọc riêng message.thinking với message.content. Tài liệu nằm ở Thinking. Danh sách model có nhãn thinking: ollama.com/search?c=thinking.

Cùng một khuôn, làm việc khác

Khuôn “đưa tài liệu vào, siết định dạng, tự kiểm tra sự kiện” dùng được cho việc khác, không chỉ tóm tắt.

Hỏi nghĩa một thuật ngữ trong thông báo, vẫn bằng model local:

ollama run gemma3:270m "Giải thích ngắn, bằng tiếng Việt, cụm 'van tổng' trong ngữ cảnh thay van cấp nước tại tầng hầm tòa nhà. Không thêm chi tiết kỹ thuật không cần thiết."

Nhờ soạn một tin nhắn trả lời ban quản lý — ví dụ đăng ký nhận nước cho hộ có trẻ nhỏ — nhưng chỉ dùng thông tin có trong thông báo. Hoặc hỏi đúng một sự kiện: “Theo thông báo, thang máy nào dừng, thang máy nào vẫn chạy?” Câu hỏi hẹp thường dễ bắt lỗi hơn một bản tóm tắt dài.

Gọi API với system prompt tách riêng, "stream": false để nhận một JSON:

curl http://localhost:11434/api/chat \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:0.6b",
    "think": true,
    "messages": [
      {"role": "system", "content": "Bạn là trợ lý đọc tài liệu tiếng Việt. Chỉ trả lời bằng đúng 3 gạch đầu dòng. Không thêm thông tin không có trong văn bản."},
      {"role": "user", "content": "Tóm tắt thông báo sau cho cư dân:\n\nTừ 8 giờ đến 16 giờ ngày 18/11/2026, hệ thống cấp nước sẽ tạm ngưng để thay van tổng tại tầng hầm B1. Cư dân vui lòng trữ nước sinh hoạt từ tối 17/11. Thang máy số 2 sẽ dừng hoạt động trong cùng khung giờ; thang máy số 1 vẫn chạy bình thường."}
    ],
    "stream": false
  }'

Đổi "model" nếu bạn đang dùng bản khác. Chi tiết các trường nằm ở API /api/chat.

Bài tập tự luyện

  1. Chạy lại đúng lệnh ở bước 1 với gemma3:270m. Gạch ra những chỗ khác với ba việc dễ kiểm tra ở trên, đặc biệt là thang máy nào dừng.
  2. Nếu đã có phi3, chạy cùng prompt-tom-tat.txt một lần bằng tiếng Việt (như bước 2), rồi nhờ model tóm tắt một bản dịch tiếng Anh ngắn của cùng thông báo. So xem ngôn ngữ nào model bám sự kiện hơn.
  3. Với qwen3:0.6b, chạy một lần có --think và một lần thêm --hidethinking. Đối chiếu mạch thinking với ba gạch đầu dòng: chỗ nào thinking đã sai mà câu trả lời vẫn trông gọn?
  4. Dùng curl như trên, rồi gửi thêm một lượt user: “Theo thông báo, thang máy nào dừng?” Đọc cả thinking lẫn content trong JSON trả về.

Khi kết quả không như ý

Hầu hết lỗi ở bài này không phải do Ollama “hỏng”, mà do model trượt việc hoặc không vừa ngôn ngữ.

  • Trả lời trôi nhưng sai sự kiện: đúng như lần chạy gemma3:270m ở trên. Hãy giữ văn bản gốc bên cạnh và kiểm tra từng mốc, từng số. Đừng dùng bản tóm tắt nếu chưa đối chiếu.
  • Không chịu dùng gạch đầu dòng: siết lại bằng system prompt, hoặc thử model khác trên cùng file.
  • Tiếng Việt gãy hoặc trộn từ lạ: như lần chạy phi3 trong bài. Đây không phải dấu hiệu máy thiếu RAM. Hãy thử một model khác, hoặc làm cùng việc bằng tiếng Anh để xem khác biệt nằm ở ngôn ngữ hay ở model.
  • Thinking dài, câu trả lời cuối vẫn thiếu chi tiết: đọc mạch thinking để bắt chỗ model đã hiểu sai, rồi hỏi lại một câu hẹp hơn (“thang máy nào dừng?”) thay vì xin tóm tắt lần nữa.
  • /set system không còn tác dụng: bạn đã thoát phiên. Đặt lại, hoặc chuyển sang API / Modelfile.
  • Máy chậm hoặc hết bộ nhớ khi kéo model lớn: ollama stop model đang nạp, chọn bản nhẹ hơn. Điều kiện cho gpt-oss:20b nằm ở bảng chuẩn bị; không đủ thì dùng qwen3:0.6b --think.
  • Lệnh cat không chạy trên PowerShell: mở file trong trình soạn thảo, copy prompt, rồi chạy ollama run MODEL và dán vào. Hoặc lưu file và dùng đúng cú pháp đọc file của shell bạn đang mở.

Các lệnh ollama ps, ollama ls, ollama stop, ollama rm vẫn như bài trước.

Câu hỏi thường gặp

Đoạn thông báo của mình có bị gửi lên ollama.com không? Khi model chạy local, Ollama xử lý trên máy bạn; tài liệu của họ cho biết họ không thấy prompt hay dữ liệu trong trường hợp này. Việc download model vẫn cần mạng. Đừng dán tài liệu nhạy cảm vào một chatbot trên trình duyệt nếu bạn đang cố giữ dữ liệu ở máy.

Thinking có nghĩa là câu trả lời đúng hơn không? Không tự động. Thinking tách mạch suy nghĩ ra để bạn đọc được, và đôi khi giúp model làm theo khuôn (như ba gạch đầu dòng). Lần chạy qwen3:0.6b trong bài cho thấy thinking vẫn có thể ghi sai sự kiện. Vẫn phải đối chiếu với văn bản gốc.

Mình có bắt buộc phải chạy gpt-oss:20b không? Không. Đó là lựa chọn khi máy đủ RAM hoặc GPU. Máy yếu hơn dùng được thinking với qwen3:0.6b. Chọn theo việc và theo máy, không theo tên model.

Model nào hợp để đọc tài liệu tiếng Việt? Không có một đáp án cố định. Hãy thử ít nhất hai model trên cùng một đoạn văn và một danh sách sự kiện cần giữ. Lần chạy trong bài cho thấy bản nhỏ hơn có thể viết tiếng Việt trôi hơn một bản nặng hơn, trong khi bản nặng hơn lại có thể mạnh ở tiếng Anh.

Tài liệu tham khảo

Các liên kết dưới đây mình đã kiểm tra là mở được tại thời điểm viết bài:

Model local chỉ đáng tin khi bạn còn giữ văn bản gốc bên cạnh và chịu đọc lại câu trả lời. Lần chạy trong bài đủ để thấy chỗ model nhỏ viết trôi nhưng đảo sự kiện, chỗ model nặng hơn lại rối tiếng Việt, và chỗ thinking trông gọn mà mạch suy nghĩ vẫn sai. Giữ thói quen đối chiếu đó khi bạn đưa email hoặc tài liệu của chính mình vào.



Bài trước
01 · Chạy LLM trên máy tính của bạn với Ollama