LLM Observability: Xây Dựng Hệ Thống Giám Sát AI Agents Hiệu Quả
Đặng Thị Duyên
21 tháng 7, 2025
LLM Observability: Xây Dựng Hệ Thống Giám Sát AI Agents Hiệu Quả
Khi AI agents ngày càng tự chủ hơn và hoạt động trong các hệ thống phức tạp, việc giám sát chúng không còn đơn giản như monitoring phần mềm truyền thống. Bạn không chỉ cần biết liệu hệ thống có chạy ổn định hay không, mà còn phải hiểu AI đã suy luận gì, quyết định gì ở mỗi bước, và tại sao nó lại đưa ra lựa chọn đó. Đó chính là lõi của LLM Observability.
Bài viết này sẽ hướng dẫn bạn xây dựng hệ thống LLM Observability toàn diện từ lý thuyết đến triển khai thực tế với OpenTelemetry và FastAPI. Chúng tôi sẽ đi vào chi tiết các kỹ thuật tracing, metrics collection, best practices bảo mật, và cách tích hợp với các công cụ phổ biến hiện nay.
LLM Observability là gì và tại sao khác với monitoring thông thường?

Kiến trúc tham chiếu LLM Observability với các span theo dõi từng giai đoạn RAG pipeline - nguồn từ freeCodeCamp
Trong thế giới monitoring truyền thống, chúng ta giả định rằng hệ thống hoạt động theo cơ chế xác định (deterministic) — với cùng một input, bạn sẽ luôn nhận được output giống nhau. Nhưng LLM hoàn toàn khác. Cùng một prompt có thể sinh ra các response khác nhau tùy theo temperature, model version, context window bị cắt ngắn, hoặc thậm chí các ký tự random được chèn vào. Đây là bản chất probabilistic của các mô hình ngôn ngữ lớn.
LLM Observability ra đời để giải quyết vấn đề này. Thay vì chỉ theo dõi "request thành công hay thất bại", nó cần trả lời những câu hỏi sâu hơn:
- Prompt được xây dựng từ những thành phần nào? Retrieval đã tìm được document đúng không?
- Mô hình đã sử dụng bao nhiêu token? Chi phí suy luận là bao nhiêu?
- Câu trả lời từ AI có chính xác không? Nó có bị hallucination không?
- Agent quyết định gọi tool nào và vì sao? Chuỗi suy luận có hợp lý không?
Theo khảo sát LangChain State of Agent Engineering năm 2026, 89% các tổ chức đã triển khai một hình thức observability nào đó cho AI agents của họ. Con số này chứng tỏ rằng LLM Observability không còn là tính năng tùy chọn mà đã trở thành hạ tầng bắt buộc.
Điểm khác biệt lớn nhất giữa APM truyền thống và LLM Observability là chiều sâu của hành động được theo dõi. APM chỉ theo dõi latency, error rate, throughput ở mức ứng dụng. LLM Observability bổ sung thêm việc theo dõi token consumption, chất lượng prompt, chi phí suy luận cho từng request, hành vi quyết định của agent qua nhiều bước, và cơ hội để detect hallucination hoặc bias.
Kiến trúc Span Taxonomy cho RAG Pipeline
Để hiểu rõ hệ thống LLM Observability, bạn cần nắm khái niệm trace và span. Một trace là tập hợp các span tương ứng với toàn bộ hành trình của một user request từ lúc vào hệ thống đến khi trả về kết quả. Mỗi span lại đại diện cho một giai đoạn logic độc lập — ví dụ như retrieval tài liệu từ vector database, xây dựng prompt template, gọi LLM API, hoặc post-process response.

Cover article LLM Observability in FastAPI with OpenTelemetry - nguồn từ freeCodeCamp
Đối với một RAG pipeline (Retrieval-Augmented Generation), bạn sẽ cần tách thành các span riêng biệt:
- http.request — Span bao bọc toàn bộ HTTP request từ client
- rag.retrieval — Truy vấn vector database, tìm kiếm semantic tài liệu liên quan
- rag.prompt.build — Xây dựng prompt cuối cùng từ template và retrieved documents
- llm.call — Gọi LLM API hoặc inference engine
- llm.postprocess — Xử lý output từ mô hình (parsing, cleanup, validation)
- llm.eval — Đánh giá chất lượng response (optional, nhưng rất hữu ích)
Việc tách thành các span nhỏ như vậy giúp bạn:
- Debug từng bước một khi có vấn đề
- Tối ưu độc lập từng thành phần (retrieval chậm? prompt xây dựng tốn token quá nhiều?)
- Track chi phí token một cách chi tiết (biết chính xác llm.call tiêu tốn bao nhiêu)
- Phát hiện병bottleneck trong pipeline
Để làm điều này hiệu quả, mỗi span nên bao gồm các semantic attributes quan trọng:
llm.model = "gpt-4-turbo"
llm.usage.prompt_tokens = 487
llm.usage.completion_tokens = 102
llm.cost_estimated_usd = 0.0147
rag.documents_returned = 3
rag.retrieval.latency_ms = 245
Những attribute này không chỉ giúp bạn giám sát, mà còn tạo ra dữ liệu có giá trị để phân tích hiệu suất và tối ưu chi phí.
Triển khai OpenTelemetry trong FastAPI: Hướng dẫn thực hành
OpenTelemetry (OTel) là tiêu chuẩn vendor-agnostic được khuyến nghị làm nền tảng cho LLM Observability. Ưu điểm lớn nhất của nó là: bạn cấu hình instrumentation một lần, nhưng có thể xuất dữ liệu sang nhiều backend khác nhau — Jaeger, Grafana Tempo, Arize Phoenix, hoặc thậm chí Datadog — mà không cần thay đổi code.
Dưới đây là quy trình triển khai từng bước:
Bước 1: Cài đặt dependencies
pip install fastapi
pip install opentelemetry-api opentelemetry-sdk
pip install opentelemetry-instrumentation-fastapi
pip install opentelemetry-exporter-jaeger
pip install opentelemetry-exporter-otlp
Bước 2: Khởi tạo TracerProvider
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
# Cấu hình Jaeger exporter
jaeger_exporter = JaegerExporter(
agent_host_name="localhost",
agent_port=6831,
)
# Khởi tạo TracerProvider
trace_provider = TracerProvider()
trace_provider.add_span_processor(
BatchSpanProcessor(jaeger_exporter)
)
# Set global trace provider
from opentelemetry import trace
trace.set_tracer_provider(trace_provider)
# Auto-instrument FastAPI
FastAPIInstrumentor.instrument_app(app)
tracer = trace.get_tracer(__name__)
Bước 3: Tạo custom spans cho RAG pipeline
from fastapi import FastAPI, HTTPException
from opentelemetry import trace
app = FastAPI()
tracer = trace.get_tracer(__name__)
@app.post("/ask")
async def ask_question(query: str):
with tracer.start_as_current_span("rag.retrieval") as retrieval_span:
# Truy vấn vector database
documents = await retrieve_from_vector_db(query)
retrieval_span.set_attribute("rag.documents_returned", len(documents))
retrieval_span.set_attribute("rag.retrieval.latency_ms", elapsed_time)
with tracer.start_as_current_span("rag.prompt.build") as prompt_span:
# Xây dựng prompt
prompt_text = build_prompt(query, documents)
prompt_span.set_attribute("prompt.tokens_count", count_tokens(prompt_text))
with tracer.start_as_current_span("llm.call") as llm_span:
# Gọi LLM
response = await openai.ChatCompletion.create(
model="gpt-4-turbo",
messages=[{"role": "user", "content": prompt_text}]
)
# Ghi lại usage information
usage = response.usage
llm_span.set_attribute("llm.model", "gpt-4-turbo")
llm_span.set_attribute("llm.usage.prompt_tokens", usage.prompt_tokens)
llm_span.set_attribute("llm.usage.completion_tokens", usage.completion_tokens)
# Tính chi phí (giá theo OpenAI pricing)
prompt_cost = (usage.prompt_tokens / 1000) * 0.01
completion_cost = (usage.completion_tokens / 1000) * 0.03
total_cost = prompt_cost + completion_cost
llm_span.set_attribute("llm.cost_estimated_usd", total_cost)
with tracer.start_as_current_span("llm.postprocess") as postprocess_span:
# Xử lý output
final_answer = response.choices[0].message.content
postprocess_span.set_attribute("response.length", len(final_answer))
return {"answer": final_answer}
Bước 4: Hash dữ liệu nhạy cảm
Khi lưu prompt và response vào observability system, KHÔNG bao giờ lưu trực tiếp raw text vì chúng có thể chứa thông tin nhạy cảm của người dùng (PII — Personally Identifiable Information), dữ liệu kinh doanh bí mật, hoặc thông tin bảo mật.
import hashlib
def hash_sensitive_data(text: str) -> str:
return hashlib.sha256(text.encode()).hexdigest()
with tracer.start_as_current_span("rag.prompt.build") as prompt_span:
prompt_text = build_prompt(query, documents)
# Lưu hash thay vì raw text
prompt_hash = hash_sensitive_data(prompt_text)
prompt_span.set_attribute("prompt.hash_sha256", prompt_hash)
prompt_span.set_attribute("prompt.token_count", count_tokens(prompt_text))
Cách này vẫn cho phép bạn correlate traces và debug vấn đề (ví dụ: prompt nào gây ra hallucination?), nhưng không expose dữ liệu thực của người dùng.
Anti-patterns cần tránh:
Chỉ dùng vendor SDK traces — Không tuỳ thuộc vào OpenAI SDK hoặc LangChain SDK tracing. Thay vào đó, hãy tạo custom spans với OpenTelemetry để có full control.
Logging prompt mà không trace correlation — Nếu lưu prompt vào logs, hãy gắn trace ID vào log để có thể correlate lại với trace sau này:
logger.info(f"prompt: {prompt_hash}", extra={"trace_id": trace.get_current_span().get_span_context().trace_id})Tạo span riêng cho từng token — Điều này sẽ tạo quá nhiều span và làm nổ tung storage. Thay vào đó, track token count dưới dạng attributes.
Giám sát AI Agents 24/7: Triển khai và Bảo mật

OpenClaw dashboard giao diện quản lý AI agent 24/7 - nguồn từ freeCodeCamp
Khi triển khai AI agents trong production, bạn cần một hệ thống giám sát liên tục để phát hiện vấn đề trước khi chúng ảnh hưởng tới người dùng. Một công cụ hữu ích cho việc này là OpenClaw — nền tảng cho phép self-host AI agent với 3 lớp rõ ràng:
- CLI/Runtime — Môi trường thực thi agent, hỗ trợ local machine, VPS, Docker container, hoặc PaaS như Sevalla
- Configuration — Quản lý cấu hình agent, prompt templates, tool definitions
- Persistence & Execution Context — Lưu lại trạng thái agent, memory, logs cho audit trail
OpenClaw cho phép bạn:
- Kiểm soát agent từ xa thông qua Telegram hoặc Discord bot
- Giám sát hoạt động 24/7 với dashboard realtime
- Lưu lại lịch sử tất cả tool calls và quyết định của agent
- Rollback nếu agent hành động sai
Tuy nhiên, cảnh báo bảo mật quan trọng: Khi cho AI agent quyền truy cập vào hệ thống thực (database, API, file system), bạn đang chấp nhận rủi ro lớn. Theo freeCodeCamp, "It is dangerous to give an AI system full control of your system — understanding the associated risks before deployment is essential."
Do đó, trước khi triển khai agent với quyền full control, hãy:
- Bắt đầu với sandbox environment hoặc staging
- Sử dụng RBAC (Role-Based Access Control) để giới hạn quyền của agent
- Yêu cầu human approval cho các hành động critical (xoá dữ liệu, thay đổi config)
- Lưu lại audit trail chi tiết để forensics khi cần
- Monitor anomalies trong hành vi của agent (ví dụ: agent bỗng dưng gọi 100 API requests/phút)
Kiến trúc LLMOps: 5 Lớp Quản Lý LLM Chuyên Nghiệp

Kiến trúc 5 lớp LLMOps toàn diện
Observability chỉ là một phần trong hệ sinh thái LLMOps rộng lớn hơn. Để quản lý LLM systems một cách chuyên nghiệp trong production, bạn cần hiểu 5 lớp này:
Lớp 1 — Data Management: Quản lý dữ liệu đầu vào cho LLM. Bao gồm data cleaning, embedding generation, vector database management, và — điều quan trọng — version control và lineage tracking. Bạn cần biết dữ liệu version nào được dùng để train, fine-tune, hay retrieval tại bất kỳ thời điểm nào.
Lớp 2 — Model Development: Lựa chọn foundation model phù hợp (open-source vs proprietary), fine-tuning với LoRA hoặc PEFT, hoặc prompt engineering. Mỗi lựa chọn có trade-off giữa chi phí, latency, và chất lượng.
Lớp 3 — Inference & Deployment: API serving, batching optimization, quantization để giảm memory footprint, token streaming cho UX tốt hơn, caching để tránh redundant calls. Đây là lớp ảnh hưởng trực tiếp tới latency và chi phí.
Lớp 4 — Security & Compliance: RBAC cho dữ liệu observability, data anonymization trong traces, audit trails cho compliance (HIPAA, GDPR, SOC 2), encryption at rest và in transit.
Lớp 5 — Governance & Responsible AI: Hallucination detection, bias monitoring, harmful content filtering, guardrails để đảm bảo AI hoạt động theo intent của tổ chức. Đây là lớp bảo vệ người dùng cuối cùng.
Observability nằm ở giao điểm của tất cả 5 lớp này — nó cung cấp visibility để bạn phát hiện vấn đề ở từng lớp.
Thị Trường và Công Cụ LLM Observability Phổ Biến 2026

So sánh các platform LLM Observability phổ biến
Thị trường observability đang bùng nổ. Theo Mordor Intelligence, thị trường được định giá 3.35 tỷ USD năm 2026 và dự kiến tăng lên 6.93 tỷ USD vào năm 2031, với mức tăng trưởng hàng năm (CAGR) 15.62%. Đặc biệt, châu Á-Thái Bình Dương đang tăng trưởng nhanh nhất với CAGR 19.62%.
Các platform phổ biến hiện nay:
Langfuse — Self-hosted, hoàn toàn miễn phí. Phù hợp cho startup và team nhỏ muốn toàn quyền kiểm soát dữ liệu. Giao diện thân thiện, hỗ trợ LangChain ecosystem.
LangSmith — Của LangChain, tích hợp tốt nếu bạn sử dụng LangChain framework. Hỗ trợ cloud hosting.
Arize Phoenix — LLM-focused, nhấn mạnh vào tracing chi tiết và LLM-specific metrics. Tốt cho team muốn insight sâu về hành vi mô hình.
Helicone — Proxy-based approach, có thể capture tất cả API calls tới OpenAI hoặc local LLM mà không cần thay đổi code.
Galileo AI — Enterprise-grade platform với strong capabilities trong bias detection và hallucination scoring.
Gần đây, Datadog đã ra mắt module LLM Observability riêng biệt dành cho GenAI workloads, cho phép tích hợp với hệ thống monitoring hiện tại nếu bạn đã dùng Datadog.
Dự báo từ Gartner là 60% nhóm kỹ thuật phần mềm sẽ sử dụng nền tảng AI evaluation và observability vào năm 2028, tăng từ chỉ 18% năm 2025. Điều này cho thấy sự chuyển dịch từ observability là "nice-to-have" sang là "must-have" infrastructure.
Best Practices và Anti-Patterns trong Production
Dựa trên kinh nghiệm triển khai từ các tổ chức lớn, đây là các nguyên tắc vàng:
Nguyên tắc 1: 1 Trace per User Request Mỗi request từ user nên tạo ra một trace duy nhất. Tất cả các operations trong request đó (retrieval, prompt build, LLM call, post-processing) đều là children spans của trace chính. Điều này giúp bạn trace lại toàn bộ hành trình của một user request.
Nguyên tắc 2: 1 Span per Logical Stage Đừng tạo span quá chi tiết (ví dụ: span cho từng sentence parsing). Thay vào đó, tạo span cho mỗi giai đoạn logic rõ ràng (retrieval, generation, evaluation).
Nguyên tắc 3: Hash Sensitive Data Lưu hash thay vì raw text cho prompt, response, hoặc bất kỳ dữ liệu chứa PII.
Nguyên tắc 4: Tách Retrieval khỏi Generation Có separate spans cho retrieval vs generation giúp debug và tối ưu độc lập.
Nguyên tắc 5: Track Token Usage Rõ Ràng Ghi lại llm.usage.prompt_tokens, llm.usage.completion_tokens, và tính chi phí cho mỗi request.
Sampling trong High-Volume Systems: Nếu hệ thống của bạn xử lý hàng triệu requests/ngày, lưu tất cả traces sẽ tốn storage khổng lồ. Hãy implement sampling — chẳng hạn, lưu 100% traces của requests có latency cao hoặc error, nhưng chỉ lưu 1-5% traces của requests normal.
from opentelemetry.sdk.trace.export import TraceExportResult
from opentelemetry.sdk.trace.export import SpanExporter
class AdaptiveSampler:
def should_sample(self, latency_ms, has_error):
if has_error or latency_ms > 2000:
return True # 100% sample errors dan slow requests
return random.random() < 0.05 # 5% sample normal requests
Coi Traces như Production Data: Traces có thể chứa dữ liệu nhạy cảm (kể cả dưới dạng hash). Kiểm soát truy cập chặt chẽ: chỉ engineers và on-call staff nên có quyền xem traces. Implement RBAC để limit ai có thể query traces.
Link Logs với Trace IDs: Nếu bạn đang sử dụng logging bên cạnh tracing, hãy gắn trace ID vào mỗi log entry để có thể correlate. Điều này tạo ra end-to-end visibility từ logs tới traces tới metrics.
from opentelemetry import trace
current_trace_id = trace.get_current_span().get_span_context().trace_id
logger.info("Processing user request", extra={"trace_id": current_trace_id})
Human-in-the-Loop + LLM-as-Judge: Theo LangChain survey, 59.8% tổ chức sử dụng human-in-the-loop evaluation (engineer hoặc QA team review AI responses), kết hợp với 53.3% sử dụng LLM-as-judge (dùng một LLM khác để đánh giá output của LLM chính). Kết hợp hai cách này cho accuracy cao nhất.
Câu hỏi thường gặp
LLM Observability khác gì so với Application Performance Monitoring (APM) truyền thống?
APM truyền thống theo dõi latency, error rate, throughput, và resource usage (CPU, memory) của code xác định — nó giả định rằng cùng một input sẽ luôn sinh ra output giống nhau. LLM Observability bổ sung thêm một tầng monitoring dành riêng cho hành vi probabilistic của mô hình: token consumption, prompt quality, inference cost per request, hallucination detection, agent decision traces qua nhiều bước suy luận, và tool selection patterns. Nói cách khác, APM quan tâm tới "hệ thống chạy nhanh không", còn LLM Observability quan tâm tới "AI trả lời đúng không và nó đã suy luận thế nào".
Nên chọn công cụ observability nào cho dự án LLM đầu tiên?
Nếu bạn là startup hoặc team nhỏ và muốn tiết kiệm chi phí, hãy bắt đầu với Langfuse self-hosted (miễn phí) kết hợp OpenTelemetry. Nếu bạn sử dụng LangChain, LangSmith là sự mở rộng tự nhiên. Arize Phoenix là lựa chọn tốt nếu bạn cần LLM-specific features như detailed span taxonomy và cost tracking. Quan trọng là, hãy coi OpenTelemetry là foundation để bạn không bị vendor lock-in — bạn có thể dễ dàng chuyển sang platform khác sau này nếu cần.
Làm thế nào để giám sát chi phí token trong hệ thống LLM production?
Track các semantic attributes: llm.usage.prompt_tokens, llm.usage.completion_tokens, llm.cost_estimated_usd cho mỗi request, rồi aggregate theo model, user, hoặc feature. Tạo span riêng cho llm.call để tách biệt inference cost khỏi retrieval hoặc post-processing. Dùng Helicone hoặc Langfuse để visualize cost over time, phát hiện outliers (ví dụ: một user bỗng dưng tốn gấp 10 lần chi phí bình thường), và tối ưu prompt để giảm token count.
Tại sao cần hash prompt và response thay vì lưu trực tiếp trong observability system?
Prompt và response thường chứa thông tin nhạy cảm của người dùng: PII (tên, email, số điện thoại), dữ liệu kinh doanh bí mật, hoặc thông tin bảo mật. Lưu raw text vi phạm GDPR (ở EU) và các quy định bảo mật dữ liệu khác. Hash cho phép bạn correlate traces (tìm ra "prompt nào gây hallucination?") và debug vấn đề mà vẫn bảo vệ dữ liệu thực của người dùng. Nếu cần review raw data cho debugging, lưu nó trong một hệ thống khác với access control chặt chẽ hơn, tách biệt khỏi observability system.
Multi-Agent System cần giám sát những gì khác so với single LLM call?
Multi-agent systems phức tạp hơn vì bạn cần trace toàn bộ chuỗi quyết định qua nhiều agent. Những điều quan trọng: phát hiện recursive loops (agent A gọi agent B gọi agent A lặp lại) — đây là nguyên nhân chi phí token đột biến, theo dõi tool calls chi tiết (agent gọi cái tool nào, kết quả là gì, agent khác có sử dụng được không), monitor handoffs giữa agents (agent có chuyển context đúng cách không), đảm bảo fault tolerance (nếu một agent fail, hệ thống có fallback khác không). Áp dụng distributed tracing với parent-child span relationships để show rõ dependencies giữa agents.
Xây dựng hệ thống LLM Observability không phải là nhiệm vụ một lần mà là quá trình liên tục. Bắt đầu với các span cơ bản, rồi dần dần thêm chi tiết khi bạn tìm ra thêm signal và metrics quan trọng. Hãy nhớ rằng, theo McKinsey Global AI Survey 2025, 51% tổ chức sử dụng AI đã trải qua hậu quả tiêu cực từ sự không chính xác hoặc hành vi không mong muốn của AI. Observability tốt là cách chủ động giảm thiểu rủi ro đó.
Khám Phá
LLM Agents & Multi-Agent Patterns: Thiết Kế Hệ Thống AI Phối Hợp Hiệu Quả
Multi-Agent AI 2026: Hướng Dẫn Xây Dựng Hệ Thống Theo Design Patterns
Multi-Agent Pattern: Hướng dẫn chi tiết các mô hình phối hợp giữa Agent AI
Quy trình CI/CD với Docker và GitHub Actions: Hướng dẫn từng bước
Multi-Agent AI & Edge Computing: Kiến Trúc Hệ Thống AI Phân Tán Cho Đông Nam Á


