Skip to content

Commit 860b375

Browse files
authored
Merge pull request #6 from thevivotran/develop
Vibe coding article
2 parents 00215c2 + 09240ea commit 860b375

File tree

3 files changed

+183
-0
lines changed

3 files changed

+183
-0
lines changed

content/images/flashcard1.png

50.8 KB
Loading

content/images/flashcard2.png

122 KB
Loading

content/vibe_coding.md

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
title: Vibe coding Flashcard Flask App
2+
date: 2025-04-12
3+
tags: Python, vibe_coding, roocode, gemini
4+
category: pymi.vn
5+
slug: vibe_coding
6+
authors: thevix
7+
description: Tạo webapp flashcard để luyện thi chứng chỉ trong 15 phút!
8+
9+
10+
### Context (Rất quan trọng cho cả người đọc và LLM)
11+
Tác giả đang trong thời gian ôn luyện để thi chứng chỉ AWS và GCP nên đã tìm tới các exam dump để làm quen với đề. Tuy nhiên, các trang này không đem lại trải nghiệm học tập tốt lắm:
12+
- Hiển thị 1 lúc nhiều câu hỏi, ít nhất là 5
13+
- Khi sang trang mới cần phải chứng minh mình không phải là người máy
14+
- Muốn đánh dấu 1 câu hỏi khó để xem lại hoặc thêm ghi chú thì phải dùng 1 spreadsheet riêng để track
15+
- Vân vân..
16+
17+
Vì vậy, tác giả đã quyết định tự làm 1 web app riêng để thoả mãn sự khó tính của bản thân. Để tiết kiệm thời gian, nếu không sẽ bị mất tinh thần học tập, tác giả đã `Vibe coding` cùng model `Gemini Pro 2.5`.
18+
19+
Các công cụ mà tác giả như sau:
20+
- VS Code
21+
- Roo Code (VS Code plugin)
22+
- Openrouter: Model Gemini Pro 2.5 free (10 calls per day)
23+
- AI Studio: Model Gemini Pro 2.5 API free (10 calls per day)
24+
25+
Lí do tác giả không tự host model bằng Ollama dưới local:
26+
- Hạn chế về phần cứng, `NVIDIA 3060 Ti 12gb VRAM` chơi game thì mượt, nhưng chỉ chạy được các model trung bình (< 6B params), context window nhỏ.
27+
- Dùng model nhỏ cũng được, tuy nhiên sẽ phải ngồi fix lỗi và xử lý các vấn đề lặt vặt mà model không aware được.
28+
29+
### Vibe coding là gì?
30+
Theo wikipedia định nghĩa là: Code cùng với AI. Coder ra lệnh cho LLM, Coder kiểm tra đầu ra, nếu đúng kết quả như Coder mong muốn thì lưu file lại. Cứ như thế lặp đi lặp lại.
31+
>Vibe coding (also vibecoding) is an AI-dependent programming technique where a person describes a problem in a few sentences as a prompt to a large language model (LLM) tuned for coding. The LLM generates software, shifting the programmer's role from manual coding to guiding, testing, and refining the AI-generated source code. Vibe coding is claimed by its advocates to allow even amateur programmers to produce software without the extensive training and skills required for software engineering. The term was introduced by Andrej Karpathy in February 2025 and listed in the Merriam-Webster Dictionary the following month as a "slang & trending" noun.
32+
33+
Giờ thì vào việc thôi.
34+
35+
### Phát thảo Web App
36+
Bên dưới là trích lược prompt đầu tiên của tác giả.
37+
38+
``` txt
39+
I want to develop python webapp that can run in every users local machine. the app is packaged in a container, so everyone will be able to docker up it (or podman up it). the app can be writen in django or flask, or what ever framework that easy to maintain in the future.
40+
41+
the webapp's name is "Flashcard", this is a flashcard app. this app will have a database (sqlite3). this database stores questions, answers and correct answer of the question. each question has only 1 correct answer. the database will be initiated at every first run. at first, user will provide a csv file that have 7 columns and a name for the dataset:
42+
43+
...
44+
```
45+
Còn đây là link github [full không che](https://github.com/thevivotran/studytest/blob/main/idea/1/idea_draft.md)
46+
47+
Nôm na là:
48+
1. Mô tả công nghệ
49+
- Viết 1 Python web app
50+
- App này được gói trong 1 container, để khi dùng chỉ cần docker up
51+
- Viết app này bằng django hay flask gì cũng được, miễn là dễ maintain
52+
53+
2. Mô tả tính năng
54+
- Dùng sqlite3 để lưu data cho toàn bộ webapp
55+
- Database này sẽ lưu dữ liệu câu hỏi, câu trả lời và câu trả lời đúng
56+
- Người dùng sẽ cung cấp 1 file csv để import bộ dữ liệu này
57+
- Người dùng có thể thêm nhiều bộ câu hỏi cho từng loại chứng chỉ khác nhau
58+
- Vân vân...
59+
60+
### Chi tiết hoá prompt
61+
`Roo Code` có 1 tính năng là dùng AI để chi tiết hoá prompt đầu vào của người dùng.
62+
Tại sao phải làm vậy? Prompt càng chi tiết thì các Model càng dễ hiểu và trả ra kết quả cũng chính xác hơn.
63+
64+
Bên dưới đây là 10 dòng đầu của đoạn prompt đã được bổ sung thêm thông tin:
65+
``` md
66+
Develop a Python web application named "Flashcard", designed to run locally on user machines via Docker or Podman. Use the Flask framework and SQLite3 for the database.
67+
68+
**Core Requirements:**
69+
70+
1. **Containerization:** Package the application in a Docker container. Provide a `Dockerfile` using a Python base image (e.g., `python:3.10-slim`), a `requirements.txt` file (including Flask), and instructions for building and running the container, ensuring data persistence via volume mounting for the database and user progress. The application should be accessible via a mapped port (e.g., 5000).
71+
2. **Database (`flashcard.db`):**
72+
* Use SQLite3, stored within the persistent volume (`/data/flashcard.db`).
73+
* Schema:
74+
* `datasets` table: `id` (INTEGER PRIMARY KEY AUTOINCREMENT), `name` (TEXT UNIQUE NOT NULL).
75+
* `cards` table: `id` (INTEGER PRIMARY KEY AUTOINCREMENT), `dataset_id` (INTEGER, FOREIGN KEY (`dataset_id`) REFERENCES `datasets` (`id`)), `question` (TEXT NOT NULL), `correct_answer` (TEXT NOT NULL), `choice1` (TEXT NOT NULL), `choice2` (TEXT NOT NULL), `choice3` (TEXT NOT NULL), `choice4` (TEXT NOT NULL), `choice5` (TEXT).
76+
* Initialization: Automatically create the database and tables if they don't exist on application startup.
77+
```
78+
Đây là link github [full không che](https://github.com/thevivotran/studytest/blob/main/idea/1/enhanced_idea_draft.md)
79+
80+
AI đã tự động thêm những chi tiết rất technical vào đoạn prompt phát thảo ban đầu:
81+
- Python base image cho container
82+
- Requirement file
83+
- Persistence volume
84+
- Port
85+
- Tự thiết kế schema cho database
86+
- ...
87+
88+
### Dùng Architecture thiết kế hệ thống
89+
Sau khi đã hài lòng với đoạn prompt cung cấp thông tin `công nghệ cần sử dụng``các tính năng cần có` của web app, tác giả dùng `AI Agent Architecture` để thiết kế chi tiết hệ thống. Architecture này cũng đảm nhiệm vai trò phân tách các giai đoạn làm việc để đảm bảo `AI Agent Developer` sẽ dễ dàng thực hiện.
90+
91+
Cuối cùng Agent này xuất ra 1 file `PLAN.MD` để có thể vào đọc được nhiều lần về sau mà không cần phải hỏi lại user.
92+
93+
Đầu tiên, `PLAN.MD` có đoạn các yêu cầu đã thống nhất:
94+
``` md
95+
# Flashcard Application Development Plan
96+
97+
This document outlines the plan for developing the "Flashcard" Python web application using Flask and SQLite, containerized with Docker/Podman.
98+
99+
## Confirmed Specifications
100+
101+
* **CSV Import:** Assume no header row.
102+
* **Styling:** Implement using basic, custom CSS.
103+
* **Error Handling:** Display errors using Flask's flash messaging system.
104+
* **Card Navigation:** No wrap-around (Next/Previous disabled at ends).
105+
* **Answer Reveal:** Clicking the card area reveals the answer.
106+
```
107+
108+
Sau đó, sẽ là thông tin chi tiết của các Phase, ví dụ đây sẽ là Phần 1 của Phase 1:
109+
``` md
110+
## Phase 1: Project Setup & Core Backend
111+
112+
1. **Define Project Structure:**
113+
* Create the main project directory: `flashcard_app/`
114+
* Inside `flashcard_app/`, create:
115+
* `app.py`: Main Flask application file.
116+
* `database.py`: Module for database interactions.
117+
* `requirements.txt`: Python dependencies.
118+
* `Dockerfile`: Container build instructions.
119+
* `templates/`: Directory for HTML templates.
120+
* `static/`: Directory for CSS/JS files.
121+
* A separate `data/` directory will be used as a volume mount point for persistent storage (`/data/flashcard.db`, `/data/progress.json`).
122+
```
123+
Chi tiết file `PLAN.MD` có thể [xem tại đây](https://github.com/thevivotran/studytest/blob/main/idea/1/PLAN.md?plain=1).
124+
125+
Agent này đã break down dự án này thành 4 phases, mỗi phase có từ 2 đến 3 bước nhỏ.
126+
127+
### Dùng Developer xây dự án
128+
`Roo code` sẽ có nút bấm để user chuyển đổi sang `AI Agent Developer` chuyên dùng để coding. Hơn cả thế, `Roo Code` cũng có khả năng nhận biết khi nào thì cần chuyển sang Developer, plugin này sẽ xin phép user để được bắt đầu quá trình viết code.
129+
130+
`Agent` này sẽ tự động đọc file `PLAN.MD` ở trên, và tạo cấu trúc folder, cũng như coding những file .py, .html, .css theo đúng yêu cầu. Mỗi bước, `Roo Code` đều sẽ xin permission cho những hoạt động của `Agent`, nếu được phép thì mới được thực hiện. Đặc biệt, sau khi viết 1 đoạn code, `Agent` sẽ hỏi mình xem qua và đồng ý thêm đoạn code này vào code base.
131+
132+
Riêng trong dự án này, vì tác giả đã có thử nghiệm `Gemini 2.5 Pro` từ trước nên rất tin tưởng khả năng coding của model, nên đã bật tính năng tự động cho `Agent` permission đọc và ghi file. Thành ra, toàn bộ quá trình build dự án mất vỏn vẹn 15 phút.
133+
134+
### Thành phẩm
135+
Tác giả đã có thể `docker build``docker run` một web app flask theo đúng nhu cầu ban đầu.
136+
Link [GitHub](https://github.com/thevivotran/studytest/tree/main/flashcard_app) để tải dự án về dùng trên local. Trong repo đã có sẵn file hướng dẫn của `Agent Developer` viết, mọi người có thể làm theo.
137+
138+
Hoặc đơn giản hơn, chỉ cần 2 câu lệnh:
139+
``` shell
140+
make build
141+
make
142+
```
143+
144+
Web app có 2 trang: trang chủ và trang học
145+
146+
Trang chủ có tính năng upload file csv cho từng dataset (bộ đề ôn) và chọn bộ đề ôn để luyện tập.
147+
![img]({static}/images/flashcard1.png)
148+
149+
Sau khi bấm vào từng dataset, sẽ vào trang học flashcard. Có thể tiến, lùi và hiện câu trả lời đúng. Ngoài ra còn có thể đánh dấu câu khó để xem lại, cũng như viết note cho từng câu.
150+
![img]({static}/images/flashcard2.png)
151+
152+
### Chi phí thực hiện
153+
Hoàn toàn **free**. Tuy nhiên, toàn bộ dữ liệu (token) trong quá trình xây dựng dự án sẽ được Google sử dụng.
154+
155+
Nếu không muốn Google làm vậy, chúng ta có thể sử dụng bản có phí của `Gemini 2.5 Pro` từ `Openrouter`. Giá sẽ như sau:
156+
- $1.25/M input tokens
157+
- $10/M output tokens
158+
159+
Toàn bộ dự án dùng:
160+
- 522.0k input tokens
161+
- 29.1k output tokens
162+
163+
Tổng cộng sẽ phải trả `$0.9435`, `24,275.00 VNĐ`.
164+
165+
---
166+
Rẻ hơn thì có thể dùng `deepseek/deepseek-chat-v3-0324` với giá:
167+
- $0.27/M input tokens
168+
- $1.1/M output tokens
169+
170+
Hoặc `anthropic/claude-3.7-sonnet` thì giá sẽ cao hơn:
171+
- $3/M input tokens
172+
- $15/M output tokens
173+
---
174+
175+
### Kết
176+
- Thay vì chỉ suggest code hoặc sửa những lỗi như trước đây, các Agent đã có thể hoạt động như những Architecture, Developer và Debugger. `Roo Code` giúp việc chuyển đổi qua lại các `Agent` rất mượt.
177+
- Vì chi phí được tính dựa trên độ dài của context (token), nên phải luôn biết mình muốn gì trước khi bắt đầu. Hoặc, có thể brain storm trong khi làm việc với `Agent Architecture`. Như vậy sẽ tiết kiệm hơn là chỉnh sửa trong quá trình dùng `Agent Developer`.
178+
- Chi phí khá rẻ, 1 ly cà phê vỉa hè cho 1 web app đúng theo nhu cầu cá nhân, trong vòng 15 phút.
179+
- Không cần phải đầu tư quá nhiều cho phần cứng, bất kì ai cũng có thể tiếp cận các Large Language Model một cách dễ dàng và đa dạng thông qua `Openrouter`.
180+
181+
[Github](https://github.com/thevivotran/studytest)
182+
183+
**Vibe coding ngay thôi !**

0 commit comments

Comments
 (0)