Sukmadi commited on
Commit
aa09238
·
1 Parent(s): 4d508e0

add upload multiple files feature

Browse files
test/cerebras-api.py DELETED
@@ -1,32 +0,0 @@
1
- # import os
2
- # from cerebras.cloud.sdk import Cerebras
3
-
4
- # client = Cerebras(
5
- # # This is the default and can be omitted
6
- # api_key=os.environ.get("CEREBRAS_API_KEY")
7
- # )
8
-
9
- # stream = client.chat.completions.create(
10
- # messages=[
11
- # {
12
- # "role": "system",
13
- # "content": ""
14
- # }
15
- # ],
16
- # model="gpt-oss-120b",
17
- # stream=True,
18
- # max_completion_tokens=65536,
19
- # temperature=1,
20
- # top_p=1
21
- # )
22
-
23
- my_dict = {'apple': 1, 'banana': 2, 'cherry': 3}
24
-
25
- # Enumerate through both keys and values
26
- for index, (key, value) in enumerate(my_dict.items()):
27
- print(f"Index: {index}, Key: {key}, Value: {value}")
28
-
29
- # Enumerate only through keys (less common with dictionaries)
30
- print("\nEnumerate through keys only:")
31
- for index, key in enumerate(my_dict): # By default, iterating a dict iterates its keys
32
- print(f"Index: {index}, Key: {key}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
test/mcq_output.json CHANGED
@@ -1,199 +1,181 @@
1
  {
2
  "mcqs": {
3
  "1": {
4
- "câu hỏi": "Trong bảng tổng hợp các nhóm nội dung dễ gây nhầm lẫn, nhóm nào liên quan đến giao dịch tiền bạc?",
5
  "lựa chọn": {
6
- "a": "promotion_phrases",
7
- "b": "financial_phrases",
8
- "c": "lottery_phrases",
9
- "d": "scam_alert_phrases"
10
  },
11
- "đáp án": "financial_phrases"
12
  },
13
  "2": {
14
- "câu hỏi": "Theo tả về kiến trúc BERT‑base trong nội dung, hình này bao nhiêu lớp encoder Transformer?",
15
  "lựa chọn": {
16
- "a": "10",
17
- "b": "12",
18
- "c": "24",
19
- "d": "48"
20
  },
21
- "đáp án": "12"
22
  },
23
  "3": {
24
- "câu hỏi": "Theo Định 6.1 (Tính chất Convex Combination), công thức tính trọng số kết hợp bằng tham số α là gì?",
25
  "lựa chọn": {
26
- "a": "weight = (1 - α) × w_similarity × ICF + α × w_saliency",
27
- "b": "weight = α × w_similarity × ICF + (1 - α) × w_saliency",
28
- "c": "weight = w_similarity + w_saliency",
29
- "d": "weight = α × (w_similarity + w_saliency)"
30
  },
31
- "đáp án": "weight = (1 - α) × w_similarity × ICF + α × w_saliency"
32
  },
33
  "4": {
34
- "câu hỏi": "Theo nội dung, một nhược điểm của phương pháp dựa trên từ khóa trong việc phát hiện spam ?",
35
  "lựa chọn": {
36
- "a": " thể xử lý các biến thể và lỗi chính tả",
37
- "b": "Thiếu linh hoạt khi từ khóa thay đổi",
38
- "c": "Không hiểu ngữ cảnh của từ trong các câu",
39
- "d": "Đòi hỏi tính toán phức tạp"
40
  },
41
- "đáp án": "Không hiểu ngữ cảnh của từ trong các câu"
42
  },
43
  "5": {
44
- "câu hỏi": "Theo đoạn văn, điều nào sau đây tả đúng về hình BERT?",
45
  "lựa chọn": {
46
- "a": "BERT 12 lớp encoder, mỗi lớp kích thước ẩn 768 12 attention head.",
47
- "b": "BERT chỉ được huấn luyện bằng nhiệm vụ Dự đoán câu tiếp theo (Next Sentence Prediction - NSP).",
48
- "c": "BERT sử dụng kiến trúc một chiều, chỉ xử văn bản từ trái sang phải.",
49
- "d": "BERT bao gồm 24 lớp encoder kích thước ẩn 1024."
50
  },
51
- "đáp án": "BERT 12 lớp encoder, mỗi lớp kích thước ẩn 768 12 attention head."
52
  }
53
  },
54
  "validation": {
55
  "1": {
56
  "supported_by_embeddings": true,
57
- "max_similarity": 1.0912104845046997,
58
  "evidence": [
59
  {
60
- "idx": 27,
61
- "page": 4,
62
- "score": 0.7866219282150269,
63
- "text": "Dưới đây bảng tổng hợp các nhóm nội dung dễgây nhầm lẫn xuất hiện trong cảham spam tinh\nvi, đòi hỏi hình phải rất tinh tếmới phân biệt được:\n\n\n\n|Nhóm nội dung|Ví dụ nội dung|Dễ nhầm với|\n|---|---|---|\n|`financial_phrases`|“Please<br>confrm<br>the<br>$200<br>transfer<br>from<br>your<br>account.”<br>“Your invoice for June is now available.”|Scam / Phishing|\n|`promotion_phrases`|“Flash sale ends tonight 30% of all items!”<br>“Exclusive discount for HUST students.”|Spam quảng cáo|\n|`lottery_phrases`|“You’ve been selected for a loyalty reward.”<br>“You may be eligible for a lucky draw.”|Spam quà tặng /<br>Random Reward|\n|`scam_alert_phrases`|“Unusual login detected. Was this you?”<br>“A payment attempt was blocked on your card.”|Cảnh báo giả/ Giả<br>danh ngân hàng|\n|`call_to_action_phrases`|“Act now to secure your spot in the seminar.”<br>“Verify your email to complete registration.”|Spam ép buộc /<br>Confrmation bait|\n\n\n4"
64
  },
65
  {
66
- "idx": 46,
67
- "page": 11,
68
- "score": 0.7944862842559814,
69
- "text": "**Xây dựng tập cụm ngữnghĩa theo chủđề** : Các nhóm cụm từđược phân loại theo 7 chủđề\ndễgây nhầm lẫn giữa spam và ham, bao gồm:\n\n\n - `financial_phrases` (liên quan đến giao dịch, tiền bạc)\n\n\n - `promotion_phrases` (quảng cáo, ưu đãi)\n\n - `lottery_phrases` (trúng thưởng, phần thưởng)\n\n\n - `scam_alert_phrases` (cảnh báo giảmạo)\n\n\n - `call_to_action_phrases` (dẫn dụngười dùng hành động)\n\n\n - `social_engineering_phrases` (lừa đảo cảm xúc)\n\n - `obfuscated_phrases` (che giấu, tránh bộlọc spam)\n\n\n2. **Sinh dữliệu bằng kịch bản và LLM** :\n\n\n - Với mỗi nhóm cụm từ, nhóm thiết kếmột tập các kịch bản “base” như: _“Hey, did you hear_\n_about...”_, _“Bro, you should check this out”_ ... - Các cụm spam hoặc ham tương ứng được **chèn vào base**, tạo ra các mẫu dữliệu mới, theo\ncấu trúc _“base + insert”_ hoặc _“insert + base”_ . - Ngoài ra, nhóm chúng mình sửdụng LLM (như GPT hoặc Mixtral) đểsinh các câu mới theo\ntemplate kịch bản thực tế, nhằm tái hiện các loại spam ngụy trang phổbiến."
70
  },
71
  {
72
- "idx": 44,
73
- "page": 12,
74
- "score": 1.0912104845046997,
75
- "text": "Tuy nhiên sau khi chèn cụm “$200 cashback”, nó trởthành\nmột tin nhắn spam ngụy trang. Những câu như vậy rất khó nhận diện nếu chỉhuấn luyện từtập dữ\nliệu spam kiểu cũ. **Tác dụng**\n\n\nViệc áp dụng data augmentation theo hướng có kiểm soát giúp:\n\n\n **Giảm hiện tượng bias** của mô hình khi gặp spam đời thực, vốn thường mang ngôn ngữtựnhiên\nvà ẩn dụhơn là spam thô sơ kiểu “FREE!!! Click now!!!”\n\n\n **Tăng độrobust** của hệthống khi xửlý các tin nhắn có bềngoài giống ham nhưng nội dung\ntiềm ẩn spam. 12"
76
  }
77
  ],
78
  "model_verdict": {
79
- "supported": true,
80
- "confidence": 0.99,
81
- "evidence": "`financial_phrases` (liên quan đến giao dịch, tiền bạc)",
82
- "reason": "Context explicitly states that the group 'financial_phrases' is related to transactions and money."
83
  }
84
  },
85
  "2": {
86
  "supported_by_embeddings": true,
87
- "max_similarity": 1.0187240839004517,
88
  "evidence": [
89
  {
90
- "idx": 30,
91
- "page": 16,
92
- "score": 0.6454246044158936,
93
- "text": "**5.3.2** **Transformer Encoder**\n\n\n**Mục tiêu** Các lớp Transformer encoder xửlý ma trận embedding đểtạo biểu diễn ngữcảnh sâu sắc\ncho mỗi token, đặc biệt vector [CLS], giúp nắm bắt mối quan hệgiữa các từtrong tin nhắn. 16"
94
  },
95
  {
96
- "idx": 53,
97
- "page": 17,
98
- "score": 0.9272838234901428,
99
- "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n**Cấu trúc** BERT-base **12 lớp encoder**, mỗi lớp bao gồm:\n\n\n1. **Multi-Head Self-Attention** : Cho phép mỗi token “chú ý” đến các token khác trong chuỗi để\ncập nhật vector của nó. Công thức:\n\n\n\n_QK_ _T_\nAttention( _Q, K, V_ ) = softmax\n� ~~_√_~~ _d_ _k_\n\n\n\n_V_\n�\n\n\n\n\n - _Q_, _K_, _V_ : Ma trận query, key, value, được tạo từma trận embedding qua các trọng số _W_ _Q_,\n_W_ _K_, _W_ _V_ . - _d_ _k_ : Kích thước mỗi head (768 / 12 = 64). - Mỗi lớp **12 head**, mỗi head xửlý một góc nhìn khác của ngữcảnh. dụ: Trong “Nhận ngay quà tặng miễn phí!”, token “miễn” chú ý mạnh đến “quà” và “tặng”,\ntạo ngữcảnh quảng cáo. Attention Mask đảm bảo không chú ý đến [PAD]. Kết quả: Ma trận 16\n_×_ 768, với mỗi token được cập nhật dựa trên ngữcảnh. 2. **Residual Connection và Layer Normalization** : Cộng đầu vào đầu ra của attention:\n\n\n_x_ + Attention( _x_ )\n\n\nSau đó chuẩn hóa:\nLayerNorm( _x_ + Attention( _x_ ))\n\n\n3. **Feed-Forward Neural Network (FFN)** : ..."
100
  },
101
  {
102
- "idx": 32,
103
- "page": 28,
104
- "score": 1.0187240839004517,
105
- "text": "Các chuỗi này đóng vai tròđiểm neo” ngữnghĩa cho mỗi loại. hình BERT\ncũng tạo ra một vector nhúng cho mỗi chuỗi này\n\n\n28"
106
  }
107
  ],
108
  "model_verdict": {
109
- "supported": true,
110
- "confidence": 0.99,
111
- "evidence": "BERT-base có **12 lớp encoder**",
112
- "reason": "Context explicitly states BERT-base has 12 encoder layers, matching the answer."
113
  }
114
  },
115
  "3": {
116
  "supported_by_embeddings": true,
117
- "max_similarity": 0.808438777923584,
118
  "evidence": [
119
  {
120
- "idx": 14,
121
- "page": 20,
122
- "score": 0.7317581176757812,
123
- "text": "**6.1** **Khung Phân loại Trọng sốĐềxuất**\n\n\nVì vậy nhóm đã nghiên cứu và đềxuất áp dụng công thức trọng sốmới trong quá trình voting của KNN\nbằng kết hợp hai yếu tốtương đồng (similarity) và tầm quan trọng tinh tếcủa từng thực thể(saliency). **6.2** **Công thức Cốt lõi**\n\n\nweight( _x_ _j_ _,_ _q_ ) = (1 _−_ _α_ ) _×_ similarity( _x_ _j_ _,_ _q_ ) _×_ ICF( _y_ ( _x_ _j_ )) + _α ×_ saliency( _x_ _j_ _,_ _q_ ) (5)\n\n\nTrong đó:\n\n\n_x_ _j_ _·_ _q_\nsimilarity( _x_ _j_ _, q_ ) = cos( _x_ _j_ _, q_ ) = (6)\n_∥x_ _j_ _∥× ∥q∥_\n\n\n\n_N_\nICF( _c_ _i_ ) =\n_M × n_ _i_\n\n\n\n(7)\n\n\n\nsaliency( _x_ _j_ _, q_ ) = _∥∇_ _x_ _j_ _L_ ( _f_ ( _x_ _j_ ) _,_ ˆ _y_ ) _∥_ 2 (8)\n\n_α ∈_ [0 _,_ 1] (tham sốcân bằng) (9)\n\n\n**6.3** **Quyết định Phân loại Cuối cùng**\n\n\n\nˆ\n_y_ = arg max\n_c_ _i_ _∈C_\n\n\n\n�\n\n_x_ _j_ _∈N_ _K_ ( _q_ )\n_y_ ( _x_ _j_ )= _c_ _i_\n\n\n20\n\n\n\nweight( _x_ _j_ _, q_ ) (10)"
124
- },
125
- {
126
- "idx": 56,
127
- "page": 24,
128
- "score": 0.765610933303833,
129
- "text": "**6.4.3** **Trọng sốNội dung dựa trên Saliency**\n\n\n**Định nghĩa 3** (Gradient-based Saliency) **.** _Thành phần saliency nắm bắt_ _**tầm quan trọng cụthể**_\n_**theo đầu vào**_ _dựa trên mô hình explainable AI:_\n\n\n_saliency_ ( _x_ _j_ _, q_ ) = _∥∇_ _x_ _j_ _L_ ( _f_ ( _x_ _j_ ) _,_ ˆ _y_ ) _∥_ 2 (38)\n\n\n**6.4.4** **Kết hợp Lồi và Tham sốCân bằng** _α_\n\n\n**��ịnh lý 6.1** (Tính chất Convex Combination) **.** _Tham số_ _α tạo ra_ _**kết hợp lồi**_ _của hai lược đồtrọng_\n_số:_\n\n_weight_ = (1 _−_ _α_ ) _× w_ _similarity×ICF_ + _α × w_ _saliency_ (39)\n\n_Với α ∈_ [0 _,_ 1] _, kết quảnằm trong convex hull của hai thành phần._\n\n\n**6.5** **Phân tích Lý thuyết: Tại sao Công thức này Hợp lý**\n\n\n**6.5.1** **Phân tích Hiệu chỉnh Bias**\n\n\n**Định lý 6.2** (Bias Correction) **.** _Đối với majority voting truyền thống, ảnh hưởng kỳvọng của lớp c_ _i_ _là:_\n\nE[ _Influence_ _traditional_ ( _c_ _i_ )] = _K × P_ ( _c_ _i_ ) = _K ×_ _N_ _[n]_ _[i]_ (40)\n\n\n_Với phương pháp trọng sốcủa chúng ta:_\n\n\nE[ _Influence..."
130
- },
131
- {
132
- "idx": 41,
133
- "page": 19,
134
- "score": 0.808438777923584,
135
- "text": "Đối với điểm truy vấn _q_, KNN truyền thống tính toán:\n\n\nˆ\n_y_ = arg max _c_ _i_ _∈C_ _[|{][x]_ _[j]_ _[ ∈N]_ _[K]_ [(] _[q]_ [) :] _[ y]_ [(] _[x]_ _[j]_ [) =] _[ c]_ _[i]_ _[}|]_ (1)\n\n\n**Phân tích Bias:**\nXác suất đểmột K-neighborhood ngẫu nhiên chứa _k_ thực thểtừlớp _c_ _i_ tuân theo phân phối siêu hình\nhọc:\n\n\n19"
136
  }
137
  ],
138
  "model_verdict": {
139
  "supported": true,
140
  "confidence": 0.99,
141
- "evidence": "weight = (1 - α) × w_similarity×ICF + α × w_saliency (39)",
142
- "reason": "Công thức trong Định 6.1 khớp với đáp án đã cho"
143
  }
144
  },
145
  "4": {
146
  "supported_by_embeddings": true,
147
- "max_similarity": 0.5541524291038513,
148
  "evidence": [
149
  {
150
- "idx": 21,
151
- "page": 15,
152
- "score": 0.5191619992256165,
153
- "text": "Trong bài toán spam/ham, BERT được tinh\nchỉnh đểtối ưu hóa dựđoán nhãn tập trung vào các từkhóa quan trọng như “miễn phí” hoặc “quà\ntặng” trong tin nhắn spam. **Ứng dụng** : Trong phân loại tin nhắn spam/ham, BERT chuyển tin nhắn thành vector số, hiểu ngữ\ncảnh sâu sắc (ví dụ: nhận diện ”miễn phí” trong ngữcảnh quảng cáo), dựđoán nhãn (spam hoặc\nham). **Ưu điểm** :\n\n\n - Hiểu ngữcảnh hai chiều, vượt trội so với các phương pháp truyền thống như TF-IDF. - Sửdụng vector [CLS] đểtổng hợp thông tin toàn câu, phù hợp cho phân loại. **5.3** **Kiến trúc BERT**\n\n\nQuy trình xửlý của BERT bao gồm ba giai đoạn chính:\n\n\n1. ** hóa đầu vào** : Chuyển tin nhắn thành token, embedding, attention mask. 2. **Xửlý qua Transformer encoder** : Tạo biểu diễn ngữcảnh cho từng token, đặc biệt vector\n\n[CLS]. 3. **Phân loại** : Sửdụng vector [CLS] đểdựđoán nhãn spam/ham. Phần này trình bày chi tiết từng thành phần của kiến trúc BERT cách chúng hỗtrợbài toán phân\nloại tin nhắn spam/ham. **5.3.1** *..."
154
  },
155
  {
156
- "idx": 57,
157
- "page": 10,
158
- "score": 0.5541524291038513,
159
- "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n2. **Thiếu dữliệu vềspam tinh vi (Subtle or Obfuscated Spam)** :\n\n\n - Phần lớn mẫu spam trong tập train dạng “truyền thống” sửdụng từkhóa dễnhận\ndiện như _“FREE!!!”_, _“WIN now”_, _“Click here”_,... - Trong khi đó, spam thực tếngày nay ngày càng được thiết kếtinh vi hơn để **bắt chước văn**\n**phong tựnhiên của người thật**, dụ:\n\n\n_“Yo, this app gave me $200 cashback instantly, you should try =«”_\n\n\n - Do thiếu các dụkiểu này trong tập huấn luyện, hình không hội học được “ngữ\nnghĩa tiềm ẩn” của chúng, từđó dễbịđánh lừa. **2.2** **Giải pháp: Data Augmentation**\n\n\n**Mục tiêu**\n\n\nTăng độđa dạng của spam, đặc biệt spam dạng giống ham, nhằm:\n\n\n - Cân bằng dữliệu một cách hiệu quả\n\n\n - Tăng khảnăng hình phát hiện spam ngụy trang những câu ham dễnhầm thành spam\n\n\n** tảthay đổi của dataset trước và sau Augmentation**\n\n\nDataset gốc là _SMS Spam Collection Dataset_ từKaggle, có tổng cộng 5.572 tin nhắn, trong đó có 4.82..."
 
 
 
 
 
 
160
  }
161
  ],
162
  "model_verdict": {
163
  "supported": true,
164
- "confidence": 0.99,
165
- "evidence": "Không hiểu ngữcảnh: Không thể phân biệt được ý nghĩa của một từ trong các ngữcảnh khác nhau.",
166
- "reason": "Context explicitly lists 'Không hiểu ngữcảnh' as a disadvantage of keyword-based spam detection."
167
  }
168
  },
169
  "5": {
170
  "supported_by_embeddings": true,
171
- "max_similarity": 1.0499497652053833,
172
  "evidence": [
173
  {
174
- "idx": 53,
175
- "page": 17,
176
- "score": 0.7536194324493408,
177
- "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n**Cấu trúc** BERT-base **12 lớp encoder**, mỗi lớp bao gồm:\n\n\n1. **Multi-Head Self-Attention** : Cho phép mỗi token “chú ý” đến các token khác trong chuỗi để\ncập nhật vector của nó. Công thức:\n\n\n\n_QK_ _T_\nAttention( _Q, K, V_ ) = softmax\n� ~~_√_~~ _d_ _k_\n\n\n\n_V_\n�\n\n\n\n\n - _Q_, _K_, _V_ : Ma trận query, key, value, được tạo từma trận embedding qua các trọng số _W_ _Q_,\n_W_ _K_, _W_ _V_ . - _d_ _k_ : Kích thước mỗi head (768 / 12 = 64). - Mỗi lớp **12 head**, mỗi head xửlý một góc nhìn khác của ngữcảnh. dụ: Trong “Nhận ngay quà tặng miễn phí!”, token “miễn” chú ý mạnh đến “quà” và “tặng”,\ntạo ngữcảnh quảng cáo. Attention Mask đảm bảo không chú ý đến [PAD]. Kết quả: Ma trận 16\n_×_ 768, với mỗi token được cập nhật dựa trên ngữcảnh. 2. **Residual Connection và Layer Normalization** : Cộng đầu vào đầu ra của attention:\n\n\n_x_ + Attention( _x_ )\n\n\nSau đó chuẩn hóa:\nLayerNorm( _x_ + Attention( _x_ ))\n\n\n3. **Feed-Forward Neural Network (FFN)** : ..."
178
- },
179
- {
180
- "idx": 50,
181
- "page": 7,
182
- "score": 1.0445164442062378,
183
- "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n**Explainable AI (XAI) và Classifier:**\n\n\n **Vấn đềtồn đọng:** Mô hình hoạt động như một ”hộp đen”, khó giải thích lý do đưa ra dựđoán. Khảnăng giải thích thường bịtách rời khỏi quá trình phân loại chính. **Giải pháp:** Tích hợp khảnăng giải thích vào lõi của bộphân loại. **–**\n_Masking-based Saliency:_ Phương pháp này xác định các từkhóa quan trọng nhất trong tin\nnhắn. Nói trực quan thì từnào quan trọng trong quyết định spam hơn sẽđược tô đậm hơn. **–**\n_Phân loại có tích hợp Saliency:_ Bộphân loại sửdụng một tham số‘alpha‘ đểđiều chỉnh mức\nđộảnh hưởng của điểm nổi bật (saliency score) vào công thức phân loại cuối cùng, giúp kết\nquảchính xác hơn và có thểgiải thích được. **Đầu ra cuối cùng:** Đầu ra cho mỗi câu gồm thông tin dựđoán và chỉsốgiải thích cho dựđoán đó,\ngiúp người dùng hiểu rõ quyết định của mô hình. Cấu trúc đầu ra bao gồm:\n\n\n - **Lớp dựđoán:** Tin nhắn được gán nhãn dựđoán cuối cùng ( _SPAM_ hoặc _HAM_ ) dựa trên kết quả\nphân loại. *..."
184
- },
185
- {
186
- "idx": 42,
187
- "page": 18,
188
- "score": 1.0499497652053833,
189
- "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n**Kết quả** Sau 12 lớp encoder, mỗi token có vector 768 chiều, chứa thông tin ngữcảnh sâu sắc. Vector\n\n[CLS] (hàng đầu tiên của ma trận đầu ra) tổng hợp ngữcảnh toàn tin nhắn, ví dụ: `[0.7, -0.1, ...,`\n`0.5]`, phản ánh đặc trưng spam như “miễn phí”, “quà”. **Liên hệvới spam/ham** Attention giúp BERT nhận diện mối quan hệgiữa các từ(như “miễn phí”\nvà “quà” gợi ý spam). FFN tinh chỉnh vector đểnhấn mạnh đặc trưng riêng của mỗi token, hỗtrợ\nvector [CLS] mang thông tin quảng cáo hoặc giao tiếp tựnhiên. **5.3.3** **Lớp Phân Loại**\n\n\n**Mục tiêu** Sửdụng vector [CLS] đểdựđoán nhãn spam (1) hoặc ham (0) cho tin nhắn. **Quy trình**\n\n\n1. **Lớp tuyến tính** : Vector [CLS] (768 chiều) được đưa qua lớp tuyến tính:\n\n\nlogits = _W_ cls _·_ vector [CLS] + _b_ cls\n\n\n - _W_ cls : Ma trận 768 _×_ 2 (2 nhãn: spam, ham). - _b_ cls : Bias 2 chiều. Ví dụ: Vector [CLS] `[0.7, -0.1, ..., 0.5]` _→_ Logits `[2.8, -0.7]` . 2. **Softmax** : Chuyển logits thành xác suất:\n\n\nexp(..."
190
  }
191
  ],
192
  "model_verdict": {
193
  "supported": true,
194
  "confidence": 0.99,
195
- "evidence": "BERT-base12 lớp encoder ... Mỗi lớp12 head ... mỗi tokenvector 768 chiều",
196
- "reason": "Context xác nhận BERT-base 12 lớp encoder, hidden size 768 12 attention head, nên đáp án a được chứng thực."
197
  }
198
  }
199
  }
 
1
  {
2
  "mcqs": {
3
  "1": {
4
+ "câu hỏi": "Trong bảng so sánh các phương pháp xử Feature Correlation, phương pháp nào được tả nền tảng thống kê và sử dụng ngưỡng (threshold) khách quan?",
5
  "lựa chọn": {
6
+ "a": "Loại bỏ Features",
7
+ "b": "VIF-based Removal",
8
+ "c": "PCA",
9
+ "d": "Autoencoder"
10
  },
11
+ "đáp án": "VIF-based Removal"
12
  },
13
  "2": {
14
+ "câu hỏi": "Trong dụ pipeline, bước nào được dùng để giảm ảnh hưởng của các giá trị ngoại lệ (outliers) lên các đặc trưng?",
15
  "lựa chọn": {
16
+ "a": "RobustScaler",
17
+ "b": "EditedNearestNeighbours",
18
+ "c": "KNeighborsClassifier",
19
+ "d": "StratifiedKFold"
20
  },
21
+ "đáp án": "RobustScaler"
22
  },
23
  "3": {
24
+ "câu hỏi": "SMOTE tạo ra các điểm thiểu số tổng hợp mới bằng cách nào?",
25
  "lựa chọn": {
26
+ "a": "Sao chép ngẫu nhiên các mẫu thiểu số hiện có.",
27
+ "b": "Nội suy giữa một mẫu thiểu số một trong các hàng xóm thiểu số gần nhất của nó.",
28
+ "c": "Tạo các mẫu tổng hợp từ dữ liệu lớp đa số.",
29
+ "d": "Loại bỏ một số mẫu đa số để cân bằng dữ liệu."
30
  },
31
+ "đáp án": "Nội suy giữa một mẫu thiểu số một trong các hàng xóm thiểu số gần nhất của nó."
32
  },
33
  "4": {
34
+ "câu hỏi": "Theo nội dung trên, phương pháp nào được đề xuất để tăng cường ảnh hưởng của lớp thiểu số trong kNN?",
35
  "lựa chọn": {
36
+ "a": "Tăng giá trị k",
37
+ "b": "Bỏ phiếu kNN trọng số khoảng cách",
38
+ "c": "Giảm số chiều dữ liệu",
39
+ "d": "Sử dụng thuật toán Random Forest"
40
  },
41
+ "đáp án": "Bỏ phiếu kNN trọng số khoảng cách"
42
  },
43
  "5": {
44
+ "câu hỏi": "Trong dụ về dataset mất cân bằng, tại sao thuật toán 1 (luôn trả về 0) vẫn đạt accuracy 99%?",
45
  "lựa chọn": {
46
+ "a": " số lượng bệnh nhân không mắc ung thư chiếm đa số trong tập dữ liệu.",
47
+ "b": " hình được huấn luyện tốt học được các đặc trưng quan trọng.",
48
+ "c": " độ chính xác (accuracy) luôn phản ánh đúng chất lượng của hình.",
49
+ "d": " thuật toán sử dụng chỉ số precision cao để đánh giá."
50
  },
51
+ "đáp án": " số lượng bệnh nhân không mắc ung thư chiếm đa số trong tập dữ liệu."
52
  }
53
  },
54
  "validation": {
55
  "1": {
56
  "supported_by_embeddings": true,
57
+ "max_similarity": 0.6565414071083069,
58
  "evidence": [
59
  {
60
+ "idx": 118,
61
+ "page": 46,
62
+ "score": 0.6023983359336853,
63
+ "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\nHình 5: Ảnh hưởng feature correlation đến performance của KNN\n\n\n**7.5.3 Cách xửlý Feature Correlation**\n\n\nKhi phát hiện các features correlation cao, chúng ta nhiều cách tiếp cận đểxửlý vấn đềnày. Dưới\nđây các phương pháp chính được sửdụng trong thực tế.\n\n\n**7.5.3.1 Loại bỏFeature thừa**\n\n\nPhương pháp đơn giản hiệu quảnhất loại bỏcác features correlation cao với nhau. Thông\nthường, chúng ta giữlại feature tương quan mạnh nhất với target variable hoặc feature ý nghĩa\nbusiness quan trọng hơn.\n\n\n1 `import` `numpy as np`\n\n2 `import` `pandas as pd`\n\n\n3\n\n\n4 `def` `remove_correlated_features (X, threshold =0.8):`\n\n\n5 `\"\"\"`\n\n\n6 `Remove` `features` `with high` `correlation`\n\n\n7\n\n\n8 `Parameters:`\n\n\n9 `-----------`\n\n\n10 `X : array -like`\n\n\n45"
64
  },
65
  {
66
+ "idx": 158,
67
+ "page": 46,
68
+ "score": 0.6023983359336853,
69
+ "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\nHình 5: Ảnh hưởng feature correlation đến performance của KNN\n\n\n**7.5.3 Cách xửlý Feature Correlation**\n\n\nKhi phát hiện các features correlation cao, chúng ta nhiều cách tiếp cận đểxửlý vấn đềnày. Dưới\nđây các phương pháp chính được sửdụng trong thực tế.\n\n\n**7.5.3.1 Loại bỏFeature thừa**\n\n\nPhương pháp đơn giản hiệu quảnhất loại bỏcác features correlation cao với nhau. Thông\nthường, chúng ta giữlại feature tương quan mạnh nhất với target variable hoặc feature ý nghĩa\nbusiness quan trọng hơn.\n\n\n1 `import` `numpy as np`\n\n2 `import` `pandas as pd`\n\n\n3\n\n\n4 `def` `remove_correlated_features (X, threshold =0.8):`\n\n\n5 `\"\"\"`\n\n\n6 `Remove` `features` `with high` `correlation`\n\n\n7\n\n\n8 `Parameters:`\n\n\n9 `-----------`\n\n\n10 `X : array -like`\n\n\n45"
70
  },
71
  {
72
+ "idx": 6,
73
+ "page": 47,
74
+ "score": 0.6565414071083069,
75
+ "text": "nflation Factor)**\n\n\nVIF đo mức độmột feature bịdựđoán bởi các features khác."
76
  }
77
  ],
78
  "model_verdict": {
79
+ "supported": false,
80
+ "confidence": 0.9,
81
+ "evidence": "VIF đo mức độ một feature bị dự đoán bởi các features khác.",
82
+ "reason": "Context không cung cấp thông tin về việc VIF-based Removal nền tảng thống kê và sử dụng ngưỡng khách quan, nên không thể chứng thực đáp án."
83
  }
84
  },
85
  "2": {
86
  "supported_by_embeddings": true,
87
+ "max_similarity": 0.9880712032318115,
88
  "evidence": [
89
  {
90
+ "idx": 8,
91
+ "page": 15,
92
+ "score": 0.9730517864227295,
93
+ "text": "- Nếu KNN cho kết quảquá thấp, ta có thể **phân tích nguyên nhân** (ví dụ: dữliệu có nhiễu,\nphân bốkhông đồng đều, giá trịngoại lai,...) đểhiểu rõ hơn vềdataset. Sau đó, ta có thểchọn\nmột phương pháp khác phù hợp hơn. **Tóm lại:** KNN Regression là một cách tiếp cận đơn giản, không đòi hỏi giảđịnh vềdữliệu, và giúp\nđánh giá tổng quan vềdataset. Tuy nhiên, nếu KNN không hoạt động tốt, ta cần kiểm tra lại dữliệu\nvà cân nhắc phương pháp khác. **6** **Tăng tốc KNN bằng KD-Tree**\n\n\n**Giải thích vềhàm** `fit()` **trong KNN**\n\n\nKhi sửdụng KNN, ta đoạn code:\n\n\n1 `knn.fit(X_train, y_train)`\n\n2 `pred_i = knn.predict(X_test)`\n\n\nTa biết rằng KNN không thực sựcó giai đoạn \"train\"giống như các mô hình học máy khác (như\nLinear Regression hay Neural Networks). Vậy tại sao vẫn có hàm `fit()`, thực sự\"train\"mô\nhình không? **Thực tế**, hàm `fit()` trong KNN **không** thực hiện quá trình học (training) mà chỉlưu trữdữliệu\nhuấn luyện và **xây dựng một cấu trúc dữliệu hỗtrợ** đểtăng tốc quá trìn..."
94
  },
95
  {
96
+ "idx": 113,
97
+ "page": 15,
98
+ "score": 0.9730517864227295,
99
+ "text": "- Nếu KNN cho kết quảquá thấp, ta thể **phân tích nguyên nhân** (ví dụ: dữliệu nhiễu,\nphân bốkhông đồng đều, giá trịngoại lai,...) đểhiểu hơn vềdataset. Sau đó, ta thểchọn\nmột phương pháp khác phù hợp hơn. **Tóm lại:** KNN Regression một cách tiếp cận đơn giản, không đòi hỏi giảđịnh vềdữliệu, giúp\nđánh giá tổng quan vềdataset. Tuy nhiên, nếu KNN không hoạt động tốt, ta cần kiểm tra lại dữliệu\nvà cân nhắc phương pháp khác. **6** **Tăng tốc KNN bằng KD-Tree**\n\n\n**Giải thích vềhàm** `fit()` **trong KNN**\n\n\nKhi sửdụng KNN, ta đoạn code:\n\n\n1 `knn.fit(X_train, y_train)`\n\n2 `pred_i = knn.predict(X_test)`\n\n\nTa biết rằng KNN không thực sựcó giai đoạn \"train\"giống như các hình học máy khác (như\nLinear Regression hay Neural Networks). Vậy tại sao vẫn hàm `fit()`, thực sự\"train\"mô\nhình không? **Thực tế**, hàm `fit()` trong KNN **không** thực hiện quá trình học (training) chỉlưu trữdữliệu\nhuấn luyện **xây dựng một cấu trúc dữliệu hỗtrợ** đểtăng tốc quá trìn..."
100
  },
101
  {
102
+ "idx": 154,
103
+ "page": 24,
104
+ "score": 0.9880712032318115,
105
+ "text": "Một hệquảcủa lời nguyền chiều dữliệu**hầu hết các điểm dữliệu**\n**nằm rất gần các siêu phẳng phân loại** _→_ chỉcần nhiễu nhỏ(thường khó nhận ra) là có thểđổi\nnhãn phân loại. Hiện tượng này chính là _mẫu đối kháng_ ( _adversarial samples_ ). **7.1.3 Xửlý Dữliệu nhiều chiều**\n\n\nXửlý dữliệu kích thước cao không phải là một nhiệm vụdễdàng. Kích thước cao có nghĩa là chúng\nta cần lưu trữcác vectơ hoặc mảng với sốlượng phần tử/sốlượng lớn, điều này tiêu tốn một lượng lớn\nbộnhớlưu trữ. Không chỉbộnhớlưu trữ, mà các thao tác tìm kiếm trong không gian kích thước cao\ncũng là một nút thắt cổchai, vì thời gian và tính toán tăng theo cấp sốnhân. Do đó, việc giảm kích\nthước dữliệu là rất quan trọng, nhưng khi giảm kích thước, chúng ta cũng cần giữlại được phân bố\nhoặc các mẫu biểu hiện trong không gian kích thước cao. **7.1.4 Giảm Kích Thước: PCA, LDA, t-SNE**\n\n\nCác kỹthuật giảm kích thước biến đổi dữliệu có chiều cao thành không gian có chiều thấp hơn, đồng\nthời bảo tồn các cấu trúc quan tr..."
106
  }
107
  ],
108
  "model_verdict": {
109
+ "supported": false,
110
+ "confidence": 0.9,
111
+ "evidence": "",
112
+ "reason": "Trong ngữ cảnh không đề cập đến RobustScaler hay bất kỳ bước nào trong pipeline dùng để giảm ảnh hưởng của outliers"
113
  }
114
  },
115
  "3": {
116
  "supported_by_embeddings": true,
117
+ "max_similarity": 0.8513287305831909,
118
  "evidence": [
119
  {
120
+ "idx": 104,
121
+ "page": 29,
122
+ "score": 0.8513287305831909,
123
+ "text": "Tuy nhiên, khi một lớp hiếm, hầu hết các hàng xóm đó thể\nđến từlớp chiếm ưu thế- tạo ra sựthiên vịtrong kết quả. 28"
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
  ],
126
  "model_verdict": {
127
  "supported": true,
128
  "confidence": 0.99,
129
+ "evidence": "SMOTE ... tạo ra các điểm thiểu số tổng hợp mới bằng cách nội suy giữa các điểm hiện có. Ý tưởng cơ bản: đối với mỗi mẫu thiểu số, chọn một trong k hàng xóm thiểu số gần nhất của nó và tạo một điểm ở giữa.",
130
+ "reason": "Context explicitly describes SMOTE generating synthetic minority points by interpolating between a minority sample and one of its nearest minority neighbors."
131
  }
132
  },
133
  "4": {
134
  "supported_by_embeddings": true,
135
+ "max_similarity": 0.7898242473602295,
136
  "evidence": [
137
  {
138
+ "idx": 78,
139
+ "page": 13,
140
+ "score": 0.7718899250030518,
141
+ "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n - **Tại sao k chẵn ảnh hưởng đến độchính xác?**\nĐểhiểu điều này, ta xem lại các bước của KNN:\n\n\n1. Chọn sốlượng hàng xóm k. 2. Định nghĩa phương pháp đo độtương đồng (thường Euclidean distance). 3. Tìm **k hàng xóm gần nhất** . 4. **Voting đểdựđoán nhãn của điểm mới** . **bước 4 (Voting)**, nếu k là sốchẵn, thểxảy ra trường hợp **sốlượng nhãn bịchia đều** giữa\nhai lớp. dụ: - Với **k = 4**, nếu 2 điểm thuộc loại A 2 điểm thuộc loại B, thuật toán sẽkhông biết\nchọn loại nào, dẫn đến sựbất ổn định trong dựđoán. - Tương tự, trong bài toán phân loại nhiều lớp\nnhư **Iris dataset**, giá trịk không phù hợp thểlàm giảm hiệu suất mô hình. **4.3** **Cách giải quyết vấn đềkhi ksốchẵn?**\n\n\nNếu chỉsửdụng voting, việc chọn loại A hay B đều hợp lý, nhưng điều này không tối ưu. Thay vào đó,\nta thể **đánh trọng số(weighting)** đểưu tiên các điểm gần hơn trong không gian đặc trưng. **Ba phương pháp đánh trọng sốtrong KNN:**\n\n\n1. **Uniform wei..."
142
  },
143
  {
144
+ "idx": 199,
145
+ "page": 13,
146
+ "score": 0.7718899250030518,
147
+ "text": "**AI VIETNAM** **aivietnam.edu.vn**\n\n\n - **Tại sao k chẵn ảnh hưởng đến độchính xác?**\nĐểhiểu điều này, ta xem lại các bước của KNN:\n\n\n1. Chọn sốlượng hàng xóm k. 2. Định nghĩa phương pháp đo độtương đồng (thường Euclidean distance). 3. Tìm **k hàng xóm gần nhất** . 4. **Voting đểdựđoán nhãn của điểm mới** . **bước 4 (Voting)**, nếu k sốchẵn, thểxảy ra trường hợp **sốlượng nhãn bịchia đều** giữa\nhai lớp. dụ: - Với **k = 4**, nếu 2 điểm thuộc loại A và 2 điểm thuộc loại B, thuật toán sẽkhông biết\nchọn loại nào, dẫn đến sựbất ổn định trong dựđoán. - Tương tự, trong bài toán phân loại nhiều lớp\nnhư **Iris dataset**, giá trịk không phù hợp thểlàm giảm hiệu suất mô hình. **4.3** **Cách giải quyết vấn đềkhi k là sốchẵn?**\n\n\nNếu chỉsửdụng voting, việc chọn loại A hay B đều hợp lý, nhưng điều này không tối ưu. Thay vào đó,\nta thể **đánh trọng số(weighting)** đểưu tiên các điểm gần hơn trong không gian đặc trưng. **Ba phương pháp đánh trọng sốtrong KNN:**\n\n\n1. **Uniform wei..."
148
+ },
149
+ {
150
+ "idx": 71,
151
+ "page": 31,
152
+ "score": 0.7898242473602295,
153
+ "text": "SMOTE (Synthetic Minority\nOver-sampling Technique) tạo ra các điểm thiểu sốtổng hợp mới bằng cách nội suy giữa các điểm hiện\ncó. Ý tưởng cơ bản: đối với mỗi mẫu thiểu số, chọn một trong k hàng xóm thiểu sốgần nhất của nó và\ntạo một điểm ởgiữa. 1 `from` `imblearn.over_sampling` `import` `SMOTE`\n\n2 `sm = SMOTE(random_state =42)`\n\n3 `X_res, y_res = sm.fit_resample(X_train, y_train)`\n\n4 `print (\" Before: \", sorted(Counter(y_train).items ()))`\n\n5 `print (\" After: \", sorted(Counter(y_res).items ()))`\n\n\n**Khi nào sửdụng:** SMOTE phù hợp khi bạn có đủmẫu thiểu sốgốc đểnội suy có ý nghĩa là có\nthể. Nó giảđịnh lớp thiểu sốcó phần nào liên tục trong không gian đặc trưng. **Mẹo triển khai:** Sửdụng imblearn trong một pipeline đểtránh rò rỉdữliệu:\n\n\n1 `from` `imblearn.pipeline` `import` `Pipeline`\n\n2 `pipe = Pipeline ([`\n\n3 `(’smote ’, SMOTE(random_state =42)),`\n\n4 `(’knn ’, KNeighborsClassifier (n_neighbors =5))`\n\n5 `])`\n\n6 `pipe.fit(X_train, y_train)`\n\n\n**7.2.4 Giảm mẫu Lớp đa số**\n\n\nĐôi khi việc..."
154
  }
155
  ],
156
  "model_verdict": {
157
  "supported": true,
158
+ "confidence": 0.9,
159
+ "evidence": "thay vào đó, ta thể **đánh trọng số(weighting)** để ưu tiên các điểm gần hơn trong không gian đặc trưng.",
160
+ "reason": "Context đề cập đến việc sử dụng trọng số (weighting) trong kNN để ưu tiên các điểm gần hơn, tức là bỏ phiếu kNN có trọng số khoảng cách, nên đáp án được chứng thực."
161
  }
162
  },
163
  "5": {
164
  "supported_by_embeddings": true,
165
+ "max_similarity": 0.766804039478302,
166
  "evidence": [
167
  {
168
+ "idx": 8,
169
+ "page": 15,
170
+ "score": 0.766804039478302,
171
+ "text": "- Nếu KNN cho kết quảquá thấp, ta thể **phân tích nguyên nhân** (ví dụ: dữliệu nhiễu,\nphân bốkhông đồng đều, giá trịngoại lai,...) đểhiểu hơn vềdataset. Sau đó, ta thểchọn\nmột phương pháp khác phù hợp hơn. **Tóm lại:** KNN Regression một cách tiếp cận đơn giản, không đòi hỏi giảđịnh vềdữliệu, giúp\nđánh giá tổng quan vềdataset. Tuy nhiên, nếu KNN không hoạt động tốt, ta cần kiểm tra lại dữliệu\nvà cân nhắc phương pháp khác. **6** **Tăng tốc KNN bằng KD-Tree**\n\n\n**Giải thích vềhàm** `fit()` **trong KNN**\n\n\nKhi sửdụng KNN, ta đoạn code:\n\n\n1 `knn.fit(X_train, y_train)`\n\n2 `pred_i = knn.predict(X_test)`\n\n\nTa biết rằng KNN không thực sựcó giai đoạn \"train\"giống như các hình học máy khác (như\nLinear Regression hay Neural Networks). Vậy tại sao vẫn hàm `fit()`, thực sự\"train\"mô\nhình không? **Thực tế**, hàm `fit()` trong KNN **không** thực hiện quá trình học (training) chỉlưu trữdữliệu\nhuấn luyện **xây dựng một cấu trúc dữliệu hỗtrợ** đểtăng tốc quá trìn..."
 
 
 
 
 
 
 
 
 
 
 
 
172
  }
173
  ],
174
  "model_verdict": {
175
  "supported": true,
176
  "confidence": 0.99,
177
+ "evidence": "Giả sủ trong 1000 bệnh nhân, chỉ 5 người thực sự bị ung thư... Giải thuật 1 (Sai nhưng Accuracy cao) trả về 0 và vẫn accuracy = 99%",
178
+ "reason": "Context nêu dataset mất cân bằng với đa số bệnh nhân không mắc ung thư, vậy thuật toán luôn trả về 0 vẫn đạt accuracy cao."
179
  }
180
  }
181
  }
test/raw_resp.json CHANGED
@@ -1,33 +1,33 @@
1
  {
2
- "id": "chatcmpl-84e4f53d-9bca-4dd8-89d3-7a4a9b69b860",
3
  "choices": [
4
  {
5
  "finish_reason": "stop",
6
  "index": 0,
7
  "message": {
8
- "content": "{\n \"supported\": true,\n \"confidence\": 0.99,\n \"evidence\": \"BERT-base 12 lớp encoder ... Mỗi lớp 12 head ... mỗi token vector 768 chiều\",\n \"reason\": \"Context xác nhận BERT-base 12 lớp encoder, hidden size 768 và 12 attention head, nên đáp án a được chứng thực.\"\n}",
9
- "reasoning": "We need to determine if the answer (option a) is supported by the context. The context includes: \"Cấu trúc BERT-base12 lớp encoder, mỗi lớp bao gồm: ... Mỗi lớp 12 head, ... d_k: 768/12=64. ...\". Also earlier: \"BERT-base 12 lớp encoder\". It mentions hidden size 768. So option a: \"BERT 12 lớp encoder, mỗi lớp kích thước ẩn 768 12 attention head.\" This matches. So supported true. Provide confidence maybe 0.99. Evidence: \"BERT-base 12 lớp encoder\" and \"Mỗi lớp 12 head\" and hidden size 768 mentioned in description of token vector dimension. Provide short citation. Provide reason.",
10
  "role": "assistant"
11
  }
12
  }
13
  ],
14
- "created": 1755749149,
15
  "model": "gpt-oss-120b",
16
  "system_fingerprint": "fp_e25f231b468af246abb0",
17
  "object": "chat.completion",
18
  "usage": {
19
- "prompt_tokens": 1714,
20
- "completion_tokens": 265,
21
- "total_tokens": 1979,
22
  "prompt_tokens_details": {
23
  "cached_tokens": 0
24
  }
25
  },
26
  "time_info": {
27
- "queue_time": 0.000124009,
28
- "prompt_time": 0.063482573,
29
- "completion_time": 0.18115486,
30
- "total_time": 0.2471165657043457,
31
- "created": 1755749149
32
  }
33
  }
 
1
  {
2
+ "id": "chatcmpl-1499765c-023c-4c15-8dca-3c7946ae5d7f",
3
  "choices": [
4
  {
5
  "finish_reason": "stop",
6
  "index": 0,
7
  "message": {
8
+ "content": "{\n \"supported\": true,\n \"confidence\": 0.9,\n \"evidence\": \"d −→ p ( t ) ∧−→ q ( t ) dt ... = [−→] p ( t ) ∧ [d] [−→] q\",\n \"reason\": \"Context includes derivation showing derivative of cross product equals p'(t)×q(t) + p(t)×q'(t)\"\n}",
9
+ "reasoning": "We need to determine if the answer (the derivative formula) is supported by the context. The question: \"Theo công thức trong nội dung, đạo hàm của tích hướng của hai vectơ p(t) và q(t) là gì?\" Options, correct answer is a: d/dt [p(t) × q(t)] = p'(t) × q(t) + p(t) × q'(t). We need to see if the context contains that formula. The context includes some garbled text but includes lines like:\n\n\"[(] [t] [)] + [d] [−→] q [(] [t] [)] dt dt ... = [d] [−→] p dt\" Not clear.\n\nLater, page 22 shows:\n\n\"d. d −→ p ( t ) ∧−→ q ( t ) dt ... = [d] ... = ... = [−→] p ( t ) ∧ [d] [−→] q ∧ [−→] q ( t ) dt\"\n\nIt seems they derive product rule for cross product: derivative of p × q equals p' × q + p × q'. The context includes lines like:\n\n\"= ... p 2 ( t ) p 3 ( t ) ... = + p 2 ( t ) p 3 [′] [(] [t] [)] ... + p 2 [′] [(] [t] [)] p 3 ( t ) ... = [−→] p ( t ) ∧ [d] [−→] [q] ∧ [−→] q ( t ) dt\"\n\nThus the context does contain the product rule for cross product. So supported = true. Confidence maybe 0.9. Evidence: a snippet showing \"d −→ p ( t ) ∧−→ q ( t ) dt ... = [−→] p ( t ) ∧ [d] [−→] q\". Or earlier: \"d/dt [p(t) × q(t)] = p'(t) × q(t) + p(t) × q'(t)\". The context may not have that exact string but the derivation shows that. Provide short evidence: \"d −→ p ( t ) ∧−→ q ( t ) dt ... = [−→] p ( t ) ∧ [d] [−→] q\". Or \" = [−→] p ( t ) ∧ [d] [−→] q\". That indicates product rule.\n\nThus answer JSON.",
10
  "role": "assistant"
11
  }
12
  }
13
  ],
14
+ "created": 1755769091,
15
  "model": "gpt-oss-120b",
16
  "system_fingerprint": "fp_e25f231b468af246abb0",
17
  "object": "chat.completion",
18
  "usage": {
19
+ "prompt_tokens": 1924,
20
+ "completion_tokens": 628,
21
+ "total_tokens": 2552,
22
  "prompt_tokens_details": {
23
  "cached_tokens": 0
24
  }
25
  },
26
  "time_info": {
27
+ "queue_time": 0.166335959,
28
+ "prompt_time": 0.097067263,
29
+ "completion_time": 0.358066944,
30
+ "total_time": 0.6239833831787109,
31
+ "created": 1755769091
32
  }
33
  }
test/test-api-key.py CHANGED
@@ -1,5 +1,6 @@
1
  import os
2
  from qdrant_client import QdrantClient
 
3
 
4
  qdrant_client = QdrantClient(
5
  url=os.environ.get('QDRANT_URL'),
@@ -7,19 +8,33 @@ qdrant_client = QdrantClient(
7
  )
8
  print(qdrant_client.get_collections())
9
 
10
- # qdrant_client.recreate_collection(
11
- # collection_name="programming",
12
- # vectors_config={
13
- # "my_vector_name": models.VectorParams(size=1536, distance=models.Distance.COSINE),
14
- # },
15
- # )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  print()
17
  print(os.environ.get('HF_API_KEY'))
18
  print(os.environ.get('TOGETHER_API_KEY'))
19
  print(os.environ.get('QDRANT_URL'))
20
  print(os.environ.get('QDRANT_API_KEY'))
21
  print(os.environ.get('CEREBRAS_API_KEY'))
22
- # cerebras API: your_key
23
 
24
 
25
  """
 
1
  import os
2
  from qdrant_client import QdrantClient
3
+ from cerebras.cloud.sdk import Cerebras
4
 
5
  qdrant_client = QdrantClient(
6
  url=os.environ.get('QDRANT_URL'),
 
8
  )
9
  print(qdrant_client.get_collections())
10
 
11
+ import os
12
+
13
+ client = Cerebras(
14
+ # This is the default and can be omitted
15
+ api_key=os.environ.get("CEREBRAS_API_KEY")
16
+ )
17
+
18
+ stream = client.chat.completions.create(
19
+ messages=[
20
+ {
21
+ "role": "system",
22
+ "content": ""
23
+ }
24
+ ],
25
+ model="gpt-oss-120b",
26
+ stream=True,
27
+ max_completion_tokens=65536,
28
+ temperature=1,
29
+ top_p=1
30
+ )
31
+
32
  print()
33
  print(os.environ.get('HF_API_KEY'))
34
  print(os.environ.get('TOGETHER_API_KEY'))
35
  print(os.environ.get('QDRANT_URL'))
36
  print(os.environ.get('QDRANT_API_KEY'))
37
  print(os.environ.get('CEREBRAS_API_KEY'))
 
38
 
39
 
40
  """
test/test_case.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ # uvicorn app:app --reload --reload-exclude test/
4
+
5
+ def test_upload_files(folder_path=None):
6
+ url = "http://127.0.0.1:8000/upload_multiple_files"
7
+ base = r"D:/graduation_project/mcq-generator/pdfs"
8
+ # file1 = os.path.join(base, "/Calculus2/Calculus2-1.pdf")
9
+ # file2 = os.path.join(base, "/Calculus2/Calculus2-2.pdf")
10
+ # file3 = os.path.join(base, "/Calculus2/Calculus2-3.pdf")
11
+ # file4 = os.path.join(base, "/Calculus2/Calculus2-4.pdf")
12
+ # file5 = os.path.join(base, "/Calculus2/Calculus2-5.pdf")
13
+
14
+ calculus_folder = os.path.join(base, "Calculus2")
15
+ files = []
16
+ for filename in os.listdir(calculus_folder):
17
+ if filename.endswith(".pdf"):
18
+ file_path = os.path.join(calculus_folder, filename)
19
+ file_name_without_suffix = os.path.splitext(filename)[0] # remove suffix
20
+ files.append(
21
+ ("files", (file_name_without_suffix, open(file_path, "rb"))),
22
+ )
23
+
24
+ #? Upload multiple files manually
25
+ # files.append(
26
+ # ("files", (f"{file1}", open(file2, "rb"))),
27
+ # ("files", (f"{file2}", open(file2, "rb"))),
28
+ # )
29
+
30
+
31
+ data = {"collection_name": "math", "overwrite": "True", 'qdrant_filename_prefix': "math"}
32
+ resp = requests.post(url, files=files, data=data)
33
+ print(resp.status_code, resp.json())
34
+
35
+ def test_generation():
36
+ pass
test/verdict_context.md ADDED
@@ -0,0 +1 @@
 
 
1
+ ['[page 21] t )\n\n\n\n\n[(] [t] [)]\n\ndt ∧ [−→] q ( t )\n\n\n\n( t ) + [d] [−→] [p] [(] [t] [)]\n\ndt dt\n\n\n\n_Lời giải_ . a. Giảsử [−→] p ( t ) = ( p 1 ( t ), p 2 ( t ), p 3 ( t )), [−→] q ( t ) = ( q 1 ( t ), q 2 ( t ), q 3 ( t )), khi đó:\n\n\nd −→ d\ndt � p ( t ) + −→ q ( t ) � = dt [(] [p] [1] [ (] [t] [) +] [ q] [1] [ (] [t] [)] [,][ p] [2] [ (] [t] [) +] [ q] [2] [ (] [t] [)] [,][ p] [3] [ (] [t] [) +] [ q] [3] [ (] [t] [))]\n\n\n=\n�p 1 [′] [(] [t] [) +] [ q] 1 [′] [(] [t] [)] [,][ p] 2 [′] [(] [t] [) +] [ q] 2 [′] [(] [t] [)] [,][ p] 3 [′] [(] [t] [) +] [ q] 3 [′] [(] [t] [)] �\n\n= �p 1 [′] [(] [t] [)] [,][ p] 2 [′] [(] [t] [)] [,][ p] 3 [′] [(] [t] [)] � + �q 1 [′] [(] [t] [)] [,][ q] 2 [′] [(] [t] [)] [,][ q] 3 [′] [(] [t] [)] �\n\n\n\n\n[p]\n\n[(] [t] [)] + [d] [−→] [q] [(] [t] [)]\n\ndt dt\n\n\n\n\n[(] [t] [)]\n= [d] [−→] [p]\n\n\n\ndt\n\n\n\nb.', '[page 22] _20_ _Chương 1. Các ứng dụng của phép tính vi phân trong hình học_\n\n\nd. d −→\n� p ( t ) ∧−→ q ( t ) �\ndt\n\n\n\n,\n�����\n\n\n\np 3 ( t ) p 1 ( t )\n����� q 3 ( t ) q 1 ( t )\n\n\n\n,\n�����\n\n\n\np 1 ( t ) p 2 ( t )\n����� q 1 ( t ) q 2 ( t )\n\n\n\n�����\n\n\n\n= [d]\n\ndt\n\n\n= ... p 2 ( t ) p 3 ( t )\n������ q 2 ( t ) q 3 ( t )\n\n\n\n�\n\n\n\np 3 ( t ) p 1 [′] [(] [t] [)]\n\n�����, ����� q 3 ( t ) q 1 [′] [(] [t] [)]\n\n\np 3 [′] [(] [t] [)] p 1 ( t )\n\n�����, ����� q 3 [′] [(] [t] [)] q 1 ( t )\n\n\n\np 1 ( t ) p 2 [′] [(] [t] [)]\n\n�����, ����� q 1 ( t ) q 2 [′] [(] [t] [)]\n\n\np 1 [′] [(] [t] [)] p 2 ( t )\n\n�����, ����� q 1 [′] [(] [t] [)] q 2 ( t )\n\n\n\n������\n\n������\n\n\n\n=\n\n\n+\n\n\n\np 2 ( t ) p 3 [′] [(] [t] [)]\n������ q 2 ( t ) q 3 [′] [(] [t] [)]\n\n\np 2 [′] [(] [t] [)] p 3 ( t )\n������ q 2 [′] [(] [t] [)] q 3 ( t )\n\n\n\n\n[(] [t] [)] + [d] [−→] [p] [(] [t] [)]\n\ndt dt\n\n\n\n\n[(] [t] [)]\n= [−→] p ( t ) ∧ [d] [−→] [q]\n\n\n\n∧ [−→] q ( t )\ndt\n\n\n\n**Bài tập 1.5.** Viết phương trình tiếp tuyến và pháp diện của đường:\n\n\n\na. b.', '[page 21] �\n\n\n\n\n[p]\n\n[(] [t] [)] + [d] [−→] [q] [(] [t] [)]\n\ndt dt\n\n\n\n\n[(] [t] [)]\n= [d] [−→] [p]\n\n\n\ndt\n\n\n\nb. d\n_α_ t [−→] t\n� ( ) p ( ) �\ndt\n\n\n′ ′ ′\n= � [ _α_ ( t ) p 1 ( t )], [ _α_ ( t ) p 2 ( t )], [ _α_ ( t ) p 3 ( t )] �\n\n= � _α_ [′] ( t ) p 1 ( t ) + _α_ ( t ) p 1 [′] [(] [t] [)] [,] _[ α]_ [′] [ (] [t] [)] [ p] [2] [(] [t] [) +] _[ α]_ [ (] [t] [)] [ p] 2 [′] [(] [t] [)] [,] _[ α]_ [′] [ (] [t] [)] [ p] [3] [(] [t] [) +] _[ α]_ [ (] [t] [)] [ p] 3 [′] [(] [t] [)] �\n\n= � _α_ [′] ( t ) p 1 ( t ), _α_ [′] ( t ) p 2 ( t ), _α_ [′] ( t ) p 3 ( t ) � + � _α_ ( t ) p 1 [′] [(] [t] [)] [,] _[ α]_ [ (] [t] [)] [ p] 2 [′] [(] [t] [)] [,] _[ α]_ [ (] [t] [)] [ p] 3 [′] [(] [t] [)] �\n\n\n[(] [t] [)]\n= _α_ ( t ) [d] [−→] [p] + _α_ [′] ( t ) [−→] p ( t )\n\ndt\n\n\nc. Chứng minh tương tựnhư câu b, sửdụng công thức đạo hàm của hàm hợp. 19']