Download app.py from ngocng19/LLM: direct link, hf CLI and curl.
- Browser
- Download file 11.6 kB
-
https://huggingface.co/spaces/ngocng19/LLM/resolve/main/app.py
- Command line
-
hf download hf://spaces/ngocng19/LLM/app.py
-
curl -L -o app.py https://huggingface.co/spaces/ngocng19/LLM/resolve/main/app.py
11.6 kB
| import time | |
| import gradio as gr | |
| import datetime | |
| import pandas as pd | |
| # 1. Khởi tạo dữ liệu Journal mẫu | |
| journal_data = pd.DataFrame(columns=[ | |
| "Date", "Category", "Task", "Background", "Current condition", | |
| "Goal/Target condition", "Root Cause Analysis", "Confirmation", "Follow-up" | |
| ]) | |
| # Dữ liệu Projects với nội dung trọng tâm đầy đủ | |
| projects = [ | |
| { | |
| "id": "tdpb_1", "category": "Tư duy", | |
| "title": "🧠 Tư duy phản biện - Tổng quan", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **1.1 Khái niệm:** Định nghĩa Tư duy phản biện (Critical Thinking). | |
| - **1.2 Phân loại:** Tư duy logic, sáng tạo, hệ thống. | |
| - **1.3 Các loại bệnh tư duy:** Ngụy biện, thiên kiến xác nhận, tư duy lối mòn.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 1", "url": "https://drive.google.com/drive/folders/1S2HZphDorycggd59gZtwoD1g18vAkO6g"}, | |
| {"name": "📝 Bài tập rèn luyện", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "tdpb_2", "category": "Tư duy", | |
| "title": "🔍 Hình thức & Quy luật Logic", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **2.1 Các quy luật:** Luật đồng nhất, Phi mâu thuẫn, Loại trừ cái thứ ba, Lý do đầy đủ. | |
| - **2.2 Hình thức:** Khái niệm, Phán đoán và Suy luận chuẩn xác.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 2 & 3", "url": "https://drive.google.com/drive/folders/1mM_f1C95WmU05kCyIWCg7eH2Twxp76kk"}, | |
| {"name": "📊 Sơ đồ logic hệ thống", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "tdpb_3", "category": "Tư duy", | |
| "title": "🔍 Chương 4: Chứng minh & Bác bỏ", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **4.1 Chứng minh:** Cấu trúc luận điểm, luận cứ và phương pháp. | |
| - **4.2 Bác bỏ:** Cách phát hiện lỗi sai và bẻ gãy ngụy biện.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 4", "url": "https://drive.google.com/drive/u/0/folders/1YpS-hM5yMtZL-SdC4BLxPIgC_eE6TF8J"}, | |
| {"name": "📊 Sơ đồ logic", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "tdpb_4", "category": "Thu nhập", | |
| "title": "💰 Thu nhập & Giá trị", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **Tư duy tài chính:** Mối liên hệ giữa năng lực phản biện và thu nhập. | |
| - **Phân tích:** Cách tối ưu hóa nguồn lực cá nhân.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 4", "url": "https://drive.google.com/drive/u/0/folders/1ETUOnwCJWg_s-lmje1rNx9O0WcE-wzBu"}, | |
| {"name": "📊 Sơ đồ thu nhập", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "tdpb_6", "category": "Đặt câu hỏi", | |
| "title": "❓ Kỹ năng Đặt câu hỏi", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **Kỹ thuật hỏi:** Sử dụng 5W1H (Who, What, Where, When, Why, How). | |
| - **Mục tiêu:** Đặt câu hỏi đúng để mở khóa vấn đề cốt lõi.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 5", "url": "https://drive.google.com/drive/u/0/folders/1x_c1ajxMSANm1muLk76dGW9VypUZknbO"}, | |
| {"name": "📊 Sơ đồ đặt câu hỏi", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "tdpb_7", "category": "FTO", | |
| "title": "🔭 FTO - Quan sát thực địa", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **Kỹ năng FTO:** Quan sát thực tế, thu thập dữ liệu khách quan tại hiện trường. | |
| - **Báo cáo:** Chuyển đổi dữ liệu thô thành nhận định có giá trị.""", | |
| "resources": [ | |
| {"name": "📁 Drive: Tài liệu Chương 6", "url": "https://drive.google.com/drive/u/0/folders/1QKyU_19f-MZz7pJ2hscTA5B4kG-aVVGj"}, | |
| {"name": "📊 Sơ đồ quan sát", "url": "#"} | |
| ] | |
| }, | |
| { | |
| "id": "kt_tt200", "category": "Kế toán TT200", | |
| "title": "💵 Kế toán Tiền (TK 111, 112, 113)", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **Nguyên tắc:** Quản lý dòng tiền, kiểm kê quỹ tiền mặt hàng ngày. | |
| - **Nghiệp vụ:** Đối chiếu sổ phụ ngân hàng, xử lý chênh lệch tỷ giá (TK 413). | |
| - **Chứng từ:** Phiếu thu, Phiếu chi, Ủy nhiệm chi.""", | |
| "resources": [ | |
| {"name": "PR Check-list", "url": "https://drive.google.com/drive/u/0/folders/1DR9yD-9PUIOxwEcLiaBC7BG8DZ9M5nYg0J0WK_xm2uE"}, | |
| {"name": "Technical Accounting", "url": "https://docs.google.com/spreadsheets/d/1VXd0qSUsMT7vPrqG-3QskzOqnn3rOYsD3TnDWD1o0S0/edit?gid=1784442735#gid=1784442735"} | |
| ] | |
| }, | |
| { | |
| "id": "ifrs_all", "category": "IFRS Chuyên sâu", | |
| "title": "📑 IFRS - IAS", | |
| "desc": """### 📌 Nội dung trọng tâm: | |
| - **IFRS Hierarchy:** Hệ thống chuẩn mực kế toán quốc tế. | |
| - **Fair Value:** Tư duy về Giá trị hợp lý thay vì Giá gốc.""", | |
| "resources": [ | |
| {"name": "📄 IFRS Framework", "url": "https://nngouyenngoc913.github.io/ifrs-hierachy/"}, | |
| ] | |
| }, | |
| { | |
| "id": "template_pr", "category": "Template for PR", | |
| "title": "📋 Templates & Resources", | |
| "desc": """### 📌 Công cụ hỗ trợ: | |
| - **Templates:** Inventory, Fixed Asset, AP-AR Aging. | |
| - **Analysis:** Power Query, BI và mô hình kinh doanh (MHKD).""", | |
| "resources": [ | |
| {"name": "📄 Folder PR", "url": "https://drive.google.com/drive/u/1/folders/1s5EIxMJ1_P1AAvErAIIjhNpmDBBjwI00"}, | |
| {"name": "Power BI Analysis", "url": "https://docs.google.com/spreadsheets/d/1V07eBrpl1RnqUR3iwa_hYZbNCSgD1-PIGh9ufXG1-0I/edit?gid=1008653781#gid=1008653781"} | |
| ] | |
| } | |
| ] | |
| # 2. Các hàm xử lý | |
| def get_resources(project_id): | |
| if not project_id: return "### 💡 Chọn một học phần để xem nội dung." | |
| proj = next((p for p in projects if p["id"] == project_id), None) | |
| if not proj: return "### ❌ Không tìm thấy dữ liệu." | |
| md = f"# {proj['title']}\n" | |
| md += f"{proj.get('desc', 'Nội dung đang được cập nhật...')}\n" | |
| md += "\n---\n### 🛠️ Tài liệu học tập:\n" | |
| for res in proj['resources']: | |
| md += f"- **[{res['name']}]({res['url']})**\n" | |
| return md | |
| def handle_tracker(duration, current_task, progress=gr.Progress()): | |
| if not current_task: return "00:00", "⚠️ Hãy nhập mục tiêu phiên học!" | |
| total_secs = int(duration * 60) | |
| for elapsed in range(total_secs + 1): | |
| mins, secs = divmod(total_secs - elapsed, 60) | |
| progress(elapsed / total_secs, desc=f"Đang tập trung: {current_task}") | |
| yield f"{mins:02d}:{secs:02d}", f"📖 Đang nghiên cứu: {current_task}" | |
| time.sleep(1) | |
| yield "00:00", "✅ Tuyệt vời! Bạn đã hoàn thành phiên học." | |
| def add_reflection(cat, task, bg, curr, target, root, confirm, follow, history): | |
| new_row = { | |
| "Date": datetime.date.today().strftime("%d/%m"), | |
| "Category": cat, | |
| "Task": task, | |
| "Background": bg, | |
| "Current condition": curr, | |
| "Goal/Target condition": target, | |
| "Root Cause Analysis": root, | |
| "Confirmation": confirm, | |
| "Follow-up": follow | |
| } | |
| updated_history = pd.concat([pd.DataFrame([new_row]), history], ignore_index=True) | |
| return updated_history, "✅ Đã lưu nhật ký phản tư thành công!" | |
| # 3. Giao diện Gradio | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.HTML("<h1 style='text-align: center; color: #2563eb;'>🚀 Personal Learning Dashboard</h1>") | |
| with gr.Tabs(): | |
| # TAB 1: KHO TÀI LIỆU | |
| with gr.Tab("📚 Trung tâm Tài liệu"): | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 📂 Danh mục") | |
| dropdown_choices = [(p["title"], p["id"]) for p in projects] | |
| selector = gr.Dropdown(choices=dropdown_choices, label="Tra cứu nhanh học phần") | |
| gr.Markdown("---") | |
| categories = ["Tư duy", "Kế toán TT200", "IFRS Chuyên sâu", "Thu nhập", "Đặt câu hỏi", "FTO", "Template for PR"] | |
| for cat in categories: | |
| with gr.Accordion(cat, open=False): | |
| cat_projs = [p for p in projects if p["category"] == cat] | |
| for p in cat_projs: | |
| btn = gr.Button(p["title"], variant="secondary", size="sm") | |
| # Gán output vào resource_output | |
| btn.click(fn=lambda pid=p['id']: get_resources(pid), outputs=gr.Markdown(elem_id="res_display")) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### 🔍 Nội dung chi tiết & Trọng tâm") | |
| resource_output = gr.Markdown("Hãy chọn một bài học từ danh mục bên trái.", elem_id="res_display") | |
| # TAB 2: FOCUS MODE | |
| with gr.Tab("⏱️ Focus Mode"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| task_in = gr.Textbox(label="Mục tiêu phiên học", placeholder="VD: Giải bài tập IFRS 15...") | |
| dur_slider = gr.Slider(5, 60, value=25, label="Phút") | |
| btn_start = gr.Button("Bắt đầu Focus", variant="primary") | |
| with gr.Column(): | |
| timer_out = gr.Label(value="00:00") | |
| stat_out = gr.Textbox(label="Trạng thái", interactive=False) | |
| # TAB 3: REFLECTION JOURNAL | |
| with gr.Tab("📝 Reflection Journal"): | |
| gr.Markdown("### 🧠 Tư duy giải quyết vấn đề theo chuẩn A3/Lean") | |
| with gr.Row(): | |
| with gr.Column(): | |
| j_cat = gr.Dropdown(choices=["Tư duy", "Kế toán", "Kỹ năng mềm", "Dự án"], label="Category") | |
| j_task = gr.Textbox(label="Task/Problem Name", placeholder="Vấn đề cần giải quyết...") | |
| j_bg = gr.Textbox(label="Background (Bối cảnh)", lines=2) | |
| j_curr = gr.Textbox(label="Current condition (Hiện trạng)", lines=2) | |
| with gr.Column(): | |
| j_target = gr.Textbox(label="Goal (Mục tiêu hướng tới)", lines=2) | |
| j_root = gr.Textbox(label="Root Cause Analysis (Phân tích gốc rễ)", lines=2, placeholder="Sử dụng 5 Why...") | |
| j_confirm = gr.Textbox(label="Confirmation (Xác nhận giải pháp)") | |
| j_follow = gr.Textbox(label="Follow-up (Theo dõi kết quả)") | |
| save_btn = gr.Button("💾 Lưu nhật ký phản tư", variant="primary") | |
| msg_out = gr.Markdown("") | |
| gr.Markdown("---") | |
| gr.Markdown("### 📜 Lịch sử phản tư") | |
| history_table = gr.DataFrame(value=journal_data, interactive=False) | |
| # Đăng ký sự kiện | |
| selector.change(fn=get_resources, inputs=selector, outputs=resource_output) | |
| btn_start.click(fn=handle_tracker, inputs=[dur_slider, task_in], outputs=[timer_out, stat_out]) | |
| save_btn.click( | |
| fn=add_reflection, | |
| inputs=[j_cat, j_task, j_bg, j_curr, j_target, j_root, j_confirm, j_follow, history_table], | |
| outputs=[history_table, msg_out] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch(share="True") |