Menu

Ảo giác AI: vì sao LLM bịa ra thông tin

Ảo giác AI (AI hallucination) là một câu trả lời đầy tự tin nhưng sai: một sự thật, trích dẫn, hàm hay package do AI bịa ra. Nó xảy ra vì mô hình ngôn ngữ dự đoán văn bản có khả năng xuất hiện cao, chứ không tra cứu gì cả. Prompt có thể làm giảm ảo giác; chỉ có kiểm tra mới phát hiện được.

Mọi prompt bên dưới đều có thể chỉnh sửa: thay đổi nó, rồi mở trong ChatGPT, Claude hoặc ứng dụng AI khác.

Ảo giác AI (AI hallucination) là một câu trả lời nghe rất chắc chắn nhưng lại sai: một sự thật bịa ra, một trích dẫn tới bài báo không tồn tại, một hàm mà thư viện chưa bao giờ có. Mọi mô hình chat đều mắc phải, kể cả ChatGPT, Claude và Gemini. Đây không phải là bug sẽ được vá đi; nó bắt nguồn từ cách mô hình ngôn ngữ tạo ra văn bản. Prompt có thể làm ảo giác ít xảy ra hơn, và chỉ có kiểm tra mới phát hiện được những trường hợp còn lại.

Vì sao mô hình ngôn ngữ bị ảo giác

Mô hình ngôn ngữ viết từng token một, mỗi token được chọn vì nó có khả năng cao sẽ nối tiếp phần văn bản trước đó. Khả năng cao, dựa trên mọi thứ mô hình đã thấy khi huấn luyện. Không bước nào trong quá trình đó tra cứu sự thật. Khi câu trả lời phổ biến trong dữ liệu huấn luyện, phần tiếp theo có khả năng cao nhất thường là phần đúng. Khi nó hiếm gặp, mới xuất hiện, hoặc hoàn toàn không có, mô hình vẫn tạo ra phần tiếp theo hợp lý nhất, và văn bản nghe hợp lý về một sự thật mà mô hình không nắm được chính là ảo giác.

Một số loại câu hỏi dễ gặp ảo giác hơn những loại khác:

  • Chi tiết cụ thể: con số chính xác, ngày tháng, tên người, số phiên bản, số trang. Hình thức của câu trả lời thì dễ đoán; còn chi tiết thì không.
  • Trích dẫn và đường link. Một nguồn tham khảo có định dạng dễ đoán (tác giả, năm, tiêu đề, tạp chí), nên mô hình có thể tạo ra một trích dẫn đúng chuẩn cho một bài báo chưa từng được viết.
  • Chủ đề hiếm hoặc mới: một thư viện nhỏ, một quy định địa phương, bất cứ điều gì sau thời điểm dữ liệu huấn luyện của mô hình kết thúc.
  • Câu hỏi có tiền đề sai. Hỏi một hàm làm gì, và mô hình có xu hướng trả lời như thể hàm đó có thật.

Văn phong trôi chảy không phải là dấu hiệu của độ chính xác. Một câu trả lời ảo giác có cùng giọng tự tin, cùng cách trình bày và cùng mức chi tiết như một câu trả lời đúng, vì vậy rất dễ bỏ sót.

Cái bẫy tiền đề sai

Các tab bên dưới hỏi về DataFrame.smart_merge() trong pandas. Phương thức này không tồn tại. Câu hỏi đầu tiên mặc định là nó có; câu hỏi thứ hai cho phép mô hình nói ra điều đó.

DataFrame.smart_merge() trong pandas làm gì, và khi nào tôi nên dùng nó thay cho merge()?
Try it
Example replyReplies vary between models and runs.

DataFrame.smart_merge() gộp hai DataFrame và tự phát hiện khóa nối (join key) cho bạn bằng cách so sánh tên cột và kiểu dữ liệu. Hãy dùng nó khi các DataFrame có chung cột khóa nhưng tên hơi khác nhau, ví dụ user_id và userId, vì nó có thể tự động ghép chúng lại.

Nếu muốn kiểm soát hoàn toàn khóa và kiểu nối, merge() vẫn là lựa chọn tốt hơn.

Câu trả lời đầu tiên là một ảo giác được ghép từ những mảnh có thật: pandas đúng là gộp được DataFrame, và tự ghép khóa là một tính năng hợp lý ai cũng muốn. Câu hỏi đưa ra tiền đề, còn mô hình đưa ra một hàm nghe hợp lý để khớp với nó. Các mô hình hiện nay phát hiện tiền đề sai thường xuyên hơn mô hình cũ, nhưng một câu hỏi được diễn đạt như một giả định vẫn đẩy câu trả lời về phía đồng tình.

Prompt thứ hai làm hai việc. Nó hỏi phương thức có tồn tại không trước khi hỏi phương thức làm gì, và nó cho phép rõ ràng việc không chắc chắn. Câu trả lời còn đưa lại một cách để kiểm chứng, đó là thói quen nên giữ: hasattr kiểm tra thư viện thật chỉ trong một dòng.

Trả lời từ nguồn, kèm trích dẫn

Cách mạnh nhất để giảm ảo giác là đưa các sự thật vào prompt. Khi câu trả lời nằm trong văn bản mà mô hình nhìn thấy được, nó không cần nhớ lại điều gì, và bạn có thể đối chiếu mọi nhận định với văn bản đó. Yêu cầu một câu trích dẫn hỗ trợ cho mỗi nhận định giúp việc kiểm tra nhanh hơn, và nói cho mô hình biết phải trả lời gì khi tài liệu không đề cập sẽ khiến nó ít lấp chỗ trống bằng phỏng đoán hơn.

Chỉ trả lời dựa trên tài liệu
Fill in
Parts
Trả lời câu hỏi chỉ dựa trên tài liệu bên dưới.
<document> Bản sao lưu được tạo mỗi đêm lúc 02:00 UTC và được giữ trong 30 ngày. Bản sao lưu cơ sở dữ liệu staging được giữ trong 7 ngày. Yêu cầu khôi phục được gửi trong kênh #ops và thường được hoàn tất trong vòng bốn giờ. </document> Câu hỏi: Bản sao lưu production được giữ bao lâu, và tôi có tự khôi phục được không?
Với mỗi phần của câu hỏi: câu trả lời, sau đó là câu nguyên văn trong tài liệu hỗ trợ cho câu trả lời đó, đặt trong dấu ngoặc kép.
Nếu tài liệu không trả lời một phần nào đó, hãy ghi "Không có trong tài liệu" cho phần đó. Không thêm thông tin từ kiến thức chung.
Try it
Example replyReplies vary between models and runs.

Bản sao lưu production được giữ bao lâu: 30 ngày. Tài liệu nêu 30 ngày cho bản sao lưu nói chung và 7 ngày chỉ dành cho staging. "Bản sao lưu được tạo mỗi đêm lúc 02:00 UTC và được giữ trong 30 ngày."

Tôi có tự khôi phục được không: Không có trong tài liệu. Tài liệu chỉ nói cách gửi yêu cầu khôi phục: "Yêu cầu khôi phục được gửi trong kênh #ops và thường được hoàn tất trong vòng bốn giờ." Điều đó gợi ý rằng một nhóm khác thực hiện việc này, nhưng tài liệu không nói có hình thức tự khôi phục hay không.

Hãy xem câu trả lời đã xử lý câu hỏi thứ hai thế nào. Một mô hình trả lời từ kiến thức chung có thể đã mô tả một lệnh khôi phục. Khi bị giới hạn trong tài liệu, nó tách bạch điều văn bản nói ra với điều văn bản chỉ gợi ý. Thử tắt phần ràng buộc rồi hỏi lại để xem câu trả lời có còn tách bạch hai điều đó không.

Thẻ <document> giữ tài liệu nguồn tách biệt khỏi chỉ dẫn của bạn; bài dấu phân cách và thẻ XML giải thích vì sao điều đó quan trọng, còn bài context engineering nói về cách cung cấp đúng tài liệu cho mô hình ở quy mô lớn. Ý tưởng này cũng là nền tảng của các ứng dụng chat có tìm kiếm web hoặc tải tệp lên: câu trả lời chỉ đáng tin bằng các nguồn có trong cuộc trò chuyện, nên hãy đọc chính nguồn được trích dẫn, đừng chỉ đọc phần tóm tắt.

Những thói quen viết prompt hữu ích khác

  • Hỏi, đừng mặc định. Hỏi "Có cách nào để làm X không?" trước khi hỏi "Làm X thế nào?". Tiền đề sai là kiểu ảo giác dễ kích hoạt nhất.
  • Yêu cầu nêu mức độ không chắc chắn. "Đánh dấu mọi nhận định bạn không chắc chắn" cho bạn danh sách những chỗ cần kiểm tra trước. Các nhãn này không phải xác suất đã được hiệu chỉnh, nhưng thường chỉ ra đúng điểm yếu.
  • Yêu cầu nguồn mà bạn mở được. Rồi mở chúng ra. Một trích dẫn bạn chưa mở là chưa được kiểm tra, và một đường link có thể tồn tại nhưng lại nói khác với nhận định mà nó được dùng để hỗ trợ.
  • Bắt đầu lại khi cuộc trò chuyện quá dài. Chi tiết ở đầu một cuộc trò chuyện dài có thể bị lẫn lộn hoặc bỏ sót khi cuộc trò chuyện dài thêm. Với những sự thật quan trọng, hãy mở cuộc trò chuyện mới và dán tài liệu liên quan vào; bài token và cửa sổ ngữ cảnh giải thích lý do.
  • Hỏi lần thứ hai, trong cuộc trò chuyện mới. Nếu hai câu trả lời độc lập cho cùng một câu hỏi về sự thật mâu thuẫn nhau, ít nhất một câu là sai. Việc hai câu trùng nhau là bằng chứng yếu hơn, vì mô hình có thể lặp lại cùng một lỗi.

Kiểm chứng những gì quan trọng

Không prompt nào loại bỏ được ảo giác, nên hãy quyết định cần kiểm tra gì dựa trên cái giá của việc sai. Một buổi brainstorm hay một bản nháp đầu tiên có thể chấp nhận vài lỗi. Một con số trong báo cáo, một nhận định pháp lý hay y tế, một câu nói được gán cho ai đó, hay một trích dẫn trong công việc của bạn thì cần nguồn gốc.

Code là loại đầu ra dễ kiểm chứng nhất, vì chạy code chính là kiểm tra nó. Một phương thức bịa ra sẽ báo AttributeError hoặc lỗi tương đương ngay khi dòng gọi nó chạy, nên hãy chắc rằng test của bạn chạy tới dòng đó. Trường hợp rủi ro là tên package bịa ra. Nếu mô hình bảo bạn cài một package bạn chưa từng nghe tên, hãy kiểm tra nó có tồn tại không, có đúng là dự án bạn nghĩ không, và có được dùng rộng rãi không, trước khi cài. Các nhà nghiên cứu bảo mật đã chỉ ra rằng mô hình thường bịa đi bịa lại cùng những tên package giả, và kẻ tấn công nào phát hành một package dưới một trong những cái tên đó sẽ khiến code của họ được cài bởi bất kỳ ai làm theo gợi ý. Bài prompt để viết code trình bày các bước kiểm tra code do AI viết.

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

Ảo giác AI là gì?

Ảo giác AI là câu trả lời của một mô hình ngôn ngữ nghe tự tin và trôi chảy nhưng sai hoặc không có căn cứ: một sự thật bịa ra, một trích dẫn tới bài báo không tồn tại, một hàm mà thư viện chưa bao giờ có. Mô hình không cố ý nói dối. Nó tạo ra văn bản trông có khả năng xuất hiện cao nhất, mà có khả năng cao không có nghĩa là đúng.

Vì sao ChatGPT bịa ra thông tin?

Các mô hình chat tạo văn bản bằng cách dự đoán token tiếp theo, lần lượt từng token một, dựa trên các mẫu học được trong quá trình huấn luyện. Trừ khi cuộc trò chuyện có một công cụ như tìm kiếm web hoặc một tài liệu, không có gì tra cứu câu trả lời cả. Khi câu trả lời đúng hiếm gặp trong dữ liệu huấn luyện, hoặc không hề có, mô hình vẫn tạo ra phần tiếp theo hợp lý nhất, và một câu trả lời sai nhưng hợp lý đọc lên y hệt một câu trả lời đúng.

Có thể ngăn AI bị ảo giác hoàn toàn không?

Không. Các mô hình hiện nay ít bị ảo giác hơn các mô hình trước, và trả lời dựa trên tài liệu bạn cung cấp hoặc kết quả tìm kiếm còn giảm nó hơn nữa, nhưng không prompt nào loại bỏ được ảo giác. Hãy coi mọi sự thật, con số, câu trích dẫn, nguồn tham khảo hay API quan trọng là một nhận định cần đối chiếu với nguồn gốc.

Prompt nào giúp giảm ảo giác AI?

Ba cách hiệu quả nhất. Cho phép rõ ràng việc nói "Tôi không biết". Cung cấp tài liệu nguồn và yêu cầu mô hình chỉ trả lời dựa trên đó. Yêu cầu một câu trích nguyên văn hỗ trợ cho mỗi nhận định, để bạn đối chiếu nhận định với văn bản. Tránh những câu hỏi mặc định điều gì đó là đúng, vì mô hình có xu hướng xuôi theo giả định đó.

Ví dụ về ảo giác AI khi lập trình là gì?

Gọi một phương thức mà thư viện không có, truyền một tùy chọn không tồn tại, import một package chưa ai phát hành, và mô tả hành vi của phiên bản cũ của thư viện như thể đó là hiện tại. Với code, nhiều lỗi kiểu này dễ phát hiện, vì một phương thức bịa ra sẽ báo lỗi ngay khi dòng gọi nó chạy. Tên package bịa ra mới là trường hợp nguy hiểm: hãy kiểm tra package đó có thật và được nhiều người biết đến trước khi cài đặt.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu