TungDaDev's Blog

llm evaluation & observability

Llm evaluation observability.jpg
Published on
/10 mins read/

Đưa một ứng dụng LLM chạy thử nghiệm trên máy local (Proof of Concept - PoC) là việc mà bất kỳ lập trình viên nào cũng có thể làm được trong một buổi chiều bằng vài dòng code Python hay JavaScript.

Thế nhưng, đưa ứng dụng LLM đó vào môi trường Production phục vụ hàng triệu người dùng thật lại là một "cơn ác mộng" hoàn toàn khác.

Khi phần mềm truyền thống gặp lỗi, bạn có stack trace, error code 500, hoặc exception rõ ràng để debug. Còn với LLM:

  • Request thành công với status 200 OK, JSON trả về đúng schema.
  • Nhưng nội dung bên trong lại là một câu trả lời... hoang tưởng (hallucination) hoàn toàn sai sự thật, hoặc tệ hơn là vi phạm chính sách bảo mật doanh nghiệp!

Làm thế nào để đo lường chất lượng của một hệ thống có tính chất bất định (non-deterministic)? Chào mừng bạn đến với thế giới của LLM Evaluation & Observability (LLMOps).


# sự khác biệt giữa traditional monitoring và llm observability

Trong hệ thống backend truyền thống, chúng ta giám sát 4 tín hiệu vàng (Golden Signals): Latency, Traffic, Errors, Saturation.

Đối với các ứng dụng GenAI và Agentic Workflow, chừng đó là chưa đủ:

Tiêu chíTraditional Backend APMLLM Observability
Output TypeDữ liệu có cấu trúc, giá trị xác định (deterministic)Văn bản tự nhiên, ngôn ngữ tự do, tính ngẫu nhiên cao (probabilistic)
Định nghĩa "Lỗi"Exception, Status 4xx/5xx, TimeoutTrả lời sai sự thật, lạc đề (Drift), rò rỉ dữ liệu mật, giọng điệu phản cảm
Metric cốt lõiRPS, CPU/RAM, Error Rate, p99 LatencyToken Count, Cost per Request, Hallucination Rate, Faithfulness
DebuggingStack trace theo từng hàmStep-by-step Execution Graph qua chuỗi Agents, Tools, RAG context

# bộ ba nguyên tử: rag triad of metrics

Một trong những bài toán phổ biến nhất của LLM trong doanh nghiệp là RAG (Retrieval-Augmented Generation). Làm sao để đánh giá xem câu trả lời của bot RAG có tốt không mà không cần con người phải ngồi đọc từng dòng log?

Bộ khung RAG Triad (được khởi xướng bởi framework TruLens và Ragas) chia chất lượng của RAG thành 3 thước đo toán học cốt lõi:

1. Context Relevance (Độ liên quan của ngữ cảnh)

  • Đo lường xem các mẩu dữ liệu (chunks) được Vector Database truy xuất về có thực sự chứa thông tin liên quan đến câu hỏi hay không.
  • Nếu điểm số này thấp: Bạn cần tối ưu lại thuật ngữ tìm kiếm, Chunking strategy, Embedding model hoặc áp dụng Reranking.

2. Faithfulness / Groundedness (Tính trung thực thực tế)

  • Đo lường xem câu trả lời của LLM có thể chứng minh được hoàn toàn bằng các dữ liệu trong Context hay không.
  • Nếu Faithfulness < 100%: LLM đang bịa đặt thêm thông tin (hallucination) dựa trên tri thức đã học trong quá khứ thay vì dựa vào tài liệu cung cấp.

3. Answer Relevance (Độ thỏa đáng của câu trả lời)

  • Đo lường xem câu trả lời cuối cùng có giải đáp trực diện vấn đề mà người dùng hỏi hay không (dù đúng sự thật nhưng nếu trả lời vòng vo, lạc đề thì điểm này vẫn thấp).

# phương pháp llm-as-a-judge: dùng ai để chấm điểm ai

Thuê một đội ngũ chuyên gia gắn nhãn thủ công (Human-in-the-loop Evaluation) là tiêu chuẩn vàng, nhưng chi phí quá đắt đỏ và không thể mở rộng (scale) khi bạn có hàng trăm ngàn lượt tương tác mỗi ngày.

Giải pháp hiện đại là LLM-as-a-Judge: Sử dụng một mô hình ngôn ngữ cực kỳ thông minh (như GPT-4o, Claude 3.5 Sonnet) kèm một Prompt chấm điểm khắt khe (Rubric) để đánh giá câu trả lời của mô hình phục vụ sản phẩm (như Llama 3 8B hay Qwen 2.5):

[PROMPT TEMPLATE: EVALUATE FAITHFULNESS]
Bạn là một giám khảo khắt khe về tính trung thực của dữ liệu.
Nhiệm vụ: Hãy phân tích kỹ lưỡng từng mệnh đề trong "CÂU TRẢ LỜI" dưới đây.
Đối chiếu từng mệnh đề đó với thông tin có trong "NGỮ CẢNH CUNG CẤP".
 
NGỮ CẢNH:
{retrieved_context}
 
CÂU TRẢ LỜI:
{generated_response}
 
HÃY ĐÁNH GIÁ:
 
- Liệt kê các luận điểm trong câu trả lời.
- Với mỗi luận điểm, kiểm tra xem có căn cứ trong ngữ cảnh không.
- Trả về JSON theo định dạng:
  {
  "reasoning": "giải thích chi tiết logic chấm điểm",
  "score": 1.0 (nếu hoàn toàn có căn cứ) hoặc 0.0 (nếu có mệnh đề bịa đặt)
  }

Các cạm bẫy cần lưu ý khi dùng LLM-as-a-Judge:

  1. Position Bias: Mô hình có xu hướng thích câu trả lời nằm ở vị trí đầu tiên hoặc cuối cùng khi so sánh cặp (Pairwise comparison).
  2. Self-enhancement Bias: Mô hình của OpenAI có xu hướng chấm điểm cao hơn cho các đoạn văn do chính các mô hình của OpenAI sinh ra!
  3. Verbosity Bias: Mô hình thường đánh giá câu trả lời dài dòng, hoa mỹ là "tốt hơn" câu trả lời ngắn gọn, súc tích dù cả hai đều đúng.

# kiến trúc full-stack tracing cho ai agents

Khi xây dựng các Agent phức tạp (sử dụng LangGraph, AutoGen, hoặc LlamaIndex), một request của người dùng có thể kích hoạt cả một chuỗi phản ứng dây chuyền:

  1. Agent suy nghĩ (Planning)
  2. Gọi Tool tìm kiếm trên Web
  3. Đọc dữ liệu từ Database SQL
  4. Nhận thấy thiếu thông tin -> tiếp tục suy nghĩ và gọi API phụ trợ
  5. Tổng hợp câu trả lời cuối cùng

Nếu câu trả lời mất 12 giây để hoàn thành và kết quả bị sai, bạn làm sao biết khâu nào gây nghẽn (bottleneck) hoặc khâu nào đưa ra quyết định sai lầm?

Đây là lúc bạn cần Distributed Tracing dành riêng cho LLM (với các giải pháp mã nguồn mở tiêu biểu như Langfuse, Arize Phoenix, hay OpenTelemetry GenAI Semantic Conventions):

Với mô hình Span & Trace này, kỹ sư có thể click vào bất kỳ request nào để kiểm tra:

  • Prompt chính xác được gửi tới LLM là gì (bao gồm cả system prompt bí mật).
  • Nhiệt độ (temperature), top-p của model vào thời điểm gọi.
  • Số lượng Input/Output Tokens và chi phí tính theo USD đến từng phần trăm cent.
  • Thời gian chạy của từng Tool và tỷ lệ thành công của các bước lập luận.

# prompt drift & dataset curation: vòng lặp hoàn thiện liên tục

Xây dựng hệ thống Observability không chỉ để xem dashboard cho đẹp mắt, mà mục đích tối thượng là tạo ra một Vòng lặp phản hồi tích cực (Flywheel Feedback Loop):

  1. Phát hiện Prompt Drift: Theo thời gian, hành vi và từ ngữ của người dùng thực tế sẽ thay đổi khác xa so với dữ liệu mà nhóm phát triển giả định khi còn ở giai đoạn thử nghiệm. Giám sát độ lệch ngữ nghĩa (semantic drift) giúp phát hiện sớm các trường hợp LLM không còn hiểu người dùng.
  2. Xây dựng "Golden Dataset" từ thất bại: Mỗi khi người dùng bấm nút Dislike (Thumbs Down) hoặc bot đưa ra câu trả lời vi phạm, trace đó phải lập tức được đánh dấu (flagged), trích xuất cặp {Query, Bad Response, Context} và đưa vào bộ kiểm thử chuẩn (Regression Test Suite).
  3. CI/CD cho Prompts: Mỗi khi một kỹ sư thay đổi một câu chữ trong System Prompt hoặc nâng cấp phiên bản mô hình, CI/CD pipeline sẽ tự động chạy bộ kiểm thử trên toàn bộ Golden Dataset và tính toán xem điểm số trung bình (F1, Accuracy, Faithfulness) tăng hay giảm trước khi cho phép merge code vào nhánh main.

# tổng kết

Cái gì không thể đo lường được thì không thể cải tiến được. — Peter Drucker.

Câu danh ngôn kinh điển này đúng hơn bao giờ hết trong kỷ nguyên của GenAI. Việc đưa một sản phẩm AI ra thị trường mà thiếu vắng hệ thống Evaluation & Observability chẳng khác nào lái một chiếc máy bay siêu thanh xuyên qua màn sương mù dày đặc mà không hề có bảng điều khiển tín hiệu.

Bằng cách kết hợp RAG Triad, cơ chế LLM-as-a-Judge khách quan, hệ thống Tracing chi tiết đến từng Span, và Vòng lặp kiểm thử tự động, bạn sẽ biến một ứng dụng AI đầy rủi ro và khó đoán thành một hệ thống phần mềm doanh nghiệp vững chắc, minh bạch và luôn sẵn sàng mở rộng quy mô.


Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!

Happy coding 😎 👍🏻 🚀 🔥.