Bạn sẽ không phát hành code mà không có kiểm tra. Các prompt cũng không ngoại lệ. Nhưng đầu ra của LLM không mang tính xác định, điều đó có nghĩa là kiểm thử truyền thống không hiệu quả. Bạn cần một cách tiếp cận khác.
🔄 Tóm tắt nhanh: Trong Bài học 5, bạn đã học cách phòng chống tấn công Prompt injection. Nhưng làm thế nào để bạn biết các biện pháp phòng vệ của mình thực sự hiệu quả? Và làm thế nào để bạn biết prompt của mình tạo ra đầu ra tốt một cách nhất quán? Đó là những gì mà các framework đánh giá trả lời.
Tại sao kiểm thử truyền thống thất bại với các prompt?
Unit test kiểm tra đầu ra chính xác: assertEqual(result, expected). Điều này không hiệu quả với LLM vì:
Cùng một prompt có thể tạo ra các cách diễn đạt khác nhau mỗi lần chạy
"Đúng" có thể có nhiều cách biểu diễn hợp lệ
Chất lượng là một phổ, không đơn giản chỉ là đạt/không đạt
Những gì hiệu quả hơn: Kiểm thử dựa trên thuộc tính, đánh giá ngữ nghĩa và các chỉ số thống kê trên tập dữ liệu.
Xây dựng tập dữ liệu đánh giá của bạn
Tập dữ liệu đánh giá là một tập hợp các cặp đầu vào-đầu ra xác định "tốt" trông như thế nào.
Bộ dữ liệu tối thiểu khả thi: 50-100 ví dụ thuộc các danh mục sau:
Phân loại
% trong tập dữ liệu
Ví dụ
Các trường hợp tiêu chuẩn
50%
Đầu vào bình thường, đúng định dạng
Các trường hợp ngoại lệ
20%
Rất dài, rất ngắn, ký tự đặc biệt
Đối kháng
15%
Các nỗ lực chèn mã độc, thông tin đầu vào gây hiểu nhầm
Không rõ ràng
15%
Các đầu vào có nhiều cách diễn giải hợp lệ
Định dạng tập dữ liệu:
{
"input": "Extract the email from: Contact John at john@acme.com",
"expected_output": {"email": "john@acme.com", "name": "John"},
"tags": ["standard", "single-email"],
"quality_criteria": ["correct_email", "correct_name", "valid_json"]
}
Hãy xây dựng tập dữ liệu trước khi viết prompt. Đây là phương pháp phát triển dựa trên đánh giá - tương đương với TDD trong việc kiểm tra prompt.
✅ Kiểm tra nhanh: Tập dữ liệu đánh giá của bạn có 100 ví dụ, tất cả đều từ cùng một nguồn dữ liệu. Đây có phải là một tập dữ liệu tốt không?
Câu trả lời: Có lẽ là không. Một tập dữ liệu tốt thể hiện sự phân bố thực tế của dữ liệu đầu vào. Nếu lưu lượng truy cập sản xuất của bạn bao gồm dữ liệu đầu vào bằng nhiều ngôn ngữ, độ dài khác nhau và đôi khi có dữ liệu không đúng định dạng, thì tập dữ liệu đánh giá của bạn cũng nên như vậy. Các tập dữ liệu đồng nhất tạo ra những prompt hoạt động hoàn hảo trong quá trình thử nghiệm và bị lỗi trong môi trường sản xuất.
Các chỉ số đánh giá
Tuân thủ định dạng
def check_format(response, schema):
try:
parsed = schema.model_validate_json(response)
return True
except ValidationError:
return False
# Run across dataset
pass_rate = sum(check_format(r, MySchema) for r in responses) / len(responses)
# Target: 99%+
Độ chính xác thực tế
Đầu ra có chứa thông tin chính xác không?
Đối với đầu ra có cấu trúc: So sánh các trường được trích xuất với dữ liệu thực tế. Đối với văn bản: Sử dụng độ tương đồng ngữ nghĩa hoặc chấm điểm LLM-as-judge.
def check_accuracy(response, expected):
# For structured: field-by-field comparison
return response.email == expected.email and response.name == expected.name
# For text: semantic similarity
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
similarity = cosine_similarity(
model.encode(response_text),
model.encode(expected_text)
)
# Target: > 0.85
LLM-as-Judge
Sử dụng LLM thứ hai để đánh giá đầu ra của LLM đầu tiên:
judge_prompt = """Đánh giá câu trả lời này trên thang điểm từ 1-5:
- 5: Hoàn toàn chính xác, định dạng tốt, đầy đủ
- 4: Chính xác với một số lỗi định dạng nhỏ
- 3: Hầu hết chính xác, thiếu một số thông tin
- 2: Chính xác một phần, có vấn đề đáng kể
- 1: Sai hoặc (Không liên quan đến chủ đề chính)
TIÊU CHÍ:
- Độ chính xác về mặt thực tế (so với tài liệu tham khảo)
- Tuân thủ định dạng
- Tính đầy đủ
- Tính ngắn gọn (không có thông tin không cần thiết)
Câu trả lời tham khảo: {dự kiến}
Câu trả lời cần đánh giá: {thực tế}
Điểm số (1-5):"""
Hiệu chỉnh judge: Bao gồm 10 ví dụ đã được chấm điểm trước để judge biết điểm "3" và "4" trông như thế nào. Kiểm tra điểm số của judge so với điểm số của con người hàng tháng.
Chạy: promptfoo eval - nó kiểm tra prompt của bạn với tất cả các trường hợp kiểm thử và hiển thị báo cáo đạt/không đạt.
Vòng lặp phát triển dựa trên đánh giá
Xác định tiêu chí đánh giá trước khi viết prompt
Xây dựng tập dữ liệu đánh giá với các ví dụ đa dạng
Viết prompt (bản nháp đầu tiên)
Chạy đánh giá — đo tỷ lệ đạt
Lặp lại prompt — sửa các mẫu lỗi
Chạy đánh giá lại — xác nhận cải tiến, kiểm tra lỗi hồi quy
Phát hành khi tỷ lệ đạt đạt ngưỡng (thường là 95% trở lên)
✅ Kiểm tra nhanh: Prompt của bạn vượt qua 96% trường hợp đánh giá. Bạn thực hiện một thay đổi để cải thiện khả năng xử lý các trường hợp ngoại lệ. Prompt mới xử lý được 98% các trường hợp ngoại lệ nhưng tỷ lệ xử lý tổng thể giảm xuống còn 93%. Chuyện gì đã xảy ra vậy?
Đáp án: Regression. Cải tiến của bạn đã khắc phục các trường hợp ngoại lệ nhưng lại làm hỏng các trường hợp chuẩn - thay đổi prompt xử lý các đầu vào bất thường có thể đã khiến mô hình suy nghĩ quá mức đối với những đầu vào đơn giản. Luôn chạy toàn bộ bộ đánh giá sau khi thay đổi, không chỉ chạy danh mục bạn đang sửa. Đây chính là lý do tại sao bạn cần một bộ kiểm thử toàn diện.
Những điểm chính cần ghi nhớ
Các bài unit test truyền thống (assertEqual) không hoạt động với đầu ra của LLM — hãy sử dụng đánh giá dựa trên thuộc tính và ngữ nghĩa
Xây dựng tập dữ liệu đánh giá của bạn TRƯỚC KHI viết prompt — phát triển dựa trên đánh giá giúp phát hiện vấn đề sớm
Tập dữ liệu khả thi tối thiểu: 50-100 ví dụ đa dạng bao gồm các trường hợp chuẩn, ngoại lệ, đối nghịch và mơ hồ
Ba loại số liệu: Tuân thủ định dạng (xác thực schema), độ chính xác thực tế (so sánh trường) và điểm chất lượng (LLM-as-judge)
Luôn chạy toàn bộ bộ công cụ đánh giá sau khi thay đổi prompt - cải tiến ở một lĩnh vực có thể gây ra vấn đề ở những lĩnh vực khác
Mục tiêu tỷ lệ đạt 95% trở lên trước khi đưa vào sản xuất
Câu 1:
Bạn sử dụng 'LLM-as-judge' để đánh giá đầu ra prompt. Một LLM thứ hai chấm điểm mỗi phản hồi từ 1-5 về chất lượng. Rủi ro chính của phương pháp này là gì?
GIẢI THÍCH:
LLM-as-judge rất mạnh mẽ nhưng có rủi ro thiên vị. Cả hai mô hình có thể thích các phản hồi dài hơn (thiên kiến dài dòng), văn bản được viết trang trọng hoặc các phản hồi nghe có vẻ tự tin ngay cả khi sai (thiên kiến tự tin). Biện pháp giảm thiểu: Xác định các tiêu chí chấm điểm rõ ràng trong judge prompt, bao gồm những ví dụ hiệu chuẩn với điểm số do con người gán và thường xuyên kiểm tra điểm số judge so với đánh giá của con người. Judge là một công cụ, không phải là chân lý. Cả hai có thể coi một phản hồi dài dòng, trang trọng 'tốt hơn' một phản hồi ngắn gọn, chính xác. Hiệu chỉnh hệ thống chấm điểm của người đánh giá bằng các ví dụ do con người gắn nhãn và định kỳ so sánh điểm số judge với đánh giá của con người để kiểm tra xem có sự thiên vị có hệ thống hay không.
Câu 2:
Bạn đánh giá câu hỏi của mình với 5 trường hợp kiểm thử. Tất cả đều đạt. Đồng nghiệp của bạn chạy cùng một câu hỏi với 200 trường hợp kiểm thử và thấy tỷ lệ lỗi là 12%. Chuyện gì đã xảy ra?
GIẢI THÍCH:
Các tập hợp kiểm thử nhỏ rất nguy hiểm vì chúng tạo ra sự tự tin sai lầm. 5 trường hợp đạt có thể đều là những đầu vào đơn giản, được định dạng tốt. Tỷ lệ lỗi 12% trên 200 trường hợp bao gồm các trường hợp ngoại lệ: Đầu vào không rõ ràng, văn bản đa ngôn ngữ, đầu vào rất dài, dữ liệu bị lỗi. Một đánh giá có ý nghĩa cần 50-100+ trường hợp đa dạng đại diện cho sự phân bố trong thế giới thực, bao gồm cả những phần phức tạp. Họ đã tình cờ chạm vào điểm mạnh của prompt, chứ không phải điểm yếu của nó. 200 trường hợp kiểm thử đa dạng sẽ tiết lộ các trường hợp ngoại lệ, những chế độ lỗi và tỷ lệ độ tin cậy thực tế. Bộ dữ liệu đánh giá tối thiểu khả thi: 50-100 ví dụ đa dạng bao gồm các đầu vào dự kiến, trường hợp ngoại lệ và đầu vào đối nghịch.
Câu 3:
Bạn viết một bài test: assertEqual(llm_response, 'The answer is 42.'). Hôm nay nó chạy thành công nhưng ngày mai lại thất bại với 'The answer is 42'. Phương pháp test này có vấn đề gì?
GIẢI THÍCH:
Đầu ra của LLM không mang tính xác định như các truy vấn cơ sở dữ liệu. Ngay cả ở temperature 0, bạn vẫn sẽ thấy các biến thể về định dạng. Phương pháp đúng: Kiểm tra thuộc tính, không phải chuỗi chính xác. 'Phản hồi có chứa 42 không?' 'Nó có phải là JSON hợp lệ không?' 'Nó có tuân theo định dạng được chỉ định không?' 'Nội dung thực tế có chính xác không?' Kiểm tra dựa trên thuộc tính và chấm điểm tương đồng ngữ nghĩa xử lý sự biến đổi vốn có. Các biến thể nhỏ trong cách diễn đạt, dấu câu hoặc định dạng là bình thường và được mong đợi. Sử dụng đánh giá ngữ nghĩa: Phản hồi có chứa câu trả lời chính xác, tuân theo định dạng và đáp ứng các tiêu chí chất lượng không?
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây: