thaidinhz1 commited on
Commit
bcdd7c5
·
1 Parent(s): cd36943

fix: sửa docker port, bổ sung gitignore, thêm Hạn chế & Hướng phát triển vào README

Browse files
Files changed (5) hide show
  1. .gitignore +8 -0
  2. README.md +12 -1
  3. docker-compose.yml +1 -2
  4. eval_results.json +167 -38
  5. migrate_qdrant.py +81 -0
.gitignore CHANGED
@@ -31,6 +31,14 @@ data/pdf_text/
31
  # Vector store
32
  chroma_db/
33
  qdrant_storage/
 
 
 
 
 
 
 
 
34
 
35
  # Jupyter
36
  .ipynb_checkpoints/
 
31
  # Vector store
32
  chroma_db/
33
  qdrant_storage/
34
+ qdrant_colpali/
35
+
36
+ # Generated indices & cache
37
+ bm25_index.pkl
38
+ hf_models/
39
+
40
+ # Eval artifacts
41
+ eval_checkpoint.json
42
 
43
  # Jupyter
44
  .ipynb_checkpoints/
README.md CHANGED
@@ -201,7 +201,7 @@ python evaluate_colpali.py
201
 
202
  ## Đánh giá RAGAS (LLM-as-judge)
203
 
204
- Đánh giá trên bộ câu hỏi báo cáo tài chính tiếng Việt:
205
 
206
  | Pipeline | Faithfulness | Answer Relevancy | Context Recall | Trung bình |
207
  |---------|-------------|-----------------|----------------|-----------|
@@ -212,6 +212,17 @@ python evaluate_colpali.py
212
 
213
  > Context Recall baseline thấp (0.40) phản ánh điểm yếu của pypdf với bảng tài chính — đúng khoảng trống mà ColPali nhắm tới.
214
 
 
 
 
 
 
 
 
 
 
 
 
215
  ## Quyết định kiến trúc
216
 
217
  | Quyết định | Lý do |
 
201
 
202
  ## Đánh giá RAGAS (LLM-as-judge)
203
 
204
+ Đánh giá trên **20 câu hỏi** báo cáo tài chính tiếng Việt (judge model: `llama-3.3-70b-versatile`):
205
 
206
  | Pipeline | Faithfulness | Answer Relevancy | Context Recall | Trung bình |
207
  |---------|-------------|-----------------|----------------|-----------|
 
212
 
213
  > Context Recall baseline thấp (0.40) phản ánh điểm yếu của pypdf với bảng tài chính — đúng khoảng trống mà ColPali nhắm tới.
214
 
215
+ ## Hạn chế & Hướng phát triển
216
+
217
+ | Hạn chế hiện tại | Hướng cải thiện |
218
+ |-----------------|----------------|
219
+ | OCR nhiễu cao với PDF scan (EasyOCR) | Thay bằng Gemini Vision / GPT-4o cho OCR chất lượng cao hơn |
220
+ | Bộ đánh giá nhỏ (27 câu) | Mở rộng lên 100+ câu, bổ sung adversarial questions |
221
+ | ColPali chỉ chạy local (GPU + ~500KB/trang) | Dùng dịch vụ embedding API hỗ trợ multi-vector |
222
+ | Không có conversation memory | Thêm chat history, multi-turn Q&A |
223
+ | BM25 rebuild từ Qdrant khi cold start (~5s) | Cache BM25 trên persistent volume hoặc Redis |
224
+ | Chưa có hybrid ColPali + Text RAG | Kết hợp MaxSim score với RRF để tận dụng cả hai pipeline |
225
+
226
  ## Quyết định kiến trúc
227
 
228
  | Quyết định | Lý do |
docker-compose.yml CHANGED
@@ -2,10 +2,9 @@ services:
2
  app:
3
  build: .
4
  ports:
5
- - "8000:8000"
6
  volumes:
7
  - ./qdrant_storage:/app/qdrant_storage
8
- - ./bm25_index.pkl:/app/bm25_index.pkl
9
  - ./data:/app/data
10
  - hf_cache:/root/.cache/huggingface
11
  env_file:
 
2
  app:
3
  build: .
4
  ports:
5
+ - "8000:7860"
6
  volumes:
7
  - ./qdrant_storage:/app/qdrant_storage
 
8
  - ./data:/app/data
9
  - hf_cache:/root/.cache/huggingface
10
  env_file:
eval_results.json CHANGED
@@ -1,89 +1,218 @@
1
  {
2
  "summary": {
3
- "faithfulness": 0.5900000000000001,
4
- "answer_relevancy": 0.72,
5
- "context_recall": 0.72
 
6
  },
7
  "details": [
8
  {
9
  "question": "Doanh thu thuần của công ty trong quý 1 năm 2026 là bao nhiêu?",
10
  "ground_truth": "Doanh thu thuần quý 1/2026 được ghi nhận trong báo cáo kết quả hoạt động kinh doanh của công ty.",
11
- "answer": "Không tìm thấy thông tin cụ thể về doanh thu thuần của công ty trong quý 1 năm 2026 trong đoạn văn được cung cấp. Tuy nhiên, trong [1], có đề cập đến \"Gross profit\" (lợi nhuận gộp) với giá trị \"(10,307,600,718)\" cho năm trước và \"200,633,245\" cho quý 1 năm 2026, nhưng không có thông tin về doanh thu thuần. \n\nĐể biết doanh thu thuần, cần có thông tin cụ thể về doanh thu và chi phí trong quý 1 năm 2026, nhưng thông tin này không được cung cấp một cách rõ ràng trong tài liệu.",
12
- "faithfulness": 0.8,
13
- "answer_relevancy": 0.8,
14
- "context_recall": 0.8
15
  },
16
  {
17
  "question": "Lợi nhuận sau thuế của công ty quý 1 năm 2026 là bao nhiêu?",
18
  "ground_truth": "Lợi nhuận sau thuế quý 1/2026 được thể hiện trong báo cáo kết quả kinh doanh.",
19
- "answer": "Lợi nhuận sau thuế của công ty quý 1 năm 2026 là (28,960,612,444) VND [1].",
20
  "faithfulness": 0.8,
21
- "answer_relevancy": 1.0,
22
- "context_recall": 0.8
23
  },
24
  {
25
  "question": "Doanh thu của FPT trong quý 2 năm 2016 là bao nhiêu?",
26
  "ground_truth": "Doanh thu FPT quý 2/2016 được ghi nhận trong báo cáo tài chính giữa niên độ.",
27
- "answer": "Doanh thu của FPT trong quý 2 năm 2016 là 14.530.526.811 VND [1].",
28
- "faithfulness": 0.8,
29
- "answer_relevancy": 1.0,
30
- "context_recall": 0.8
31
  },
32
  {
33
  "question": "Chi phí tài chính của FPT trong nửa đầu năm 2016 là bao nhiêu?",
34
  "ground_truth": "Chi phí tài chính được thể hiện trong báo cáo kết quả hoạt động kinh doanh của FPT.",
35
- "answer": "Không tìm thấy thông tin về chi phí tài chính của FPT trong nửa đầu năm 2016 trong các tài liệu cung cấp. [1], [2], [3], [4], [5] không đề cập đến chi phí tài chính của FPT trong nửa đầu năm 2016.",
36
- "faithfulness": 0.0,
37
- "answer_relevancy": 0.0,
38
- "context_recall": 0.8
39
  },
40
  {
41
  "question": "Báo cáo UPCOM quý 1 trình bày thông tin về những công ty nào?",
42
  "ground_truth": "Báo cáo UPCOM quý 1 trình bày thông tin giao dịch và tài chính của các công ty niêm yết trên sàn UPCOM.",
43
- "answer": "Báo cáo UPCOM quý 1 trình bày thông tin về công ty CÔNG TY CP SÁCH VÀ THIẾT BỊ TRƯÒNG HỌC THÀNH PHỐ HỒ CHÍ MINH với mã chứng khoán STC [1]. Ngoài ra, trong văn bản cũng đề cập đến công ty VN RAILWAY CONSTRUCTION CORPORATION JSC [3]. Tuy nhiên, thông tin chủ yếu tập trung vào công ty CÔNG TY CP SÁCH VÀ THIẾT BỊ TRƯÒNG HỌC THÀNH PHỐ HỒ CHÍ MINH.",
44
- "faithfulness": 0.2,
45
- "answer_relevancy": 0.8,
46
- "context_recall": 0.0
47
  },
48
  {
49
  "question": "FPT hoạt động trong những lĩnh vực kinh doanh nào?",
50
  "ground_truth": "FPT hoạt động trong các lĩnh vực công nghệ thông tin, viễn thông, giáo dục và các dịch vụ liên quan.",
51
- "answer": "Theo tài liệu [1], hoạt động chính của Công ty Cổ phần FPT là cung cấp dịch vụ trong lĩnh vực thông tin, truyền thông và đầu tư. Các dịch vụ cụ thể bao gồm tích hợp hệ thống, phân phối phần mềm, và dịch vụ khác trong lĩnh vực công nghệ. \n\nNgoài ra, theo tài liệu [2] và [4], FPT còn hoạt động trong các lĩnh vực như mua hàng hóa và dịch vụ, lai cho vay, cho thuê tài sản, và các hoạt động khác liên quan đến công nghệ và truyền thông. \n\nDo đó, có thể kết luận rằng FPT hoạt động trong nhiều lĩnh vực kinh doanh khác nhau, bao gồm cả lĩnh vực công nghệ, truyền thông, và đầu tư.",
52
  "faithfulness": 0.8,
53
- "answer_relevancy": 1.0,
54
- "context_recall": 0.8
55
  },
56
  {
57
  "question": "Tổng tài sản của TIG tại thời điểm cuối quý 1 năm 2026 là bao nhiêu?",
58
  "ground_truth": "Tổng tài sản của TIG được ghi nhận trên bảng cân đối kế toán tại ngày 31/03/2026.",
59
- "answer": "Tổng tài sản của công ty tại thời điểm cuối quý I năm 2026 là 1.083.417.018.385 VND [1], [2].",
60
  "faithfulness": 0.8,
61
- "answer_relevancy": 0.8,
62
- "context_recall": 0.8
63
  },
64
  {
65
  "question": "Doanh thu của FPT quý 2 năm 2016 so với cùng kỳ năm trước tăng hay giảm?",
66
  "ground_truth": "Sự biến động doanh thu được thể hiện qua cột so sánh cùng kỳ trong báo cáo tài chính.",
67
- "answer": "Để trả lời câu hỏi, cần tìm thông tin về doanh thu của FPT quý 2 năm 2016 và so sánh với doanh thu quý 2 năm 2015. Tuy nhiên, thông tin cụ thể về doanh thu quý 2 năm 2015 và 2016 không được cung cấp rõ ràng trong các đoạn văn [1] đến [5].\n\nTuy nhiên, trong đoạn văn [1], có thông tin về doanh thu bán hàng và cung cấp dịch vụ của FPT trong các kỳ khác nhau, bao gồm cả năm 2016. Nhưng không có thông tin cụ thể về doanh thu quý 2 năm 2016 so với quý 2 năm 2015.\n\nDo đó, cần phải kết luận rằng: \"Không tìm thấy thông tin trong tài liệu.\"",
68
- "faithfulness": 0.0,
69
- "answer_relevancy": 0.0,
70
- "context_recall": 0.8
71
  },
72
  {
73
  "question": "Vốn chủ sở hữu của TIG tại quý 1 năm 2026 là bao nhiêu?",
74
  "ground_truth": "Vốn chủ sở hữu của TIG được trình bày trong phần nguồn vốn của bảng cân đối kế toán.",
75
- "answer": "Vốn chủ sở hữu của TIG tại quý 1 năm 2026 là 332.944.895.998 đồng [1].",
76
- "faithfulness": 0.9,
77
- "answer_relevancy": 1.0,
78
- "context_recall": 0.8
79
  },
80
  {
81
  "question": "Trong báo cáo FPT quý 2 năm 2016, khoản mục nào có giá trị lớn nhất trong tài sản ngắn hạn?",
82
  "ground_truth": "Khoản mục có giá trị lớn nhất trong tài sản ngắn hạn được thể hiện trên bảng cân đối kế toán của FPT.",
83
- "answer": "Trong báo cáo FPT quý 2 năm 2016, không tìm thấy thông tin cụ thể về khoản mục có giá trị lớn nhất trong tài sản ngắn hạn trong phần NGỮ CẢNH đã cung cấp. Tuy nhiên, có thể thấy trong phần [1] có nhiều giá trị tài sản được liệt kê, nhưng không có thông tin cụ thể về việc nào là khoản mục lớn nhất trong tài sản ngắn hạn.\n\nĐể trả lời chính xác câu hỏi này, cần phải xem xét kỹ lưỡng hơn các thông tin trong báo cáo tài chính và có thể cần tham khảo thêm các phần khác của báo cáo mà không được cung cấp trong phần NGỮ CẢNH.\n\nTuy nhiên, dựa trên thông tin trong [1], có thể thấy một số giá trị tài sản như:\n\n- 216.546.277.392 (không rõ là tài sản ngắn hạn hay dài hạn)\n- 119.102.619.872 (không rõ là tài sản ngắn hạn hay dài hạn)\n\nCần phải có thông tin chi tiết hơn về từng khoản mục tài sản để xác định được khoản mục nào có giá trị lớn nhất trong tài sản ngắn hạn.\n\nVì vậy, câu trả lời cho câu hỏi này là: Không tìm thấy thông tin trong tài liệu.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  "faithfulness": 0.8,
85
  "answer_relevancy": 0.8,
86
- "context_recall": 0.8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
88
  ]
89
  }
 
1
  {
2
  "summary": {
3
+ "faithfulness": 0.6269230769230771,
4
+ "answer_relevancy": 0.55,
5
+ "context_recall": 0.5,
6
+ "judge_model": "llama-3.1-8b-instant"
7
  },
8
  "details": [
9
  {
10
  "question": "Doanh thu thuần của công ty trong quý 1 năm 2026 là bao nhiêu?",
11
  "ground_truth": "Doanh thu thuần quý 1/2026 được ghi nhận trong báo cáo kết quả hoạt động kinh doanh của công ty.",
12
+ "answer": "Không tìm thấy thông tin về doanh thu thuần của công ty trong tài liệu.",
13
+ "faithfulness": 0.5,
14
+ "answer_relevancy": 0.5,
15
+ "context_recall": 0.5
16
  },
17
  {
18
  "question": "Lợi nhuận sau thuế của công ty quý 1 năm 2026 là bao nhiêu?",
19
  "ground_truth": "Lợi nhuận sau thuế quý 1/2026 được thể hiện trong báo cáo kết quả kinh doanh.",
20
+ "answer": "Để tìm lợi nhuận sau thuế của công ty quý 1 năm 2026, cần tham khảo thông tin từ bảng tài liệu [5] (File: UPCOM_quy1.pdf, Trang: 27).\n\nTừ bảng Short-term advances from customers, Advance payments from customers và Advance payments from related parties, có các thông tin được trích ra như sau:\n\n- Thuế giá trị gia tăng 44,815,816 (có thể được tính là \"thue\" trong tài liệu)\n\nLợi nhuận sau thuế của công ty quý 1 năm 2026 có liên quan đến giá trị gia tăng nên có thể tham khảo thêm tài liệu [2] (File: UPCOM_quy1.pdf, Trang: 35).\n\nTóm lại, lợi nhuận sau thuế của công ty quý 1 năm 2026 được tính như sau:\n\n60 = (30 + 40)\n- (30 = lợi nhuận trước thuế, tương đương với \"lgi_nhn_thuan_tr hoat d^ng_kh kinh doanh30\" trong tài liệu [3] (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 8)).\n- (40 = lợi nhuận trước thuế chịu thuế thu nhập doanh nghiệp, tương đương với \"l^i_nhuan_khdc (40=31-32)\" trong tài liệu [3] (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 8)).\n\n\nLợi nhuận trước thuế có thể được trích từ tài liệu [2] (File: UPCOM_quy1.pdf, Trang: 35), có thông tin sau:\n17 Earning after tax (14-15-16) (29,161,413,091)\n\n- Trong đó có 3 mục liên quan: \"14-15-16\" tương đương với \"lgi_nhn_truoc_thue (14), lgi_nhn_thuan_tr hoat d^ng_kh kinh doanh30 (15) và lgi_nhn_sau_thue_thu_nh n^p dng (16)\".\n\n- Giá trị của mục \"14\" không được trích dẫn trong tài liệu.\n\n- Giá trị của mục \"15\" không được trích dẫn trong tài liệu.\n\n- Giá trị của mục \"16\" là 28,960,612,444.\n\n- Lợi nhuận trước thuế là 29,161,413,091\n\nVậy lợi nhuận sau thuế của công ty quý 1 năm 2026 là:\n60 = (30 = 29,161,413,091) + (40) - (51) = 28,966,612,445.\n\nDo đó, lợi nhuận sau thuế của công ty quý 1 năm 2026 là 28,960,612,444.",
21
  "faithfulness": 0.8,
22
+ "answer_relevancy": 0.0,
23
+ "context_recall": 0.5
24
  },
25
  {
26
  "question": "Doanh thu của FPT trong quý 2 năm 2016 là bao nhiêu?",
27
  "ground_truth": "Doanh thu FPT quý 2/2016 được ghi nhận trong báo cáo tài chính giữa niên độ.",
28
+ "answer": "Không tìm thấy thông tin về doanh thu của FPT trong quý 2 năm 2016 trong tài liệu được cung cấp.",
29
+ "faithfulness": 0.5,
30
+ "answer_relevancy": 0.8,
31
+ "context_recall": 0.5
32
  },
33
  {
34
  "question": "Chi phí tài chính của FPT trong nửa đầu năm 2016 là bao nhiêu?",
35
  "ground_truth": "Chi phí tài chính được thể hiện trong báo cáo kết quả hoạt động kinh doanh của FPT.",
36
+ "answer": "Không tìm thấy thông tin về chi phí tài chính của FPT trong nửa đầu năm 2016 trong tài liệu được cung cấp.",
37
+ "faithfulness": 0.5,
38
+ "answer_relevancy": 0.8,
39
+ "context_recall": 0.5
40
  },
41
  {
42
  "question": "Báo cáo UPCOM quý 1 trình bày thông tin về những công ty nào?",
43
  "ground_truth": "Báo cáo UPCOM quý 1 trình bày thông tin giao dịch và tài chính của các công ty niêm yết trên sàn UPCOM.",
44
+ "answer": "Không tìm thấy thông tin về báo cáo UPCOM quý 1 trong phần NGỮ CẢNH được cung cấp.\n\nTuy nhiên, ở phần cuối trang, có thông tin về các công ty phải chịu trách nhiệm nộp phạt khác nhau, cụ thể là:\n\n- Công ty TNHH Thong Tin FPT\n- Công ty TNHH Gido dye FPT\n- Công ty TNHH Thuang mgi FPT\n- Công ty TNHH Phdn mint FPT\n- Công ty Cdphan V iin thong FPT\n- Công ty Cdphdn Ban le K $ thudt sd FPT\n- Công ty TNHH Ddu tu FPT\n- Công ty TNHH Truyin thong vd Gidi tri FPT\n\nTuy nhiên, điều này không liên quan trực tiếp đến báo cáo UPCOM quý 1.",
45
+ "faithfulness": 0.5,
46
+ "answer_relevancy": 0.2,
47
+ "context_recall": 0.5
48
  },
49
  {
50
  "question": "FPT hoạt động trong những lĩnh vực kinh doanh nào?",
51
  "ground_truth": "FPT hoạt động trong các lĩnh vực công nghệ thông tin, viễn thông, giáo dục và các dịch vụ liên quan.",
52
+ "answer": "FPT hoạt động trong các lĩnh vực cơ bản sau đây:\n\n- Cung cấp dịch vụ tin học, giải trí (truyên truyền, quảng cáo, true tuyin)\n- Cung cấp dịch vụ truyền thông thông qua internet\n- Xây dựng và cung cấp giải pháp công nghệ thông tin\n- Cung cấp dịch vụ phát triển phần mềm, giải pháp công nghệ thông tin\nTheo thông tin được cung cấp trên Trang: 22 của tài liệu, ban đầu FPT hoạt động trong lĩnh vực tin học, giải trí, và sau này mở rộng sang các lĩnh vực khác như truyền thông, giải trí.\n\nTheo thông tin trong tài liệu, ở thời điểm năm 2016, FPT có 5 công ty con, trong đó:\n\n- Công ty TNHH Truyền thông Giá trị FPT: 100%\n- Công ty TNHH Phát triển Phần mềm FPT: 100%\n- Công ty TNHH Phát triển Phần cứng FPT: 100%\n- Công ty TNHH Dịch vụ FPT: 100%\n- Công ty Cổ phần Công nghệ Thông tin FPT: 45,64%\n\nTuy nhiên, trong thời gian hoạt động, FPT đã mở rộng và có nhiều công ty con hơn.",
53
  "faithfulness": 0.8,
54
+ "answer_relevancy": 0.5,
55
+ "context_recall": 0.5
56
  },
57
  {
58
  "question": "Tổng tài sản của TIG tại thời điểm cuối quý 1 năm 2026 là bao nhiêu?",
59
  "ground_truth": "Tổng tài sản của TIG được ghi nhận trên bảng cân đối kế toán tại ngày 31/03/2026.",
60
+ "answer": "Để tính tổng tài sản của TIG tại thời điểm cuối quý 1 năm 2026, chúng ta cần thống kê số liệu tài sản trong các bảng tài khoản.\n\nTuy nhiên, dựa trên thông tin trong tài liệu, chúng ta có thể tính tổng tài sản bằng cách cộng tổng các tài sản ngắn hạn và dài hạn.\n\nTrong tài liệu [1] (Trang: 24), chúng ta thấy bảng danh sách tài sản dài hạn sau:\n\n- Tất cả các tài sản dài hạn khác được đề cập đều có liên quan đến tài sản cố định (fixed assets).\n\nTrong tài liệu [2] (Trang: 23), bảng danh sách tài sản dài hạn chi tiết tài sản cố định như sau:\n\n- Đất đai : VND43,769,366,865\n- Các công trình và thiết bị: VND154,958,142,898\n- Thiết bị và máy móc: VND24,167,415,745\n- Xe cộ: VND1,469,963,571\n- Thiết bị thu - phát tín hiệu: VND224,364,889,079\n\nNhư vậy, tổng tài sản cố định của TIG tại thời điểm cuối quý 1 năm 2026 là VND43,769,366,865 + VND154,958,142,898 + VND24,167,415,745 + VND1,469,963,571 + VND224,364,889,079 = VND408,539,938,158.\n\nTổng tài sản dài hạn của TIG tại thời điểm cuối quý 1 năm 2026 là VND408,539,938,158.\n\nTrừ đi tài sản cố định, chúng ta lấy lại tài sản dài hạn không phải cố định trong tài liệu [1] (Trang: 24). Ở đó, tài sản dài hạn không phải cố định của TIG là quyền sử dụng đất: VND5,686,065,091.\n\nTổng tài sản dài hạn của TIG tại thời điểm cuối quý 1 năm 2026 là VND408,539,938,158 + VND5,686,065,091 = VND414,225,003,249.\n\nTrong tài liệu [1] (Trang: 24), tổng tài sản ngắn hạn của TIG tại thời điểm cuối quý 1 năm 2026, đó là:\n\n- Phải trả (VND4,662,511,819), khoản thu chưa thực hiện (VND1,011,142,000), các khoản đầu tư ngắn hạn (VND1,516,707,882), các khoản đầu tư khác (VND208,920,624), các khoản nợ ngắn hạn khác (VND1,500,000,000).\n\nTổng tài sản ngắn hạn của TIG tại thời điểm cuối quý 1 năm 2026 là 4,662,511,819 + 1,011,142,000 + 1,516,707,882 + 208,920,624 + 1,500,000,000 = VND8,999,181,325.\n\nTổng tài sản của TIG tại thời điểm cuối quý 1 năm 2026 là VND8,999,181,325 + VND414,225,003,249 = VND423,224,184,574.\n\nVậy, Tổng tài sản của TIG tại thời điểm cuối quý 1 năm 2026 là VND 423,224,184,574.\n\nChú thích: Thông tin có thể không chính xác vì dựa vào tài liệu cung cấp.",
61
  "faithfulness": 0.8,
62
+ "answer_relevancy": 0.9,
63
+ "context_recall": 0.5
64
  },
65
  {
66
  "question": "Doanh thu của FPT quý 2 năm 2016 so với cùng kỳ năm trước tăng hay giảm?",
67
  "ground_truth": "Sự biến động doanh thu được thể hiện qua cột so sánh cùng kỳ trong báo cáo tài chính.",
68
+ "answer": "Không tìm thấy thông tin về doanh thu của FPT quý 2 năm 2016 và năm trước trong tài liệu.",
69
+ "faithfulness": 0.5,
70
+ "answer_relevancy": 0.5,
71
+ "context_recall": 0.5
72
  },
73
  {
74
  "question": "Vốn chủ sở hữu của TIG tại quý 1 năm 2026 là bao nhiêu?",
75
  "ground_truth": "Vốn chủ sở hữu của TIG được trình bày trong phần nguồn vốn của bảng cân đối kế toán.",
76
+ "answer": "Tôi tìm thấy thông tin trong tài liệu.\n\nTheo tài liệu [3], vốn chủ sở hữu của TIG tại 31/12/2025 là 332,944,895,998 VND.\n\nTuy nhiên, tôi không tìm thấy thông tin về vốn chủ sở hữu tại quý 1 năm 2026 trong tài liệu. Nhưng chúng ta có thể tính được vốn chủ sở hữu tại quý 1 năm 2026 dựa trên thông tin về lợi nhuận trước thuế và các yếu tố khác trong tài liệu [5] và [4].\n\nCụ thể, tại quý 1 năm 2026, lợi nhuận trước thuế của TIG là 01 (28,960,612,444) (tức là lỗ), và các yếu tố khác như khấu hao và trích trước quỹ thưởng cũng được ghi nhận trong tài liệu [5].\n\nTuy nhiên, để tính được vốn chủ sở hữu tại quý 1 năm 2026, chúng ta cần thông tin bổ sung về các yếu tố khác như quỹ thưởng và các khoản phải thu/còn phải trả.\n\nVì vậy, tôi không thể tính được chính xác vốn chủ sở hữu của TIG tại quý 1 năm 2026.",
77
+ "faithfulness": 0.5,
78
+ "answer_relevancy": 0.5,
79
+ "context_recall": 0.5
80
  },
81
  {
82
  "question": "Trong báo cáo FPT quý 2 năm 2016, khoản mục nào có giá trị lớn nhất trong tài sản ngắn hạn?",
83
  "ground_truth": "Khoản mục có giá trị lớn nhất trong tài sản ngắn hạn được thể hiện trên bảng cân đối kế toán của FPT.",
84
+ "answer": "Trong báo cáo FPT quý 2 năm 2016, khoản mục có giá trị lớn nhất trong tài sản ngắn hạn là \"Tài khoản phải trả khác\" với giá trị 1.451.600.000.000 VND.\n\nXin lỗi, tôi không tìm thấy thông tin cụ thể về khoản mục có giá trị lớn nhất trong tài sản ngắn hạn trong tài liệu được cung cấp.\n\nTôi sử dụng thông tin trong phần NGỮ CẢNH dưới đây:\n\n[1] (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 8)\n11. Doanh thu và cung cấp dịch vụ\n MA U S6 B 02a-DN\n...\nTài sản ngắn hạn\n\nTuy nhiên, tôi không tìm thấy thông tin chi tiết về khoản mục có giá trị lớn nhất trong tài sản ngắn hạn trong báo cáo FPT quý 2 năm 2016.",
85
+ "faithfulness": 0.0,
86
+ "answer_relevancy": 0.5,
87
+ "context_recall": 0.5
88
+ },
89
+ {
90
+ "question": "Vốn điều lệ của Công ty Cổ phần FPT tại thời điểm báo cáo quý 2 năm 2016 là bao nhiêu?",
91
+ "ground_truth": "Vốn điều lệ của FPT được ghi nhận trong phần vốn chủ sở hữu trên bảng cân đối kế toán tại ngày 30/06/2016.",
92
+ "answer": "Theo tài liệu [2], tại thời điểm ngày 30 tháng 6 năm 2016, vốn điều lệ của Công ty Cổ phần FPT là 4.594.266.840.000 VND.",
93
+ "faithfulness": 0.9,
94
+ "answer_relevancy": 0.9,
95
+ "context_recall": 0.5
96
+ },
97
+ {
98
+ "question": "Tổng tài sản của FPT tại cuối quý 2 năm 2016 là bao nhiêu?",
99
+ "ground_truth": "Tổng tài sản của FPT được tổng hợp trên bảng cân đối kế toán tại ngày 30/06/2016.",
100
+ "answer": "Đoạn tài liệu [4] cho biết Tổng tài sản của FPT tại cuối quý 2 năm 2016 là 431.000.111.769 VND.\n\n[4] (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 34)\n\n\"Den ngiy 30 th^ng 6 nim 2016, C6ng ty da g6p dupe 170 ty V ND...\"",
101
+ "faithfulness": 0.9,
102
+ "answer_relevancy": 0.9,
103
+ "context_recall": 0.5
104
+ },
105
+ {
106
+ "question": "Số lượng nhân viên của FPT tại ngày 30 tháng 6 năm 2016 là bao nhiêu?",
107
+ "ground_truth": "Số lượng nhân viên của FPT tại ngày 30/06/2016 được công bố trong phần thông tin chung của báo cáo tài chính.",
108
+ "answer": "Theo tài liệu được cung cấp [2], tại ngày 30 tháng 6 năm 2016, FPT có tổng cộng 208 nhân viên.",
109
+ "faithfulness": 0.9,
110
+ "answer_relevancy": 0.5,
111
+ "context_recall": 0.5
112
+ },
113
+ {
114
+ "question": "Chi phí quản lý doanh nghiệp của FPT nửa đầu năm 2016 so với cùng kỳ năm 2015 thay đổi như thế nào?",
115
+ "ground_truth": "Biến động chi phí quản lý doanh nghiệp so với cùng kỳ được trình bày trong bảng so sánh của báo cáo kết quả kinh doanh.",
116
+ "answer": "Không tìm thấy thông tin về chi phí quản lý doanh nghiệp của FPT nửa đầu năm 2016 so với cùng kỳ năm 2015 trong tài liệu được cung cấp.",
117
+ "faithfulness": 0.8,
118
+ "answer_relevancy": 0.5,
119
+ "context_recall": 0.5
120
+ },
121
+ {
122
+ "question": "FPT được niêm yết tại sở giao dịch chứng khoán nào?",
123
+ "ground_truth": "FPT được niêm yết tại Sở Giao dịch Chứng khoán Thành phố Hồ Chí Minh (HOSE) từ tháng 12 năm 2006.",
124
+ "answer": "Tôi không tìm thấy thông tin về sở giao dịch chứng khoán mà FPT được niêm yết trong phần tài liệu cung cấp. Tuy nhiên, trong phần 4 (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 22), có thông tin về sở giao dịch chứng khoán và số đăng ký của một số công ty con của FPT.\n\nTheo đó, có thể thấy FPT có các sở giao dịch chứng khoán sau:\n\n* Sở giao dịch chứng khoán Hà Nội (HNX) - cụ thể là Công ty TNHH Truyền thông Giiitri FPT (FREITOP) có sở giao dịch tại địa chỉ số 261-263 K, quận Thanh Xuân, Hà Nội.\n* Sở giao dịch chứng khoán Hồ Chí Minh (HOSE) - cụ thể là Công ty Cổ phần Đấu Thầu FPT Dd Ndng có sở giao dịch tại địa chỉ số 40S, đường Định Công, phường Định Công, quận Hoàng Mai, Hà Nội.\n\nTuy nhiên, thông tin về sở giao dịch chứng khoán chính của FPT không được chỉ rõ trong phần tài liệu cung cấp.",
125
+ "faithfulness": 0.8,
126
+ "answer_relevancy": 0.8,
127
+ "context_recall": 0.5
128
+ },
129
+ {
130
+ "question": "Tổng tài sản của công ty tại ngày 31 tháng 3 năm 2026 là bao nhiêu?",
131
+ "ground_truth": "Tổng tài sản tại ngày 31/03/2026 được trình bày trên bảng cân đối kế toán trong báo cáo tài chính quý 1/2026.",
132
+ "answer": "Để tính tổng tài sản của công ty tại ngày 31 tháng 3 năm 2026, chúng ta cần xem các tài khoản sau:\n\n- Vốn kinh doanh\n- Nhiễm nợ\n- Tài sản ngắn hạn\n- Tài sản dài hạn\n\nTuy nhiên, không có thông tin về vốn kinh doanh và nhiễm nợ trong tài liệu được cung cấp. Nhưng chúng ta có thể xem xét các tài khoản khác nhau như sau:\n\n[2] (File: UPCOM_quy1.pdf, Trang: 18)\nCASH EQUIVALENTS \n 31/03/2026 01/01/2026\n VND VND \n- Cash on hand 258,726,283 208,338,657 \n- Cash at bank 2,635,107,728 50,493,015,326 \n- Short-term deposits with a maturity of less than 3 months 300,000,000 - \nTotal 3,193,834,011 50,701,353,983\n\n[5] (File: UPCOM_quy1.pdf, Trang: 22)\n8. INVENTORIES \nBalance Provision Balance Provision\nVND VND VND VND\n- Raw materials 12,561,506,078 - 12,592,349,506 - \n- Tools, instruments 669,732,255 - 263,541,855 - \n- Work in progress 74,013,570,655 (6,340,234,019) 91,393,448,779 (6,340,234,019)\n- Goods 4,159,914,964 - 4,159,914,964 -\n\n9. PREPAID EXPENSES \n 31/03/2026 01/01/2026 \n VND VND \nShort-term prepayments 590,847,398 865,140,107 \n- Fixed asset repair expenses 342,162,697 507,494,979 \n- Tools and equipment 4,690,000 67,182,497 \n- Insurance expense 243,994,701 284,872,631 \n- Other short-term prepaid expenses - 5,590,000 \nLong-term prepayments 2,789,130,795 3,551,010,262 \n- Tools và equipment 865,228,920 1,087,678,302 \n\n\n Tổng tài sản của công ty tại ngày 31 tháng 3 năm 2026 có thể tính như sau: \nCASH EQUIVALENTS + INVENTORIES + PREPAID EXPENSES \n= 3,193,834,011 + (12,592,349,506 - 263,541,855 + 91,393,448,779 - 4,159,914,964) \n+ (590,847,398 + 865,140,107 + 4,690,000 + 243,994,701) + (2,789,130,795 + 865,228,920) \n= 3,193,834,011 + 99,552,128,412 + 1,399,672,206 = 104,146,334,629 \n\nHoặc \n\n= 3,193,834,011 + 103,985,798,285 + 3,654,280,493 \n= 110,833,913,089\n\nChúng ta thấy có 2 kết quả khác nhau. Có thể kết quả này đến từ việc sử dụng tài khoản khác nhau trong tài liệu được cung cấp. Tuy nhiên, dựa trên thông tin được cung cấp, kết quả chính xác hơn có thể là 104,146,334,629.",
133
  "faithfulness": 0.8,
134
  "answer_relevancy": 0.8,
135
+ "context_recall": 0.5
136
+ },
137
+ {
138
+ "question": "Nợ phải trả của công ty tại cuối quý 1 năm 2026 là bao nhiêu?",
139
+ "ground_truth": "Nợ phải trả được ghi nhận trong phần nguồn vốn của bảng cân đối kế toán tại ngày 31/03/2026.",
140
+ "answer": "Câu hỏi này liên quan đến tài liệu [1] (File: UPCOM_quy1.pdf, Trang: 6).\n\nTại phần \"STATEMENT OF FINANCIAL POSITION (Continued)\" trên trang 6 của tài liệu, chúng ta thấy cột \"31/03/2026\" thể hiện số nợ phải trả của công ty tại cuối quý 1 năm 2026.\n\nTheo đó, tổng số nợ phải trả của công ty tại cuối quý 1 năm 2026 là 748.045.198.004 VND.\n\nNếu bạn muốn biết chi tiết nợ phải trả của công ty, bạn có thể tham khảo cột \"311\", \"312\", \"314\", \"315\", \"316\", \"320\", \"321\" của phần \"Current liabilities\" trên trang 6 của tài liệu.\n\nVì thông tin này được thể hiện rất rõ ràng và chi tiết trong tài liệu, nên tôi không cần sử dụng thêm bất kỳ tài liệu nào khác.\n\nVậy, nợ phải trả của công ty tại cuối quý 1 năm 2026 là 748.045.198.004 VND.",
141
+ "faithfulness": 0.9,
142
+ "answer_relevancy": 0.5,
143
+ "context_recall": 0.5
144
+ },
145
+ {
146
+ "question": "Chi phí bán hàng của công ty trong quý 1 năm 2026 là bao nhiêu?",
147
+ "ground_truth": "Chi phí bán hàng quý 1/2026 được thể hiện trong báo cáo kết quả hoạt động kinh doanh.",
148
+ "answer": "Không tìm thấy thông tin về chi phí bán hàng trong số liệu được cung cấp. Tuy nhiên, có một số thông tin liên quan đến chi phí bán hàng:\n\nTrong bài viết [1], có một dòng chỉ ra rằng \"Selling expenses\" là một mục trong bảng cân đối kế toán, nhưng không có thông tin cụ thể về chi phí bán hàng.\n\nTrong bài viết [4], có một dòng chỉ ra rằng \"Cost of goods sold\" là một mục trong bảng thu nhập, nhưng không phải là chi phí bán hàng.\n\nNếu bạn cần thông tin chi tiết hơn, có thể cần phải sử dụng số liệu khác hoặc liên hệ trực tiếp với công ty.",
149
+ "faithfulness": 0.5,
150
+ "answer_relevancy": 0.4,
151
+ "context_recall": 0.5
152
+ },
153
+ {
154
+ "question": "Lợi nhuận sau thuế quý 1 năm 2026 so với cùng kỳ năm trước biến động như thế nào?",
155
+ "ground_truth": "Biến động lợi nhuận so với cùng kỳ năm trước được thể hiện qua cột so sánh trong báo cáo kết quả kinh doanh.",
156
+ "answer": "Lợi nhuận sau thuế quý 1 năm 2026 so với cùng kỳ năm trước đã giảm 7,472,342,632 đồng (theo số liệu trên Bảng 60, trang 32 của tài liệu).\n\nLợi nhuận sau thuế quý 1 năm 2026: (28,960,612,444) đồng\nLợi nhuận sau thuế quý 1 năm 2025: (-21,487,269,812) đồng\n\nLợi nhuận sau thuế quý 1 năm 2026 giảm 7,472,342,632 (28,960,612,444 - (-21,487,269,812)) so với cùng kỳ năm trước.",
157
+ "faithfulness": 0.5,
158
+ "answer_relevancy": 0.5,
159
+ "context_recall": 0.5
160
+ },
161
+ {
162
+ "question": "Doanh thu thuần của TIG trong quý 1 năm 2026 là bao nhiêu?",
163
+ "ground_truth": "Doanh thu thuần của TIG quý 1/2026 được ghi nhận trong báo cáo kết quả hoạt động kinh doanh.",
164
+ "answer": "Để tính toán doanh thu thuần của TIG trong quý 1 năm 2026, chúng ta cần xem xét phầngross revenue from goods sold and services rendered trong báo cáo tài chính [1].\n\nDoanh thu thuần của TIG trong quý 1 năm 2026 là:\n63,904,435,716 (VND)\n\nLưu ý: Đơn vị tiền tệ sử dụng trong báo cáo tài chính là Việt Nam Đồng (VND).",
165
+ "faithfulness": 0.8,
166
+ "answer_relevancy": 0.8,
167
+ "context_recall": 0.5
168
+ },
169
+ {
170
+ "question": "Lợi nhuận sau thuế của TIG quý 1 năm 2026 là bao nhiêu?",
171
+ "ground_truth": "Lợi nhuận sau thuế của TIG quý 1/2026 được thể hiện trong báo cáo kết quả kinh doanh hợp nhất.",
172
+ "answer": "Không tìm thấy thông tin về lợi nhuận sau thuế của TIG trong tài liệu liên quan. Tuy nhiên, có một thông tin về lợi nhuận sau thuế của một công ty, trong đó có thông tin về việc phân phối lợi nhuận sau thuế cho các cổ đông trong năm 2015.",
173
+ "faithfulness": 0.0,
174
+ "answer_relevancy": 0.2,
175
+ "context_recall": 0.5
176
+ },
177
+ {
178
+ "question": "TIG hoạt động trong lĩnh vực kinh doanh nào theo báo cáo tài chính quý 1 năm 2026?",
179
+ "ground_truth": "Lĩnh vực kinh doanh chính của TIG được mô tả trong phần thông tin chung hoặc thuyết minh báo cáo tài chính.",
180
+ "answer": "Theo tài liệu [1], TIG hoạt động trong lĩnh vực xây dựng và cung cấp vật liệu xây dựng tại Việt Nam.\n\nHay theo tài liệu [4], TIG hoạt động trong các lĩnh vực sau:\n\n- Đưa ra các hợp đồng xây dựng\n- Thuê văn phòng\n- Thuê tài sản cố định và công cụ\n- Cung cấp vật liệu\n- Hoạt động khác\n\nCác hoạt động này được thể hiện trong phần \"Lợi nhuận từ các hợp đồng bán hàng và cung cấp dịch vụ\" và \"Chi phí sản xuất hàng bán\".",
181
+ "faithfulness": 0.5,
182
+ "answer_relevancy": 0.5,
183
+ "context_recall": 0.5
184
+ },
185
+ {
186
+ "question": "Khoản mục nào chiếm tỷ trọng lớn nhất trong tổng tài sản của TIG quý 1 năm 2026?",
187
+ "ground_truth": "Khoản mục chiếm tỷ trọng lớn nhất trong tổng tài sản được xác định từ bảng cân đối kế toán của TIG tại 31/03/2026.",
188
+ "answer": "Đoạn [2] trong tài liệu cung cấp thông tin chi tiết về tổng tài sản của VN Railway Construction Corporation JSC SEPARATE FINALCIAL STATEMENTS tại ngày 31/03/2026.\n\nTheo đó, tổng tài sản được chia thành các loại như: Tài sản ngắn hạn (280) và Tài sản dài hạn (200). Chúng ta có thể thấy rằng Tài sản dài hạn chiếm tỷ trọng lớn nhất.",
189
+ "faithfulness": 0.5,
190
+ "answer_relevancy": 0.8,
191
+ "context_recall": 0.5
192
+ },
193
+ {
194
+ "question": "Khối lượng giao dịch cổ phiếu trên sàn UPCOM trong quý 1 là bao nhiêu?",
195
+ "ground_truth": "Khối lượng giao dịch cổ phiếu trên sàn UPCOM được thống kê trong báo cáo tổng hợp hoạt động giao dịch quý 1.",
196
+ "answer": "Không tìm th��y thông tin trong tài liệu.",
197
+ "faithfulness": 0.5,
198
+ "answer_relevancy": 0.5,
199
+ "context_recall": 0.5
200
+ },
201
+ {
202
+ "question": "Sàn UPCOM được quản lý bởi tổ chức nào?",
203
+ "ground_truth": "Sàn UPCOM được quản lý và vận hành bởi Sở Giao dịch Chứng khoán Hà Nội (HNX).",
204
+ "answer": "Không tìm thấy thông tin về sàn UPCOM trong tài liệu NGỮ CẢNH.",
205
+ "faithfulness": 0.8,
206
+ "answer_relevancy": 0.0,
207
+ "context_recall": 0.5
208
+ },
209
+ {
210
+ "question": "Doanh thu FPT nửa đầu năm 2016 so với nửa đầu năm 2015 tăng hay giảm bao nhiêu phần trăm?",
211
+ "ground_truth": "Tỷ lệ tăng trưởng doanh thu so với cùng kỳ được thể hiện qua cột so sánh trong báo cáo kết quả kinh doanh giữa niên độ.",
212
+ "answer": "Để trả lời câu hỏi này, ta cần phân tích dữ liệu trong tài liệu [2] (File: FPT_16Q2_BCTC_MSX.pdf, Trang: 20).\n\nVào ngày 30 tháng 6 năm 2016, doanh thu FPT bao gồm cả mục, thiết bị, phụ tùng và tài sản bao gồm là 34.708.372.341 VND (ngày 31 tháng 12 năm 2015: 34.377.804.525 VND).\n\nDo đó, doanh thu FPT nửa đầu năm 2016 tăng so với nửa đầu năm 2015 là:\n\n(34.708.372.341 VND - 34.377.804.525 VND) / 34.377.804.525 VND * 100%\n\n= 1,03%\n\nThế nên, doanh thu FPT nửa đầu năm 2016 tăng 1,03% so với nửa đầu năm 2015.",
213
+ "faithfulness": 0.8,
214
+ "answer_relevancy": 0.5,
215
+ "context_recall": 0.5
216
  }
217
  ]
218
  }
migrate_qdrant.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Migrate Qdrant local → Qdrant Cloud.
3
+ Usage: python migrate_qdrant.py
4
+ """
5
+ import os
6
+ from qdrant_client import QdrantClient
7
+ from qdrant_client.models import Distance, VectorParams, PointStruct
8
+ from tqdm import tqdm
9
+ from dotenv import load_dotenv
10
+
11
+ load_dotenv()
12
+
13
+ COLLECTION_NAME = "rag_docs"
14
+ QDRANT_PATH = "qdrant_storage"
15
+ BATCH_SIZE = 20
16
+
17
+ QDRANT_URL = os.getenv("QDRANT_URL")
18
+ QDRANT_API_KEY = os.getenv("QDRANT_API_KEY")
19
+
20
+ if not QDRANT_URL or not QDRANT_API_KEY:
21
+ raise ValueError("Thiếu QDRANT_URL hoặc QDRANT_API_KEY trong .env")
22
+
23
+
24
+ def migrate():
25
+ print("Kết nối local Qdrant...")
26
+ local = QdrantClient(path=QDRANT_PATH)
27
+
28
+ print("Kết nối Qdrant Cloud...")
29
+ cloud = QdrantClient(url=QDRANT_URL, api_key=QDRANT_API_KEY, timeout=60)
30
+
31
+ # Lấy info collection local
32
+ collection_info = local.get_collection(COLLECTION_NAME)
33
+ vector_size = collection_info.config.params.vectors.size
34
+ print(f"Collection: {COLLECTION_NAME}, vector dim: {vector_size}")
35
+
36
+ # Tạo collection trên cloud
37
+ existing = [c.name for c in cloud.get_collections().collections]
38
+ if COLLECTION_NAME in existing:
39
+ print(f"Collection '{COLLECTION_NAME}' đã tồn tại trên cloud, xóa và tạo lại...")
40
+ cloud.delete_collection(COLLECTION_NAME)
41
+
42
+ cloud.create_collection(
43
+ collection_name=COLLECTION_NAME,
44
+ vectors_config=VectorParams(size=vector_size, distance=Distance.COSINE),
45
+ )
46
+ print("Đã tạo collection trên cloud.")
47
+
48
+ # Đọc tất cả points từ local
49
+ print("Đọc points từ local...")
50
+ offset = None
51
+ all_points = []
52
+ while True:
53
+ result, next_offset = local.scroll(
54
+ collection_name=COLLECTION_NAME,
55
+ limit=BATCH_SIZE,
56
+ offset=offset,
57
+ with_vectors=True,
58
+ with_payload=True,
59
+ )
60
+ all_points.extend(result)
61
+ if next_offset is None:
62
+ break
63
+ offset = next_offset
64
+
65
+ print(f"Tổng {len(all_points)} points cần migrate.")
66
+
67
+ # Upload lên cloud theo batch
68
+ for i in tqdm(range(0, len(all_points), BATCH_SIZE), desc="Uploading"):
69
+ batch = all_points[i:i + BATCH_SIZE]
70
+ points = [
71
+ PointStruct(id=p.id, vector=p.vector, payload=p.payload)
72
+ for p in batch
73
+ ]
74
+ cloud.upsert(collection_name=COLLECTION_NAME, points=points)
75
+
76
+ count = cloud.count(COLLECTION_NAME).count
77
+ print(f"Migration xong! Cloud có {count} points.")
78
+
79
+
80
+ if __name__ == "__main__":
81
+ migrate()