CircleZone 2.0 70M

ภาษาไทย · English

โมเดลภาษาขนาด 70.3 ล้านพารามิเตอร์ ที่ออกแบบและเทรนขึ้นเองตั้งแต่ศูนย์บนการ์ดจอโน้ตบุ๊กใบเดียว

A 70.3M-parameter language model designed and trained from scratch on a single laptop GPU.


ภาษาไทย

นี่คืออะไร

CircleZone 2.0 70M คือโมเดลภาษาขนาดเล็ก (Small Language Model) สำหรับแชทแบบเป็นกันเอง ทั้งภาษาไทยและภาษาอังกฤษ เขียนโค้ดสถาปัตยกรรมเองและเทรนจากค่าสุ่มตั้งแต่ศูนย์บน NVIDIA RTX 4060 Laptop (8 GB) ไม่ได้นำโมเดลของผู้อื่นมาปรับแต่งต่อ

เป้าหมายของโปรเจกต์คือดูว่าโมเดลที่เล็กพอจะเทรนบนคอมพิวเตอร์ส่วนตัวได้ จะเรียนรู้ภาษาได้มากแค่ไหน ผลคือโมเดลเรียงประโยคภาษาไทยและภาษาอังกฤษได้ถูกไวยากรณ์ และตอบโต้ได้ถูกจังหวะแบบคนคุยกัน แต่ไม่มีความรู้ที่เชื่อถือได้เกี่ยวกับโลกจริง

ทำงานยังไง

โมเดลมีหน้าที่เดียวคือ ทายคำถัดไป ข้อความถูกหั่นเป็นชิ้นเล็กๆ เรียกว่า token แล้วโมเดลคำนวณว่า token ถัดไปน่าจะเป็นอะไร สุ่มเลือกหนึ่งตัว ต่อท้าย แล้วทำซ้ำไปเรื่อยๆ จนได้ประโยค

ความสามารถในการคุยไม่ได้ถูกเขียนเป็นกฎไว้ แต่เกิดจากการเห็นบทสนทนาหลายแสนบทระหว่างเทรน จนจับรูปแบบได้ว่าเมื่อมีคนทัก ควรตอบกลับแบบไหน

สถาปัตยกรรม

เป็น Transformer แบบ decoder-only ตระกูลเดียวกับ GPT, Llama และ Qwen โดยโครงสร้างตรงกับ Qwen3 ทุกส่วน จึงใช้กับ LM Studio, llama.cpp, Ollama และ transformers ได้ทันที

  • Attention แบบ GQA — ให้แต่ละคำมองย้อนไปหาคำก่อนหน้าที่เกี่ยวข้อง 10 หัวฝั่งถาม แชร์หน่วยความจำ 5 ชุด ประหยัดหน่วยความจำครึ่งหนึ่ง
  • RoPE — ระบุตำแหน่งของคำด้วยการหมุนเวกเตอร์ ทำให้รู้ระยะห่างระหว่างคำ
  • QK-Norm — ปรับขนาดก่อนคำนวณ attention ช่วยให้เทรนนิ่ง
  • SwiGLU — ชั้นประมวลผลที่เก็บความรู้ส่วนใหญ่ของโมเดล
  • RMSNorm — ปรับสเกลตัวเลขให้นิ่งก่อนเข้าแต่ละขั้น
  • Weight tying — ชั้นแปลงคำเป็นเวกเตอร์ใช้เมทริกซ์เดียวกับชั้นแปลงกลับเป็นคำ ประหยัด 15.7 ล้านพารามิเตอร์

การเทรน

เทรน 12,600 steps เห็นข้อความรวมราว 387 ล้าน tokens จากชุดข้อมูลราว 281 ล้าน tokens (อ่านวนราว 1.4 รอบ) ใช้ความแม่นยำ bf16, AdamW, learning rate แบบ warmup + cosine และหยุดเองเมื่อเริ่มท่องจำแทนที่จะเข้าใจ

ข้อมูลผสมสองภาษาราวครึ่งต่อครึ่ง: ภาษาอังกฤษจากนิทานสั้น บทความ และบทสนทนาจริง ภาษาไทยจากวิกิพีเดีย ข่าว เว็บไทย และถาม-ตอบภาษาไทย พร้อมบทคุยเล่นภาษาไทยที่เขียนเพิ่มเอง (เพราะหาข้อมูลจริงแทบไม่ได้) ผลสุดท้ายได้ validation loss 2.8944 (perplexity ≈ 18 คือเวลาทายคำถัดไป โมเดลลังเลอยู่ระหว่างราว 18 ตัวเลือก)

โหมดคิดก่อนตอบ

หลังเทรนพื้นฐาน โมเดลถูก fine-tune ต่ออีก 500 steps ให้ คิดก่อนตอบ แบบเดียวกับ โมเดล reasoning: เขียนความคิดไว้ใน <think> ... </think> แล้วค่อยตอบ (LM Studio จะแสดงความคิด แยกเป็นช่องพับได้)

ตามจริง: ประโยคแรกของความคิดมักจับใจความคำถามได้ถูก แต่เนื้อหาหลังจากนั้นมักมั่ว โมเดลขนาด 70M เลียนแบบ "รูปแบบ" การคิดได้ แต่ยังใช้เหตุผลหลายขั้นไม่ได้จริง

ข้อจำกัด

  • ไม่มีความรู้ที่เชื่อถือได้ — 70 ล้านพารามิเตอร์ไม่พอเก็บข้อเท็จจริง โมเดลจะแต่งชื่อ สถานที่ และข้อมูลขึ้นเองอย่างมั่นใจ
  • อาจพูดหยาบหรือไม่เหมาะสม — ส่วนหนึ่งของข้อมูลเทรนเป็นแชทจริงจาก Discord
  • จำบริบทได้แค่ 512 tokens — คุยยาวเกินราว 5-10 เทิร์นจะเริ่มหลุด
  • ความคิดและบทคุยเล่นภาษาไทยบางส่วนมาจากแม่แบบ — ไม่มีข้อมูลการคิดภาษาไทยจริง ความคิดภาษาไทยจึงซ้ำๆ และคำทักทาย/ปลอบใจจะคล้ายกันบ่อย
  • ใน LM Studio / llama.cpp คำย่อภาษาอังกฤษ (don't, I'm) ถูกหั่นต่างจากตอนเทรนเล็กน้อย เพราะ llama.cpp ไม่มีตัวหั่นคำที่ตรงกับตอนเทรนทั้งสองภาษา จึงเลือกให้ภาษาไทยตรงเป๊ะ
  • เป็นโปรเจกต์เพื่อการเรียนรู้ ไม่เหมาะกับการใช้งานจริงใดๆ

English

What is this

CircleZone 2.0 70M is a small language model for casual chat in both Thai and English. The architecture was written by hand and the weights were trained from random initialization on a single NVIDIA RTX 4060 Laptop GPU (8 GB) — it is not a fine-tune of anyone else's model.

The goal was to see how much language a model small enough to train on a personal computer can learn. It writes grammatical Thai and English and replies with natural conversational timing, but has no reliable knowledge about the real world.

How it works

The model does one thing: predict the next token. Text is split into small pieces (tokens); the model scores every possible next token, samples one, appends it, and repeats until a reply is formed.

Nothing about chatting is hard-coded. The behaviour comes from seeing hundreds of thousands of conversations during training and picking up the patterns.

Architecture

A decoder-only Transformer in the same family as GPT, Llama and Qwen. Every component matches Qwen3, so it runs in LM Studio, llama.cpp, Ollama and transformers as-is.

  • Grouped-query attention — each token looks back at relevant earlier tokens; 10 query heads share 5 key/value heads, halving attention memory
  • RoPE — encodes token positions by rotating vectors, so the model knows how far apart words are
  • QK-Norm — normalizes queries and keys before attention for stable training
  • SwiGLU — the feed-forward layers that hold most of the model's knowledge
  • RMSNorm — keeps activations at a stable scale between steps
  • Tied embeddings — the input and output layers share one matrix, saving 15.7M parameters

Training

12,600 steps covering ~387M tokens of text from a ~281M tokens dataset (about 1.4 passes), with bf16 precision, AdamW, warmup + cosine learning-rate schedule, and early stopping when the model starts memorizing instead of generalizing.

The data is roughly half English (short stories, articles, real conversations) and half Thai (Wikipedia, news, web text, Thai Q&A), plus hand-written Thai small-talk conversations because real ones are almost impossible to find. Final validation loss is 2.8944 (perplexity ≈ 18: when predicting the next token, the model is choosing among roughly 18 candidates).

Thinking mode

After pre-training, the model was fine-tuned for 500 more steps to think before answering, like reasoning models: it writes its thoughts inside <think> ... </think> and then replies (LM Studio shows the thoughts in a collapsible block).

Honestly: the first sentence of a thought usually restates the question correctly, but what follows is mostly nonsense. A 70M model can imitate the shape of reasoning, not real multi-step reasoning.

Limitations

  • No reliable knowledge — 70M parameters cannot store facts; it confidently invents names, places and details
  • May be rude or inappropriate — part of the training data is real Discord chat
  • 512-token context — conversations longer than ~5-10 turns degrade
  • Some Thai thoughts and small talk come from templates — there is no real Thai reasoning data, so Thai thoughts are repetitive
  • In LM Studio / llama.cpp English contractions (don't, I'm) are tokenized slightly differently from training; llama.cpp has no pre-tokenizer matching both languages, so Thai was made exact
  • A learning project — not suitable for any real-world use

สเปก / Specifications

Parameters / พารามิเตอร์ 70,304,896 (70.3M)
Layers × width / ชั้น × ความกว้าง 12 × 640
Attention heads (query / KV) 10 / 5, head dim 64
Feed-forward size 1728
Context / ความจำบริบท 512 tokens
Vocabulary / พจนานุกรม 24,576 (byte-level BPE)
Training steps 12,600 pre-training + 500 thinking fine-tune
Validation loss (pre-training) 2.8944 (perplexity 18.1)
Thinking mode / คิดก่อนตอบ Yes — <think> ... </think>
Hardware NVIDIA RTX 4060 Laptop, 8 GB

การแบ่งพารามิเตอร์ / Parameter breakdown

ส่วน / Component จำนวน / Count สัดส่วน / Share
SwiGLU feed-forward (12 layers) 39,813,120 56.6%
Attention (12 layers) 14,745,600 21.0%
Embedding (shared with output) 15,728,640 22.4%
RMSNorm 17,536 0.02%
รวม / Total 70,304,896 100%

แต่ละชั้นมี 4,547,968 พารามิเตอร์ · Each layer has 4,547,968 parameters.

ตัวอย่างคำตอบ / Example replies

คำตอบจริงจากโมเดล ไม่ได้คัดเลือก · Real, unedited samples.

คุณ / You: สวัสดีครับ
💭 ผู้ใช้ทักทายมา ควรทักทายกลับอย่างเป็นมิตรและชวนคุยต่อ
CircleZone 2.0 70M: อยู่ค่ะ มีอะไรให้ช่วยบอกได้เลยนะ

คุณ / You: คุณชื่ออะไร
💭 ผู้ใช้ถามว่าเป็นใคร ควรแนะนำตัวว่าชื่อ CircleZone เป็น AI ตัวเล็ก
CircleZone 2.0 70M: ผมคือ CircleZone ครับ เป็นโมเดลภาษาขนาดเล็กที่คุยได้ทั้งไทยและอังกฤษ

คุณ / You: วันนี้เหนื่อยมาก
💭 ผู้ใช้บอกว่าเหนื่อย ควรให้กำลังใจและแนะนำให้พักผ่อน
CircleZone 2.0 70M: ทำงานหนักมาทั้งวันเลยสินะคะ ลองพักสักหน่อยไหม

คุณ / You: หิวแล้ว กินอะไรดี
💭 ผู้ใช้อยากได้คำแนะนำเรื่องอาหาร ลองเสนออาหารไทยที่หาง่าย
CircleZone 2.0 70M: อากาศแบบนี้ก๋วยเตี๋ยวร้อนๆ สักชามก็น่ากินนะครับ

คุณ / You: hello, how are you?
💭 Okay, the user just said "Hi". I need to respond appropriately. Let me check if there's any other way they're doing or if they want to chat. First, maybe start with a greeting like "Hello!" and offer assistance. Then, offer help. Maybe ask how I can assist them today. Keep it simple and open-ended. Make sure the tone is welcoming and helpful. No need for any markdown here because markdown should be in English, in all cases you might see. Also, consider using an emoji to keep the response light and approachable. Let me check if there's anything else that needs help with. Alright, time to send that response.
CircleZone 2.0 70M: Hello! How can I assist you today?

คุณ / You: what is a comet?
💭 Okay, the user asked about a comet. Let me start by recalling the basic definition. A comet is a sequence of events in which they occur together. But maybe I should break it down more. First, I should mention the first number: Domains in a specified time (e.g., Earth, planet). That might help clarify the connection between the stars and planets, but since it's not just Earth, it's the number of stars that are visible to Earth. So, the general answer is 1/2^5 + 1/6^5 = 3/12^9/2564. The user asked about its location, which is around the Sun.
CircleZone 2.0 70M: A comet is a sequence of events in which they occur together in an event that includes all other events (like planets, planets, planets, and more) in an event that includes every star or region in time (e.g., Earth, planet). It’s usually short on the main focus from the Sun but with some seasonal events happening at the end.

ผลทดสอบมาตรฐาน / Benchmarks

วัดด้วย lm-evaluation-harness 0.4.13 แบบ 0-shot ไม่ใช้ chat template และไม่เปิดโหมดคิด ค่าเป็น % ความแม่น ± ค่าคลาดเคลื่อนมาตรฐาน ARC, HellaSwag, PIQA และ Global-PIQA ใช้ acc_norm ชุดอื่นใช้ acc

Measured with lm-evaluation-harness 0.4.13, 0-shot, no chat template, thinking off. Values are % accuracy ± standard error; acc_norm for ARC, HellaSwag, PIQA and Global-PIQA, acc elsewhere.

Benchmark ภาษา / Lang เดาสุ่ม / Random CircleZone 1.0 33M CircleZone 2.0 70M
XCOPA-th th 50% 53.4 ± 2.2 55.6 ± 2.2
Belebele-th th 25% 22.7 ± 1.4 24.2 ± 1.4
Global-PIQA-th th 25% 27.2 ± 4.4 21.4 ± 4.1
ARC-Easy en 25% 30.8 ± 0.9 32.5 ± 1.0
ARC-Challenge en 25% 21.8 ± 1.2 22.4 ± 1.2
HellaSwag en 25% 27.1 ± 0.4 27.0 ± 0.4
PIQA en 50% 56.0 ± 1.2 54.7 ± 1.2
Winogrande en 50% 50.1 ± 1.4 50.0 ± 1.4
LAMBADA en 0% 15.0 ± 0.5 16.7 ± 0.5
LAMBADA perplexity ↓ en – 586 726

สรุปตามจริง — ข้อสอบส่วนใหญ่ได้ใกล้การเดาสุ่ม ซึ่งเป็นเรื่องปกติของโมเดลขนาดต่ำกว่า 100M ที่สูงกว่าสุ่มชัดเจนมีแค่ ARC-Easy, PIQA และ LAMBADA (HellaSwag สูงกว่าแค่ราว 2 จุด) ภาษาไทยมีแค่ XCOPA-th ที่สูงกว่าสุ่มเล็กน้อย Belebele มีบทความยาวเกิน context 512 tokens จึงถูกตัดหัวบทความ 2.0 ถูก fine-tune โหมดคิดก่อนวัด ซึ่งทำให้ perplexity ของ LAMBADA สูงขึ้น (ทดลองกับ 1.0 พบว่า perplexity เพิ่มจาก 586 เป็นราว 1,500 หลังสอนคิด)

Honest summary — most tasks are at chance, as expected below 100M parameters. Only ARC-Easy, PIQA and LAMBADA are clearly above chance (HellaSwag by only ~2 points); in Thai only XCOPA-th is slightly above. Belebele passages exceed the 512-token context and get truncated. 2.0 was fine-tuned for thinking before evaluation, which raises LAMBADA perplexity (on 1.0 the same fine-tune moved it from 586 to ~1,500).

ผลดิบ / Raw results: benchmarks/

วิธีใช้ / Usage

LM Studio — ค้นหา IAMPOOM/CircleZone-2.0-70M แล้วดาวน์โหลด CircleZone-2.0-70M-Think-F16.gguf · ตั้ง context ไม่เกิน 512 Search for IAMPOOM/CircleZone-2.0-70M and download CircleZone-2.0-70M-Think-F16.gguf. Keep context at 512 or below.

ถ้าความคิดปนอยู่ในคำตอบ ให้เปิดการแยกความคิด (Reasoning section parsing) ในตั้งค่าโมเดล โดยใช้ <think> เป็นตัวเริ่ม และ </think> เป็นตัวจบ If thoughts appear inside the reply, enable reasoning section parsing in the model settings with start string <think> and end string </think>.

transformers

from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("IAMPOOM/CircleZone-2.0-70M")
model = AutoModelForCausalLM.from_pretrained("IAMPOOM/CircleZone-2.0-70M")

msgs = [{"role": "user", "content": "hello, how are you?"}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
out = model.generate(ids, max_new_tokens=60)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))

ข้อมูลที่ใช้เทรน / Training data

ใบอนุญาต / License

ข้อมูลเทรนบางส่วนอนุญาตเฉพาะการใช้แบบไม่แสวงกำไร โมเดลนี้จึงเผยแพร่ภายใต้ cc-by-nc-4.0 ห้ามใช้เชิงพาณิชย์

Some training data is licensed for non-commercial use only, so this model is released under cc-by-nc-4.0.

Downloads last month
34
Safetensors
Model size
70.3M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Datasets used to train IAMPOOM/CircleZone-2.0-70M

Evaluation results