CLI native Rust + llama.cpp cho macOS

Thu thập bằng chứng SQLite / MySQL / PostgreSQL / SQL Server với Qwen

qwen-native chạy mô hình Qwen 2.5 Coder GGUF cục bộ và truy cập cơ sở dữ liệu SQLite / MySQL / PostgreSQL / SQL Server ở chế độ chỉ đọc thông qua các lớp cầu nối native tối giản.

  • 1. Bảo mật & Tiết kiệm chi phí.
  • 2. Chuyên môn hóa (ChatGPT lập kế hoạch, Qwen sinh cú pháp).
  • 3. Tốc độ (Vòng lặp sửa lỗi offline zero-network latency).
  • 4. Tối ưu cho macOS, không yêu cầu Ollama hay Python.
Cấu hình Đích
x86_64-apple
Mô hình Chuẩn
Qwen 2.5 Coder GGUF
Chế độ Chỉ đọc
Bảo vệ chỉ đọc
Đầu ra Bằng chứng
evidence_bundle.md
Terminal — Thu thập bằng chứng
./dist/qwen-native \
  --model ./model/qwen2.5-coder-7b-instruct-q4_k_m.gguf \
  --db '' \
  --batch-question-file ./questions.tsv \
  --batch-output-dir ./evidence \
  --batch-round-id round-1
1

Bắt đầu nhanh — Đường chạy cơ bản

Đây là toàn bộ quy trình cốt lõi để tạo ra tệp evidence_bundle.md cho ChatGPT rà soát ngữ nghĩa:

1. Chuẩn bị mô hình
Đặt GGUF vào model/
2. ./build_x86_64.sh
Biên dịch Rust & llama.cpp
3. Tạo questions.tsv
Chuẩn bị danh sách câu hỏi
4. Chạy lô
Truy vấn SQLite / MySQL / PostgreSQL / SQL Server & thu thập
5. ChatGPT rà soát
Phán quyết ngữ nghĩa

Cấu hình Chuẩn của Dự án

Đích hệ thống: x86_64-apple-darwin
Mô hình: Qwen 2.5 Coder Q4_K_M GGUF
llama.cpp commit: 25ae3a9b331fffea50ff8d...
Luồng CPU: 0 (tự động - mặc định)
Chế độ suy nghĩ: /no_think (mặc định)
Backend CSDL: SQLite / MySQL / PostgreSQL / SQL Server

* Môi trường chạy native, không yêu cầu Ollama, Python hay máy chủ mô hình.

2

Kiến trúc & Luồng xử lý chính

Sơ đồ luồng Cầu nối bằng chứng

Bước 1

Khám phá & Thực thi

Ở Vòng 1, đọc câu hỏi khám phá và lược đồ SQLite / MySQL / PostgreSQL / SQL Server. Bộ tiền lập kế hoạch xác định Rust xử lý các mẫu SQL thông dụng ở chế độ khám phá; Vòng 2+ dùng yêu cầu thực thi do ChatGPT đã chia nhỏ.

Bộ tiền lập kế hoạch xác định chỉ dùng ở chế độ khám phá.
Bước 2

Qwen & bộ bảo vệ Rust

Ở Vòng 2+, Qwen chỉ dịch yêu cầu thực thi đã chọn thành SQL. Câu SQL tiếp tục qua Rust SQL Guard để kiểm tra an toàn trước khi thực thi.

SQLite dùng PRAGMA query_only + READONLY; MySQL / PostgreSQL / SQL Server được mở theo luồng evidence chỉ đọc.
Bước 3

Đóng gói bằng chứng & ChatGPT

Tổng hợp kết quả SQLite / MySQL / PostgreSQL / SQL Server thô, SQL, chẩn đoán vào evidence_bundle.md. ChatGPT thực hiện rà soát ngữ nghĩa cuối cùng.

SQL thành công ≠ Ngữ nghĩa câu hỏi đúng.
Qwen
Đôi tay SQL

Chuyển yêu cầu điều tra đã được chọn thành câu SQL; không tự quyết định chiến lược từ Vòng 2.

SQLite / MySQL / PostgreSQL / SQL Server
Nguồn dữ kiện cục bộ

SQLite, MySQL, PostgreSQL và SQL Server đều được truy cập ở chế độ chỉ đọc trong các vòng evidence.

Rust Guard
Bộ kiểm soát an toàn

Kiểm soát an toàn khi thực thi SQL, ngăn thao tác ghi, DDL hoặc chèn SQL.

ChatGPT
Bộ điều phối ngữ nghĩa

Quyết định chiến lược, chia nhỏ vấn đề, rà soát bằng chứng và đưa ra kết luận cuối cùng.

3

Vận hành Cầu nối Bằng chứng

Trình tạo lệnh điều tra nhiều vòng

Có tệp bằng chứng vòng trước thì lô chạy ở chế độ thực thi; liên kết nguồn gốc được truyền qua cờ --batch-parent-bundle.

Công cụ tương tác
CẢNH BÁO QUAN TRỌNG: Cờ --batch-parent-bundle PHẢI trỏ tới tệp evidence_bundle.md của vòng trước. KHÔNG truyền tệp TSV vào cờ này!
Lệnh shell tương ứng:
./dist/qwen-native \
  --model ./model/qwen2.5-coder-7b-instruct-q4_k_m.gguf \
  --db '' \
  --batch-question-file ./followup_questions.tsv \
  --batch-output-dir ./evidence \
  --batch-round-id round-2 \
  --batch-parent-bundle ./evidence/evidence_bundle.md

Mẫu cấu trúc nội dung `evidence_bundle.md`

Mỗi ca điều tra trong tệp bằng chứng Markdown giữ các trường chuẩn:

# Case ID: metadata
- Chế độ lập kế hoạch: discovery | Nguồn gốc ca cha: none
- Câu hỏi: Liệt kê tất cả các dòng key và value của audit_metadata theo thứ tự key.
- Lược đồ: audit_metadata (key TEXT PRIMARY KEY, value TEXT)
- Nguồn kế hoạch: deterministic
- SQL đã thực thi: SELECT key, value FROM audit_metadata ORDER BY key LIMIT 50;
- Kết quả thô: [ {"key": "schema_version", "value": "1.2.0"}, {"key": "created_at", "value": "2026-01-01"} ]
- Chẩn đoán kỹ thuật: none
- Đánh giá ngữ nghĩa cục bộ: not_performed
4

Chỉ cho phép đọc dữ liệu SQLite / MySQL / PostgreSQL / SQL Server

Chỉ chấp nhận truy vấn đọc dữ liệu

  • SQLite được mở bằng SQLITE_OPEN_READONLY; MySQL, PostgreSQL và SQL Server được sử dụng qua luồng kết nối evidence chỉ đọc.
  • Riêng SQLite bật PRAGMA query_only=ON; MySQL, PostgreSQL và SQL Server vẫn đi qua Rust SQL Guard và chính sách chỉ cho phép truy vấn đọc.
  • Chỉ cho phép các lệnh đọc như SELECT, WITH ... SELECT; các lệnh đặc thù như EXPLAIN QUERY PLAN / PRAGMA áp dụng cho SQLite.
  • Không cho phép các lệnh làm thay đổi dữ liệu như INSERT, UPDATE, DELETE, CREATE, DROP; nhiều câu SQL cùng lúc cũng bị từ chối.
  • Giới hạn mặc định: 50 dòng / truy vấn, 4096 bytes, thời gian chờ 2000 ms.

Các lệnh đọc thông tin cấu trúc được cho phép

Với SQLite, ngoài SELECT hệ thống chỉ cho phép một số PRAGMA đọc thông tin cấu trúc. Với MySQL, PostgreSQL và SQL Server, schema được introspect qua metadata tương ứng; PRAGMA không áp dụng:

TABLE_INFO
TABLE_XINFO
INDEX_LIST
INDEX_INFO
INDEX_XINFO
FOREIGN_KEY_LIST

Bảng trạng thái chẩn đoán kỹ thuật

Trạng thái kỹ thuật Mô tả Kỹ thuật Ghi chú Vận hành
executed Truy vấn thành công, không có chẩn đoán lỗi. Không tự chứng minh đúng ngữ nghĩa.
executed_with_diagnostics Truy vấn thành công đồng thời có chẩn đoán đi kèm. Có thể có truy vấn phụ bị lỗi.
runtime_capability_error Môi trường SQLite thiếu tính năng hoặc phần mở rộng cần thiết. Cần kiểm tra bản SQLite hệ thống.
result_truncated Kết quả vượt quá giới hạn dòng (50) hoặc byte (4096). Báo cáo chưa được xem là hoàn tất.
planner_missed Qwen không tạo được kế hoạch SQL cho ca. Trở thành bằng chứng kỹ thuật rỗng.
5

Xử lý sự cố nhanh

Hiện tượng Kiểm tra trước
Không tìm thấy mô hình Kiểm tra model/qwen2.5-coder-7b-instruct-q4_k_m.gguf hoặc truyền --model PATH đúng.
Nạp mô hình lỗi Kiểm tra tệp GGUF có tồn tại, đúng đường dẫn và dùng được; chuẩn bị lại tệp tương thích nếu cần.
command not found ở cờ CLI Kiểm tra dòng lệnh shell trước đó có thiếu ký tự nối \ hay không.
Một vòng mất nhiều phút Đối chiếu thời gian lập kế hoạch Qwen; SQLite / MySQL / PostgreSQL / SQL Server thường không phải nút thắt chính.
runtime_capability_error Xem chẩn đoán SQLite chính xác; không tự diễn giải thành lỗi ngữ nghĩa.
result_truncated Tăng giới hạn phù hợp hoặc thu hẹp câu hỏi; không coi báo cáo là hoàn tất.
A

Thử nghiệm thực tế với đồ thị mã nguồn

Hai câu hỏi trung tâm của cuộc điều tra là:
① Đồ thị mã nguồn của mcp-app được lưu vào SQLite như thế nào?
② Đồ thị mã nguồn có được lưu đúng và đầy đủ không?
Ví dụ thực tế dưới đây minh họa cách ChatGPT điều khiển cuộc điều tra qua 3 vòng: khám phá dữ liệu, lập chiến lược trả lời hai câu hỏi này, rồi chốt các vấn đề phát sinh.

Luồng 3 vòng điều tra: Khám phá → Lập chiến lược → Chốt vấn đề

Quá trình điều tra · 19 phút 25 giây
Vai trò trong điều tra Vòng 1 — Khám phá Vòng 2 — Lập chiến lược Vòng 3 — Chốt vấn đề
Mục tiêu Khám phá SQLite và hiểu cách đồ thị mã nguồn được lưu. Lập chiến lược để trả lời 2 câu hỏi chính từ bằng chứng Vòng 1. Kiểm tra các điểm còn chưa rõ và chốt kết luận.
ChatGPT thực hiện Skill tạo 9 câu hỏi khám phá độc lập để dựng ngữ cảnh cơ sở dữ liệu. Đọc bằng chứng, xác định khoảng trống và chia chiến lược thành 9 phép kiểm tra. Tập trung 6 phép kiểm tra vào các vấn đề phát sinh cần xác minh cuối.
Qwen + SQLite Qwen dịch câu hỏi → SQL; SQLite trả lược đồ và bằng chứng nền. Qwen dịch yêu cầu thực thi → SQL; SQLite trả bằng chứng về tính nhất quán và độ phủ. Qwen thực thi các kiểm tra chốt về tệp thiếu ký hiệu, phạm vi dòng và phân giải đích.
Bằng chứng chính Xác định graph_symbols, graph_edges, các cột, chỉ mục và cấu trúc lưu trữ. 0 ký hiệu nguồn mồ côi, 0 ký hiệu cha mồ côi, 0 lệch đường dẫn; phát hiện điểm cần kiểm tra sâu. 70 cạnh ngoài phạm vi đều thuộc Implements; các đường dẫn thiếu graph_symbols vẫn có semantic_chunks.
Kết quả / bước tiếp theo Đủ ngữ cảnh để ChatGPT lập chiến lược cho Vòng 2. Xác định các vấn đề cần kiểm tra sâu ở Vòng 3. Đủ bằng chứng để trả lời 2 câu hỏi chính; không cần Vòng 4 cho kết luận cấp cao.
Cách đọc quy trình

Vòng 1: Skill ChatGPT tạo câu hỏi để khám phá cơ sở dữ liệu.
Vòng 2: ChatGPT đọc bằng chứng và lập chiến lược để trả lời hai câu hỏi chính.
Vòng 3: ChatGPT kiểm tra các vấn đề phát sinh rồi chốt kết luận. Qwen không tự quyết định chiến lược; Qwen chỉ chuyển từng yêu cầu thành SQL, Rust kiểm tra an toàn và SQLite trả dữ kiện.
Sau Vòng 3, đồ thị mã nguồn được xác nhận có cấu trúc rõ ràng và nhất quán ở mức đã kiểm tra, nhưng độ phủ ký hiệu chưa đầy đủ hoàn toàn.

B

Thử nghiệm thực tế WordPress

Bài thử nghiệm sử dụng một website WordPress development thực tế để kiểm chứng quy trình ChatGPT → qwen-native → MySQL → evidence_bundle.md. Mục tiêu không chỉ là đọc dữ liệu hiện có, mà còn đối chiếu source theme straight-press-renew với trạng thái MySQL, xác định data contract cần thiết và tạo seed SQL có thể tái dựng môi trường development.

Phạm vi điều tra
8 vòng
Vòng 1 schema bootstrap + Vòng 2–8 evidence
Evidence operations
21 case
19 executed · 2 diagnostic-only
Thời gian Qwen đo được
8m 42s
Tổng Vòng 2–8: 522.021 giây
MySQL native
~35 ms
Cho toàn bộ Vòng 2–8

Luồng 8 vòng: từ schema đến seed development

MySQL 8.0.46 · read-only investigation
Vòng Mục tiêu Thời gian Kết quả
1 Schema bootstrap deterministic Không dùng Qwen 29 bảng · schema đầy đủ · không truncate
2 Inventory post type, taxonomy, postmeta 50.525 s 3/3 executed
3 Inventory page/post và thử JOIN taxonomy 130.800 s 2/3 executed · phát sinh SQL repair
4 Retry taxonomy + theme/front-page options 129.243 s 2/3 executed · repair vẫn sai owner cột
5 Decompose taxonomy thành 3 SELECT độc lập 57.372 s 3/3 executed · không repair
6 Core options, plugins, Contact Form 7 42.628 s Nhanh nhất · 3/3 executed
7 Theme state, contact meta, author 47.406 s 3/3 executed
8 Runtime options, full plugin list, CF7 values 64.047 s 3/3 executed · đóng điều tra DB
Kết luận hiệu năng

Nút thắt là inference, không phải MySQL

Planner
401.335 s
≈ 76.9% tổng thời gian Vòng 2–8
SQL repair
83.254 s
≈ 15.9% · chỉ xuất hiện ở Vòng 3–4
Model load
37.388 s
≈ 7.2% tổng thời gian
Nhóm vòng không repair trung bình 52.4 giây/vòng, thấp hơn khoảng 59.7% so với nhóm Vòng 3–4 có repair (~130 giây/vòng). Decomposition đúng có giá trị lớn hơn tối ưu MySQL ở workload này.

Những gì source WordPress + MySQL đã chứng minh

Theme đích

Database ban đầu dùng twentyeleven. Source được đối chiếu để chuyển target sang straight-press-renew, không tái sử dụng state widget/menu cũ nếu theme mới không cần.

Taxonomy thật của theme

Source hard-code 11 category: local, lifestyle, mono, entame, beauty, fashion, mama, otoku, cawaii, mens và m-fashion. Riêng LOCAL sử dụng thêm 8 tag vùng địa lý.

BUSINESS NEWS

Theme tự định nghĩa bảng company_news với ID PR TIMES, công ty, tiêu đề, nội dung, ngày xuất bản và cờ xóa; Round 8 xác nhận chưa có stale option cản bước tạo bảng.

URL category

Plugin wp-no-category-base đang active, giải thích vì sao source dùng URL như /local thay cho /category/local.

Contact

Source cũ có dấu vết CF7 ID 9681 trong khi MySQL development chỉ có form ID 5. Footer thực tế chuyển Contact sang Tayori, nên seed không cần giả lập ID cũ để website hoạt động.

Page contract

Nhóm page cần seed gồm company, press, site, company_news và child company_news/detail với page template tương ứng.

Kết quả của thử nghiệm

  • • Điều tra schema và trạng thái WordPress development mà không ghi dữ liệu trong các vòng evidence.
  • • Từ source theme xác định được data contract mà database trống không thể tự mô tả.
  • • Tạo seed idempotent cho theme, page, category, tag, post relationship và BUSINESS NEWS.
  • • Phát hiện lỗi cú pháp MySQL ở seed đầu và hiệu chỉnh chiến lược conditional insert cho bản tiếp theo.
  • • Xác định rõ điểm dừng: sau Vòng 8 không cần thêm vòng Qwen để trả lời các fact đã đủ bằng chứng.

Bài học tối ưu qwen-native

  1. Ưu tiên deterministic preplanner cho SELECT đơn giản để bỏ model call không cần thiết.
  2. Khi lỗi owner cột/JOIN lặp lại, chuyển ngay sang truy vấn đơn bảng thay vì gọi repair thêm.
  3. Nếu Qwen cần schema, chỉ truyền schema slice của các bảng được nhắc tới thay vì toàn bộ catalog.
  4. Giảm output token và số model call; generation chiếm phần lớn thời gian inference thực tế.
  5. Giữ ChatGPT làm semantic controller; Qwen chỉ làm lớp dịch thao tác đã chọn sang SQL.
Trạng thái nghiệm thu: phần điều tra read-only đã hoàn tất và seed MySQL đã được hiệu chỉnh sau lỗi cú pháp conditional insert đầu tiên. Việc import bản seed đã sửa và chạy verification cuối trên môi trường development vẫn là bước xác nhận cuối cùng trước khi coi quá trình dựng database là hoàn tất tuyệt đối.