Giai đoạn: 30/06 – 06/07/2026 · Tổng hợp từ lịch sử Git và transcript phiên làm việc Claude của từng dự án
Người thực hiện: jc-hello
Ngày lập: 06/07/2026
Phạm vi: 3 dự án
Tổng quan tuần
Đây là tuần thay "bộ não" làm giàu dữ liệu — trọng tâm là xây một dịch vụ nghiên cứu web tự chủ (research provider) để thay thế Perplexity, rẻ hơn và kiểm soát được chất lượng. Song song là chuẩn hoá pipeline crawl một địa điểm Google từ đầu đến cuối (place_flow) và bổ sung bộ lọc theo Tỉnh/Thành cho dashboard kèm tự động hoá deploy.
~37
commit trong tuần
3
dự án hoạt động
Research
tự xây, thay Perplexity
place_flow
crawl 1 địa điểm end-to-end
Khối lượng commit theo dự án:
20
chicgo_data Crawler / Enrich
10
chicdata_dashboard Báo cáo / CI-CD
7
llm_call Research provider
1. Dịch vụ nghiên cứu web tự chủ — thay Perplexity, trọng tâm tuần
Trước đây khâu làm giàu dữ liệu (tìm giá, mô tả, thông tin địa điểm) phụ thuộc hoàn toàn vào Perplexity — vừa tốn chi phí, vừa bị rate-limit, vừa khó kiểm soát khi nó bịa nguồn/đường link. Tuần này tự xây một "research provider" riêng trong dịch vụ dùng chung llm_call: tự tìm kiếm web (DDGS), tự đọc trang, rồi tổng hợp bằng model rẻ qua OpenRouter.
Vì sao quan trọng: đây là bộ máy tự chủ — mình kiểm soát được nó tìm gì, đọc nguồn nào, dùng model nào và chặn được việc bịa link. Sau khi smoke-test 5 địa điểm cho kết quả tốt, đã chính thức chuyển cả 2 bước làm giàu của chicgo sang provider mới.
1.1 Cơ chế nghiên cứu (agentic web research)
Tự tìm — tự đọc — tự tổng hợp — provider tự chạy tìm kiếm DDGS, tải nội dung trang tin cậy, rồi để model tổng hợp thành JSON có cấu trúc.
Tìm kiếm 2 vòng theo lỗ hổng (gap-driven round 2) — sau vòng 1, nếu còn thiếu thông tin, hệ thống tự tìm bổ sung đúng phần còn thiếu thay vì tìm lại từ đầu.
Chọn model theo chi phí — dùng model rẻ cho khâu trích xuất/đọc, để dành model mạnh cho khâu tổng hợp → tối ưu chi phí; cho phép chọn model & bật/tắt streaming theo từng request.
Cho phép giá cấp chuỗi/chi nhánh khác — khi không có giá chính xác của địa điểm, chấp nhận tham chiếu giá của chi nhánh cùng chuỗi ở mức tin cậy vừa (confidence ≤ medium), có ghi rõ độ tin cậy.
1.2 Chống bịa nguồn / đường link độ tin cậy dữ liệu
Chỉ được trích link có thật — khâu tổng hợp chỉ nhận danh sách URL hợp lệ đã thực sự truy cập, không cho model tự "sáng tác" link nguồn.
Lọc hậu kiểm — sau khi có kết quả, một bước lọc tự động loại bỏ mọi URL bịa ra khỏi JSON trả về.
Bắt buộc tìm kiếm với địa điểm cụ thể — luôn chạy tìm kiếm web (không trả lời chay), và làm sạch URL ở cả nhánh trả lời trực tiếp.
Kết quả: dữ liệu làm giàu truy vết được về nguồn thật, giảm hẳn rủi ro thông tin sai/bịa lọt vào kho dữ liệu địa điểm.
2. chicgo_data — Pipeline crawl một địa điểm hoàn chỉnh
Gọn hoá và chuẩn hoá lại toàn bộ crawler Google Maps quanh một công cụ điều phối duy nhất: tools/place_flow.py — chạy trọn vẹn một địa điểm từ Google Maps qua các bước làm giàu, địa chỉ, ảnh cho tới xuất dữ liệu.
2.1 Bộ điều phối place_flow mới
3 chế độ chạy linh hoạt — theo --url (một link Google cụ thể), theo --from-db-keywords (tự lấy keyword từ DB), hoặc theo --ids (danh sách địa điểm chỉ định).
Chạy tất định (deterministic) — mỗi lần chạy cho kết quả nhất quán, dễ kiểm thử và soát lại; kèm bộ prompt phân loại danh mục & seed được khôi phục.
Tích hợp địa chỉ TrackAsia — bước chuẩn hoá địa chỉ gọi thẳng TrackAsia (có proxy pool nếu cấu hình), bỏ hẳn khâu tự phân tích địa giới thủ công.
Tích hợp ảnh R2 — bước tải & lưu ảnh địa điểm lên Cloudflare R2 nằm trong cùng luồng.
Nối liền khâu làm giàu — sửa để bước 2 (enrichment) chạy được qua place_flow, và chuyển bước 2 sang dùng research provider mới.
2.2 Ảnh & đánh giá (reviews)
Nén ảnh WebP trước khi upload — chuyển ảnh sang định dạng WebP trước khi đẩy lên R2, kèm báo cáo dung lượng → tiết kiệm lưu trữ & băng thông, tải nhanh hơn.
Crawl reviews ổn định hơn — mở phần đánh giá qua đúng nút "More reviews" và cuộn feed bền hơn để lấy đủ review, ít bị kẹt.
Giữ mã định danh cid khi dọn URL — khi strip query khỏi URL Google, vẫn giữ tham số cid để không mất khả năng định danh địa điểm.
2.3 Dọn kho mã (slim repo)
Về đúng bản chất "crawler Google Maps thuần" — gỡ toàn bộ cấu hình đồng bộ Google BigQuery khỏi repo (config, README, .env, gitignore), giảm phần thừa không còn dùng.
Khôi phục & sắp xếp lại các script vận hành — runner enrich chạy trên VPS, script theo dõi tiến độ, luồng xuất/nhập JSON từ kho lưu trữ.
Tài liệu thiết kế pipeline — thêm spec mô tả pipeline crawler địa điểm hợp nhất để đội nắm luồng chuẩn.
3. chicdata_dashboard — Lọc theo Tỉnh/Thành & tự động deploy
3.1 Bộ lọc theo Tỉnh/Thành (cấp 1) cho báo cáo mới
Lọc mọi thẻ thống kê theo tỉnh/thành — thẻ tổng quan và các thẻ danh mục / đánh giá / tiến độ làm giàu đều có thể lọc theo một tỉnh/thành cụ thể, giúp chị xem số liệu từng khu vực.
Dropdown chọn tỉnh — thêm API GET /api/stats/provinces để đổ danh sách tỉnh vào ô chọn.
Tối ưu tốc độ — thêm chỉ mục (index) theo tỉnh và các hàm tổng hợp để lọc nhanh, không làm chậm trang.
Có spec & plan đi kèm — thiết kế và kế hoạch 8 đầu việc được ghi tài liệu trước khi làm.
3.2 Tự động hoá triển khai (CI/CD) & vận hành
CI/CD deploy lên Fly.io — thiết lập tự động build & deploy dashboard mỗi khi có thay đổi, giảm thao tác tay và rủi ro deploy sót.
Sửa lỗi build hết bộ nhớ — chuyển build Docker sang dùng node thay vì --bun để tránh lỗi tràn bộ nhớ (exit 137).
Gọn trang My Stats — đơn giản hoá hiển thị điểm trung bình, bỏ số lượt sửa khỏi API cho nhẹ.
Spec research provider v2 — ghi tài liệu định hướng vòng 2 (gap-driven) và chọn model tối ưu chi phí, làm căn cứ cho phần việc ở mục 1.
Tổng kết & định hướng
Điểm nhấn tuần: làm chủ khâu làm giàu dữ liệu — có dịch vụ nghiên cứu web tự xây thay Perplexity, rẻ hơn, kiểm soát chất lượng và chặn bịa nguồn; đồng thời chuẩn hoá luồng crawl một địa điểm Google end-to-end (place_flow) và cho chị lọc báo cáo theo từng tỉnh/thành.
Theo dõi tiếp: (1) giám sát tỉ lệ thành công & chất lượng dữ liệu sau khi chuyển cả 2 bước enrich sang research provider mới; (2) chạy diện rộng place_flow qua các chế độ (URL / keyword DB / IDs) và theo dõi chi phí model; (3) hoàn thiện CI/CD dashboard trên Fly.io và bộ lọc tỉnh/thành theo phản hồi thực tế của chị.