Mô hình ngôn ngữ làm gì
Trước khi học cách viết prompt cho tốt, ta cần một bức tranh đơn giản nhưng đúng về thứ đang ngồi phía bên kia màn hình. Khi bạn gõ một câu vào một công cụ như ChatGPT, Claude hay Gemini, bạn đang nói chuyện với một mô hình ngôn ngữ lớn, tiếng Anh gọi là large language model, viết tắt LLM. Ở buổi này ta không đi vào toán học hay mạng nơ-ron; chỉ cần vài hình dung đủ chắc để giải thích vì sao prompt lại quan trọng.
Vì sao phải bắt đầu từ đây? Vì phần lớn rắc rối sinh viên gặp khi dùng AI đều bắt nguồn từ một hiểu nhầm về bản chất công cụ. Bạn nhờ nó tìm tài liệu, nó đưa ra tên sách nghe rất thật nhưng sách đó không tồn tại. Bạn hỏi lại đúng câu cũ, nó trả lời khác đi. Cả hai chuyện đều có chung một lời giải thích, nằm ở cách mô hình sinh chữ.
Cách nói tắt "mô hình biết nhiều lắm" cài vào đầu bạn một hình dung sai: rằng bên trong công cụ có kho tri thức xếp gọn gàng, và trả lời là đi lấy đúng ngăn kéo ra. Bài này thay nó bằng một hình dung thô sơ hơn nhưng đúng hơn.
Thử ngay: ba thuật ngữ nhớ nhanh
Ba từ này sẽ quay lại suốt bài. Lật từng thẻ để xem nghĩa gọn của chúng; chưa cần thuộc, các mục phía sau sẽ giải thích kỹ từng cái.
Trò chơi đoán chữ tiếp theo
Hãy tưởng tượng một trò chơi rất đơn giản. Tôi đưa bạn một đoạn văn còn dở và yêu cầu bạn điền từ tiếp theo:
"Thủ đô của Việt Nam là ______"
Gần như chắc chắn bạn điền "Hà Nội". Bạn làm được vì đã đọc rất nhiều câu tiếng Việt và biết từ nào hay đi sau cụm từ đó. Một LLM chơi đúng trò này, nhưng ở quy mô khổng lồ. Nó đã được cho đọc một lượng văn bản rất lớn (sách, bài báo, mã nguồn, trang web) và học được rằng: cho một chuỗi chữ phía trước, chữ nào có khả năng xuất hiện tiếp theo cao nhất.
Một LLM là bộ máy đoán chữ tiếp theo. Dựa trên những gì đã có (lời nhắc của bạn cộng phần nó vừa viết), nó chọn chữ tiếp theo có khả năng cao, rồi lặp lại tới khi xong câu trả lời.
Quá trình này diễn ra theo vòng: mô hình đọc toàn bộ chữ đang có, chọn một chữ tiếp theo, ghép chữ đó vào, rồi lặp lại với chuỗi vừa dài thêm. Điểm cốt lõi: mô hình không "tra cứu" một câu trả lời có sẵn trong từ điển, cũng không "hiểu" theo nghĩa con người. Nó nối chữ theo những gì nghe có vẻ hợp lý dựa trên các mẫu đã học. Vì câu trả lời được dựng dần từng chữ một, mỗi chữ đã viết ra lại ảnh hưởng đến chữ kế tiếp, nên phần mở đầu mà bạn cung cấp định hướng cho toàn bộ phần còn lại. Đây chính là lý do sâu xa khiến prompt có sức nặng lớn đến vậy.
Mô hình học kiểu gì
Làm sao nó biết chữ nào khả năng cao? Bằng cách luyện đúng trò đó vô số lần: che chữ cuối của một câu có sẵn, bắt mô hình đoán, so với chữ thật, rồi chỉnh tham số bên trong để lần sau đoán gần hơn. Lặp ở quy mô khổng lồ, mô hình dần nắm được ngữ pháp, lối hành văn, cách viết code và cả kiến thức nằm sẵn trong văn bản. Hai điều đáng rút ra:
- Mô hình học quy luật thống kê của văn bản, không học một kho sự thật có đánh dấu đúng sai. Câu đúng và câu sai trông giống nhau về mặt ngữ pháp.
- Huấn luyện xong thì tham số đóng băng. Trò chuyện hôm nay không làm mô hình học thêm gì; nó chỉ dùng những gì bạn đưa vào lời nhắc.
Ba chặng biến bộ máy đoán chữ thành trợ lý
Nếu chỉ dừng ở trò đoán chữ, thứ bạn nhận được sẽ rất khó dùng: hỏi "làm sao sắp xếp một mảng trong C", nó có thể đoán tiếp thành một câu hỏi khác, vì trong biển văn bản nó đọc, sau một câu hỏi rất hay là một câu hỏi nữa. Để công cụ hữu ích, người ta huấn luyện thêm qua ba chặng.
Huấn luyện trước: trò đoán chữ ở quy mô rất lớn trên một khối văn bản khổng lồ. Sau chặng này mô hình đã có ngữ pháp, lối hành văn, cách viết code và phần lớn cái ta quen gọi là "kiến thức", nhưng chưa có thói quen làm theo yêu cầu.
Tinh chỉnh theo chỉ dẫn: cho mô hình học trên rất nhiều cặp gồm một yêu cầu và một câu trả lời mẫu do con người viết. Vẫn là trò đoán chữ, nhưng vùng văn bản mà mô hình bị kéo về đã đổi: tiếp nối tự nhiên nhất của một yêu cầu giờ là câu trả lời thẳng vào việc.
Tinh chỉnh theo phản hồi con người: cho mô hình sinh vài câu trả lời rồi nhờ người xếp hạng cái nào tốt hơn, và dùng tín hiệu đó kéo mô hình về phía câu được ưa chuộng. Chặng này giải thích vì sao câu trả lời thường có dàn ý đẹp và giọng điềm đạm.
Chỗ này cần một cảnh báo. Cái được tối ưu ở chặng ba là mức được người chấm ưa thích, không phải mức đúng sự thật: câu dứt khoát thường được chấm cao hơn câu ngập ngừng, kể cả khi câu ngập ngừng mới trung thực. Nói cách khác, giọng tự tin không tương quan với độ đúng.
Tham số không phải là cơ sở dữ liệu
Khi mô hình trả lời "Hà Nội", nó không mở bảng dữ liệu nào ra tra. Mọi thứ nó "biết" nằm rải trong các tham số, tức một đống con số được chỉnh dần lúc huấn luyện, và chúng không lưu nguyên văn câu nào. Hãy hình dung như một dạng nén rất mạnh và có mất mát: cái lặp lại nhiều lần thì được giữ khá chắc, cái chỉ xuất hiện vài lần thì gần như chỉ còn cái dáng.
Từ đó ra một thước đo dùng được ngay. Cái phổ biến thì mô hình tái tạo rất chắc: cú pháp vòng lặp, định nghĩa sách vở của một khái niệm nhập môn. Cái hiếm và cụ thể thì rất yếu: số trang một cuốn sách, tên hàm của thư viện ít người dùng, đường link, tên tác giả kèm năm xuất bản. Với nhóm sau, nó không có gì để lấy ra nên dựng lại một thứ đúng hình dạng, và vì đang tái tạo chứ không tra cứu, nó cũng không tự biết mình vừa dựng ra thứ không tồn tại. Hệ quả thực tiễn: cái gì hiếm và cụ thể thì luôn phải kiểm chứng bằng nguồn bên ngoài.
Cửa sổ ngữ cảnh: mô hình chỉ nhìn thấy một khoảng
Khi đoán chữ tiếp theo, mô hình không nhìn vô hạn về phía sau. Nó chỉ đọc được một khoảng văn bản gần nhất, gọi là cửa sổ ngữ cảnh (context window). Mọi thứ bạn cung cấp trong một lượt trò chuyện, lời nhắc của bạn, đoạn mã bạn dán vào, các câu trao đổi trước đó, đều phải nằm gọn trong cửa sổ này thì mô hình mới dùng tới được.
Một so sánh dễ nhớ: cửa sổ ngữ cảnh giống như mặt bàn làm việc. Tài liệu bạn đặt lên bàn thì mô hình đọc và dùng được ngay. Tài liệu cất trong tủ (không đưa vào lời nhắc) thì mô hình không biết là nó tồn tại. Hai hệ quả thực dụng:
- Nếu một thông tin quan trọng cho câu trả lời (mã lỗi, đoạn code, yêu cầu đề bài), bạn phải đưa nó vào lời nhắc. Đừng giả định mô hình tự biết.
- Trong một cuộc trò chuyện rất dài, phần đầu có thể trôi ra ngoài cửa sổ và mô hình "quên". Khi đó nhắc lại thông tin then chốt là việc bình thường, không phải lỗi của bạn.
Cửa sổ ngữ cảnh đo bằng token (mẩu chữ nhỏ; một từ tiếng Việt thường bằng vài token).
Chưa cần đếm; chỉ cần nhớ: mô hình có giới hạn lượng văn bản cùng lúc đọc được.
Vì sao mô hình bịa: hiện tượng ảo giác
Bạn nhờ mô hình liệt kê tài liệu tham khảo cho đồ án. Nó đưa ra năm cuốn sách kèm tác giả và năm xuất bản, nhưng ra thư viện tìm thì hai cuốn không tồn tại. Hiện tượng này gọi là ảo giác (hallucination), và nó là hệ quả trực tiếp của cơ chế đoán chữ.
Mô hình chọn chữ nghe có vẻ hợp lý, không kiểm tra chữ đó có đúng sự thật hay không. Khi bị hỏi chi tiết mà nó không nắm chắc, nó vẫn phải sinh chữ tiếp theo, nên nó sinh ra thứ đúng hình dạng: một tên sách rất giống tên sách thật, một tên hàm rất giống hàm có thật. Cấu trúc đúng, nội dung bịa, mà giọng văn vẫn tự tin y như lúc nó nói đúng. Ảo giác hay gặp nhất ở con số, trích dẫn, tên hàm của thư viện ít phổ biến, và đường link.
Cách phòng hiệu quả không phải là quát "đừng bịa", mà là cắt bỏ chỗ để bịa: cấp dữ liệu tận tay và ràng buộc nguồn.
Chỉ trả lời dựa trên đoạn tài liệu tôi dán bên dưới.
Nếu tài liệu không có thông tin, hãy nói rõ "tài liệu
không đề cập", tuyệt đối không suy đoán thêm.
Câu này cho mô hình một lối thoát hợp lệ thay vì ép nó phải bịa ra cái gì đó.
Điểm cần nhấn: ảo giác không phải lỗi ngẫu nhiên kiểu máy chạy quá tải rồi trục trặc. Nó là hệ quả trực tiếp của cách mô hình được tạo ra: một bộ máy luôn phải đưa ra chữ tiếp theo, được rèn để nghe hay, và không giữ nguyên văn nguồn nào, thì tất yếu lấp chỗ trống bằng thứ trông giống thật. Vậy nên hãy đặt bước kiểm chứng vào quy trình, đừng chờ một mô hình không bao giờ sai.
Hai ví dụ đọc kỹ
Xin tài liệu tham khảo. Cấu trúc một mục tài liệu là thứ cực kỳ phổ biến nên phần khung mô hình dựng rất chuẩn, nhưng tên sách ghép đúng tác giả và đúng năm lại là thông tin hiếm, rất dễ lệch. Kết quả: một danh sách đẹp, đúng định dạng, trong đó có mục thật và có mục ghép lai. Cách chữa không phải là nhờ nó "kiểm tra lại" (nó lấy gì mà kiểm?), mà là đổi việc: bạn tự tìm tài liệu ở thư viện số rồi dán vào cho mô hình tóm tắt.
Gọi một hàm không tồn tại. Nhờ viết code dùng một thư viện ít phổ biến, bạn nhận về đoạn code gọi một hàm nghe rất hợp lý, đúng phong cách đặt tên của thư viện, và chương trình báo không tìm thấy hàm. Mô hình học được "văn phong" đặt tên hàm, nhưng danh sách hàm chính xác thì không được lưu nguyên vẹn, nên nó sinh ra cái tên mà thư viện đó lẽ ra sẽ có. Hỏi lại "hàm này có thật không", nó rất dễ đáp "có" chắc nịch, vì câu khẳng định cũng là một tiếp nối trôi chảy. Cách chữa: dán tài liệu chính thức vào lời nhắc, hoặc chạy thử.
Bài học chung: mô hình rất mạnh khi bạn đưa dữ liệu cho nó xử lý, rất yếu khi bạn bắt nó lấy dữ kiện ra từ trí nhớ. Hãy dồn việc về phía thứ nhất.
Một chút ngẫu nhiên: ý niệm về temperature
Nếu mô hình luôn chọn chữ có xác suất cao nhất, hai lần hỏi cùng một câu sẽ cho hai câu trả lời giống hệt nhau và khá khô cứng. Trên thực tế, mô hình thường thêm vào một chút ngẫu nhiên khi chọn chữ. Mức ngẫu nhiên này được điều khiển bởi một tham số gọi là nhiệt độ (temperature).
Cần nói rõ một bước ta đã lược qua. Ở mỗi bước sinh chữ, mô hình không chọn đúng một chữ mà tạo ra cả danh sách ứng viên kèm mức khả năng. Sau "Thủ đô của Việt Nam là", ứng viên "Hà" gần như chiếm trọn khả năng; sau "Hôm nay tôi muốn viết về", danh sách trải rộng và không ứng viên nào áp đảo. Chọn chữ cuối cùng từ danh sách đó gọi là lấy mẫu, và nhiệt độ là núm vặn điều khiển nó.
Ở mức ý niệm, bạn hình dung như sau:
- Nhiệt độ thấp: mô hình "thận trọng", gần như luôn chọn khả năng an toàn nhất, nên câu trả lời ổn định và bám sát. Hợp cho việc cần đúng và nhất quán như sửa code hay trích xuất số liệu.
- Nhiệt độ cao: mô hình "phóng khoáng" hơn, dám chọn cả những khả năng ít gặp, nên câu trả lời đa dạng và sáng tạo hơn nhưng cũng dễ lệch. Hợp cho việc động não, đặt tên, gợi ý ý tưởng.
Chưa cần chỉnh temperature bằng tay. Chỉ cần nhớ: do có ngẫu nhiên, cùng một prompt có
thể cho câu trả lời hơi khác nhau giữa các lần. Đó là bình thường, không phải mô hình
"hỏng".
Nhiều người nghe tới đây liền kết luận: vậy cứ vặn cho thật ổn định là hết bịa. Không phải. Ngẫu nhiên chỉ quyết định chọn ứng viên nào, nó không tạo ra kiến thức mà mô hình vốn không có. Ổn định chỉ khiến mô hình bịa giống nhau qua các lần, mà thế còn dễ đánh lừa hơn: hỏi lại thấy trùng khớp nên bạn tưởng đã kiểm chứng chéo. Hỏi lại chính mô hình không bao giờ là kiểm chứng.
Mốc kiến thức: mô hình dừng ở một thời điểm
Dữ liệu huấn luyện thu thập tới một thời điểm rồi dừng, gọi là mốc kiến thức (knowledge cutoff). Sau mốc đó mô hình không biết gì thêm, trừ khi bạn đưa thông tin mới vào lời nhắc hoặc công cụ có gắn khả năng tìm kiếm. Với sinh viên công nghệ, đây là chuyện gặp hằng tuần: thư viện ra phiên bản mới, một hàm bị đổi tên, nhưng mô hình vẫn tự tin viết theo phiên bản cũ. Cách xử lý: nêu rõ phiên bản bạn dùng, dán tài liệu tương ứng, và luôn chạy thử.
- "Mô hình nhớ tôi từ hôm qua." Không. Tham số đã đóng băng; trừ khi công cụ có tính năng ghi nhớ riêng, mỗi cuộc trò chuyện bắt đầu từ con số không.
- "Nó trả lời chắc nịch nên chắc là đúng." Giọng tự tin là đặc tính của văn bản nó học, không phải thước đo độ đúng.
- "Trả lời khác nhau nghĩa là mô hình hỏng." Không, đó là tính ngẫu nhiên khi chọn chữ. Cần ổn định thì siết lời nhắc, đừng hỏi lại cho may rủi.
Vì sao mô hình rất nhạy với cách đặt prompt
Ghép các ý trên lại, ta hiểu được điều quan trọng nhất của cả buổi học. Mô hình dựng câu trả lời bằng cách nối tiếp lời nhắc của bạn, chỉ dựa trên những gì nằm trong cửa sổ ngữ cảnh, và mỗi chữ đã viết lại định hướng chữ sau. Cho nên lời nhắc không phải là một "ô tìm kiếm"; nó là phần mở đầu của chính câu trả lời. Bạn đặt mở đầu thế nào, mô hình sẽ trượt theo hướng đó.
Hệ quả là cùng một ý định nhưng diễn đạt khác nhau sẽ kéo mô hình về những vùng văn bản khác nhau mà nó đã học. Yêu cầu "viết về con trỏ" kéo về một biển văn bản chung chung; yêu cầu "giải thích con trỏ trong C cho sinh viên năm nhất, kèm một hình ví dụ bộ nhớ" kéo về đúng vùng văn bản mang tính giảng dạy nhập môn. Mô hình không đọc được suy nghĩ của bạn; nó chỉ đọc được chữ bạn gõ.
Gõ vài từ khoá rồi mong máy hiểu hết là sai lầm phổ biến. Phần bạn không nói ra là phần mô hình phải tự đoán, và nó đoán theo cái phổ biến nhất, thường không phải cái bạn cần.
Bài tập nhỏ
Bài tập: chọn mức ngẫu nhiên
Với mỗi việc sau, bạn muốn mô hình thiên về ổn định hay thiên về đa dạng, vì sao? (a) Chuyển một bảng điểm dạng văn bản sang CSV. (b) Nghĩ mười cái tên cho câu lạc bộ lập trình. (c) Tìm lỗi trong một hàm C bị lặp vô hạn.
Lời giải. (a) Ổn định: chỉ có một kết quả đúng, mọi sự sáng tạo đều là sai sót. (b) Đa dạng: bạn cần nhiều phương án để chọn, trùng lặp mới là thất bại. (c) Ổn định: gỡ lỗi phải bám sát đúng đoạn code bạn đưa, một câu trả lời "sáng tạo" ở đây thường là nguyên nhân được bịa ra. Quy tắc chung: việc có đáp án đúng thì cần ổn định, việc cần nhiều phương án thì cần đa dạng.
Bài tập: câu nào nên tin, câu nào phải tra lại
Mô hình giúp bạn phần cơ sở lý thuyết của đồ án và trả về ba câu. Với mỗi câu, hãy nói bạn có
thể tạm tin hay bắt buộc kiểm chứng ở nguồn ngoài, và giải thích bằng cơ chế đã học. (a) "Sắp
xếp nổi bọt so sánh từng cặp phần tử kề nhau và đổi chỗ nếu sai thứ tự." (b) "Kỹ thuật này
được trình bày trong cuốn Nhập môn giải thuật của tác giả A, ở cuối chương ba." (c) "Thư viện
X có hàm sort_stable_inplace làm đúng việc bạn cần."
Lời giải. (a) Tạm tin: định nghĩa nhập môn, lặp lại vô số lần trong dữ liệu nên được tái tạo rất chắc. (b) Bắt buộc kiểm chứng, và đây là loại nguy hiểm nhất: tên sách ghép với tác giả ghép với vị trí là thông tin hiếm và cụ thể, đúng vùng mô hình chỉ còn giữ được cái dáng. (c) Bắt buộc kiểm chứng: mở tài liệu chính thức hoặc gọi thử hàm. Quy tắc chung: phổ biến thì tạm tin rồi đối chiếu, hiếm và cụ thể thì tra trước khi dùng, và không bao giờ lấy chính mô hình làm trọng tài cho câu trả lời của nó.
Câu hỏi tự kiểm
- 1Vì sao mô hình bịa ra tên sách hay tên hàm không tồn tại (ảo giác)?
- 2Hạ nhiệt độ (temperature) xuống thật thấp thì điều gì xảy ra với ảo giác?
- 3Loại thông tin nào mô hình tái tạo YẾU nhất, buộc phải kiểm chứng bằng nguồn ngoài?
- 4Nhận định "mô hình trả lời chắc nịch nên chắc là đúng" thì...
Tóm tắt
Gói cả bài trong một mạch: mô hình sinh văn bản bằng cách đoán chữ tiếp theo, rồi được tinh chỉnh theo chỉ dẫn và theo phản hồi con người để chịu làm theo yêu cầu và nói cho dễ nghe. Chính chặng làm cho dễ nghe khiến nó luôn tự tin, kể cả khi sai. Kiến thức của nó nằm rải trong tham số dưới dạng nén có mất mát chứ không nằm trong một cơ sở dữ liệu, nên cái phổ biến thì chắc còn cái hiếm thì bị dựng lại theo hình dạng, và đó là gốc rễ của ảo giác. Ba thói quen theo sau: đưa cái quan trọng vào lời nhắc, dồn việc về phía xử lý dữ liệu bạn cấp, và kiểm chứng bên ngoài mọi thứ hiếm và cụ thể trước khi dán vào bài nộp.
- LLM là bộ máy đoán chữ tiếp theo, học quy luật thống kê của văn bản, không tra cứu một kho sự thật.
- Nó chỉ thấy những gì nằm trong cửa sổ ngữ cảnh; không đưa vào lời nhắc thì coi như không tồn tại.
- Nó bịa khi bị hỏi chi tiết không nắm chắc, và bịa với đúng giọng tự tin. Hãy cấp dữ liệu, ràng buộc nguồn, rồi kiểm chứng.
- Có ngẫu nhiên khi chọn chữ, và kiến thức dừng ở mốc huấn luyện.
Những ý này dẫn thẳng tới phần sau: nếu prompt là phần mở đầu của câu trả lời, thì ta cần một bộ khung để biết nói rõ những gì. Đó là nội dung của bài tiếp theo.