Windows-GPU-UNLOCK
RTX3090 UEFI 포트, 한국어 무리셋 윈도우 부팅 가이드, 검증된 소스와 벤치마크 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Hỏi–đáp tài liệu PDF bằng tiếng Việt theo kiến trúc RAG có suy luận (reasoning): mỗi câu trả lời đi kèm bằng chứng trích nguyên văn, các bước suy luận, trích dẫn [n] về đúng đoạn / trang, và được kiểm chứng tự động với tài liệu.
Project có hai cách dùng:
Bản web (app.py) | Bản dòng lệnh (chat.py) | |
|---|---|---|
| Giao diện | Chat kiểu ChatGPT, upload PDF ngay trong khung chat | Terminal |
| Tài liệu | PDF người dùng tải lên, riêng cho từng cuộc trò chuyện | Thư mục dataset/ (đề thi PROCON) |
| Trả lời (LLM) | Groq (nhiều model dự phòng cho nhau) | Groq |
| Tìm kiếm | Từ khoá BM25 (+ embedding bge-m3 qua Cloudflare nếu cấu hình) | BAAI/bge-m3 chạy trên máy + reranker bge-reranker-v2-m3 |
| Lưu trữ | dataset_web/ trên máy, Vercel Blob khi deploy | FAISS index trong RAG_system/faiss_index/ |
| Deploy | Vercel | Chạy trên máy |
Cả hai dùng chung lõi suy luận trong RAG_system/RAG/reasoning.py:
Câu hỏi
│ 1. Phân tích câu hỏi: phân loại, viết lại câu hỏi nối tiếp, tách truy vấn con
▼
│ 2. Tìm các đoạn liên quan (web: BM25 + embedding; dòng lệnh: FAISS + rerank)
▼
│ 3. Suy luận (Groq, reasoning_effort): bằng chứng nguyên văn -> các bước suy luận -> kết luận có trích dẫn [n]
▼
│ 4. Kiểm chứng: trích dẫn có thật sự nằm trong tài liệu không -> độ tin cậy + cảnh báo
▼
Câu trả lời
[n] trong câu trả lời hoặc chip nguồn bên dưới sẽ cuộn tới đoạn tương ứng.Nút chọn phương pháp nằm cạnh ô nhập câu hỏi. Mặc định là "So sánh cả 4": mỗi câu hỏi chạy lần lượt cả 4 phương pháp, rồi hiện 4 câu trả lời cạnh nhau để đánh giá.
| Phương pháp | Tìm đoạn tài liệu | Trả lời | Số lần gọi LLM | |
|---|---|---|---|---|
| 01 | LLM thuần, không RAG | Không tìm | LLM trả lời bằng hiểu biết sẵn có | 1 |
| 02 | LLM + RAG thuần | WEB_TOP_N đoạn có embedding gần nhất với nguyên văn câu hỏi (cosine) | Đưa thẳng các đoạn cho LLM | 1 |
| 03 | LLM + RAG + Reranking | Như 02 nhưng lấy WEB_RERANK_CANDIDATES đoạn ứng viên, rồi LLM đọc và chấm 0–10 từng đoạn, giữ WEB_TOP_N đoạn điểm cao nhất | Như 02 | 2 |
| 04 | LLM + RAG + Reasoning | LLM tách câu hỏi thành 2–4 truy vấn, tìm theo từng truy vấn bằng cả từ khoá (BM25) và ngữ nghĩa rồi gộp (RRF) | Suy luận từng bước, trích nguyên văn làm bằng chứng, rồi kiểm chứng trích dẫn với tài liệu | 2 |
openai/gpt-oss-20b, nhanh hơn gpt-oss-120b; đổi bằng COMPARE_MODEL). Tên model hiện ở đầu khung so sánh.gpt-oss-20b. Nếu có nhiều key Groq, app dùng key khác (vẫn cùng model) trước. Khi chạm giới hạn, app chờ Groq cấp lại hạn mức (theo header retry-after, tối đa COMPARE_MAX_WAIT giây mỗi lần) thay vì đổi model. Thời gian chờ không cộng vào thời gian phản hồi của từng phương pháp, nên so sánh tốc độ vẫn công bằng; tổng thời gian chờ chỉ hiện ở đầu khung so sánh.gpt-oss-20b (200.000 token, bằng gpt-oss-120b) đủ cho khoảng 10–15 câu hỏi so sánh với mỗi key. Hết hạn mức ngày thì phương pháp đó báo lỗi; khi đó có thể hỏi riêng từng phương pháp (vẫn tự chuyển model) hoặc đặt COMPARE_MODEL sang model khác.bge-reranker-v2-m3.WEB_REASONING_RERANK=1 nếu muốn 04 gồm cả reranking.py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
Copy-Item .env.example .env # rồi điền GROQ_API_KEY
uvicorn app:app --reload
Mở http://127.0.0.1:8000. File upload được lưu trong thư mục dataset_web/.
vercel.json khai báo "framework": "fastapi", nên Vercel deploy app.py như một app FastAPI duy nhất và cài requirements.txt ở gốc. Nhờ vậy Vercel không nhầm thư mục RAG_system/ là một service riêng. Kiểm tra mục Framework Preset hiện FastAPI, rồi bấm Deploy.GROQ_API_KEY với Value là key lấy ở https://console.groq.com/keys, rồi bấm Save. Có thể thêm các biến tuỳ chọn ở mục 3, mỗi biến một dòng Key / Value.Nếu bạn tạo Blob store ở chế độ Public, cần đặt thêm biến BLOB_ACCESS=public.
| Việc | Dùng gì | Biến môi trường | Ghi chú |
|---|---|---|---|
| Trả lời | Groq | GROQ_API_KEY (bắt buộc), GROQ_API_KEY_2… (tuỳ chọn) | Là Groq (chữ q), không phải Grok của xAI. |
| Tìm kiếm từ khoá | BM25 trên server | — | Luôn chạy, không tốn quota. Upload không bao giờ lỗi vì hết quota. |
| Tìm kiếm ngữ nghĩa | Cloudflare Workers AI (@cf/baai/bge-m3) | CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN (tuỳ chọn) | Free tier tính theo "neuron"/ngày. Cùng model với bản dòng lệnh. |
Nhiều model Groq dự phòng cho nhau. Groq tính hạn mức riêng cho từng model (ví dụ gpt-oss-120b: 30 request/phút, 1.000 request/ngày, 8.000 token/phút). App dùng lần lượt GROQ_MODELS (mặc định openai/gpt-oss-120b, llama-3.3-70b-versatile, openai/gpt-oss-20b, llama-3.1-8b-instant). Model nào hết quota thì app tự chuyển sang model kế tiếp; model đó được "nghỉ" theo thời gian Groq báo trong header retry-after. Hạn mức theo ngày của Groq đặt lại lúc 0h UTC (7h sáng giờ Việt Nam).
Nhiều API key Groq. Thêm GROQ_API_KEY_2 (tối đa GROQ_API_KEY_5) trên Vercel. Key đầu hết hạn mức thì app dùng key sau với cùng model, rồi mới chuyển sang model kế tiếp. Lưu ý: Groq tính hạn mức theo tổ chức (organization), không theo key. Hai key tạo trong cùng một tài khoản dùng chung hạn mức nên không có tác dụng; key thứ hai phải thuộc một tổ chức khác. Hãy đọc điều khoản của Groq trước khi dùng nhiều tài khoản để tăng hạn mức. Cách chính thống là nâng lên gói Developer.
Tìm kiếm:
Ctrl+K) trong dashboard, gõ Copy account ID rồi chọn kết quả. Hoặc vào Workers & Pages, xem mục Account Details.curl mẫu. Nếu lỡ dán, app vẫn tự tách được token, nhưng nên dán đúng ngay từ đầu.dataset_web/ (thư mục trên máy, hoặc tiền tố dataset_web/ trong Vercel Blob)
└── <conversation_id>/
└── <document_id>/
├── <tên file gốc>.pdf file PDF đã upload
├── chunks.json các đoạn văn + số trang
├── embeddings.npy vector embedding của từng đoạn (không có nếu chỉ tìm theo từ khoá)
├── meta.json thông tin tài liệu (ghi sau cùng, đánh dấu đã xử lý xong)
└── overview.json tóm tắt + câu hỏi gợi ý
Lịch sử chat lưu trong trình duyệt (localStorage). Xoá một cuộc trò chuyện trên giao diện sẽ xoá luôn các file của nó trên server.
Dùng model chạy trên máy nên chính xác hơn khi không có mạng, nhưng nặng (~4.5 GB model, cần torch).
python -m pip install -r RAG_system\requirements.txt
python run.py # build index FAISS từ dataset/ + thử tìm kiếm
python chat.py # chat nhiều lượt; thêm --show-context để xem đoạn tài liệu đã dùng
| Lệnh | Tác dụng |
|---|---|
python chat.py -q "Xe tuần tra hết nhiên liệu thì sao?" | Hỏi một câu rồi thoát |
--show-context | In truy vấn con và các đoạn tài liệu đã dùng |
--hide-reasoning | Ẩn các bước suy luận |
--no-rerank | Bỏ reranker (nhanh hơn nhiều trên CPU) |
--no-analysis | Bỏ bước phân tích câu hỏi |
Thư mục dataset/ gồm file Đề thi Procon_Tiếng Việt.pdf và file bo_sung_bang_hinh_de_thi.md. File .md chép lại Bảng 1 và Hình 1–4 thành chữ, vì trong PDF chúng là ảnh. Index tự build lại khi file nguồn hoặc cấu hình thay đổi.
Đặt trong .env khi chạy trên máy, hoặc trong Environment Variables của Vercel. Xem mẫu ở .env.example.
| Biến | Mặc định | Ý nghĩa |
|---|---|---|
GROQ_API_KEY | (bắt buộc) | API key Groq, lấy tại https://console.groq.com/keys |
GROQ_API_KEY_2 … GROQ_API_KEY_5 | (tuỳ chọn) | Key dự phòng của tổ chức Groq khác; key trước hết hạn mức thì dùng key sau |
GROQ_MODELS | openai/gpt-oss-120b,llama-3.3-70b-versatile,openai/gpt-oss-20b,llama-3.1-8b-instant | Các model theo thứ tự ưu tiên; hết quota model đầu thì dùng model sau |
GROQ_REASONING_EFFORT | medium | Mức suy luận của các model gpt-oss: low, medium, high, off |
COMPARE_MODEL | openai/gpt-oss-20b | Model dùng chung cho cả 4 phương pháp ở chế độ so sánh, ví dụ openai/gpt-oss-120b |
COMPARE_MAX_WAIT | 65 | Chế độ so sánh: chờ Groq cấp lại hạn mức tối đa bấy nhiêu giây mỗi lần; cần chờ lâu hơn thì báo lỗi |
COMPARE_TIME_BUDGET | 240 | Thời gian tối đa (giây) của một lượt so sánh, để không vượt giới hạn 300 giây của Vercel |
WEB_EMBEDDING_PROVIDER | auto | auto (Cloudflare nếu có key) / cloudflare / none (chỉ tìm từ khoá) |
CLOUDFLARE_ACCOUNT_ID / CLOUDFLARE_API_TOKEN | (tuỳ chọn) | Embedding bge-m3 qua Cloudflare Workers AI |
BLOB_ACCESS | private | Chế độ của Vercel Blob store |
MAX_UPLOAD_MB | 4 | Dung lượng tối đa mỗi PDF |
WEB_CHUNK_SIZE / WEB_CHUNK_OVERLAP / WEB_TOP_N | 800 / 150 / 6 | Chia đoạn và số đoạn đưa cho LLM (bản web) |
Đổi model embedding thì các PDF đã upload sẽ tự được tạo lại embedding ở lần hỏi kế tiếp.
Mã nguồn: RAG_system/RAG/reasoning.py. Prompt: RAG_system/config_prompt_web.yaml (bản web) và RAG_system/config_prompt_system.yaml (bản dòng lệnh).
QueryAnalyzer):
ReasoningAnswerer): model bắt buộc trả JSON theo thứ tự evidence (trích nguyên văn) → reasoning_steps → answerable → answer (có trích dẫn [n]) → confidence.
GroundingChecker): so khớp từng trích dẫn với đoạn tài liệu được dẫn. Việc so khớp đã chuẩn hoá Unicode tiếng Việt và khoảng trắng, và cho phép lược bằng "...".
python test_web.py # 35 test bản web: upload, 4 phương pháp + so sánh, rerank, BM25 / hybrid, chuyển model, lỗi (không cần API key)
python test_offline.py # 13 test lõi RAG + bản dòng lệnh (không cần API key / model)
python test_simple.py # kiểm tra nhanh file PDF và cấu trúc project
.env khi chạy trên máy).GROQ_MODELS theo danh sách tại https://console.groq.com/docs/models.RAG_reasoning/
├── app.py # API FastAPI của bản web (entrypoint Vercel)
├── public/ # Giao diện chat (HTML/CSS/JS, không cần build)
│ ├── index.html
│ └── assets/ (app.js, styles.css, favicon.svg)
├── webapp/ # Backend web
│ ├── config.py # Cấu hình bản web
│ ├── storage.py # Lưu trữ: thư mục dataset_web/ hoặc Vercel Blob
│ ├── embeddings.py # Embedding qua Cloudflare Workers AI (bge-m3)
│ ├── keyword_search.py # Tìm kiếm từ khoá BM25 (không tốn quota)
│ ├── reranking.py # Xếp hạng lại bằng LLM (phương pháp 03)
│ └── service.py # Upload -> chunk -> embedding; hỏi–đáp có suy luận
├── RAG_system/
│ ├── RAG/ # Lõi RAG: reasoning, gen (Groq), settings, pipeline / ingest / reranking (CLI)
│ ├── read_file/ # Đọc PDF, chia chunk
│ ├── config_prompt_web.yaml # Prompt bản web
│ ├── config_prompt_system.yaml # Prompt bản dòng lệnh
│ └── requirements.txt # Thư viện bản dòng lệnh (torch, sentence-transformers, FAISS...)
├── dataset/ # Tài liệu của bản dòng lệnh
├── chat.py / run.py # Bản dòng lệnh
├── test_web.py / test_offline.py / test_simple.py
├── requirements.txt # Thư viện bản web (Vercel cài file này)
├── .vercelignore
└── .env.example
WEB_RERANK_CANDIDATES |
20 |
| Phương pháp 03: số đoạn ứng viên trước khi xếp hạng lại |
WEB_REASONING_RERANK | (tắt) | Đặt 1 để phương pháp 04 xếp hạng lại trước khi suy luận |
EMBEDDING_MODEL / RERANKER_MODEL | BAAI/bge-m3 / BAAI/bge-reranker-v2-m3 | Model của bản dòng lệnh |
RAG_CHUNK_SIZE / RAG_CHUNK_OVERLAP / RAG_INITIAL_K / RAG_TOP_N | 500 / 100 / 10 / 5 | Tham số của bản dòng lệnh |