File size: 33,989 Bytes
1a2052a
 
 
047f1c4
 
 
1a2052a
 
047f1c4
1a2052a
 
 
 
6cde696
 
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381512b
 
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
047f1c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a2052a
 
 
 
 
047f1c4
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
047f1c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae1815c
 
 
 
 
1a2052a
 
 
 
 
 
 
 
 
 
 
 
64d6f0a
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bdbe08c
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
ae1815c
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9b03e7
 
1a2052a
 
 
f9b03e7
1a2052a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1ae3d0
 
 
 
1a2052a
 
 
 
 
 
 
 
 
047f1c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a2052a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
import gradio as gr
from PIL import Image
import numpy as np
import faiss
import torch


#載入聊天機器人模型
from transformers import AutoTokenizer, AutoModelForCausalLM,TextIteratorStreamer,AutoModel
from threading import Thread

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
# device = "cuda"
# model.to(device)
def chat(message, history):
    prompt = [
        {"role": "system", "content": "You are a helpful assistant."},
    ]
    for i in history:
        prompt.append({"role": "user", "content": i[0]})
        prompt.append({"role": "assisant", "content": i[1]})
    prompt.append({"role": "user", "content": message})

    messages = prompt

    text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
    )   

    # model_inputs = tokenizer([text], return_tensors="pt").to("cuda")
    model_inputs = tokenizer([text], return_tensors="pt")
    streamer = TextIteratorStreamer(tokenizer, timeout=10., skip_prompt=True, skip_special_tokens=True)
    generate_kwargs = dict(
        model_inputs,
        streamer=streamer,
        max_new_tokens=512,
        do_sample=True,
        top_p=0.95,
        top_k=1000,
        temperature=1.0,
        )
    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()
    partial_message = ""
    for new_token in streamer:
            partial_message += new_token
            yield partial_message


#AI履歷助手(使用RAG)
embd= AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True, torch_dtype=torch.bfloat16)
doc={'技能':'python,深度學習,web開發,數據分析',
     '經歷':'ICIM2024研討會、碩士期間擔任指導教授所開的類神經網路課程助教、大學專題實務成果展競賽亞軍,技術類業界評選第一名。',
     '論文概述':'題為「基於情緒支持的對話:融合情緒感知和關鍵字識別的研究」。研究旨在通過聊天機器人為情緒困擾者提供陪伴,緩解其短期心理壓力。本文提出的模型結合情緒標籤和關鍵字識別技術,與其他基礎模型相比,能夠提供更精準的回復,從而更有效地支持用戶的情緒需求。',
     '證照':'電腦硬體裝修丙級、電腦硬體裝修乙級、Database Administration Fundamentals、Software Development Fundamentals、Networking Fundamentals、CRM Merchandise Analyst、Enterprise Resource Planning',
     '助教工作內容':'主要協助老師指導學生實作部分。包括使用 WEKA 軟體教導學生快速構建和分析機器學習模型,並解釋模型結果的含義。後期則引導學生安裝 Python 環境,撰寫並執行機器學習模型的程式碼,幫助學生在未來能夠運用 AI 技術更有效地完成工作。',
     '專題內容':'專題名稱:熱影像結合人臉偵測暨網頁瀏覽系統。為因應新冠疫情,無接觸體溫檢測需求激增,本專題開發了利用紅外線熱影像和後端資料庫蒐集,最終實現異地閱覽和確保體溫監測的安全與效率。/n我的貢獻:硬體設備組裝、人臉偵測和後端資料庫及視覺化',
     '專案':'學生點名系統、氣管插管預測、貨車車牌辨識、聊天機器人',
     '學生點名系統簡述':'''
動機與目的: 鑒於每次上課點名都是老師的一大負擔,開發了這個學生點名系統,旨在幫助老師更有效地進行點名。本專案使用 Laravel 開源 PHP Web 框架開發,主要功能包括:
老師功能:
- 查看課表及點名記錄
- 查看學生出缺席和請假狀況
- 審核學生請假申請
學生功能:
- 查看課表及進行點名
- 查看出缺席和請假記錄
- 申請請假
該完整專案在github上,網址:https://github.com/WISD-2020/final02
''',
'氣管插管預測簡述':'動機與目的:為了協助醫生在執行插管時更精確地將氧氣管置入正確位置,我們利用影像分割技術(如 TransUnet、UNet++ 等)來實現該目標。最後,我們結合邊緣檢測與形態學技術,精確量化預測與實際的誤差,以提高插管的成功率並降低風險。',
'貨車車牌辨識簡述':'動機與目的:為了提高貨車進出倉庫的效率,我們建立一個車牌辨識系統,該系統基於深度學習技術,主要透過yolo來偵測車牌位置,再透過OCR技術來識別車牌號碼,最後將車牌號碼與倉庫數據庫進行比對,以確保進出貨物的準確性。 ',
'聊天機器人簡述':'過去在研究語言模型時,尚未設計與機器人對話的專屬介面,因此這次實作了一個簡單的聊天機器人介面。該聊天機器人基於 Qwen 大型預訓練語言模型,這是一個多語言支持的模型,供使用者進行互動體驗。',
     }
docs=['主要的技能(技術)包含:python,深度學習,web開發,數據分析',
'特別經歷包含:ICIM2024研討會、碩士期間擔任指導教授所開的類神經網路課程助教、大學專題實務成果展競賽亞軍,技術類業界評選第一名。',
'論文概述:題為「基於情緒支持的對話:融合情緒感知和關鍵字識別的研究」。研究旨在通過聊天機器人為情緒困擾者提供陪伴,緩解其短期心理壓力。本文提出的模型結合情緒標籤和關鍵字識別技術,與其他基礎模型相比,能夠提供更精準的回復,從而更有效地支持用戶的情緒需求。',
'在高中和大學時期所拿到的證照有:電腦硬體裝修丙級、電腦硬體裝修乙級、Database Administration Fundamentals、Software Development Fundamentals、Networking Fundamentals、CRM Merchandise Analyst、Enterprise Resource Planning',
'助教工作內容:主要協助老師指導學生實作部分。包括使用 WEKA 軟體教導學生快速構建和分析機器學習模型,並解釋模型結果的含義。後期則引導學生安裝 Python 環境,撰寫並執行機器學習模型的程式碼,幫助學生在未來能夠運用 AI 技術更有效地完成工作。',
'大學專題內容:專題名稱:熱影像結合人臉偵測暨網頁瀏覽系統。為因應新冠疫情,無接觸體溫檢測需求激增,本專題開發了利用紅外線熱影像和後端資料庫蒐集,最終實現異地閱覽和確保體溫監測的安全與效率。/n我的貢獻:硬體設備組裝、人臉偵測和後端資料庫及視覺化',
'參與過的專案包含:學生點名系統、氣管插管預測、貨車車牌辨識、聊天機器人',
'''學生點名系統簡述:
動機與目的: 鑒於每次上課點名都是老師的一大負擔,開發了這個學生點名系統,旨在幫助老師更有效地進行點名。本專案使用 Laravel 開源 PHP Web 框架開發,主要功能包括:
老師功能:
- 查看課表及點名記錄
- 查看學生出缺席和請假狀況
- 審核學生請假申請
學生功能:
- 查看課表及進行點名
- 查看出缺席和請假記錄
- 申請請假
該完整專案在github上,網址:https://github.com/WISD-2020/final02
''',
'氣管插管預測簡述:動機與目的:為了協助醫生在執行插管時更精確地將氧氣管置入正確位置,我們利用影像分割技術(如 TransUnet、UNet++ 等)來實現該目標。最後,我們結合邊緣檢測與形態學技術,精確量化預測與實際的誤差,以提高插管的成功率並降低風險。',
'貨車車牌辨識簡述:動機與目的:為了提高貨車進出倉庫的效率,我們建立一個車牌辨識系統,該系統基於深度學習技術,主要透過yolo來偵測車牌位置,再透過OCR技術來識別車牌號碼,最後將車牌號碼與倉庫數據庫進行比對,以確保進出貨物的準確性。 ',
'聊天機器人簡述:過去在研究語言模型時,尚未設計與機器人對話的專屬介面,因此這次實作了一個簡單的聊天機器人介面。該聊天機器人基於 Qwen 大型預訓練語言模型,這是一個多語言支持的模型,供使用者進行互動體驗。',
]
def get_embedding(text):
    embd_ = embd.encode(text)
    embd_ = embd_ / np.linalg.norm(embd_)  # 归一化
    return embd_

#建立嵌入向量庫
def add_to_faiss_index(embeddings):
    vector = np.array(embeddings)
    # 设置检索维度       
    index = faiss.IndexFlatIP(vector.shape[1])
    faiss.normalize_L2(vector)
    index.add(vector)
    return index

embedding_array = [get_embedding(text) for text in doc]
faiss_index =add_to_faiss_index(embedding_array)
embedding_array_1 = [get_embedding(text) for text in docs]
faiss_index_1 =add_to_faiss_index(embedding_array_1 )
def vector_search(index,index_1, query_embedding, k=3, threshold=0.5):
    distances, indices = index.search(np.array([query_embedding]), k)

    # 如果想要筛选相似度大于某个阈值的结果,可以这样做
    results = []
    for i in range(k):
        if distances[0][i] > threshold:  # 余弦相似度的距离应该是越大越相似
            results.append(docs[indices[0][i]])
    if not results:
        distances, indices = index_1.search(np.array([query_embedding]), k)
        for i in range(k):
            if distances[0][i] > 0.4:  # 余弦相似度的距离应该是越大越相似
                results.append(docs[indices[0][i]])      
    print('\n'.join(results))     
    return results if results else None
def resume_QA(message, history):
    query_embedding = get_embedding(message)
    search_results = vector_search(faiss_index,faiss_index_1, query_embedding)
    if search_results:
        search_results='\n'.join(search_results)
    prompt = [
        {"role": "system", "content":f"""
    你是一位助手,幫助人家了解巫宇哲這個人。你只能根據下列提供的資訊回答問題,並且所有回答必須完全符合已提供的資訊,不能添加任何新內容或自己推測的訊息。如果問題的答案不在提供的資訊中,請明確回答 "沒有這方面的資料"。所有回答必須基於已提供的資料。
    並且**嚴禁提及自己是 AI 或無法回答問題**。所有回答必須基於已提供的資料,禁止出現類似「在這個特定的環境下,我無法提供詳細信息」、「我是AI,無法回答此問題」或任何與 AI 自身相關的回覆。
        
    提供的資訊:
    Name: 巫宇哲
    {search_results}

    請根據上面的資訊來回答問題。
    """}
    ]
    for i in history:
        prompt.append({"role": "user", "content": i[0]})
        prompt.append({"role": "assisant", "content": i[1]})
    prompt.append({"role": "user", "content": message})

    messages = prompt

    text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
    )   

    model_inputs = tokenizer([text], return_tensors="pt").to("cuda")
    streamer = TextIteratorStreamer(tokenizer, timeout=50., skip_prompt=True, skip_special_tokens=True)
    generate_kwargs = dict(
        model_inputs,
        streamer=streamer,
        max_new_tokens=512,
        do_sample=True,
        temperature=0.9,
        top_k=5,
        top_p=0.95,
        min_length=50,
        )
    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()
    partial_message = ""
    for new_token in streamer:
            partial_message += new_token
            yield partial_message

avatar_images = ["https://cdn-icons-png.flaticon.com/128/3135/3135715.png",
                 "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTIJYnfODgs7q_Q4k6RoUL592NBlSF7wUTEhT92lRyqc4HTunB-"]

custom_css = """
.gradio-container {background-color: #f0f0f0;padding-top: 0px !important;}
/*.container {max-width: 100px; margin: 0; font-family: 'Arial', sans-serif;}*/
.header {background-color: #2c3e50; color: white; padding: 10px; text-align: center; border-radius: 10px 10px 0 0;margin-bottom: 0; /* Ensure no margin below header */}
.content {background-color: white; padding: 10px; border-radius: 0 0 10px 10px; margin: 0;margin-top: 0;}
.profile-pic {width: 150px; height: 150px; border-radius: 50%; margin: 20px auto; display: block;}
.skills {display: flex; justify-content: space-around; margin-top: 20px;margin-bottom: 20px;}
.skill {text-align: center; padding: 10px; background-color: #ecf0f1; border-radius: 5px;}
.cert-row {border-bottom: 1px solid #ddd; padding: 10px 0;}
.cert-header {background-color: #f2f2f2; font-weight: bold;}

/* footer styling */
.gradio-container footer {
    display: none !important;
}
.custom-footer {
    text-align: center;
    padding: 0; /* 减小上下内边距 */
    # line-height: 1.2; /* 减小行高 */
    margin-top: 0; /* 减小与上方内容的间距 */
    margin-bottom: 0; /* 减小与下方内容的间距 */
}
.custom-footer p {
    margin: 0; /* 移除段落的默认外边距 */
}


/* 主要針對chatbot聊天對話框設計版面*/
.custom-chatbot {
    background-color: #FBFBFF !important; /* 機器人對話框背景顏色 */
  
}
.custom-chatbot .flex-wrap.user {
    background-color: #ECF5FF !important; /* 使用者訊息框的背景顏色 */
    border:  solid 1px #E6CAFF
}
.custom-chatbot .flex-wrap.bot {
    background-color: #ECF5FF !important; /* 使用者訊息框的背景顏色 */
    border:  solid 1px #E6CAFF
}
.custom-chatbot label.svelte-1b6s6s {
    background-color: 	#E8FFF5 !important;  /* 設定背景顏色 */
}    
button.lg.primary.svelte-cmf5ev {
    background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%) !important; /* 按鈕背景顏色 */
    color: #4F4F4F !important; /* 文字顏色 */
}
"""
custom_footer = """
<div class="custom-footer">
    <p>© 2024 Your Company Name. All rights reserved.</p>
</div>
"""

def load_image(image_path):
    img = Image.open(image_path)
    return np.array(img)

#讀取頭貼
image_path = "/content/drive/My Drive/個人資料/頭貼.jpg"
# profile_array = load_image(image_path)

#讀去證照圖片
import gradio as gr

def render_html(prove):
    if prove is not None:
        return f'<a href="{prove}" target="_blank">點擊查看證明</a>'
    else:
        return ''

with gr.Blocks(css=custom_css,title='我的履歷') as resume_app:# title可以修改页面标题
    # with gr.Column():
        gr.HTML("""
        <div class="header">
            <h1>巫宇哲的個人簡歷</h1>
            <p>軟體工程師 | AI 愛好者 | 數據分析師</p>
        </div>
        """)
        with gr.Tab("履歷資料",elem_classes="content"):
            with gr.Row():
                with gr.Column(scale=1):
                    gr.Image('履歷資料/頭貼.jpg', elem_classes="profile-pic",show_label=False)
                    gr.Markdown("""
                    <div style="text-align:center;">
                    <p style="margin-bottom: 0;">
                        📧 <a href="mailto:a0903153387@yahoo.com.tw" style="text-decoration: none; color: inherit;">a0903153387@yahoo.com.tw</a>
                    </p>
                    <p style="margin-bottom: 0;">
                        📱 <a href="tel:+1234567890" style="text-decoration: none; color: inherit;">0916-418068</a>
                    </p>
                    <p style="margin-bottom: 0; display: flex; align-items: center; justify-content: center;">
                        <img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub" style="width:16px; height:16px; margin-right: 5px;">
                        <a href="https://github.com/3A732038" target="_blank" style="text-decoration: none; color: inherit;">github.com/3A732038</a>
                    </p>
                    </div>
                    """)
                    gr.Markdown("""
                    關於我
                    ===
                    熱衷於探索 AI 技術的軟體工程師,擅長 Python 和機器學習。
                    熟悉各類開發工具與框架,並具備網站開發與資料庫使用經驗。喜歡將創新想法轉化為實際應用。
                    """)
                    gr.Markdown("""

                    技能
                    ===
                    """)
                    with gr.Row(elem_classes="skills"):
                        for skill in ["Python", "深度學習", "Web 開發", "數據分析"]:
                            gr.Markdown(f"<div class='skill'>{skill}</div>")
                    with gr.Row():
                        with gr.Column(scale=2):
                            gr.Markdown("""
                            特殊經歷
                            ===         
                            """)
                            prove=['file/履歷資料/研討會證明.png',None,'file/履歷資料/專題名次.pdf']
                            name=['ICIM2024研討會: 提交的研究成果被接受,並在研討會上進行了發表。','碩二下學期擔任指導教授所開的類神經網路課程助教。','大學專題實務成果展競賽亞軍,技術類業界評選第一名。']
                            describe=['本研究基於研究所時期的成果,題為「基於情緒支持的對話:融合情緒感知和關鍵字識別的研究」。研究旨在通過聊天機器人為情緒困擾者提供陪伴,緩解其短期心理壓力。本文提出的模型結合情緒標籤和關鍵字識別技術,與其他基礎模型相比,能夠提供更精準的回復,從而更有效地支持用戶的情緒需求。<a href="file/履歷資料/巫宇哲_研討會.pdf" target="_blank">投稿內文連結</a>',
                                    '主要協助老師指導學生實作部分。包括使用 WEKA 軟體教導學生快速構建和分析機器學習模型,並解釋模型結果的含義。後期則引導學生安裝 Python 環境,撰寫並執行機器學習模型的程式碼,幫助學生在未來能夠運用 AI 技術更有效地完成工作。' ,
                                    '<i>專題名稱:熱影像結合人臉偵測暨網頁瀏覽系統。</i></br>為因應新冠疫情,無接觸體溫檢測需求激增,本專題開發了利用紅外線熱影像和後端資料庫蒐集,最終實現異地閱覽和確保體溫監測的安全與效率。<a href="file/履歷資料/專題文件.pdf" target="_blank">專題內文連結</a></br></br><b>我的貢獻:硬體設備組裝、人臉偵測和後端資料庫及視覺化</b>'
                                    ]
        
                            for i in range(len(name)):
                                gr.HTML(f"""
                                <div style="margin-bottom: 10px;">        
                                <ui>
                                <li>
                                <p style="font-size: 1.3em; font-weight: bold;">{name[i]}</p>
                                <span style="font-size: 1.0em; font-weight: normal;">
                                {render_html(prove[i])}   
                                </span>
                                </li>                          
                                </ui>
                                </div>
                                &emsp;<strong>內容簡述:</strong> {describe[i]}                       
                                </br>
                                </br>
                                """)  
                with gr.Column(scale=1):
                    gr.HTML('''
                    <div style="font-size: 32px; font-weight: bold; color: #2c3e50; margin: 0; padding: 0;">
                        證照
                    </div>
                    <hr style="border: none; border-top: 2px solid #2c3e50; margin: 1% 0;">
                    ''')
                    # Certificate table header
                    with gr.Row(elem_classes="cert-row cert-header"):
                        with gr.Column(scale=1, min_width=100):
                            gr.Markdown("### 證照名稱")
                        with gr.Column(scale=1, min_width=100):
                            gr.Markdown("### 證照機構")
                        with gr.Column(scale=2, min_width=200):
                            gr.Markdown("### 證照照片")

                    # Certificate data rows
                    certificates = [
                        ("電腦硬體裝修丙級", "勞動部", "履歷資料/硬體裝修丙級_mask.jpg"),
                        ("電腦硬體裝修乙級", "勞動部", "履歷資料/硬體裝修乙級_mask.jpg"),
                        ("Database Administration Fundamentals", "微軟", "履歷資料/DAF.jpg"),
                        ("Software Development Fundamentals", "微軟", "履歷資料/SDF.jpg"),
                        ("Networking Fundamentals", "微軟", "履歷資料/NF.png"),
                        ("CRM Merchandise Analyst", "微析科技", "履歷資料/crm_mask.jpg"),
                        ("Enterprise Resource Planning", "中華企業資源規劃學會", "履歷資料/erp.jpg"),
                    ]

                    for cert_name, cert_org, cert_img in certificates:
                        with gr.Row(elem_classes="cert-row"):
                            with gr.Column(scale=1, min_width=100):
                                gr.Markdown(cert_name)
                            with gr.Column(scale=1, min_width=100):
                                gr.Markdown(cert_org)
                            with gr.Column(scale=2, min_width=200):
                                gr.Image(cert_img, height=100, show_label=False)
        with gr.Tab("專案展示",elem_classes="content"):                    
            with gr.Row():
                with gr.Column(scale=1):
                    gr.Markdown("""
                        ## 學生點名系統
                        <strong>動機與目的:</strong> 鑒於每次上課點名都是老師的一大負擔,開發了這個學生點名系統,旨在幫助老師更有效地進行點名。本專案使用 Laravel 開源 PHP Web 框架開發,主要功能包括:
                        <div style="display: flex;">
                        <div style="width: 20%;">
                            <b>老師功能</b>:
                            </br>
                            - 查看課表及點名記錄</br>
                            - 查看學生出缺席和請假狀況</br>
                            - 審核學生請假申請
                        </div>
                        <div style="width: 20%;">
                            <b>學生功能:</b>
                            </br>
                            - 查看課表及進行點名</br>
                            - 查看出缺席和請假記錄</br>
                            - 申請請假
                        </div>
                        </div>
                        </br>
                        下圖為學生點名系統的截圖:
                    """)
                    with gr.Row():
                        with gr.Column(scale=1):
                            gr.Markdown("""老師主頁課表封面""")
                            gr.Image('履歷資料/網頁1.jpg',container=False)#container 決定是否外面有框框
                        with gr.Column(scale=1):  
                            gr.Markdown("""老師查看出缺席""")
                            gr.Image('履歷資料/網頁2.jpg',container=False)
                    gr.Markdown("""完整專案可參閱本github:<a href="https://github.com/WISD-2020/final02" target="_blank">學生點名系統專案</a>""")        
                    gr.Markdown("""<hr style="border-top: 2px solid;border-color:#169bf2;">""")
                    gr.Markdown("""
                    ## 氣管插管預測
                    <strong>動機與目的:</strong>為了協助醫生在執行插管時更精確地將氧氣管置入正確位置,我們利用影像分割技術(如 TransUnet、UNet++ 等)來實現該目標。最後,我們結合邊緣檢測與形態學技術,精確量化預測與實際的誤差,以提高插管的成功率並降低風險。
                    該成果如下展示:
                                """)
                    #提交要的範例後顯示對應該範例氣管插管真實和預測位置
                    def choice(input_idx,img):
                        if input_idx == "example_2":
                            return (gr.Image('履歷資料/EET_project/ex_2_pred.jpg', container=False,interactive=False,label='影像切割所預測出來的mask',visible=True,height=310),
                                     gr.Image('履歷資料/EET_project/ex_2_label.jpg', container=False,interactive=False,label='真實氣管的mask位置',visible=True,height=310)    
                            )
                        elif input_idx == "example_3":
                            return (gr.Image('履歷資料/EET_project/ex_3_pred.jpg', container=False,interactive=False,label='影像切割所預測出來的mask',visible=True,height=310),
                                    gr.Image('履歷資料/EET_project/ex_3_label.jpg', container=False,interactive=False,label='真實氣管的mask位置',visible=True,height=310)     
                            )
                        else:
                            return (gr.Image('履歷資料/EET_project/ex_1_pred.jpg', container=False,interactive=False,label='影像切割所預測出來的mask',visible=True,height=310),
                                    gr.Image('履歷資料/EET_project/ex_1_label.jpg', container=False,interactive=False,label='真實氣管的mask位置',visible=True,height=310)  
                            )    
                        
                    # 定義一個函數來根據 Dropdown 的選擇更新圖片
                    def update_image(choice):
                        # 根據選擇返回對應的圖片
                        if choice == "example_1":
                            return '履歷資料/EET_project/ex_1_init.jpg'
                        elif choice == "example_2":
                            return '履歷資料/EET_project/ex_2_init.jpg'
                        elif choice == "example_3":
                            return '履歷資料/EET_project/ex_3_init.jpg'
                    with gr.Row():
                        with gr.Column(scale=1):           
                            dropdown = gr.Dropdown(["example_1", "example_2", "example_3"], label="Endotracheal Tube資料", info="氣管X-ray影像", value="example_1", interactive=True)
                            image = gr.Image('履歷資料/EET_project/ex_1_init.jpg', container=False,interactive=False)                         
                            # 當 Dropdown 值改變時更新 Image
                            dropdown.change(fn=update_image, inputs=dropdown, outputs=image)
                            gr.Interface(choice
                                 ,inputs=[dropdown,image]
                                 ,outputs=[gr.Image(visible=False),gr.Image(visible=False)],allow_flagging='never')
                    gr.HTML("""成果文件檔案:<a href="file/履歷資料/EET_project/EET_doc.pdf" target="_blank">EET成果文件檔</a>&emsp;&emsp;完整專案可參閱本github:<a href="https://github.com/3A732038/hw2_M11123020" target="_blank">EET專案</a>""")        
                    gr.Markdown("""<hr style="border-top: 2px solid;border-color:#169bf2;">""")       
                    gr.Markdown("""
                    ## 貨車車牌辨識
                    <strong>動機與目的:</strong>為了提高貨車進出倉庫的效率,我們建立一個車牌辨識系統,該系統基於深度學習技術,主要透過yolo來偵測車牌位置,再透過OCR技術來識別車牌號碼,最後將車牌號碼與倉庫數據庫進行比對,以確保進出貨物的準確性。
                    該成果如下影片展示:                       
                    """)
                    with gr.Row(): 
                        with gr.Column(scale=1): 
                            gr.Video('履歷資料/貨車車牌/video_0001.mp4',label='原始貨車影片')
                        with gr.Column(scale=1): 
                            gr.Video('履歷資料/貨車車牌/video_0001_result.mkv',label='車牌辨識影片')  
                    gr.HTML("""成果文件檔案:<a href="file/履歷資料/貨車車牌/貨車車牌_doc.pdf" target="_blank">貨車車牌成果文件檔</a>&emsp;&emsp;完整專案可參閱本github:<a href="https://github.com/3A732038/hw3_M11123020" target="_blank">貨車車牌辨識專案</a>""")                                                    
                    gr.Markdown("""<hr style="border-top: 2px solid;border-color:#169bf2;">""") 
                    gr.Markdown("""
                    ## 聊天機器人
                    """)
                    gr.Markdown("""
                    <strong>動機與目的:</strong>過去在研究語言模型時,尚未設計與機器人對話的專屬介面,因此這次實作了一個簡單的聊天機器人介面。該聊天機器人基於 Qwen 大型預訓練語言模型,這是一個多語言支持的模型,供使用者進行互動體驗。
                    <br>
                    ※ 注意:若畫面出現 error,請重新整理頁面!
                    """)                    
                    gr.ChatInterface(
                        chat,
                        chatbot=gr.Chatbot(avatar_images=avatar_images),
                        textbox=gr.Textbox(placeholder="輸入你的訊息...", elem_id="textbox"),
                        submit_btn='送出',
                        clear_btn='清除',
                        retry_btn='重新送出',
                        undo_btn=None
                    )
                    gr.Markdown("""<hr style="border-top: 2px solid;border-color:#169bf2;">""")   
                    gr.HTML(f"""
                    <h2>其他專案</h2>
                    <h3>
                    <ul> <li>分類預測和回歸預測:</li> </ul>
                    </h3>
                    使用<a href="https://archive.ics.uci.edu/dataset/2/adult">成人資料集</a> 進行測試,針對收入(income)欄位進行分類預測,針對每週工時(hours-per-week)欄位進行回歸預測。我們應用了決策樹、隨機森林、支援向量機等機器學習演算法,並使用混淆矩陣、ROC 曲線、AUC 等指標來評估模型的表現。
                    <h3>
                    <ul> <li>分群預測:</li> </ul>
                    </h3>
                    使用<a href="https://archive.ics.uci.edu/ml/datasets/iris">IRIS資料集</a>進行分群預測,採用了 K-means、DBSCAN 和層次聚類演算法。模型表現的評估則基於 purity 指標。
                    <h3>
                    <ul> <li>關聯規則:</li> </ul>
                    </h3>
                    使用交易資料集進行關聯規則分析,採用了 Apriori 和 FP-Growth 演算法來找出產品之間的關聯,並以支持度與置信度來評估規則的強度。該完整內容如右:<a href="file/履歷資料/DM/DM_4.pdf" target="_blank">關聯規則文件檔案</a> 
                    <h3>
                    <ul> <li>深度學習做分類和回歸預測:</li> </ul>
                    </h3>
                    與上述分類與回歸預測相似,使用 <a href="https://archive.ics.uci.edu/dataset/2/adult">成人資料集</a>作為測試,不同之處在於這次使用了自建的類神經網路進行預測,評估指標依然保持一致。
                    <h3>
                    <ul> <li>降維:</li> </ul>
                    </h3>
                    應用了多維縮放(MDS)與 t-SNE 等降維技術,將高維資料降至二維並進行視覺化展示。同時,對於名目尺度資料,我們除了使用 one-hot encoding,還特別測試了 word embedding 技術。該完整內容如右:<a href="file/履歷資料/ML/ML_4.pdf" target="_blank">降維文件檔案</a> 
                                            
                    """)

        with gr.Tab("AI小助手",elem_classes="content"):
            gr.Markdown("""
            ## <div align='center' >AI履歷助手:巫宇哲的智能個人資料查詢</div>
            <strong>主要用途:</strong>此語言模型運用檢索增強生成 (RAG) 技術,為巫宇哲的個人資訊提供客製化聊天服務。透過實時檢索相關資料,模型能夠準確且生成個性化回覆,無需額外訓練。
            特別適合在有新資料時,模型能即時更新知識,而無需反覆進行訓練,或是在無法進行大規模模型訓練的情境下使用。<br>
            ※ 注意:該模型提供的資訊僅供參考,可能存在誤差,請根據履歷資料和專案展示頁面加以判斷。若是出現模型回答不好的情況也可以按重新發送按鈕,讓模型在回答一次。
            """)
            gr.ChatInterface(
                resume_QA,
                chatbot=gr.Chatbot(height=400, elem_classes="custom-chatbot",avatar_images=avatar_images),
                textbox=gr.Textbox(placeholder="Ask me a yes or no question", container=False, scale=7),
                examples=["有參與過那些專案?", "有哪些證照或是技能?", "有什麼特殊經歷?","貨車車牌辨識在做什麼?","會使用python嗎?"],
                cache_examples=True,
                retry_btn="Retry",
                undo_btn="Delete Previous",
                clear_btn="Clear",
            )                    
    # gr.HTML(custom_footer)                    
resume_app.launch(allowed_paths=['./'],favicon_path='履歷資料/android-chrome-512x512.png')