How to use from
vLLM
# Gated model: Login with a HF token with gated access permission
hf auth login
Install from pip and serve model
# Install vLLM from pip:
pip install vllm
# Start the vLLM server:
vllm serve "jester6136/nuextract3-lora-386"
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:8000/v1/chat/completions" \
	-H "Content-Type: application/json" \
	--data '{
		"model": "jester6136/nuextract3-lora-386",
		"messages": [
			{
				"role": "user",
				"content": [
					{
						"type": "text",
						"text": "Describe this image in one sentence."
					},
					{
						"type": "image_url",
						"image_url": {
							"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
						}
					}
				]
			}
		]
	}'
Use Docker
docker model run hf.co/jester6136/nuextract3-lora-386
Quick Links

You need to agree to share your contact information to access this model

This repository is publicly accessible, but you have to accept the conditions to access its files and content.

Log in or Sign Up to review the conditions and access this model content.

NuExtract3 LoRA — Bản kê khai tài sản, thu nhập hằng năm (schema v14)

LoRA adapter fine-tune từ numind/NuExtract3 cho tác vụ trích xuất thông tin từ "Bản kê khai tài sản, thu nhập hằng năm" (mẫu kê khai tài sản cán bộ, công chức Việt Nam) — theo template schema_ban_ke_khai_v14.json đính kèm trong repo này.

⚠️ Bắt buộc: phải truyền schema_ban_ke_khai_v14.json làm template lúc inference

NuExtract3 là model schema-driven — không có template kèm theo, model không biết trích xuất theo cấu trúc nào. Template KHÔNG BAO GIỜ được bake cứng vào adapter, phải truyền kèm mỗi lần gọi qua chat_template_kwargs.

Dữ liệu train

  • 386 hồ sơ thật (347 train / 12 eval / 27 test — tỉ lệ 90/3/7), remap từ schema cũ sang schema v14 (đã sửa nhiều bug cấu trúc so với schema gốc: field object-đơn thay vì mảng gây mất dữ liệu, field trùng lặp/chết, chuẩn hoá đơn_vị_tiền_tệ về mã ISO thay vì text tự do "đồng"/"đ"/"tiền Việt Nam"...).
  • 3 epoch, LoRA r=16/alpha=16, train_loss cuối = 0.01524.

✅ Kết quả đánh giá (McNemar, 27 hồ sơ test, chưa từng thấy lúc train)

Leaf-accuracy Đúng/Tổng
Baseline (numind/NuExtract3 zero-shot, KHÔNG LoRA) 69.7% 1153/1655
LoRA (adapter này) 87.7% 1451/1655

McNemar exact p-value (2 phía) = 0.0000 → cải thiện có ý nghĩa thống kê thật sự (p<0.05), ĐẠT ngưỡng deploy theo tiêu chí dự án (McNemar exact test, không chỉ so accuracy thô — accuracy thô có thể trùng hợp ngẫu nhiên trên mẫu test nhỏ, McNemar mới xác nhận chênh lệch không phải nhiễu).

Bất đối xứng: 326 trường hợp LoRA đúng trong khi baseline sai, ngược lại chỉ 28 trường hợp — LoRA thắng áp đảo, gần như không có chiều ngược lại đáng kể.

Field bịa ngoài schema (model tự thêm key không có trong template — lỗi định dạng, không tính vào accuracy trên): baseline = 212 lần, LoRA = 13 lần. LoRA cũng bám sát cấu trúc template tốt hơn hẳn.

Kết luận chính: fine-tune giúp model học được QUY ƯỚC CHUẨN HOÁ mà zero-shot không thể đoán được

Nhìn theo từng field (bảng đầy đủ bên dưới), phần lớn cải thiện lớn nhất đến từ các field đơn_vị_tiền_tệ — hơn 15 field loại này baseline đạt đúng 0% (vì zero-shot chỉ chép lại nguyên văn chữ trên form: "đồng", "đ", "tiền Việt Nam"...) trong khi LoRA đạt 100% (học được quy ước gán "VND" nhất quán từ dữ liệu train đã chuẩn hoá). Đây là ví dụ rõ nhất cho việc: zero-shot không thể tự suy ra được 1 quy ước chuẩn hoá nếu form gốc không ghi đúng như vậy — phải học từ dữ liệu gán nhãn.

Ngoài ra LoRA cải thiện mạnh ở các field địa chỉ chi tiết (nơi_thường_trú.địa_chỉ_chi_tiết +47.6 điểm %, nguồn_gốc_hình_thành của thửa đất +45.5 điểm %) và tên người ký (+15.4 điểm %) — các field cần đọc hiểu ngữ cảnh/viết tắt trên form thật, đúng kiểu tác vụ fine-tune giúp ích nhiều nhất.

Một số field n nhỏ (1-7 mẫu) bị giảm nhẹ — khả năng cao là nhiễu thống kê do mẫu quá nhỏ, không phải xu hướng thật (vd nhà_ở[].nguồn_gốc_hình_thành n=7: 57.1%→14.3%). Cần theo dõi thêm khi có tập test lớn hơn trước khi kết luận đây là quy luật.

Bảng chi tiết accuracy từng field (122 field, sắp xếp tệ→tốt theo LoRA)
Trường n Baseline LoRA Δ
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].quốc_gia 16 0.000 0.000 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].quốc_gia 6 0.000 0.000 +0.000
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].hiện_trạng_quản_lý 5 0.000 0.000 +0.000
tài_sản.tài_sản_có_giá_trị_khác[].nguồn_gốc_hình_thành 4 0.000 0.000 +0.000
tài_sản.tài_sản_có_giá_trị_khác[].đơn_vị_tính 4 0.250 0.000 -0.250
tài_sản.tài_sản_có_giá_trị_khác[].ghi_chú 4 0.250 0.000 -0.250
người_kê_khai.nơi_ở_hiện_tại.phường_xã 3 0.333 0.000 -0.333
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_người_kê_khai.thu_nhập_lương_phụ_cấp 2 0.000 0.000 +0.000
người_kê_khai.ngạch_công_chức 1 1.000 0.000 -1.000
vợ_chồng.nơi_ở_hiện_tại.phường_xã 1 0.000 0.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].số_tiền_ngoại_tệ 1 0.000 0.000 +0.000
tài_sản.tài_sản_có_giá_trị_khác[].hiện_trạng_quản_lý 1 0.000 0.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].tên_tổ_chức 1 0.000 0.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].đơn_vị_ngoại_tệ 1 0.000 0.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].số_tài_khoản_sổ_tiết_kiệm 1 0.000 0.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].tài_liệu_chứng_minh 1 0.000 0.000 +0.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_vợ_chồng.thu_nhập_lương_phụ_cấp 1 0.000 0.000 +0.000
tài_sản.chứng_khoán.giấy_tờ_có_giá_khác[].giá_trị 1 0.000 0.000 +0.000
tài_sản.chứng_khoán.giấy_tờ_có_giá_khác[].đơn_vị_tiền_tệ 1 0.000 0.000 +0.000
tài_sản.chứng_khoán.giấy_tờ_có_giá_khác[].tài_liệu_chứng_minh 1 0.000 0.000 +0.000
tài_sản.chứng_khoán.giấy_tờ_có_giá_khác[].tên_giấy_tờ 1 0.000 0.000 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].nguồn_gốc_hình_thành 7 0.571 0.143 -0.429
biến_động_tài_sản_thu_nhập.tăng_thêm[].mô_tả_tài_sản_thu_nhập 4 0.500 0.250 -0.250
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].ghi_chú 4 0.000 0.250 +0.250
tài_sản.nhà_ở_và_công_trình.nhà_ở[].hiện_trạng_quản_lý 3 0.667 0.333 -0.333
người_kê_khai.nơi_ở_hiện_tại.địa_chỉ_chi_tiết 3 0.333 0.333 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].đơn_vị_tiền_tệ 8 0.000 0.375 +0.375
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].ghi_chú 5 0.400 0.400 +0.000
biến_động_tài_sản_thu_nhập.tăng_thêm[].giải_trình_nguồn_gốc 4 0.500 0.500 +0.000
con_chưa_thành_niên[].nơi_ở_hiện_tại.phường_xã 4 0.500 0.500 +0.000
tài_sản.chứng_khoán.danh_mục_chứng_khoán[].loại_chứng_khoán 2 1.000 0.500 -0.500
tài_sản.chứng_khoán.danh_mục_chứng_khoán[].đơn_vị_tiền_tệ 2 0.000 0.500 +0.500
tài_sản.chứng_khoán.danh_mục_chứng_khoán[].giá_trị 2 1.000 0.500 -0.500
tài_sản.chứng_khoán.danh_mục_chứng_khoán[].tên 2 1.000 0.500 -0.500
tài_sản.chứng_khoán.danh_mục_chứng_khoán[].số_lượng 2 1.000 0.500 -0.500
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_chung.tổng 2 0.000 0.500 +0.500
biến_động_tài_sản_thu_nhập.tăng_thêm[].đơn_vị_tiền_tệ 5 0.000 0.600 +0.600
biến_động_tài_sản_thu_nhập.tăng_thêm[].nhóm_tài_sản_tham_chiếu 5 0.400 0.600 +0.200
biến_động_tài_sản_thu_nhập.tăng_thêm[].giá_trị 5 0.800 0.600 -0.200
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].vị_trí.phường_xã 32 0.594 0.656 +0.062
tài_sản.nhà_ở_và_công_trình.nhà_ở[].ghi_chú 6 0.500 0.667 +0.167
người_kê_khai.nơi_ở_hiện_tại.tỉnh_thành_phố 3 1.000 0.667 -0.333
con_chưa_thành_niên[].nơi_ở_hiện_tại.địa_chỉ_chi_tiết 3 0.667 0.667 +0.000
tài_sản.tài_sản_có_giá_trị_khác[].số_lượng 3 0.667 0.667 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].số_giấy_chứng_nhận_sở_hữu 19 0.632 0.684 +0.053
tài_sản.nhà_ở_và_công_trình.nhà_ở[].vị_trí.phường_xã 21 0.667 0.714 +0.048
con_chưa_thành_niên[].nơi_ở_hiện_tại.tỉnh_thành_phố 4 0.750 0.750 +0.000
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].số_giấy_chứng_nhận_quyền_sử_dụng_đất 32 0.719 0.781 +0.062
tài_sản.nhà_ở_và_công_trình.nhà_ở[].vị_trí.địa_chỉ_chi_tiết 21 0.524 0.810 +0.286
người_kê_khai.nơi_thường_trú.địa_chỉ_chi_tiết 21 0.333 0.810 +0.476
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].nguồn_gốc_hình_thành 11 0.364 0.818 +0.455
con_chưa_thành_niên[].nơi_thường_trú.địa_chỉ_chi_tiết 24 0.458 0.833 +0.375
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].vị_trí.địa_chỉ_chi_tiết 32 0.531 0.844 +0.312
người_kê_khai.nơi_thường_trú.phường_xã 21 0.762 0.857 +0.095
người_kê_khai.ngày_sinh 22 0.864 0.864 +0.000
người_kê_khai.nơi_làm_việc 22 0.818 0.864 +0.045
con_chưa_thành_niên[].nơi_thường_trú.phường_xã 24 0.750 0.875 +0.125
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].loại_tiền_gửi 8 0.000 0.875 +0.875
tài_sản.tiền_mặt_và_tiền_gửi.tiền_gửi[].số_dư_tại_thời_điểm_kê_khai 8 0.875 0.875 +0.000
con_chưa_thành_niên[].giấy_tờ_tùy_thân.nơi_cấp 8 0.875 0.875 +0.000
con_chưa_thành_niên[].giấy_tờ_tùy_thân.ngày_cấp 8 0.875 0.875 +0.000
vợ_chồng.nơi_thường_trú.phường_xã 17 0.765 0.882 +0.118
vợ_chồng.nơi_làm_việc 17 0.824 0.882 +0.059
vợ_chồng.nơi_thường_trú.địa_chỉ_chi_tiết 17 0.353 0.882 +0.529
vợ_chồng.giấy_tờ_tùy_thân.nơi_cấp 19 0.842 0.895 +0.053
chữ_ký[].tên_người_ký 39 0.744 0.897 +0.154
vợ_chồng.họ_và_tên 20 0.900 0.900 +0.000
người_kê_khai.giấy_tờ_tùy_thân.nơi_cấp 22 0.864 0.909 +0.045
con_chưa_thành_niên[].giấy_tờ_tùy_thân.số_giấy_tờ_tùy_thân 11 0.818 0.909 +0.091
tài_sản.tài_sản_có_giá_trị_khác[].tên_tài_sản 24 0.833 0.917 +0.083
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].số_thứ_tự_thửa_đất 32 0.938 0.938 +0.000
vợ_chồng.nơi_thường_trú.tỉnh_thành_phố 18 0.944 0.944 +0.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_vợ_chồng.tổng 19 0.895 0.947 +0.053
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.tổng_cộng.tổng 21 0.905 0.952 +0.048
tài_sản.nhà_ở_và_công_trình.nhà_ở[].loại_nhà_ở 21 1.000 0.952 -0.048
người_kê_khai.nơi_thường_trú.tỉnh_thành_phố 21 1.000 0.952 -0.048
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_người_kê_khai.tổng 22 0.909 0.955 +0.045
thông_tin_văn_bản.ngày_kê_khai 22 0.955 0.955 +0.000
thông_tin_văn_bản.hình_thức_kê_khai 22 0.955 0.955 +0.000
người_kê_khai.họ_và_tên 22 0.955 0.955 +0.000
người_kê_khai.chức_vụ 22 0.909 0.955 +0.045
tài_sản.tài_sản_có_giá_trị_khác[].số_đăng_ký 22 0.818 0.955 +0.136
tài_sản.tài_sản_có_giá_trị_khác[].nhóm_tài_sản 25 0.800 0.960 +0.160
tài_sản.tài_sản_có_giá_trị_khác[].đơn_vị_tiền_tệ 25 0.000 0.960 +0.960
tài_sản.tài_sản_có_giá_trị_khác[].giá_trị 25 0.800 0.960 +0.160
con_chưa_thành_niên[].họ_và_tên 26 0.962 0.962 +0.000
chữ_ký[].vai_trò_người_ký 39 1.000 1.000 +0.000
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].loại_đất 32 0.969 1.000 +0.031
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].vị_trí.tỉnh_thành_phố 32 0.938 1.000 +0.062
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].đơn_vị_tiền_tệ 32 0.000 1.000 +1.000
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].diện_tích_m2 32 1.000 1.000 +0.000
con_chưa_thành_niên[].ngày_sinh 26 1.000 1.000 +0.000
con_chưa_thành_niên[].số_thứ_tự_con 26 0.962 1.000 +0.038
con_chưa_thành_niên[].nơi_thường_trú.tỉnh_thành_phố 24 1.000 1.000 +0.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.tổng_cộng.đơn_vị_tiền_tệ 22 0.000 1.000 +1.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_con_chưa_thành_niên.đơn_vị_tiền_tệ 22 0.000 1.000 +1.000
người_kê_khai.giấy_tờ_tùy_thân.số_giấy_tờ_tùy_thân 22 1.000 1.000 +0.000
người_kê_khai.giấy_tờ_tùy_thân.ngày_cấp 22 1.000 1.000 +0.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_vợ_chồng.đơn_vị_tiền_tệ 22 0.000 1.000 +1.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_chung.đơn_vị_tiền_tệ 22 0.000 1.000 +1.000
tài_sản.thu_nhập_giữa_hai_lần_kê_khai.thu_nhập_người_kê_khai.đơn_vị_tiền_tệ 22 0.000 1.000 +1.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].diện_tích_sử_dụng_m2 21 1.000 1.000 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].số_thứ_tự_nhà 21 1.000 1.000 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].đơn_vị_tiền_tệ 21 0.000 1.000 +1.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].vị_trí.tỉnh_thành_phố 21 1.000 1.000 +0.000
tài_sản.quyền_sử_dụng_đất.các_thửa_đất[].giá_trị 21 0.952 1.000 +0.048
vợ_chồng.nghề_nghiệp_chức_vụ 20 0.950 1.000 +0.050
vợ_chồng.ngày_sinh 20 1.000 1.000 +0.000
vợ_chồng.giấy_tờ_tùy_thân.ngày_cấp 19 1.000 1.000 +0.000
vợ_chồng.giấy_tờ_tùy_thân.số_giấy_tờ_tùy_thân 19 1.000 1.000 +0.000
tài_sản.nhà_ở_và_công_trình.nhà_ở[].giá_trị 11 0.909 1.000 +0.091
tài_sản.tiền_mặt_và_tiền_gửi.đơn_vị_tiền_tệ 7 0.000 1.000 +1.000
tài_sản.tiền_mặt_và_tiền_gửi.tổng_số_tiền 7 0.571 1.000 +0.429
tài_sản.tài_sản_gắn_liền_với_đất.cây_lâu_năm[].đơn_vị_tiền_tệ 2 0.000 1.000 +1.000
tài_sản.tài_sản_gắn_liền_với_đất.cây_lâu_năm[].số_lượng 2 1.000 1.000 +0.000
tài_sản.tài_sản_gắn_liền_với_đất.cây_lâu_năm[].loại_cây 2 1.000 1.000 +0.000
tài_sản.tài_sản_gắn_liền_với_đất.cây_lâu_năm[].giá_trị 2 1.000 1.000 +0.000
biến_động_tài_sản_thu_nhập.giảm_đi[].mô_tả_tài_sản_thu_nhập 1 1.000 1.000 +0.000
biến_động_tài_sản_thu_nhập.giảm_đi[].giá_trị 1 1.000 1.000 +0.000
biến_động_tài_sản_thu_nhập.giảm_đi[].lý_do_giảm 1 1.000 1.000 +0.000
biến_động_tài_sản_thu_nhập.giảm_đi[].đơn_vị_tiền_tệ 1 0.000 1.000 +1.000
biến_động_tài_sản_thu_nhập.giảm_đi[].nhóm_tài_sản_tham_chiếu 1 1.000 1.000 +0.000
vợ_chồng.nơi_ở_hiện_tại.địa_chỉ_chi_tiết 1 1.000 1.000 +0.000
vợ_chồng.nơi_ở_hiện_tại.tỉnh_thành_phố 1 1.000 1.000 +0.000
tài_sản.tài_khoản_ở_nước_ngoài[].quốc_gia 1 1.000 1.000 +0.000
tài_sản.tiền_mặt_và_tiền_gửi.tiền_mặt_tại_nhà[].số_tiền 1 1.000 1.000 +0.000
tài_sản.tài_khoản_ở_nước_ngoài[].tên_chủ_tài_khoản 1 1.000 1.000 +0.000
tài_sản.tài_khoản_ở_nước_ngoài[].tên_ngân_hàng_tổ_chức 1 1.000 1.000 +0.000
tài_sản.tài_khoản_ở_nước_ngoài[].số_tài_khoản 1 1.000 1.000 +0.000

Cả 2 model gọi qua cùng 1 request format, cùng template schema_ban_ke_khai_v14.json, temperature=0 — baseline dùng numind/NuExtract3 gốc, LoRA dùng adapter này. So bằng McNemar exact test (paired, per leaf-field) theo đúng chuẩn dự án gốc — không chỉ so accuracy thô (dễ gây hiểu nhầm với mẫu test nhỏ).

Cách dùng (qua vLLM, đúng format production)

vllm serve numind/NuExtract3 \
    --enable-lora --lora-modules nuextract-lora=<đường dẫn tải adapter về> \
    --max-lora-rank 16 --trust-remote-code --dtype bfloat16
import json
import openai

template = json.load(open("schema_ban_ke_khai_v14.json", encoding="utf-8"))  # tải kèm trong repo này
client = openai.OpenAI(base_url="http://localhost:8000/v1", api_key="none")

content = [{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}
           for b64 in images_b64]  # ảnh trang tài liệu, base64
resp = client.chat.completions.create(
    model="nuextract-lora",
    messages=[{"role": "user", "content": content}],
    extra_body={"chat_template_kwargs": {"template": json.dumps(template, ensure_ascii=False),
                                          "enable_thinking": False}},
    temperature=0.0,
    max_tokens=4096,
)
result = json.loads(resp.choices[0].message.content)
Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for jester6136/nuextract3-lora-386

Finetuned
Qwen/Qwen3.5-4B
Adapter
(1)
this model