1 Tổng quan và hướng dẫn sử dụng
Semantic Context là tính năng tìm kiếm ngữ cảnh thông minh hoạt động hoàn toàn cục bộ trên máy tính người dùng, tích hợp sẵn bên trong ứng dụng ICD MCP Dashboard.
Đặc điểm nổi bật
- Chạy hoàn toàn trên CPU cục bộ.
- Không cần môi trường chạy Python hoặc Docker.
- Không tải thêm dữ liệu từ Internet trong quá trình hoạt động.
- Chỉ cập nhật các tệp thay đổi dựa trên mã băm BLAKE3.
Không phụ thuộc dịch vụ đám mây
- Không dùng máy chủ mô hình bên ngoài.
- Không phụ thuộc cơ sở dữ liệu vector đám mây như Pinecone hoặc Qdrant.
- Không cần cài đặt SQLite thủ công.
- Không lưu lịch sử truy vấn hoặc câu lệnh.
Sáu nhóm ngôn ngữ được chuẩn hóa về declaration, import và reference. Sau khi retrieval, xếp hạng và lựa chọn đã hoàn tất, Code Graph mới phân giải quan hệ quanh các symbol đã chọn. Lớp này không thay đổi phân đoạn, thứ tự, khoảng cách vector, điểm xếp hạng, ngân sách source hoặc nội dung mã nguồn trong Markdown.
2 Sơ đồ quy trình
Nhấp vào từng bước bên dưới để xem chi tiết thông số kỹ thuật xử lý.
Quét tệp an toàn
Áp dụng allowlist, giới hạn và chính sách đọc file dùng chung.
Tạo chunk và AST chuẩn hóa
Chunking giữ contract cũ; AST trích xuất declaration, import và reference.
Tạo vector nhúng
ONNX Runtime cục bộ tạo vector 384 chiều cho semantic chunks.
Cập nhật SQLite và graph sidecar
Lưu vector, chunk, symbol và edge theo content hash của từng file.
Truy xuất và xếp hạng
Lấy tối đa 96 vector candidate rồi rerank bằng tín hiệu semantic, lexical và cấu trúc.
Chọn và đóng băng kết quả
Chọn tối đa 12 chunk trong 64 KiB; cố định thứ tự, distance và source.
Phân giải Code Graph
Ánh xạ selected chunk sang symbol và chỉ giữ quan hệ project-local đủ tin cậy.
Xuất Markdown
Render source trước; chỉ nối graph section tối đa 6 KiB khi có relation hợp lệ.
3 Mô hình nhúng và giới hạn token
Đặc tả kỹ thuật của mô hình
| Mô hình nền | sentence-transformers/all-MiniLM-L6-v2 |
| Mã định danh nội bộ | AllMiniLML6V2Q |
| Tệp ONNX | model.onnx |
| Số chiều vector | 384 |
| Phương pháp gộp và lượng tử hóa | gộp trung bình / lượng tử hóa động |
| Số token đầu vào tối đa | 128 token |
| Tiền tố truy vấn/đoạn nguồn | "" (chuỗi rỗng) |
| Thư viện môi trường chạy | libonnxruntime.dylib |
Giới hạn token: đầu vào 128, phân đoạn 112, chồng lặp 16
Mỗi phân đoạn có tối đa 112 token; 16 token cuối có thể được lặp lại ở phân đoạn kế tiếp. Giới hạn 128 token là trần đầu vào của mô hình, không phải tổng bắt buộc của 112 và 16.
chunk.content và có thể bổ sung metadata an toàn trong
giới hạn token. Declaration của AST, graph symbol key, edge và relation đã phân giải
không được đưa vào embedding input.
Tài nguyên được đóng gói cùng ứng dụng (src-tauri/assets/semantic/)
4 Quét mã nguồn và quy tắc loại trừ tệp
Các phần mở rộng được lập chỉ mục (APP_SOURCE_EXTENSIONS)
Tối đa 2.000 tệp, tổng dung lượng 64 MiB
Thư mục bị loại trừ (EXCLUDED_DIRECTORY_NAMES)
Mọi thư mục có tên bắt đầu bằng dấu chấm (.git, .vscode, .config...) cùng các thư mục chứa thư viện phụ thuộc, bản
dựng và dữ liệu sinh ra:
Khôi phục khi WalkDir gặp lỗi
SemanticError).
skipped_files += 1, thêm cảnh báo an toàn và
tiếp tục quét.
5 Lưu trữ vector bằng SQLite và sqlite-vec
Cấu trúc bảng vector ảo
CREATE VIRTUAL TABLE IF NOT EXISTS
semantic_vectors USING vec0(
searchable boolean,
embedding float[384]
);
Lưu trữ tại: <app-cache>/semantic/<project-hash>.sqlite
(Trong đó project-hash là mã băm BLAKE3 của đường dẫn dự án đã chuẩn hóa).
graph_symbols và
graph_edges nằm trong cùng cơ sở dữ liệu nhưng không
tham gia vector retrieval. Freshness được kiểm soát theo content hash của từng file.
Điều phối truy cập đồng thời
Sử dụng hai khóa Mutex trong cấu trúc SemanticRuntimeState:
-
runtime:
Mutex<Option<SemanticRuntime>>
Bảo vệ việc khởi tạo khi cần và tái sử dụng mô hình cùng bộ tách token.
-
operation_lock: Mutex<()>
Xử lý tuần tự toàn bộ tác vụ ngữ nghĩa từ lúc quét đến khi xếp hạng.
busy_timeout(5s).
6 Xếp hạng
Hiệu chỉnh cấu trúc: Điểm cộng hoặc trừ trực tiếp dựa trên tín hiệu như khớp chính xác tên ký hiệu, khai báo hàm hoặc khối impl thực tế, hằng số giới hạn, trừ điểm nếu chỉ chứa chú thích (-) hoặc câu lệnh import (-).
rank_candidates() hoặc
select_ranked_chunks*(). Graph chỉ được truy vấn sau khi
selected chunks, thứ tự, vector distance và source byte budget đã được đóng băng.
7 AST chuẩn hóa và Code Graph
Lớp dữ liệu bổ sung giúp giải thích quan hệ quanh source đã được Semantic Context chọn.
AST chuẩn hóa
Các parser Tree-sitter chuyển cú pháp riêng của từng ngôn ngữ thành mô hình chung chỉ giữ dữ liệu cần cho Code Graph: declaration, import, reference và source range.
Quan hệ Code Graph
| Tín hiệu AST | Quan hệ graph |
|---|---|
| Call / ConstructorCall | Calls |
| TypeUse / ValueUse | Uses |
| Extend | Extends |
| Implement | Implements |
| TestTarget | Tests |
| Import | Imports — lưu nhưng không render |
Thứ tự không thể đảo ngược
Retrieve → Rank → Select → Freeze
↓
Resolve Code Graph
↓
Render source → Append graph section
Cô lập lỗi
- Lỗi AST hoặc graph không làm mất semantic source Markdown hợp lệ.
- Graph không khớp content hash không được truy vấn.
- Target mơ hồ bị bỏ thay vì suy đoán.
- Không có relation hợp lệ thì toàn bộ graph section được bỏ qua.
Hợp đồng Markdown
# Semantic Context
## path/to/file.rs | `selected_symbol` | function | lines 10-40
```rust
// Nội dung source gốc của chunk đã chọn
```
## Code Graph Context for Selected Symbols
### `path/to/file.rs::selected_symbol`
- **Calls:** `target_symbol`
`path/to/target.rs`
Phần source phía trước graph heading phải giữ nguyên byte-for-byte. Ngân sách graph được áp dụng riêng và không trừ vào giới hạn 64 KiB của source chunks.
8 Nguồn tham chiếu kỹ thuật
Các tệp mã nguồn dưới đây là nguồn đối chiếu chính khi nội dung tài liệu có mâu thuẫn.
| Nội dung | Tệp mã nguồn tham chiếu |
|---|
9 Các quyết định kiến trúc hiện tại
Mô hình và ONNX Runtime được đóng gói trực tiếp cùng ứng dụng macOS/x86_64.
Tệp cơ sở dữ liệu riêng biệt theo mã băm đường dẫn gốc, tự động dọn dẹp bản ghi cũ.
Toàn bộ luồng quét → index → retrieval → graph → render được bảo vệ bằng khóa Mutex operation_lock.
Cảnh báo trả về giao diện không chứa đường dẫn tuyệt đối hoặc thư mục cá nhân của người dùng.
Graph chạy sau final selection và không thay đổi chunk, thứ tự, distance, score, source budget hoặc source content.
Resolver chỉ giữ target duy nhất, project-local và đủ tin cậy; relation mơ hồ được loại bỏ.