AI Agent Memory Evaluation: Benchmarks, Metrics & Testing Framework
Trong quá trình xây dựng AI Agent, chúng ta thường tập trung vào việc làm sao để hệ thống ghi nhớ được nhiều thông tin hơn, truy xuất nhanh hơn và duy trì ngữ cảnh qua nhiều phiên làm việc. Tuy nhiên, một câu hỏi quan trọng hơn cần được đặt ra: Làm thế nào để biết AI Agent thực sự ghi nhớ tốt?
Một Agent có thể lưu hàng nghìn memory vào PostgreSQL hoặc Vector Database nhưng vẫn trả lời sai khi người dùng hỏi về một thông tin đã xuất hiện trong cuộc hội thoại trước đó. Hệ thống cũng có thể truy xuất đúng dữ liệu nhưng lại sử dụng thông tin đã lỗi thời, không nhận ra những thay đổi hoặc đưa ra câu trả lời không có căn cứ.
Đây là lý do AI Agent Memory Evaluation trở thành một bước quan trọng trong quá trình phát triển các hệ thống AI Agent có khả năng ghi nhớ dài hạn.
Trong bài viết này, chúng ta sẽ tìm hiểu các chỉ số đánh giá memory, những benchmark phổ biến như LongMemEval, LoCoMo và MemoryAgentBench, đồng thời xây dựng một testing framework đơn giản bằng Python.
1. AI Agent Memory Evaluation là gì?
AI Agent Memory Evaluation là quá trình đo lường và kiểm tra khả năng ghi nhận, lưu trữ, truy xuất, cập nhật và sử dụng thông tin của một AI Agent.
Khác với việc chỉ đánh giá chất lượng câu trả lời của LLM, memory evaluation cần kiểm tra toàn bộ vòng đời của thông tin.
Ví dụ, một người dùng có thể cung cấp các thông tin sau trong nhiều phiên trò chuyện:
- Ngày 1: Tôi đang học Python để làm Data Analyst.
- Ngày 5: Tôi thường sử dụng SQL và Python trong các dự án.
- Ngày 12: Tôi đang thực hiện một dự án phân tích dữ liệu bằng Power BI.
- Ngày 20: Tôi đã chuyển hướng sang một dự án sử dụng R.
Sau đó, người dùng đặt câu hỏi:
“Hiện tại tôi đang sử dụng ngôn ngữ lập trình nào cho dự án mới?”
Một hệ thống memory tốt cần nhận diện được thông tin mới nhất, hiểu đúng phạm vi của dự án và không nhầm lẫn với những thông tin cũ.
Vì vậy, đánh giá memory không chỉ là kiểm tra xem Agent có nhớ được một câu nói hay không. Hệ thống còn phải chứng minh được khả năng duy trì thông tin qua nhiều phiên, xử lý thay đổi và đưa ra quyết định dựa trên memory phù hợp.
2. Bốn nhóm năng lực cần đánh giá
2.1. Accurate Retrieval – Truy xuất thông tin chính xác
Đây là khả năng tìm được thông tin phù hợp khi người dùng đặt câu hỏi.
Ví dụ, trong cuộc hội thoại trước, người dùng đã nói rằng họ sử dụng PostgreSQL cho dự án Data Warehouse. Khi được hỏi “Tôi đang sử dụng database nào?”, Agent cần tìm được đúng thông tin đó.
Có hai khía cạnh cần kiểm tra:
- Agent có tìm được memory chứa bằng chứng cần thiết không?
- Agent có sử dụng đúng bằng chứng để tạo ra câu trả lời không?
Hai vấn đề này không hoàn toàn giống nhau. Một hệ thống có thể truy xuất đúng memory nhưng LLM vẫn diễn giải sai thông tin.
2.2. Test-time Learning – Học và cập nhật trong quá trình hoạt động
AI Agent cần có khả năng tiếp nhận thông tin mới và điều chỉnh memory tương ứng.
Ví dụ:
- Ban đầu: Người dùng sử dụng MySQL.
- Sau đó: Người dùng chuyển sang PostgreSQL.
- Cuối cùng: Người dùng xác nhận PostgreSQL là database chính của dự án hiện tại.
Khi được hỏi về công nghệ đang sử dụng, Agent phải ưu tiên thông tin mới nhất trong đúng phạm vi dự án.
2.3. Long-range Understanding – Hiểu thông tin trong phạm vi dài hạn
Thông tin cần thiết có thể xuất hiện ở nhiều vị trí khác nhau trong lịch sử hội thoại.
Agent cần tổng hợp các dữ kiện được đề cập cách nhau hàng chục phiên trò chuyện, thay vì chỉ dựa vào những thông tin gần nhất.
Ví dụ, để trả lời một câu hỏi về dự án, Agent có thể phải kết hợp:
- Mục tiêu được xác định trong phiên đầu tiên.
- Công nghệ được lựa chọn trong phiên thứ ba.
- Những thay đổi về yêu cầu trong phiên thứ bảy.
2.4. Selective Forgetting – Quên có chọn lọc
Không phải mọi thông tin từng được lưu đều cần được sử dụng mãi mãi.
Agent cần phân biệt giữa thông tin vẫn còn giá trị, thông tin đã lỗi thời và thông tin không được phép tiếp tục sử dụng.
Ví dụ, nếu người dùng đã thay đổi mục tiêu dự án, Agent không nên tiếp tục sử dụng mục tiêu cũ như một yêu cầu hiện tại.
Selective Forgetting cũng cần được kiểm tra trong trường hợp người dùng yêu cầu xóa dữ liệu. Khi đó, hệ thống cần thực hiện đúng chính sách xóa dữ liệu thay vì chỉ giảm điểm ưu tiên của memory.
3. Các Metrics quan trọng trong Memory Evaluation
3.1. Recall – Khả năng tìm được thông tin cần thiết
Recall đo tỷ lệ các thông tin liên quan mà hệ thống có thể truy xuất được trên tổng số thông tin liên quan thực tế.
Recall = Relevant Retrieved / Total Relevant
Ví dụ, một câu hỏi cần ba thông tin để trả lời. Hệ thống chỉ tìm được hai thông tin.
Recall = 2 / 3 = 66.67%
Recall thấp cho thấy hệ thống có thể bỏ sót những memory quan trọng.
3.2. Precision – Độ chính xác của kết quả truy xuất
Precision đo tỷ lệ memory được truy xuất thực sự liên quan đến câu hỏi.
Precision = Relevant Retrieved / Total Retrieved
Ví dụ, hệ thống truy xuất năm memory nhưng chỉ có ba memory liên quan.
Precision = 3 / 5 = 60%
Precision thấp có nghĩa là hệ thống đang đưa quá nhiều thông tin không cần thiết vào context.
3.3. F1-score – Cân bằng Recall và Precision
F1-score là trung bình điều hòa giữa Precision và Recall.
F1 = 2 × (Precision × Recall) / (Precision + Recall)
Chỉ số này hữu ích khi muốn đánh giá đồng thời khả năng tìm đủ thông tin và hạn chế các kết quả không liên quan.
3.4. Answer Accuracy – Độ chính xác của câu trả lời
Đây là chỉ số đánh giá câu trả lời cuối cùng của Agent so với đáp án chuẩn.
Ví dụ:
| Câu hỏi | Đáp án chuẩn | Agent trả lời | Kết quả |
|---|---|---|---|
| Database của dự án? | PostgreSQL | PostgreSQL | Correct |
| Ngôn ngữ chính? | Python | Java | Incorrect |
| Thời điểm bắt đầu? | Tháng 8 | Tháng 8 | Correct |
Answer Accuracy = Correct Answers / Total Questions
Đây là chỉ số trực quan, nhưng cần lưu ý rằng câu trả lời đúng không nhất thiết chứng minh Agent đã sử dụng memory đúng cách. Agent có thể đoán đúng hoặc trả lời từ kiến thức có sẵn trong mô hình.
3.5. Temporal Accuracy – Độ chính xác theo thời gian
Temporal Accuracy đánh giá khả năng xác định thông tin đúng tại một thời điểm cụ thể.
Ví dụ:
- Tháng 1: Người dùng sử dụng MySQL.
- Tháng 3: Người dùng chuyển sang PostgreSQL.
- Tháng 5: Người dùng bắt đầu một dự án mới sử dụng SQL Server.
Nếu câu hỏi là “Trong tháng 3, người dùng sử dụng database nào?”, đáp án phải là PostgreSQL, không phải SQL Server.
Chỉ số này đặc biệt quan trọng đối với các Agent quản lý hồ sơ, dự án, công việc và thông tin cá nhân thay đổi theo thời gian.
3.6. Abstention Accuracy – Khả năng từ chối khi không đủ thông tin
Một hệ thống memory tốt không nên tự tạo ra thông tin khi không tìm thấy bằng chứng.
Ví dụ, nếu người dùng chưa từng cung cấp địa chỉ email, Agent nên trả lời rằng chưa có thông tin thay vì tự suy đoán.
Có thể đánh giá riêng tỷ lệ từ chối đúng khi câu hỏi không có đáp án trong memory, đồng thời theo dõi tỷ lệ từ chối sai đối với những câu hỏi thực sự có bằng chứng.
3.7. Latency và Token Cost – Hiệu năng và chi phí
Ngoài độ chính xác, một hệ thống memory production còn cần được đánh giá về tốc độ và chi phí.
| Metric | Ý nghĩa |
|---|---|
| Retrieval Latency | Thời gian tìm kiếm memory |
| End-to-end Latency | Tổng thời gian tạo câu trả lời |
| Token Usage | Số token dùng trong quá trình xử lý |
| Memory Storage | Dung lượng bộ nhớ đã lưu |
| Cost per Query | Chi phí trung bình cho mỗi truy vấn |
Không nên tối ưu một chỉ số đơn lẻ. Một hệ thống có Recall rất cao nhưng phải truy xuất hàng trăm memory cho mỗi câu hỏi có thể không phù hợp với ứng dụng production.
4. Các Benchmark phổ biến để đánh giá AI Agent Memory
Thay vì tự tạo toàn bộ dữ liệu kiểm thử, các nhóm phát triển có thể sử dụng những benchmark nghiên cứu đã được công bố để đánh giá và so sánh hệ thống.
4.1. LongMemEval
LongMemEval là benchmark tập trung vào khả năng ghi nhớ dài hạn trong các cuộc hội thoại nhiều phiên.
Bộ benchmark kiểm tra những năng lực như:
- Single-session user information: Nhớ thông tin người dùng trong một phiên.
- Single-session assistant information: Nhớ thông tin do Assistant cung cấp.
- Preference understanding: Nhớ sở thích của người dùng.
- Knowledge updates: Xử lý thông tin được cập nhật.
- Temporal reasoning: Suy luận theo thời gian.
- Multi-session reasoning: Tổng hợp thông tin qua nhiều phiên.
LongMemEval phù hợp khi xây dựng chatbot cá nhân, AI Assistant hoặc Agent cần duy trì thông tin qua thời gian dài.
Tài liệu: LongMemEval – GitHub.
4.2. LoCoMo
LoCoMo là benchmark nghiên cứu khả năng ghi nhớ và suy luận trên các cuộc hội thoại dài hạn.
Thay vì chỉ hỏi lại một dữ kiện đơn giản, các câu hỏi có thể yêu cầu hệ thống:
- Nhớ thông tin được đề cập từ trước.
- Kết nối nhiều dữ kiện xuất hiện ở các thời điểm khác nhau.
- Suy luận dựa trên những sự kiện trong hội thoại.
- Xác định thông tin liên quan đến trình tự thời gian.
LoCoMo hữu ích khi muốn kiểm tra khả năng xử lý hội thoại dài và khả năng tổng hợp thông tin của Agent.
Tài liệu: LoCoMo – Research Project.
4.3. MemoryAgentBench
MemoryAgentBench được thiết kế để đánh giá memory agent trong những tình huống tương tác nhiều lượt, nơi hệ thống cần liên tục tiếp nhận và sử dụng thông tin.
Benchmark tập trung vào bốn nhóm năng lực:
- Accurate Retrieval.
- Test-time Learning.
- Long-range Understanding.
- Selective Forgetting.
Điểm đáng chú ý là benchmark không chỉ kiểm tra khả năng ghi nhớ thông tin tĩnh mà còn quan tâm đến việc Agent thích nghi với dữ liệu mới trong quá trình tương tác.
Tài liệu: MemoryAgentBench – GitHub.
4.4. AMA-Bench và MemoryArena
Nếu ứng dụng của bạn không chỉ trả lời câu hỏi mà còn thực hiện hành động dựa trên kinh nghiệm trước đó, có thể tham khảo thêm:
- AMA-Bench: Đánh giá memory trong các tác vụ Agent dài hạn, bao gồm recall, causal inference, state updating và state abstraction. Xem nghiên cứu AMA-Bench.
- MemoryArena: Đánh giá memory trong các tác vụ Agent nhiều phiên có sự phụ thuộc giữa những hành động và nhiệm vụ. Xem nghiên cứu MemoryArena.
Việc lựa chọn benchmark cần dựa trên loại ứng dụng. Chatbot cá nhân, coding agent và web-navigation agent có những yêu cầu memory khác nhau.
5. Xây dựng bộ kiểm thử Memory bằng Python
Trong phần này, chúng ta sẽ xây dựng một testing framework nhỏ để kiểm tra khả năng truy xuất thông tin của một hệ thống AI Agent.
Để đơn giản hóa, ví dụ sử dụng danh sách memory và các test case có sẵn. Khi triển khai thực tế, hàm truy xuất có thể được thay thế bằng API của hệ thống PostgreSQL, pgvector hoặc một memory framework khác.
Bước 1: Chuẩn bị dữ liệu memory
memories = [
{
"id": 1,
"text": "Người dùng sử dụng Python cho Data Analysis.",
"category": "skill"
},
{
"id": 2,
"text": "Người dùng đang học SQL.",
"category": "skill"
},
{
"id": 3,
"text": "Dự án hiện tại sử dụng PostgreSQL.",
"category": "project"
},
{
"id": 4,
"text": "Người dùng thích câu trả lời ngắn gọn.",
"category": "preference"
}
]
Bước 2: Xây dựng test cases
Mỗi test case cần có câu hỏi, thông tin liên quan và đáp án mong đợi.
test_cases = [
{
"question": "Người dùng sử dụng ngôn ngữ nào?",
"expected": "Python",
"relevant_ids": [1]
},
{
"question": "Dự án hiện tại sử dụng database nào?",
"expected": "PostgreSQL",
"relevant_ids": [3]
},
{
"question": "Người dùng thích câu trả lời như thế nào?",
"expected": "ngắn gọn",
"relevant_ids": [4]
}
]
Bước 3: Xây dựng hàm Retrieval minh họa
Để tập trung vào cách đánh giá, ta sử dụng một hàm tìm kiếm đơn giản dựa trên từ khóa. Đây không phải thuật toán semantic search và chỉ dùng để minh họa testing pipeline.
def retrieve_memory(question, memories):
keywords = question.lower().split()
results = []
for memory in memories:
text = memory["text"].lower()
score = 0
for keyword in keywords:
if keyword in text:
score += 1
if score > 0:
results.append({
"id": memory["id"],
"text": memory["text"],
"score": score
})
results.sort(
key=lambda x: x["score"],
reverse=True
)
return results
Bước 4: Tính Precision, Recall và F1-score
def calculate_metrics(
retrieved_ids,
relevant_ids
):
retrieved = set(retrieved_ids)
relevant = set(relevant_ids)
true_positive = len(
retrieved.intersection(relevant)
)
if len(retrieved) == 0:
precision = 0
else:
precision = (
true_positive / len(retrieved)
)
if len(relevant) == 0:
recall = 0
else:
recall = (
true_positive / len(relevant)
)
if precision + recall == 0:
f1 = 0
else:
f1 = (
2 * precision * recall
/ (precision + recall)
)
return precision, recall, f1
Bước 5: Chạy toàn bộ testing pipeline
total_precision = 0
total_recall = 0
total_f1 = 0
for test in test_cases:
results = retrieve_memory(
test["question"],
memories
)
retrieved_ids = [
item["id"] for item in results
]
precision, recall, f1 = calculate_metrics(
retrieved_ids,
test["relevant_ids"]
)
total_precision += precision
total_recall += recall
total_f1 += f1
print("Question:", test["question"])
print("Retrieved:", retrieved_ids)
print("Expected:", test["relevant_ids"])
print("Precision:", round(precision, 2))
print("Recall:", round(recall, 2))
print("F1-score:", round(f1, 2))
print("-" * 40)
number_of_tests = len(test_cases)
print("AVERAGE PRECISION:",
round(total_precision / number_of_tests, 2))
print("AVERAGE RECALL:",
round(total_recall / number_of_tests, 2))
print("AVERAGE F1:",
round(total_f1 / number_of_tests, 2))
Đây là một bộ đánh giá retrieval ở mức cơ bản. Trong production, nên bổ sung các câu hỏi có nhiều memory liên quan, câu hỏi cần kết hợp nhiều phiên và các trường hợp có memory nhiễu.
6. Đánh giá câu trả lời bằng LLM-as-a-Judge
Precision và Recall giúp đánh giá kết quả truy xuất, nhưng chúng chưa thể phản ánh đầy đủ chất lượng câu trả lời cuối cùng.
Ví dụ, Agent có thể tìm đúng ba memory nhưng lại kết hợp chúng sai ngữ cảnh. Để đánh giá bước này, có thể sử dụng phương pháp LLM-as-a-Judge.
LLM-as-a-Judge sử dụng một mô hình ngôn ngữ làm bộ đánh giá độc lập. Mô hình nhận câu hỏi, đáp án chuẩn, câu trả lời của Agent và bằng chứng được truy xuất, sau đó đưa ra đánh giá theo tiêu chí xác định trước.
Ví dụ cấu trúc dữ liệu đánh giá
evaluation_sample = {
"question": "Dự án hiện tại sử dụng database nào?",
"expected_answer": "PostgreSQL",
"agent_answer": "PostgreSQL",
"evidence": [
"Dự án hiện tại sử dụng PostgreSQL."
]
}
Prompt mẫu cho LLM Judge
You are an independent AI evaluation judge.
Evaluate the answer produced by an AI Agent.
QUESTION:
{question}
EXPECTED ANSWER:
{expected_answer}
AGENT ANSWER:
{agent_answer}
RETRIEVED EVIDENCE:
{evidence}
Evaluation criteria:
1. Correctness:
Does the answer match the expected answer?
2. Evidence Grounding:
Is the answer supported by retrieved evidence?
3. Completeness:
Does the answer include all necessary information?
4. Hallucination:
Does the answer introduce unsupported facts?
Return a JSON object:
{
"correctness": 0,
"grounding": 0,
"completeness": 0,
"hallucination": 0,
"reason": "Explanation"
}
Use scores from 0 to 1.
Do not reward answers based on unsupported guesses.
Trong ứng dụng thực tế, có thể gọi LLM thông qua API và yêu cầu kết quả theo JSON Schema để dễ dàng tổng hợp và phân tích.
LLM Judge cũng có những hạn chế: mô hình đánh giá có thể thiên lệch, không ổn định hoặc bỏ qua những khác biệt quan trọng. Vì vậy, nên kết hợp đánh giá tự động với một tập dữ liệu có đáp án được con người kiểm chứng.
7. Thiết kế một Memory Evaluation Dashboard
Sau khi chạy testing pipeline, kết quả nên được tổng hợp thành dashboard để theo dõi chất lượng memory qua các phiên bản.
Một dashboard cơ bản có thể gồm:
| Nhóm | Metric | Mục đích |
|---|---|---|
| Retrieval | Precision, Recall, F1 | Đánh giá chất lượng tìm kiếm |
| Answer | Answer Accuracy | Đánh giá câu trả lời |
| Temporal | Temporal Accuracy | Đánh giá thông tin theo thời gian |
| Update | Update Success Rate | Kiểm tra khả năng cập nhật memory |
| Forgetting | Stale Memory Error Rate | Kiểm tra việc sử dụng memory lỗi thời |
| Performance | Latency, Token Usage | Đo tốc độ và chi phí |
Nên theo dõi các chỉ số theo từng nhóm câu hỏi thay vì chỉ nhìn vào điểm trung bình. Một hệ thống có thể đạt kết quả tốt ở câu hỏi đơn giản nhưng thất bại ở câu hỏi nhiều phiên hoặc câu hỏi yêu cầu cập nhật thông tin.
8. Xây dựng quy trình kiểm thử Memory trong Production
Memory evaluation không nên chỉ thực hiện một lần trước khi đưa Agent vào sử dụng. Khi thay đổi embedding model, retrieval strategy, prompt hoặc memory architecture, chất lượng hệ thống có thể thay đổi theo.
Một quy trình kiểm thử có thể được tổ chức như sau:
MEMORY SYSTEM
|
v
TEST DATASET
|
v
RUN EVALUATION
|
+--------+--------+
| |
v v
RETRIEVAL TEST ANSWER TEST
| |
v v
PRECISION/RECALL LLM JUDGE
| |
+--------+--------+
|
v
EVALUATION REPORT
|
v
COMPARE WITH BASELINE
|
+-----+-----+
| |
v v
PASS FAIL
| |
v v
DEPLOY DEBUG & FIX
Có thể chia thành ba giai đoạn:
Giai đoạn 1: Offline Evaluation
Chạy Agent trên tập dữ liệu kiểm thử cố định trước khi triển khai. Đây là bước giúp phát hiện những thay đổi làm giảm chất lượng memory.
Giai đoạn 2: Regression Testing
Mỗi khi thay đổi hệ thống, chạy lại các test case cũ để đảm bảo tính năng trước đó không bị ảnh hưởng.
Ví dụ, việc thay đổi embedding model có thể cải thiện semantic search nhưng lại làm giảm khả năng truy xuất các thông tin ngắn hoặc có tên riêng.
Giai đoạn 3: Production Monitoring
Theo dõi các chỉ số thực tế như retrieval latency, token usage, tỷ lệ truy xuất không có bằng chứng và phản hồi của người dùng.
Đồng thời, cần bảo vệ dữ liệu nhạy cảm trong log và chỉ lưu những thông tin cần thiết cho mục đích đánh giá.
9. Những sai lầm thường gặp khi đánh giá AI Agent Memory
- Chỉ đánh giá câu trả lời cuối cùng: Không phân biệt được Agent nhớ đúng hay chỉ đoán đúng.
- Chỉ sử dụng câu hỏi đơn giản: Không phản ánh khả năng tổng hợp thông tin qua nhiều phiên.
- Bỏ qua thông tin thay đổi theo thời gian: Agent có thể tiếp tục sử dụng dữ liệu cũ.
- Không kiểm tra khả năng từ chối: Hệ thống có thể tạo ra thông tin khi không có bằng chứng.
- Chỉ sử dụng một benchmark: Một bộ dữ liệu không thể đại diện cho mọi loại ứng dụng Agent.
- Không cố định phiên bản mô hình và dữ liệu: Kết quả giữa các lần chạy có thể không thể so sánh trực tiếp.
- Phụ thuộc hoàn toàn vào LLM Judge: Bộ đánh giá cũng có thể mắc lỗi và cần được kiểm chứng.
10. Kết luận
AI Agent Memory Evaluation là bước cần thiết để chuyển một hệ thống có khả năng lưu trữ thông tin thành một hệ thống thực sự có khả năng ghi nhớ và sử dụng thông tin đáng tin cậy.
Để xây dựng một quy trình đánh giá hiệu quả, cần kết hợp ba lớp:
- Memory-level Evaluation: Kiểm tra thông tin có được lưu trữ, cập nhật và truy xuất đúng hay không.
- Answer-level Evaluation: Kiểm tra câu trả lời có chính xác, đầy đủ và được hỗ trợ bởi bằng chứng hay không.
- System-level Evaluation: Đánh giá độ trễ, chi phí, khả năng mở rộng và tính ổn định trong môi trường production.
Các benchmark như LongMemEval, LoCoMo và MemoryAgentBench cung cấp nền tảng hữu ích để nghiên cứu và so sánh. Tuy nhiên, với mỗi ứng dụng thực tế, đội ngũ phát triển vẫn cần xây dựng bộ test riêng dựa trên các tình huống sử dụng của người dùng.
Mục tiêu cuối cùng không phải là tạo ra một AI Agent có thể nhớ mọi thứ, mà là một Agent có thể nhớ đúng thông tin, hiểu đúng bối cảnh và đưa ra quyết định dựa trên những bằng chứng phù hợp.
11. Tài liệu tham khảo
- LongMemEval – Benchmark for Long-Term Conversational Memory
- LoCoMo – Long Conversation Memory Benchmark
- MemoryAgentBench – Benchmark for Memory Agents
- AMA-Bench – Evaluating Long-Horizon Memory for Agentic Applications
- MemoryArena – Benchmarking Agent Memory
- MLflow – Agent Memory Evaluation: Datasets, Metrics, and a Practical Setup
12. Học thêm về AI và Data tại MCNA Technology School
Nếu bạn muốn phát triển kỹ năng Python, Data Analytics, Power BI và ứng dụng AI vào các dự án thực tế, hãy tham khảo các chương trình đào tạo tại MCNA Technology School:

