173 lines
5.7 KiB
Markdown
173 lines
5.7 KiB
Markdown
|
|
---
|
|||
|
|
language:
|
|||
|
|
- vi
|
|||
|
|
- en
|
|||
|
|
license: apache-2.0
|
|||
|
|
base_model: Qwen/Qwen3-4B-Instruct-2507
|
|||
|
|
tags:
|
|||
|
|
- qwen3
|
|||
|
|
- accounting
|
|||
|
|
- vietnamese
|
|||
|
|
- kế-toán
|
|||
|
|
- thông-tư-133
|
|||
|
|
- fine-tuned
|
|||
|
|
- cot
|
|||
|
|
- chain-of-thought
|
|||
|
|
datasets:
|
|||
|
|
- custom-tt133
|
|||
|
|
pipeline_tag: text-generation
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# AAI Accountant — TT133 v1.1
|
|||
|
|
|
|||
|
|
**AI tư vấn kế toán chuyên biệt cho Thông tư 133/2016/TT-BTC** (Chế độ kế toán doanh nghiệp nhỏ và vừa Việt Nam)
|
|||
|
|
|
|||
|
|
**Phiên bản 1.1** (Cải tiến: tăng độ chính xác câu trả lời, giảm halluciation)
|
|||
|
|
|
|||
|
|
## Thông tin mô hình
|
|||
|
|
|
|||
|
|
| Thuộc tính | Giá trị |
|
|||
|
|
|---|---|
|
|||
|
|
| Base model | `Qwen/Qwen3-4B-Instruct-2507` |
|
|||
|
|
| Fine-tune method | LoRA FP16 (rank=32, RSLoRA) | *(✅ FIX B-08)*
|
|||
|
|
| Dataset | 1484 samples từ TT133 + Phụ lục biểu mẫu + Nghiệp vụ|
|
|||
|
|
| Language | Tiếng Việt (kế toán) |
|
|||
|
|
| Context length | 4096 tokens |
|
|||
|
|
| Format | ChatML + `<think>...</think>` CoT |
|
|||
|
|
|
|||
|
|
## Khả năng
|
|||
|
|
|
|||
|
|
- ✅ **Hướng dẫn định khoản kế toán** theo TT133 (Nợ/Có, TK XXX)
|
|||
|
|
- ✅ **Giải thích điều khoản** — trả lời câu hỏi về 91 Điều của TT133
|
|||
|
|
- ✅ **Biểu mẫu BCTC** — hướng dẫn điền B01-DNN, B02-DNN, B09-DNN...
|
|||
|
|
- ✅ **Danh mục tài khoản** — tra cứu mã TK, phân loại, bút toán điển hình
|
|||
|
|
- ✅ **Chain-of-Thought** — suy luận từng bước rõ ràng trước khi trả lời
|
|||
|
|
|
|||
|
|
## Dataset breakdown
|
|||
|
|
|
|||
|
|
| Loại nội dung | Samples | % |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Văn bản (Điều khoản chung) | 267 | 18% |
|
|||
|
|
| Nguyên tắc kế toán | 249 | 17% |
|
|||
|
|
| Biểu mẫu (Phụ lục) | 358 | 24% |
|
|||
|
|
| Ví dụ | 72 | 5% |
|
|||
|
|
| Định khoản Nợ/Có | 447 | 30% |
|
|||
|
|
| Phụ lục chung | 91 | 6% |
|
|||
|
|
|
|||
|
|
## Cách dùng
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer
|
|||
|
|
import torch
|
|||
|
|
|
|||
|
|
model_id = 'steve-nguyen/aai-accountant-tt133-v1.1'
|
|||
|
|
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
|||
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|||
|
|
model_id, torch_dtype=torch.float16, device_map='auto'
|
|||
|
|
)
|
|||
|
|
# System prompt
|
|||
|
|
SYSTEM_STRICT = '''Bạn là AI kế toán chuyên biệt theo Thông tư 133/2016/TT-BTC.
|
|||
|
|
QUY TẮC BẮT BUỘC:
|
|||
|
|
1. Chỉ nhắc các TK có thật trong TT133 (TK 111–911, theo danh mục TT133)
|
|||
|
|
2. Khi hỏi về B01-DNN/B02-DNN, trả lời đúng mapping: Mã số → TK nguồn
|
|||
|
|
3. Nếu không chắc chắn 100%, nói rõ: "Cần kiểm tra lại với văn bản TT133"
|
|||
|
|
4. Không liệt kê TK theo pattern số tăng dần nếu không chắc
|
|||
|
|
Nguyên tắc: Chính xác > Đầy đủ. Thà ít mà đúng hơn nhiều mà sai.'''
|
|||
|
|
|
|||
|
|
def ask(question, max_new_tokens=1024):
|
|||
|
|
messages = [
|
|||
|
|
{'role': 'system', 'content': SYSTEM_STRICT},
|
|||
|
|
{'role': 'user', 'content': question},
|
|||
|
|
]
|
|||
|
|
chat_text = tokenizer.apply_chat_template(
|
|||
|
|
messages, tokenize=False, add_generation_prompt=True,
|
|||
|
|
enable_thinking=True,
|
|||
|
|
)
|
|||
|
|
encoded = tokenizer(chat_text, return_tensors='pt').to('cuda')
|
|||
|
|
prompt_len = encoded['input_ids'].shape[1]
|
|||
|
|
|
|||
|
|
with torch.no_grad():
|
|||
|
|
outputs = model.generate(
|
|||
|
|
**encoded,
|
|||
|
|
max_new_tokens = max_new_tokens,
|
|||
|
|
do_sample = True,
|
|||
|
|
temperature = 0.1,
|
|||
|
|
top_p = 0.9,
|
|||
|
|
repetition_penalty = 1.05,
|
|||
|
|
eos_token_id = tokenizer.eos_token_id,
|
|||
|
|
pad_token_id = tokenizer.eos_token_id,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
text = tokenizer.decode(outputs[0][prompt_len:], skip_special_tokens=True)
|
|||
|
|
|
|||
|
|
import re
|
|||
|
|
text = re.sub(r'<think>.*?</think>', '', text, flags=re.DOTALL).strip()
|
|||
|
|
return text
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
chat_text = tokenizer.apply_chat_template(
|
|||
|
|
messages,
|
|||
|
|
tokenize=False,
|
|||
|
|
add_generation_prompt=True,
|
|||
|
|
enable_thinking=False,
|
|||
|
|
)
|
|||
|
|
except TypeError:
|
|||
|
|
chat_text = tokenizer.apply_chat_template(
|
|||
|
|
messages, tokenize=False, add_generation_prompt=True,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
encoded = tokenizer(
|
|||
|
|
chat_text, return_tensors='pt', return_attention_mask=True,
|
|||
|
|
).to('cuda')
|
|||
|
|
|
|||
|
|
input_ids = encoded['input_ids']
|
|||
|
|
attention_mask = encoded['attention_mask']
|
|||
|
|
prompt_len = input_ids.shape[1]
|
|||
|
|
|
|||
|
|
with torch.no_grad():
|
|||
|
|
outputs = model.generate(
|
|||
|
|
input_ids = input_ids,
|
|||
|
|
attention_mask = attention_mask,
|
|||
|
|
max_new_tokens = max_new_tokens,
|
|||
|
|
do_sample = False,
|
|||
|
|
temperature = 1.0,
|
|||
|
|
repetition_penalty = 1.1,
|
|||
|
|
no_repeat_ngram_size = 5,
|
|||
|
|
eos_token_id = tokenizer.eos_token_id,
|
|||
|
|
pad_token_id = tokenizer.eos_token_id,
|
|||
|
|
use_cache = True,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
generated = outputs[0][prompt_len:]
|
|||
|
|
text = tokenizer.decode(generated, skip_special_tokens=True)
|
|||
|
|
|
|||
|
|
import re
|
|||
|
|
text = re.sub(r'<think>.*?</think>', '', text, flags=re.DOTALL).strip()
|
|||
|
|
return text
|
|||
|
|
|
|||
|
|
print('✅ ask() sẵn sàng — inference mode ON')
|
|||
|
|
print(' enable_thinking=False | do_sample=False (greedy decoding)')
|
|||
|
|
|
|||
|
|
#Đặt câu hỏi
|
|||
|
|
q1 = 'Công ty ABC mua hàng hóa giá 100 triệu đồng, chưa trả tiền người bán. Hãy định khoản nghiệp vụ này theo TT133.'
|
|||
|
|
print('='*60)
|
|||
|
|
print('❓', q1)
|
|||
|
|
print('='*60)
|
|||
|
|
print(ask(q1))
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Lưu ý
|
|||
|
|
|
|||
|
|
- Mô hình được tối ưu cho **Thông tư 133** (Doanh nghiệp Vừa và Nhỏ).
|
|||
|
|
- Một số trường hợp Mô hình trả lời không đúng yêu cầu, chỉ cần điều chình System prompt (SYSTEM_STRICT).
|
|||
|
|
- Luôn kiểm tra lại bút toán với kế toán viên — AI có thể mắc lỗi trong các trường hợp phức tạp.
|
|||
|
|
- Không áp dụng cho mục đích pháp lý mà không có xác nhận chuyên môn.
|
|||
|
|
|
|||
|
|
## License
|
|||
|
|
|
|||
|
|
Apache 2.0 — kế thừa từ Qwen3-4B-Instruct.
|
|||
|
|
|
|||
|
|
## Góp ý
|
|||
|
|
|
|||
|
|
Mọi ý kiến đóng góp xin gởi vào email: anh.nd@outlook.com
|