Spaces:
Sleeping
Sleeping
Mã Lương Khánh commited on
Commit ·
8248295
0
Parent(s):
Initial commit: RAG model evaluation system
Browse files- Dockerfile +38 -0
- README.md +69 -0
- app.py +56 -0
- cacul.py +151 -0
- model_comparison_results.csv +6 -0
- questions_answers.csv +12 -0
- requirements.txt +4 -0
- templates/index.html +189 -0
- templates/thank_you.html +12 -0
- votes_results.csv +51 -0
Dockerfile
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Dockerfile for Hugging Face Spaces deployment
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
WORKDIR /app
|
| 5 |
+
|
| 6 |
+
# Install system dependencies
|
| 7 |
+
RUN apt-get update && apt-get install -y \
|
| 8 |
+
build-essential \
|
| 9 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 10 |
+
|
| 11 |
+
# Copy requirements first for better caching
|
| 12 |
+
COPY requirements.txt .
|
| 13 |
+
|
| 14 |
+
# Install Python dependencies
|
| 15 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 16 |
+
|
| 17 |
+
# Copy application code
|
| 18 |
+
COPY app.py .
|
| 19 |
+
COPY cacul.py .
|
| 20 |
+
COPY questions_answers.csv .
|
| 21 |
+
COPY templates/ ./templates/
|
| 22 |
+
|
| 23 |
+
# Create data directory for persistent storage
|
| 24 |
+
RUN mkdir -p /data
|
| 25 |
+
|
| 26 |
+
# Create initial empty CSV files if they don't exist
|
| 27 |
+
RUN touch votes_results.csv model_comparison_results.csv
|
| 28 |
+
|
| 29 |
+
# Expose port 7860 for Hugging Face Spaces
|
| 30 |
+
EXPOSE 7860
|
| 31 |
+
|
| 32 |
+
# Set environment variables
|
| 33 |
+
ENV PYTHONUNBUFFERED=1
|
| 34 |
+
ENV FLASK_APP=app.py
|
| 35 |
+
|
| 36 |
+
# Run Flask application on port 7860
|
| 37 |
+
CMD ["python", "-c", "from app import app; app.run(host='0.0.0.0', port=7860, debug=False)"]
|
| 38 |
+
|
README.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: RAG Model Evaluation System
|
| 3 |
+
emoji: 📊
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
pinned: false
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# Hệ Thống Đánh Giá Các Mô Hình AI Pháp Luật
|
| 12 |
+
|
| 13 |
+
Ứng dụng khảo sát để đánh giá và so sánh chất lượng câu trả lời của 5 mô hình AI pháp luật khác nhau:
|
| 14 |
+
|
| 15 |
+
## Các Mô Hình Được Đánh Giá
|
| 16 |
+
|
| 17 |
+
1. **RAG** - Retrieval-Augmented Generation system
|
| 18 |
+
2. **GPT** - GPT-based model
|
| 19 |
+
3. **lexcentra** - LEXcentra AI
|
| 20 |
+
4. **ailuat** - AI Luật
|
| 21 |
+
5. **law&press** - Law&Press AI
|
| 22 |
+
|
| 23 |
+
## Tính Năng
|
| 24 |
+
|
| 25 |
+
- 📋 Khảo sát với 10 câu hỏi pháp lý thực tế
|
| 26 |
+
- ⭐ Đánh giá từng model theo thang điểm 1-5 sao
|
| 27 |
+
- 📊 Giao diện Bootstrap đẹp mắt, responsive
|
| 28 |
+
- 💾 Lưu trữ kết quả vote vào CSV
|
| 29 |
+
|
| 30 |
+
## Cách Sử Dụng
|
| 31 |
+
|
| 32 |
+
1. Truy cập ứng dụng qua URL Hugging Face Spaces
|
| 33 |
+
2. Đọc câu hỏi và câu trả lời từ 5 models
|
| 34 |
+
3. Đánh giá mỗi câu trả lời bằng hệ thống sao (1-5)
|
| 35 |
+
4. Chuyển sang câu hỏi tiếp theo bằng tabs
|
| 36 |
+
5. Gửi phiếu đánh giá khi hoàn thành tất cả câu hỏi
|
| 37 |
+
|
| 38 |
+
## Phân Tích Kết Quả
|
| 39 |
+
|
| 40 |
+
Sau khi thu thập đủ votes, sử dụng script `cacul.py` để phân tích:
|
| 41 |
+
|
| 42 |
+
```bash
|
| 43 |
+
python cacul.py
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
Kết quả phân tích bao gồm:
|
| 47 |
+
- **Win Rate (%)**: Tỷ lệ điểm trên tổng điểm tối đa
|
| 48 |
+
- **Elo Score**: Điểm Elo theo Bradley-Terry Model
|
| 49 |
+
- **Pairwise Comparison**: So sánh từng cặp model
|
| 50 |
+
- **Average Score**: Điểm trung bình
|
| 51 |
+
- **Total Score**: Tổng điểm
|
| 52 |
+
|
| 53 |
+
## Công Nghệ
|
| 54 |
+
|
| 55 |
+
- **Backend**: Flask (Python)
|
| 56 |
+
- **Frontend**: Bootstrap 5 + FontAwesome
|
| 57 |
+
- **Data Processing**: Pandas, NumPy
|
| 58 |
+
- **Deployment**: Docker on Hugging Face Spaces
|
| 59 |
+
|
| 60 |
+
## Lưu Ý
|
| 61 |
+
|
| 62 |
+
- Dữ liệu votes được lưu vào `votes_results.csv`
|
| 63 |
+
- Mỗi lần submit sẽ append thêm dữ liệu mới
|
| 64 |
+
- Kết quả phân tích được lưu vào `model_comparison_results.csv`
|
| 65 |
+
|
| 66 |
+
## License
|
| 67 |
+
|
| 68 |
+
MIT License
|
| 69 |
+
|
app.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from flask import Flask, render_template, request, redirect, url_for
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import os
|
| 4 |
+
|
| 5 |
+
app = Flask(__name__)
|
| 6 |
+
|
| 7 |
+
# Load dữ liệu câu hỏi và câu trả lời từ CSV
|
| 8 |
+
df = pd.read_csv('questions_answers.csv', encoding='utf-8', sep='|')
|
| 9 |
+
|
| 10 |
+
@app.route('/')
|
| 11 |
+
def index():
|
| 12 |
+
return render_template('index.html', questions=df.to_dict(orient='records'))
|
| 13 |
+
|
| 14 |
+
@app.route('/vote', methods=['POST'])
|
| 15 |
+
def vote():
|
| 16 |
+
# Danh sách để lưu các record vote của phiên hiện tại
|
| 17 |
+
current_votes = []
|
| 18 |
+
|
| 19 |
+
# Nhận vote từ form
|
| 20 |
+
for index, row in df.iterrows():
|
| 21 |
+
question = row['Câu hỏi']
|
| 22 |
+
|
| 23 |
+
# Lấy giá trị điểm từ 1 đến 5 cho từng mô hình
|
| 24 |
+
rag_vote = request.form.get(f'RAG_{question}')
|
| 25 |
+
gpt_vote = request.form.get(f'GPT_{question}')
|
| 26 |
+
lexcentra_vote = request.form.get(f'lexcentra_{question}')
|
| 27 |
+
ailuat_vote = request.form.get(f'ailuat_{question}')
|
| 28 |
+
lawpress_vote = request.form.get(f'law&press_{question}')
|
| 29 |
+
|
| 30 |
+
# Tạo record cho câu hỏi này
|
| 31 |
+
vote_record = {
|
| 32 |
+
'Câu hỏi': index+1,
|
| 33 |
+
'RAG': int(rag_vote) if rag_vote else 0,
|
| 34 |
+
'GPT': int(gpt_vote) if gpt_vote else 0,
|
| 35 |
+
'lexcentra': int(lexcentra_vote) if lexcentra_vote else 0,
|
| 36 |
+
'ailuat': int(ailuat_vote) if ailuat_vote else 0,
|
| 37 |
+
'law&press': int(lawpress_vote) if lawpress_vote else 0
|
| 38 |
+
}
|
| 39 |
+
current_votes.append(vote_record)
|
| 40 |
+
|
| 41 |
+
# Lưu kết quả vote vào file CSV (append mode)
|
| 42 |
+
results_df = pd.DataFrame(current_votes)
|
| 43 |
+
|
| 44 |
+
# Kiểm tra xem file đã tồn tại chưa để quyết định ghi header
|
| 45 |
+
file_exists = os.path.isfile('votes_results.csv')
|
| 46 |
+
|
| 47 |
+
results_df.to_csv('votes_results.csv', mode='a', index=False, encoding='utf-8', sep='|', header=not file_exists)
|
| 48 |
+
|
| 49 |
+
return redirect(url_for('thank_you'))
|
| 50 |
+
|
| 51 |
+
@app.route('/thank_you')
|
| 52 |
+
def thank_you():
|
| 53 |
+
return "Cảm ơn bạn đã tham gia bỏ phiếu!"
|
| 54 |
+
|
| 55 |
+
if __name__ == '__main__':
|
| 56 |
+
app.run(debug=True)
|
cacul.py
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import numpy as np
|
| 3 |
+
from collections import defaultdict
|
| 4 |
+
|
| 5 |
+
# Đọc dữ liệu từ CSV
|
| 6 |
+
df = pd.read_csv('votes_results.csv')
|
| 7 |
+
|
| 8 |
+
# Danh sách các models
|
| 9 |
+
models = ['RAG', 'GPT', 'lexcentra', 'ailuat', 'law&press']
|
| 10 |
+
|
| 11 |
+
# 1. Tính Win Rate (%)
|
| 12 |
+
print("=== WIN RATE (%) ===")
|
| 13 |
+
|
| 14 |
+
# Tính toán win rate cho từng model
|
| 15 |
+
win_rates = {}
|
| 16 |
+
for model in models:
|
| 17 |
+
# Tính tổng điểm cho mỗi model
|
| 18 |
+
total_score = df[model].sum()
|
| 19 |
+
# Tổng điểm tối đa có thể đạt được (5 điểm × 10 câu hỏi)
|
| 20 |
+
max_possible = 5 * len(df)
|
| 21 |
+
# Tính win rate
|
| 22 |
+
win_rate = (total_score / max_possible) * 100
|
| 23 |
+
win_rates[model] = win_rate
|
| 24 |
+
print(f"{model}: {win_rate:.2f}%")
|
| 25 |
+
|
| 26 |
+
# 2. Tính toán Elo Score sử dụng Bradley-Terry Model
|
| 27 |
+
print("\n=== ELO SCORE (Bradley-Terry Model) ===")
|
| 28 |
+
|
| 29 |
+
# Khởi tạo Elo scores (có thể bắt đầu từ 1500 hoặc 0)
|
| 30 |
+
initial_elo = 1500
|
| 31 |
+
elo_scores = {model: initial_elo for model in models}
|
| 32 |
+
|
| 33 |
+
# Thiết lập tham số K-factor (độ nhạy của Elo)
|
| 34 |
+
K = 32
|
| 35 |
+
|
| 36 |
+
# Tạo ma trận so sánh cặp
|
| 37 |
+
n_models = len(models)
|
| 38 |
+
comparison_matrix = np.zeros((n_models, n_models))
|
| 39 |
+
|
| 40 |
+
# Tính toán số lần chiến thắng cho mỗi cặp
|
| 41 |
+
for i, model_i in enumerate(models):
|
| 42 |
+
for j, model_j in enumerate(models):
|
| 43 |
+
if i != j:
|
| 44 |
+
wins_i_vs_j = 0
|
| 45 |
+
total_comparisons = 0
|
| 46 |
+
|
| 47 |
+
# Duyệt qua tất cả các câu hỏi
|
| 48 |
+
for _, row in df.iterrows():
|
| 49 |
+
score_i = row[model_i]
|
| 50 |
+
score_j = row[model_j]
|
| 51 |
+
|
| 52 |
+
if score_i > score_j:
|
| 53 |
+
wins_i_vs_j += 1
|
| 54 |
+
elif score_i == score_j:
|
| 55 |
+
wins_i_vs_j += 0.5 # Hòa tính là 0.5 chiến thắng
|
| 56 |
+
total_comparisons += 1
|
| 57 |
+
comparison_matrix[i][j] = wins_i_vs_j
|
| 58 |
+
|
| 59 |
+
# Hàm tính expected win probability theo Bradley-Terry
|
| 60 |
+
def expected_probability(elo_i, elo_j):
|
| 61 |
+
return 1 / (1 + 10 ** ((elo_j - elo_i) / 400))
|
| 62 |
+
|
| 63 |
+
# Thuật toán ước lượng maximum likelihood cho Bradley-Terry
|
| 64 |
+
# Sử dụng phương pháp lặp đơn giản
|
| 65 |
+
max_iterations = 1000
|
| 66 |
+
tolerance = 1e-6
|
| 67 |
+
|
| 68 |
+
for iteration in range(max_iterations):
|
| 69 |
+
old_elo_scores = elo_scores.copy()
|
| 70 |
+
|
| 71 |
+
for i, model_i in enumerate(models):
|
| 72 |
+
expected_wins = 0
|
| 73 |
+
actual_wins = 0
|
| 74 |
+
|
| 75 |
+
for j, model_j in enumerate(models):
|
| 76 |
+
if i != j:
|
| 77 |
+
# Số chiến thắng thực tế
|
| 78 |
+
actual_wins += comparison_matrix[i][j]
|
| 79 |
+
|
| 80 |
+
# Xác suất chiến thắng kỳ vọng
|
| 81 |
+
prob = expected_probability(elo_scores[model_i], elo_scores[model_j])
|
| 82 |
+
expected_wins += prob
|
| 83 |
+
|
| 84 |
+
# Cập nhật Elo score
|
| 85 |
+
if expected_wins > 0:
|
| 86 |
+
elo_scores[model_i] += K * (actual_wins - expected_wins)
|
| 87 |
+
|
| 88 |
+
# Kiểm tra hội tụ
|
| 89 |
+
max_change = max(abs(elo_scores[m] - old_elo_scores[m]) for m in models)
|
| 90 |
+
if max_change < tolerance:
|
| 91 |
+
print(f"Hội tụ sau {iteration + 1} lần lặp")
|
| 92 |
+
break
|
| 93 |
+
|
| 94 |
+
# Hiển thị kết quả Elo scores
|
| 95 |
+
print("\nElo Scores:")
|
| 96 |
+
sorted_models = sorted(elo_scores.items(), key=lambda x: x[1], reverse=True)
|
| 97 |
+
for model, score in sorted_models:
|
| 98 |
+
print(f"{model}: {score:.2f}")
|
| 99 |
+
|
| 100 |
+
# 3. Thống kê Pairwise Comparison chi tiết
|
| 101 |
+
print("\n=== THỐNG KÊ PAIRWISE COMPARISON ===")
|
| 102 |
+
print(f"\n{'Model':<12} {'RAG':<6} {'GPT':<6} {'lexcentra':<10} {'ailuat':<8} {'law&press':<10}")
|
| 103 |
+
print("-" * 60)
|
| 104 |
+
|
| 105 |
+
for i, model_i in enumerate(models):
|
| 106 |
+
row = f"{model_i:<12}"
|
| 107 |
+
for j, model_j in enumerate(models):
|
| 108 |
+
if i == j:
|
| 109 |
+
row += f"{'-':<6}"
|
| 110 |
+
else:
|
| 111 |
+
row += f"{comparison_matrix[i][j]:<6.1f}"
|
| 112 |
+
print(row)
|
| 113 |
+
|
| 114 |
+
# 4. Tính toán thêm các chỉ số thống kê
|
| 115 |
+
print("\n=== CÁC CHỈ SỐ THỐNG KÊ BỔ SUNG ===")
|
| 116 |
+
|
| 117 |
+
# Tính tổng điểm trung bình
|
| 118 |
+
print("\nĐiểm trung bình:")
|
| 119 |
+
for model in models:
|
| 120 |
+
avg_score = df[model].mean()
|
| 121 |
+
print(f"{model}: {avg_score:.2f}")
|
| 122 |
+
|
| 123 |
+
# Tính tổng điểm
|
| 124 |
+
print("\nTổng điểm:")
|
| 125 |
+
for model in models:
|
| 126 |
+
total_score = df[model].sum()
|
| 127 |
+
print(f"{model}: {total_score}")
|
| 128 |
+
|
| 129 |
+
# Tính phần trăm chiến thắng trong các so sánh cặp
|
| 130 |
+
print("\nPhần trăm chiến thắng trong so sánh cặp:")
|
| 131 |
+
for model in models:
|
| 132 |
+
model_index = models.index(model)
|
| 133 |
+
wins = sum(comparison_matrix[model_index])
|
| 134 |
+
total_comparisons = (len(models) - 1) * len(df)
|
| 135 |
+
win_percentage = (wins / total_comparisons) * 100
|
| 136 |
+
print(f"{model}: {win_percentage:.2f}%")
|
| 137 |
+
|
| 138 |
+
# 5. Xuất kết quả ra CSV
|
| 139 |
+
results_df = pd.DataFrame({
|
| 140 |
+
'Model': models,
|
| 141 |
+
'Win_Rate(%)': [win_rates[m] for m in models],
|
| 142 |
+
'Elo_Score': [elo_scores[m] for m in models],
|
| 143 |
+
'Avg_Score': [df[m].mean() for m in models],
|
| 144 |
+
'Total_Score': [df[m].sum() for m in models]
|
| 145 |
+
})
|
| 146 |
+
|
| 147 |
+
# Sắp xếp theo Elo Score
|
| 148 |
+
results_df = results_df.sort_values('Elo_Score', ascending=False)
|
| 149 |
+
results_df.to_csv('model_comparison_results.csv', index=False)
|
| 150 |
+
|
| 151 |
+
print(f"\nKết quả đã được lưu vào file: model_comparison_results.csv")
|
model_comparison_results.csv
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Model,Win_Rate(%),Elo_Score,Avg_Score,Total_Score
|
| 2 |
+
RAG,89.60000000000001,6273564.000000055,4.48,224
|
| 3 |
+
GPT,42.8,2658521.562229258,2.14,107
|
| 4 |
+
ailuat,43.6,2657619.9600229254,2.18,109
|
| 5 |
+
law&press,39.2,2113909.6166749434,1.96,98
|
| 6 |
+
lexcentra,36.8,1906093.5376822255,1.84,92
|
questions_answers.csv
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Câu hỏi|RAG|GPT|lexcentra|ailuat|law&press
|
| 2 |
+
Năm 1972, Ô A kết hôn với bà B. Ô bà sinh được 3 con là M, N, C. Năm 1995, M kết hôn với E sinh được H & X. N lấy chồng sinh được con là K & D. Tháng 3/1997 Ô A chết để lại di chúc cho X & N. Qua quá trình điều tra thấy rằng Ô A lập di chúc không hợp pháp. Biết rằng tài sản của ông A là 200 triệu VNĐ. Tài sản chung của Ô bà là 100 triệu VNĐ. Bà B mai táng cho ông A hết 40 triệu. Hãy chia tài sản thừa kế.|Sau khi Ô A qua đời vào năm 1997 và di chúc của ông không hợp pháp, tài sản của ông A sẽ được chia theo pháp luật. Tài sản của ông A là 200 triệu VNĐ và tài sản chung của ông bà là 100 triệu VNĐ. Bà B đã chi 40 triệu VNĐ để mai táng ông A, và chi phí này sẽ được trừ vào tài sản của ông A. Với 4 người thừa kế hợp pháp (bà B và 3 con: M, N, C), tài sản sẽ được chia đều. Sau khi trừ chi phí mai táng 40 triệu VNĐ, tài sản của ông A còn lại là 160 triệu VNĐ, sẽ được chia đều cho 4 người, mỗi người nhận được 40 triệu VNĐ từ tài sản của ông A. Tài sản chung của ông bà là 100 triệu VNĐ sẽ được chia theo tỷ lệ: bà B sẽ nhận 50 triệu VNĐ, còn M, N, C sẽ chia phần còn lại (50 triệu VNĐ), mỗi người nhận 16.67 triệu VNĐ. Kết quả là: Bà B nhận tổng cộng 90 triệu VNĐ (40 triệu từ tài sản của ông A và 50 triệu từ tài sản chung). M, N, C mỗi người nhận tổng cộng 56.67 triệu VNĐ (40 triệu từ tài sản của ông A và 16.67 triệu từ tài sản chung).|Căn cứ theo các quy định của Bộ luật Dân sự 1995 (có hiệu lực tại thời điểm mở thừa kế năm 1997), do di chúc của ông A được xác định là không hợp pháp, toàn bộ di sản sẽ được chia theo pháp luật cho hàng thừa kế thứ nhất. Trước hết, tổng di sản của ông A được xác định bao gồm 200 triệu đồng tài sản riêng và 50 triệu đồng (một nửa khối tài sản chung với bà B), tổng cộng là 250 triệu đồng. Sau khi khấu trừ 40 triệu đồng chi phí mai táng do bà B chi trả, di sản thuần còn lại để phân chia là 210 triệu đồng. Theo Điều 679, những người thuộc hàng thừa kế thứ nhất của ông A bao gồm: vợ (bà B) và ba người con (M, N, C). Do các con của ông A là M và N vẫn còn sống tại thời điểm này, các cháu gồm X, H, K, D không thuộc diện thừa kế thế vị. Như vậy, di sản 210 triệu đồng sẽ được chia đều thành 4 suất bằng nhau; theo đó, bà B, anh M, chị N và anh C mỗi người sẽ nhận được 52,5 triệu đồng.|Dựa trên tình huống đã nêu, tôi sẽ phân tích từng vấn đề pháp lý một cách chi tiết: 1. XÁC ĐỊNH DI SẢN CỦA ÔNG A Kết luận: Di sản của ông A là 250 triệu VNĐ. Theo Điều 637 của Bộ luật Dân sự năm 1995, di sản bao gồm tài sản riêng của người chết và phần tài sản của người chết trong tài sản chung với người khác. Cụ thể: Tài sản riêng của ông A: 200 triệu VNĐ Phần tài sản của ông A trong khối tài sản chung: Từ 100 triệu VNĐ tài sản chung vợ chồng, phần của ông A là 50 triệu VNĐ (chia đôi theo nguyên tắc chung) Tổng di sản: 200 + 50 = 250 triệu VNĐ Chi phí mai táng 40 triệu VNĐ mà bà B đã chi sẽ được trừ vào di sản, còn lại 210 triệu VNĐ để phân chia thừa kế. 2. NHỮNG NGƯỜI ĐƯỢC HƯỞNG THỪA KẾ THEO PHÁP LUẬT Kết luận: Có 4 người thừa kế hàng thứ nhất là bà B, M, N, và C. Do di chúc không hợp pháp, theo Điều 678, điểm b của Bộ luật Dân sự năm 1995, thừa kế theo pháp luật được áp dụng. Theo Điều 679 của Bộ luật Dân sự năm 1995, hàng thừa kế thứ nhất gồm: vợ, chồng, cha đẻ, mẹ đẻ, cha nuôi, mẹ nuôi, con đẻ, con nuôi của người chết. Trong trường hợp này: Bà B: vợ của ông A M, N, C: các con của ông A Lưu ý quan trọng: X và H (con của M), K và D (con của N) là cháu của ông A, thuộc hàng thừa kế thứ hai. Tuy nhiên, do cha mẹ của chúng (M, N) vẫn còn sống và là người thừa kế hàng thứ nhất, nên các cháu này không được hưởng thừa kế theo quy định tại Điều 679, khoản 3 của Bộ luật Dân sự năm 1995. 3. PHÂN CHIA DI SẢN THEO PHÁP LUẬT Kết luận: Mỗi người thừa kế được hưởng 52,5 triệu VNĐ. Theo Điều 679, khoản 2 của Bộ luật Dân sự năm 1995, những người thừa kế cùng hàng được hưởng phần di sản bằng nhau. Cách tính: Di sản còn lại sau trừ chi phí mai táng: 210 triệu VNĐ Số người thừa kế hàng thứ nhất: 4 người (bà B, M, N, C) Phần di sản mỗi người: 210 ÷ 4 = 52,5 triệu VNĐ Phân bổ cụ thể: Bà B (vợ): 52,5 triệu VNĐ M (con): 52,5 triệu VNĐ N (con): 52,5 triệu VNĐ C (con): 52,5 triệu VNĐ KẾT LUẬN TỔNG THỂ Mặc dù di chúc của ông A chỉ định X và N làm người thừa kế, nhưng do di chúc không hợp pháp nên không có hiệu lực. Di sản 210 triệu VNĐ (sau khi trừ chi phí mai táng) được chia đều cho 4 người thừa kế hàng thứ nhất theo pháp luật, mỗi người nhận 52,5 triệu VNĐ. Khuyến nghị thực tiễn: Gia đình nên thống nhất phương án phân chia và lập biên bản thỏa thuận chia di sản để tránh tranh chấp sau này. Nếu có bất đồng, có thể yêu cầu tòa án giải quyết theo quy định tại Điều 688 của Bộ luật Dân sự năm 1995. Trên đây là kết quả tra cứu của LEXcentra để bạn tham khảo. Xin lưu ý rằng nội dung này không phải là tư vấn pháp lý, không thay thế tư vấn của luật sư.|Để chia tài sản thừa kế trong trường hợp ông A chết năm 1997, để lại di chúc cho X và N nhưng di chúc không hợp pháp, cần áp dụng quy định về thừa kế theo pháp luật. Dưới đây là các bước xác định và chia tài sản cụ thể: 1. Xác định di sản thừa kế Tài sản riêng của ông A: 200 triệu đồng Tài sản chung của ông A và bà B: 100 triệu đồng Theo quy định tại Điều 612 Bộ luật Dân sự, số 91/2015/QH13 có hiệu lực từ ngày 01/01/2017, di sản bao gồm tài sản riêng của người chết và phần tài sản của người chết trong tài sản chung với người khác. Phần tài sản của ông A trong tài sản chung với bà B là 1/2 của 100 triệu = 50 triệu đồng. Tổng di sản của ông A để lại: 200 triệu (tài sản riêng) + 50 triệu (phần trong tài sản chung) = 250 triệu đồng. 2. Trừ chi phí mai táng Theo Điều 658 Bộ luật Dân sự, chi phí hợp lý cho việc mai táng được trừ vào di sản trước khi chia thừa kế. Chi phí mai táng: 40 triệu đồng Di sản thực tế để chia: 250 triệu - 40 triệu = 210 triệu đồng 3. Xác định hàng thừa kế Vì di chúc không hợp pháp nên chia theo pháp luật. Căn cứ vào Điều 651 Bộ luật Dân sự: Hàng thừa kế thứ nhất: Vợ (bà B), các con (M, N, C) 4. Chia di sản thừa kế Những người ở hàng thừa kế thứ nhất được hưởng phần di sản bằng nhau (khoản 2 Điều 651). Số người hưởng thừa kế: 4 người (bà B, M, N, C) Mỗi người được hưởng: 210 triệu / 4 = 52,5 triệu đồng 5. Tổng hợp tài sản của từng người Bà B: Ngoài phần thừa kế, bà B còn sở hữu 1/2 tài sản chung (50 triệu đồng). Tổng tài sản bà B nhận được: 52,5 triệu (thừa kế) + 50 triệu (tài sản chung) = 102,5 triệu đồng M, N, C: Mỗi người được hưởng 52,5 triệu đồng từ di sản thừa kế. 6. Kết luận chia tài sản Người được hưởng Số tiền được nhận (triệu đồng) Ghi chú Bà B 102,5 52,5 triệu thừa kế + 50 triệu tài sản chung M 52,5 Thừa kế N 52,5 Thừa kế C 52,5 Thừa kế Căn cứ pháp lý Điều 612: Di sản bao gồm tài sản riêng của người chết, phần tài sản của người chết trong tài sản chung với người khác. Điều 651: Người thừa kế theo pháp luật. Điều 658: Thứ tự ưu tiên thanh toán (chi phí mai táng). Bộ luật Dân sự, số 91/2015/QH13 có hiệu lực từ ngày 01/01/2017. Nếu bạn cần hướng dẫn về thủ tục khai nhận di sản hoặc các vấn đề liên quan đến quyền sử dụng đất, nhà ở, vui lòng cung cấp thêm thông tin để được hỗ trợ chi tiết hơn.|Dựa trên các án lệ liên quan, việc di chúc của Ô A lập không hợp pháp có thể ảnh hưởng đến phân chia tài sản thừa kế theo quy định của pháp luật. Theo đó, tài sản của Ô A là 200 triệu VNĐ, và tài sản chung của Ô bà là 100 triệu VNĐ. Bà B đã chi 40 triệu để mai táng cho Ô A. Trong trường hợp này, do di chúc không hợp pháp, tài sản của Ô A sẽ được chia theo quy định của pháp luật về hàng thừa kế. Tài sản của Ô A sẽ được chia đều cho các hàng thừa kế theo pháp luật, gồm: Bà B (mẹ), Các con M, N, C cùng các cháu H, X, K, D được sinh ra từ các con của Ô A. Cụ thể: Ô A có các con M, N, C. Trong đó, N có các cháu H và X; N kết hôn với ông N; M kết hôn với ông E, có các con K và D. Tài sản chung của Ô A là 100 triệu VNĐ, phần của mỗi con, cháu sẽ tính theo tỷ lệ phần trăm thừa kế hợp pháp. Ngoài ra, phần tài sản của Ô A còn bao gồm nội dung tài sản riêng trị giá 200 triệu VNĐ của Ô A, sẽ được chia theo quy định của pháp luật. Về phần tài sản của bà B (mẹ của Ô A), do đã góp 40 triệu để mai táng, phần tài sản này thường được xem như nghĩa vụ mai táng và sẽ được trừ vào phần tài sản chung. Tổng thể, việc phân chia sẽ dựa trên nguyên tắc thừa kế theo pháp luật, lấy giá trị tài sản của Ô A và tài sản chung của bà B để xác định phần cụ thể của từng người thừa kế. Nếu bạn cần một phân tích chi tiết hơn hoặc bản dự thảo phân chia cụ thể, tôi có thể chuẩn bị giúp đỡ.
|
| 3 |
+
|
| 4 |
+
Năm 2000, Ông A kết hôn với bà B. Họ có 2 con chung. Tài sản chung vợ chồng là 500 triệu VNĐ, tài sản riêng ông A 100 triệu, bà B 150 triệu. Năm 2025, họ ly hôn thuận tình, bà B nuôi cả 2 con. Hãy phân chia tài sản theo pháp luật.|Sau khi ly hôn, tài sản chung 500 triệu được chia đôi, mỗi người 250 triệu. Tài sản riêng giữ nguyên. Bà B có thể yêu cầu hỗ trợ nuôi con từ ông A. Tổng: Ông A nhận 250 triệu (chung) + 100 triệu (riêng) = 350 triệu. Bà B: 250 + 150 = 400 triệu, cộng thêm nghĩa vụ nuôi con.|Căn cứ Luật Hôn nhân và Gia đình 2014, tài sản chung chia theo thỏa thuận, nếu không thì tòa án chia đôi có tính đến công sức đóng góp, nhu cầu nuôi con. Giả sử chia đều: Mỗi bên 250 triệu từ chung. Tài sản riêng giữ nguyên. Bà B ưu tiên vì nuôi con.|Dựa trên tình huống: 1. XÁC ĐỊNH TÀI SẢN: Chung 500 triệu, riêng ông A 100 triệu, bà B 150 triệu (Điều 33 Luật HN&GĐ 2014). 2. PHÂN CHIA: Ưu tiên thỏa thuận, nếu không chia đôi tính công sức (Điều 59). Giả sử chia đều: Mỗi 250 triệu chung. Bà B có lợi vì nuôi con. KẾT LUẬN: Ông A 350 triệu, bà B 400 triệu. Không thay tư vấn luật sư.|Áp dụng Luật HN&GĐ 2014: Tài sản chung chia đôi (250 triệu mỗi), riêng giữ nguyên. Bà B nuôi con nên có thể yêu cầu ông A hỗ trợ (Điều 81). Tổng ông A: 350 triệu, bà B: 400 triệu.|Dựa trên án lệ, phân chia tài sản ly hôn thường chia đều chung, ưu tiên bên nuôi con. Tài sản chung 500 triệu chia 250 mỗi, riêng giữ. Bà B có thể nhận thêm nếu chứng minh công sức nhiều hơn.
|
| 5 |
+
Năm 2018, Ông X ký hợp đồng mua nhà từ bà Y giá 1 tỷ VNĐ, đã trả 500 triệu đặt cọc. Bà Y không giao nhà và từ chối hoàn tiền. Ông X muốn đòi lại tiền và bồi thường thiệt hại. Theo Bộ luật Dân sự Việt Nam?|Ông X có quyền hủy hợp đồng, đòi 500 triệu + lãi + thiệt hại. Bà Y vi phạm nghĩa vụ giao tài sản. Tổng đòi khoảng 500 triệu + lãi 10%/năm.|Căn cứ Điều 428 BLDS 2015, bên vi phạm phải bồi thường. Ông X có quyền yêu cầu hoàn tiền, lãi (Điều 468), và thiệt hại. Khởi kiện tại tòa dân sự.|Phân tích: 1. HỢP ĐỒNG: Hợp lệ theo Điều 117 BLDS 2015. 2. VI PHẠM: Bà Y không giao, vi phạm Điều 435. 3. QUYỀN: Ông X hủy hợp đồng (Điều 428), đòi tiền + lãi + thiệt hại. KẾT LUẬN: Khởi kiện đòi 500 triệu + lãi. LEXcentra không thay tư vấn.|Áp dụng BLDS 2015: Hủy hợp đồng (Điều 428), đòi đặt cọc + bồi thường (Điều 418). Thủ tục khởi kiện theo BLTTDS 2015.|Theo án lệ tranh chấp hợp đồng mua bán, tòa thường buộc bên vi phạm hoàn tiền + lãi, bồi thường nếu chứng minh thiệt hại. Ông X có thể đòi 500 triệu + lãi.
|
| 6 |
+
Năm 2024, Anh Z trộm cắp xe máy trị giá 40 triệu VNĐ của ông W, bị bắt quả tang. Anh Z chưa có tiền án. Mức án cho tội trộm cắp tài sản?|Phạt tù từ 6 tháng đến 3 năm vì giá trị 40 triệu. Có thể giảm nhẹ nếu bồi thường.|Căn cứ Điều 173 BLHS 2015 (sửa 2017), khung 1: Tù từ 6 tháng đến 3 năm cho giá trị từ 2-50 triệu. Không tiền án nên có thể probation.|Dựa trên: 1. TỘI DANH: Trộm cắp tài sản (Điều 173). 2. KHUNG: Giá trị 40 triệu thuộc khoản 1, tù 6 tháng-3 năm. 3. TÌNH TIẾT: Bị bắt quả tang, chưa tiền án giảm nhẹ. KẾT LUẬN: Có thể tù treo nếu bồi thường.|Áp dụng BLHS 2015: Khung 1 Điều 173, tù 6 tháng-3 năm. Giảm nhẹ theo Điều 51.|Dựa trên án lệ, tội trộm cắp 40 triệu thường tù 1-2 năm, có thể treo nếu hoàn trả tài sản.
|
| 7 |
+
Năm 2022, Bà M cho ông N vay 200 triệu VNĐ có giấy vay nợ, lãi 1%/tháng, kỳ hạn 1 năm. Ông N không trả. Bà M muốn thu hồi nợ. Thủ tục và quyền lợi?|Bà M khởi kiện tại tòa, đòi 200 triệu + lãi. Thời hiệu 3 năm.|Căn cứ Điều 428 BLDS 2015, bên vay phải trả nợ. Khởi kiện theo BLTTDS 2015, thời hiệu 3 năm (Điều 429).|Phân tích: 1. HỢP ĐỒNG VAY: Hợp lệ (Điều 463 BLDS). 2. VI PHẠM: Không trả, đòi gốc + lãi. 3. THỦ TỤC: Khởi kiện tòa quận/huyện. KẾT LUẬN: Đòi 200 triệu + lãi, thi hành án nếu thắng.|Áp dụng BLDS 2015: Đòi nợ qua tòa (Điều 190 BLTTDS). Lãi không vượt 20%/năm (Điều 468).|Theo án lệ thu hồi nợ, tòa buộc trả gốc + lãi hợp pháp, có thể phong tỏa tài sản nếu cần.
|
| 8 |
+
Năm 2023, Trong cãi vã, ông P đánh ông Q gây thương tích 25%. Ông P bị truy tố tội cố ý gây thương tích. Mức phạt có thể là gì nếu ông P chưa tiền án?|Phạt tù từ 6 tháng đến 3 năm, có thể giảm nếu bồi thường.|Căn cứ Điều 134 BLHS 2015, khung 1: Tù 6 tháng-3 năm cho tỷ lệ 11-30%. Giảm nhẹ theo Điều 51.|Dựa trên: 1. TỘI DANH: Cố ý gây thương tích (Điều 134). 2. KHUNG: Tỷ lệ 25% thuộc khoản 1, tù 6 tháng-3 năm. 3. TÌNH TIẾT: Chưa tiền án, giảm nhẹ. KẾT LUẬN: Có thể tù treo.|Áp dụng BLHS 2015: Khung 1 Điều 134, tù 6 tháng-3 năm. Bồi thường dân sự kèm.|Dựa trên án lệ, gây thương tích 25% thường tù 1-2 năm, treo nếu hòa giải và bồi thường.
|
| 9 |
+
Năm 2015, Ông K kết hôn với bà L. Họ có 1 con chung. Tài sản chung là 300 triệu VNĐ, tài sản riêng ông K 80 triệu, bà L 120 triệu. Năm 2024, ly hôn do ông K ngoại tình, bà L nuôi con. Phân chia tài sản?|Sau ly hôn, tài sản chung 300 triệu chia đôi, nhưng tòa có thể điều chỉnh vì lỗi ông K và bà L nuôi con, giả sử bà L nhận 180 triệu, ông K 120 triệu. Tài sản riêng giữ nguyên. Tổng: Ông K 200 triệu, bà L 300 triệu + cấp dưỡng.|Căn cứ Luật HN&GĐ 2014, tài sản chung chia theo công sức, lỗi vi phạm, nhu cầu nuôi con (Điều 95). Có thể bà L nhận nhiều hơn do ông K lỗi. Giả sử chia 60-40: Bà L 180 triệu chung, ông K 120 triệu.|Dựa trên: 1. TÀI SẢN: Chung 300 triệu, riêng giữ (Điều 33). 2. PHÂN CHIA: Xem xét lỗi, nuôi con (Điều 95). KẾT LUẬN: Bà L có lợi, khoảng 180 triệu chung + 120 riêng = 300 triệu. Ông K 120 + 80 = 200 triệu. Không thay tư vấn.|Áp dụng Luật HN&GĐ: Chia chung có tính lỗi (Điều 7), bà L ưu tiên nuôi con (Điều 81). Giả sử 60-40: Bà L 180 + 120 = 300, ông K 120 + 80 = 200.|Theo án lệ ly hôn do ngoại tình, tòa thường chia bất lợi cho bên lỗi, ưu tiên bên nuôi con. Tài sản chung chia 60-40, riêng giữ.
|
| 10 |
+
Năm 2020, Công ty M ký hợp đồng cung cấp hàng hóa cho công ty N trị giá 500 triệu VNĐ, đã giao 300 triệu hàng. Công ty N không thanh toán. Công ty M muốn chấm dứt hợp đồng và đòi bồi thường.|Công ty M có quyền chấm dứt, đòi 300 triệu + lãi + thiệt hại. Công ty N vi phạm nghĩa vụ thanh toán.|Căn cứ Điều 428 BLDS 2015, chấm dứt hợp đồng do vi phạm cơ bản. Đòi bồi thường (Điều 360). Khởi kiện tòa kinh tế.|Phân tích: 1. HỢP ĐỒNG: Hợp lệ (Điều 401). 2. VI PHẠM: Không trả, chấm dứt (Điều 428). 3. QUYỀN: Đòi tiền + lãi + thiệt hại. KẾT LUẬN: Khởi kiện đòi 300 triệu + lãi.|Áp dụng BLDS 2015: Chấm dứt hợp đồng (Điều 428), bồi thường (Điều 361). Thủ tục BLTTDS.|Theo án lệ tranh chấp hợp đồng, tòa buộc thanh toán + lãi, bồi thường nếu chứng minh thiệt hại thực tế.
|
| 11 |
+
Năm 2023, Anh O cố ý đánh anh P gây thương tích 15%, có sử dụng hung khí. Anh O có tiền án về ma túy. Mức án cho tội cố ý gây thương tích?|Phạt tù từ 2-6 năm do sử dụng hung khí và có tiền án.|Căn cứ Điều 134 BLHS 2015, khung 2: Tù 2-6 năm nếu dùng hung khí nguy hiểm. Tăng nặng do tiền án (Điều 52).|Dựa trên: 1. TỘI DANH: Cố ý gây thương tích (Điều 134 khoản 2). 2. KHUNG: 15% với hung khí, tù 2-6 năm. 3. TÌNH TIẾT: Tiền án tăng nặng. KẾT LUẬN: Khoảng 3-4 năm tù.|Áp dụng BLHS: Khung 2 Điều 134, tù 2-6 năm. Tăng nặng theo Điều 52.|Dựa trên án lệ, gây thương tích với hung khí và tiền án thường tù 3-5 năm, ít giảm nhẹ.
|
| 12 |
+
Năm 2019, Bà Q cho bà R vay 150 triệu VNĐ không lãi, có giấy biên nhận, kỳ hạn 2 năm. Bà R mất tích, không trả nợ. Bà Q muốn đòi từ người thừa kế của bà R (giả sử bà R chết). Thủ tục?|Bà Q đòi nợ từ di sản bà R, khởi kiện người thừa kế.|Căn cứ Điều 463 BLDS 2015, hợp đồng vay hợp lệ. Nợ là nghĩa vụ di sản (Điều 615). Khởi kiện theo BLTTDS.|Phân tích: 1. NỢ VAY: Hợp lệ. 2. THỪA KẾ: Nợ trừ vào di sản (Điều 658). 3. THỦ TỤC: Khởi kiện tòa, đòi từ thừa kế. KẾT LUẬN: Đòi 150 triệu từ di sản.|Áp dụng BLDS: Nợ di sản (Điều 615), thời hiệu 3 năm (Điều 429).|Theo án lệ đòi nợ từ di sản, tòa buộc thừa kế trả nợ sau trừ chi phí ưu tiên.
|
requirements.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Flask>=2.3.0
|
| 2 |
+
pandas>=2.0.0
|
| 3 |
+
numpy>=1.24.0
|
| 4 |
+
|
templates/index.html
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="vi">
|
| 3 |
+
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8">
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 7 |
+
<title>Khảo Sát Câu Trả Lời Các Mô Hình</title>
|
| 8 |
+
<!-- Bootstrap CSS -->
|
| 9 |
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
| 10 |
+
<!-- FontAwesome for Stars -->
|
| 11 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
| 12 |
+
<style>
|
| 13 |
+
body {
|
| 14 |
+
background-color: #f8f9fa;
|
| 15 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
.container {
|
| 19 |
+
max-width: 1200px;
|
| 20 |
+
margin-top: 30px;
|
| 21 |
+
background: white;
|
| 22 |
+
padding: 30px;
|
| 23 |
+
border-radius: 15px;
|
| 24 |
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
h1 {
|
| 28 |
+
color: #2c3e50;
|
| 29 |
+
text-align: center;
|
| 30 |
+
margin-bottom: 30px;
|
| 31 |
+
font-weight: 700;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
.nav-pills .nav-link {
|
| 35 |
+
border-radius: 50px;
|
| 36 |
+
margin: 0 5px;
|
| 37 |
+
color: #6c757d;
|
| 38 |
+
font-weight: 500;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
.nav-pills .nav-link.active {
|
| 42 |
+
background-color: #0d6efd;
|
| 43 |
+
color: white;
|
| 44 |
+
box-shadow: 0 2px 4px rgba(13, 110, 253, 0.4);
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.question-title {
|
| 48 |
+
font-size: 1.5rem;
|
| 49 |
+
color: #1a1a1a;
|
| 50 |
+
margin-bottom: 20px;
|
| 51 |
+
padding-bottom: 10px;
|
| 52 |
+
border-bottom: 2px solid #eee;
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
.model-card {
|
| 56 |
+
background: #fff;
|
| 57 |
+
border: 1px solid #e9ecef;
|
| 58 |
+
border-radius: 10px;
|
| 59 |
+
padding: 20px;
|
| 60 |
+
height: 100%;
|
| 61 |
+
transition: transform 0.2s;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
.model-card:hover {
|
| 65 |
+
transform: translateY(-5px);
|
| 66 |
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
.model-name {
|
| 70 |
+
font-size: 1.1rem;
|
| 71 |
+
font-weight: 700;
|
| 72 |
+
color: #0d6efd;
|
| 73 |
+
margin-bottom: 10px;
|
| 74 |
+
text-transform: uppercase;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.answer-text {
|
| 78 |
+
color: #495057;
|
| 79 |
+
font-size: 0.95rem;
|
| 80 |
+
line-height: 1.6;
|
| 81 |
+
min-height: 100px;
|
| 82 |
+
margin-bottom: 15px;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.star-rating {
|
| 86 |
+
direction: rtl;
|
| 87 |
+
display: inline-flex;
|
| 88 |
+
font-size: 1.5rem;
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
.star-rating input {
|
| 92 |
+
display: none;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
.star-rating label {
|
| 96 |
+
color: #ddd;
|
| 97 |
+
cursor: pointer;
|
| 98 |
+
padding: 0 2px;
|
| 99 |
+
transition: color 0.2s;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.star-rating input:checked~label,
|
| 103 |
+
.star-rating label:hover,
|
| 104 |
+
.star-rating label:hover~label {
|
| 105 |
+
color: #ffc107;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
.submit-btn-container {
|
| 109 |
+
text-align: center;
|
| 110 |
+
margin-top: 40px;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
.btn-submit {
|
| 114 |
+
padding: 10px 40px;
|
| 115 |
+
font-size: 1.2rem;
|
| 116 |
+
border-radius: 50px;
|
| 117 |
+
font-weight: 600;
|
| 118 |
+
}
|
| 119 |
+
</style>
|
| 120 |
+
</head>
|
| 121 |
+
|
| 122 |
+
<body>
|
| 123 |
+
<div class="container">
|
| 124 |
+
<h1><i class="fas fa-poll-h me-2"></i>Khảo Sát Chất Lượng Mô Hình AI</h1>
|
| 125 |
+
|
| 126 |
+
<form action="/vote" method="post">
|
| 127 |
+
<!-- Navigation Tabs -->
|
| 128 |
+
<ul class="nav nav-pills mb-4 justify-content-center" id="pills-tab" role="tablist">
|
| 129 |
+
{% for i in range(questions|length) %}
|
| 130 |
+
<li class="nav-item" role="presentation">
|
| 131 |
+
<button class="nav-link {% if i == 0 %}active{% endif %}" id="pills-q{{ i+1 }}-tab"
|
| 132 |
+
data-bs-toggle="pill" data-bs-target="#pills-q{{ i+1 }}" type="button" role="tab"
|
| 133 |
+
aria-controls="pills-q{{ i+1 }}" aria-selected="{% if i == 0 %}true{% else %}false{% endif %}">
|
| 134 |
+
Câu {{ i+1 }}
|
| 135 |
+
</button>
|
| 136 |
+
</li>
|
| 137 |
+
{% endfor %}
|
| 138 |
+
</ul>
|
| 139 |
+
|
| 140 |
+
<!-- Tab Content -->
|
| 141 |
+
<div class="tab-content" id="pills-tabContent">
|
| 142 |
+
{% for row in questions %}
|
| 143 |
+
{% set outer_loop = loop %}
|
| 144 |
+
<div class="tab-pane fade {% if outer_loop.index == 1 %}show active{% endif %}"
|
| 145 |
+
id="pills-q{{ outer_loop.index }}" role="tabpanel"
|
| 146 |
+
aria-labelledby="pills-q{{ outer_loop.index }}-tab">
|
| 147 |
+
<h3 class="question-title">{{ row['Câu hỏi'] }}</h3>
|
| 148 |
+
|
| 149 |
+
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4 justify-content-center">
|
| 150 |
+
{% for model in ['RAG', 'GPT', 'lexcentra', 'ailuat', 'law&press'] %}
|
| 151 |
+
<div class="col">
|
| 152 |
+
<div class="model-card">
|
| 153 |
+
<div class="model-name">{{ model }}</div>
|
| 154 |
+
<div class="answer-text">
|
| 155 |
+
{{ row[model] }}
|
| 156 |
+
</div>
|
| 157 |
+
<div class="d-flex align-items-center justify-content-between mt-3 pt-3 border-top">
|
| 158 |
+
<span class="small text-muted">Đánh giá:</span>
|
| 159 |
+
<div class="star-rating">
|
| 160 |
+
{% for star in range(5, 0, -1) %}
|
| 161 |
+
<input type="radio" id="star{{ star }}-{{ model }}-{{ row['Câu hỏi'] }}"
|
| 162 |
+
name="{{ model }}_{{ row['Câu hỏi'] }}" value="{{ star }}" {% if star==5
|
| 163 |
+
%}checked{% endif %}>
|
| 164 |
+
<label for="star{{ star }}-{{ model }}-{{ row['Câu hỏi'] }}"
|
| 165 |
+
title="{{ star }} sao"><i class="fas fa-star"></i></label>
|
| 166 |
+
{% endfor %}
|
| 167 |
+
</div>
|
| 168 |
+
</div>
|
| 169 |
+
</div>
|
| 170 |
+
</div>
|
| 171 |
+
{% endfor %}
|
| 172 |
+
</div>
|
| 173 |
+
</div>
|
| 174 |
+
{% endfor %}
|
| 175 |
+
</div>
|
| 176 |
+
|
| 177 |
+
<div class="submit-btn-container">
|
| 178 |
+
<button type="submit" class="btn btn-primary btn-submit shadow">
|
| 179 |
+
<i class="fas fa-paper-plane me-2"></i>Gửi Phiếu Bầu
|
| 180 |
+
</button>
|
| 181 |
+
</div>
|
| 182 |
+
</form>
|
| 183 |
+
</div>
|
| 184 |
+
|
| 185 |
+
<!-- Bootstrap JS -->
|
| 186 |
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
| 187 |
+
</body>
|
| 188 |
+
|
| 189 |
+
</html>
|
templates/thank_you.html
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="vi">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Cảm ơn</title>
|
| 7 |
+
</head>
|
| 8 |
+
<body>
|
| 9 |
+
<h1>Cảm ơn bạn đã tham gia bỏ phiếu!</h1>
|
| 10 |
+
<a href="/">Tham gia khảo sát khác</a>
|
| 11 |
+
</body>
|
| 12 |
+
</html>
|
votes_results.csv
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
question,RAG,GPT,lexcentra,ailuat,law&press
|
| 2 |
+
0,4,3,2,3,1
|
| 3 |
+
1,5,3,2,3,3
|
| 4 |
+
2,4,3,1,2,1
|
| 5 |
+
3,4,3,1,3,3
|
| 6 |
+
4,4,1,2,2,3
|
| 7 |
+
5,5,3,2,2,1
|
| 8 |
+
6,4,2,1,3,1
|
| 9 |
+
7,4,1,1,2,3
|
| 10 |
+
8,4,2,1,3,2
|
| 11 |
+
9,5,2,3,3,1
|
| 12 |
+
0,5,3,2,2,2
|
| 13 |
+
1,5,3,2,2,3
|
| 14 |
+
2,5,1,2,3,1
|
| 15 |
+
3,5,3,2,3,2
|
| 16 |
+
4,4,3,1,2,1
|
| 17 |
+
5,5,2,3,3,1
|
| 18 |
+
6,4,1,2,1,1
|
| 19 |
+
7,5,2,2,2,1
|
| 20 |
+
8,5,2,2,1,3
|
| 21 |
+
9,5,2,2,1,1
|
| 22 |
+
0,4,3,2,3,1
|
| 23 |
+
1,4,3,1,2,1
|
| 24 |
+
2,4,1,3,3,2
|
| 25 |
+
3,4,3,1,3,3
|
| 26 |
+
4,5,3,2,1,3
|
| 27 |
+
5,4,1,1,3,2
|
| 28 |
+
6,5,3,3,1,3
|
| 29 |
+
7,5,1,3,3,3
|
| 30 |
+
8,5,2,2,2,1
|
| 31 |
+
9,4,3,1,3,3
|
| 32 |
+
0,4,1,3,2,1
|
| 33 |
+
1,5,2,3,2,1
|
| 34 |
+
2,5,1,3,2,3
|
| 35 |
+
3,5,3,2,3,2
|
| 36 |
+
4,4,3,2,2,1
|
| 37 |
+
5,4,1,2,3,1
|
| 38 |
+
6,4,3,1,1,1
|
| 39 |
+
7,5,3,2,3,3
|
| 40 |
+
8,4,1,1,2,3
|
| 41 |
+
9,4,1,1,1,2
|
| 42 |
+
0,5,3,2,2,2
|
| 43 |
+
1,4,3,3,3,3
|
| 44 |
+
2,4,2,1,1,3
|
| 45 |
+
3,5,1,1,1,3
|
| 46 |
+
4,4,1,1,1,3
|
| 47 |
+
5,4,2,1,3,1
|
| 48 |
+
6,4,1,3,2,3
|
| 49 |
+
7,5,2,1,2,2
|
| 50 |
+
8,5,2,2,1,1
|
| 51 |
+
9,5,3,2,2,2
|