จาก Deep Text Classification สู่ AST: แนวคิด AI แบบ Recursive ที่ได้รับแรงบันดาลใจจาก Lisp, Compiler และ Minimax

ในยุคที่ AI ส่วนใหญ่ขับเคลื่อนด้วย Transformer และ Large Language Models (LLMs) เรามักคุ้นเคยกับสถาปัตยกรรมแบบ

ข้อความ
    ↓
Transformer
    ↓
คำตอบ

แต่จะเป็นอย่างไร หากเราเปลี่ยนมุมมองจากการ "ทำนายคำถัดไป" (Next Token Prediction) ไปเป็นการ "สร้างโครงสร้างความคิด" (Structure Prediction) ก่อน แล้วค่อยประมวลผลแบบ Recursive?

บทความนี้เป็นการสำรวจแนวคิดการแปลงข้อความธรรมชาติให้กลายเป็น AST (Abstract Syntax Tree) แล้วใช้ Python ทำหน้าที่เป็น Recursive Engine คล้ายกับ Compiler, Lisp Interpreter และระบบค้นหาแบบ Minimax


จุดเริ่มต้น: จาก Minimax สู่ AST

แรงบันดาลใจหนึ่งมาจากชื่อบริษัท AI ของจีนชื่อ MiniMax

แม้บริษัทจะไม่ได้ใช้ Minimax Algorithm โดยตรง แต่ชื่อดังกล่าวชวนให้นึกถึงแนวคิดการค้นหาต้นไม้ (Tree Search)

Game State
    ↓
Move Tree
    ↓
Evaluate
    ↓
Best Move

เมื่อนำแนวคิดเดียวกันมาใช้กับภาษา

Raw Text
    ↓
AST Candidates
    ↓
Evaluate
    ↓
Best Interpretation

เราจะได้ระบบที่ไม่ได้พยายามตอบทันที แต่พยายาม "ตีความข้อความ" ให้กลายเป็นโครงสร้างก่อน


AST คืออะไร?

AST ย่อมาจาก

Abstract Syntax Tree

เป็นโครงสร้างต้นไม้ที่แทนความหมายของข้อความหรือโค้ด

ตัวอย่าง

1 + 2 * 3

AST จะเป็น

    +
   / \
  1   *
     / \
    2   3

เนื่องจากการคูณต้องเกิดก่อนการบวก

ในโลกของภาษาไทย

ถ้า hp ต่ำกว่า 30 ให้ใช้ยา

สามารถแทนเป็น

if
├── hp < 30
└── use_potion

ได้เช่นกัน


ทำไม Lisp ถึงเกี่ยวข้อง?

Lisp เป็นภาษาที่โด่งดังในวงการ AI ยุคแรก

เพราะแนวคิด

Code = Data

ตัวอย่าง

(if (< hp 30)
    (use_potion))

จริง ๆ แล้วคือ Tree

if
├── <
│   ├── hp
│   └── 30
└── use_potion

ซึ่งสามารถประมวลผลแบบ Recursive ได้ง่ายมาก


Python ก็คิดแบบ Lisp ได้

แม้จะไม่ได้เขียน Lisp จริง ๆ

เราสามารถเก็บ AST ในรูป List ได้

[
    "if",
    ["<", "hp", 30],
    ["use_potion"]
]

หรือ JSON

{
    "type": "if",
    "condition": {
        "type": "lt",
        "left": "hp",
        "right": 30
    },
    "action": {
        "type": "use_potion"
    }
}

ซึ่งมีความหมายเหมือนกันทุกประการ


แนวคิดหลัก: Text → AST → Function

แทนที่จะทำ

ข้อความ
    ↓
LLM
    ↓
คำตอบ

เราอาจทำ

ข้อความ
    ↓
Parser
    ↓
AST
    ↓
Recursive Evaluator
    ↓
Function Call

ตัวอย่าง

เปิดไฟห้องนอน

แปลงเป็น

[
    "turn_on_light",
    "bedroom"
]

จากนั้นเรียก

turn_on_light("bedroom")

Label ก่อน สร้าง AST ทีหลัง

หนึ่งในแนวคิดที่น่าสนใจคือ

แทนที่จะให้โมเดลสร้าง AST ทั้งต้น

ให้โมเดลทำหน้าที่ติด Label

ถ้า hp ต่ำกว่า 30 ให้ใช้ยา

กลายเป็น

IF
VARIABLE(hp)
OPERATOR(<)
NUMBER(30)
ACTION(use_potion)

จากนั้น Python จึงนำ Labels ไปสร้าง AST

ข้อดีคือ

  • ใช้ Dataset น้อยลง

  • Debug ง่าย

  • อธิบายได้

  • ตรวจ Syntax Error ได้ทันที


Syntax Error แบบภาษาโปรแกรม

เมื่อมี Label แล้ว

ประโยค

ถ้า hp ต่ำกว่า ให้ใช้ยา

จะกลายเป็น

IF
VARIABLE(hp)
OPERATOR(<)
ACTION(use_potion)

Parser พบว่า

VARIABLE
OPERATOR
???

ขาด NUMBER

จึงรายงานได้ว่า

Syntax Error

Expected NUMBER after OPERATOR

คล้าย Compiler ของภาษาโปรแกรม


Recursive Parsing: งูเหลือมกินควาย

แทนที่จะให้โมเดลเข้าใจทุกอย่างพร้อมกัน

อาจแบ่งเป็นชั้น

ถ้า hp ต่ำกว่า 30 ให้ใช้ยา
ไม่งั้นถ้ามีศัตรูใกล้ให้โจมตี
ไม่งั้นกลับเมือง

แตกเป็น

IF
├── Condition
├── Action
└── Else

จากนั้น Else ถูกส่งเข้า Parser อีกครั้ง

IF
├── enemy_near
├── attack
└── go_town

กระบวนการนี้เกิดซ้ำไปเรื่อย ๆ

เหมือนงูเหลือมที่ค่อย ๆ กลืนเหยื่อทีละส่วน


เมื่อ Confidence ต่ำ

ถ้าประโยคกำกวม

เอายาที่อยู่ในกล่องแดงให้คนที่ยืนข้างหมอ

อาจตีความได้หลายแบบ

AST #1
AST #2
AST #3

แทนที่จะเลือกทันที

ระบบสามารถสร้าง Candidate หลายตัว

แล้วใช้ Scoring Function เลือกต้นไม้ที่ดีที่สุด

Generate
    ↓
Score
    ↓
Select

แนวคิดนี้คล้าย

  • Minimax

  • Beam Search

  • Monte Carlo Tree Search

  • AlphaGo


ซ่อม AST แทนการเดาข้อความใหม่

เมื่อ Parser พบ Error

hp <

ระบบสามารถสร้าง Candidate Fix

hp < 10
hp < 20
hp < 30

แล้วประเมินคะแนน

แทนที่จะให้โมเดลสร้างข้อความใหม่ทั้งหมด

ข้อดีคือ

  • แก้เฉพาะจุด

  • อธิบายได้

  • ตรวจสอบได้

  • ควบคุมได้


รูปแบบ Dataset ที่เป็นไปได้

แบบ Text → AST

{
  "input": "ถ้า hp ต่ำกว่า 30 ให้ใช้ยา",
  "output": [
    "if",
    ["<", "hp", 30],
    ["use_potion"]
  ]
}

แบบ Labeling

{
  "text": "hp",
  "label": "VARIABLE"
}
{
  "text": "ต่ำกว่า",
  "label": "OPERATOR_LT"
}
{
  "text": "30",
  "label": "NUMBER"
}

แบบ Recursive Node Classification

{
  "node": "ถ้า hp ต่ำกว่า 30 ให้ใช้ยา",
  "type": "if"
}

แล้วค่อยแตกเป็น Node ย่อย


สถาปัตยกรรมที่เป็นไปได้

ภาพรวมของระบบ

Raw Text
    ↓
Labeler
    ↓
Parser
    ↓
AST
    ↓
Executor

เมื่อเกิด Error

AST Error
    ↓
Repair Engine
    ↓
Generate Candidates
    ↓
Score
    ↓
Fixed AST

สรุป

แนวคิดนี้เป็นการผสมผสานข้อดีจากหลายโลกเข้าด้วยกัน

  • Lisp ให้แนวคิด Code = Data

  • Compiler ให้แนวคิด AST และ Syntax Checking

  • Minimax ให้แนวคิด Tree Search

  • Python ให้ Ecosystem และ Recursive Processing

  • Deep Learning ให้ความสามารถในการจำแนกและตีความข้อความ

แทนที่จะพึ่งโมเดลขนาดใหญ่ให้คิดทุกอย่างในครั้งเดียว

ระบบสามารถ

ข้อความ
    ↓
Label
    ↓
AST
    ↓
Recursive Search
    ↓
Function
    ↓
ผลลัพธ์

ได้อย่างเป็นระบบ อธิบายได้ และตรวจสอบได้

ซึ่งในบางโดเมน เช่น Game AI, Home Automation, ERP, Workflow Engine, MCP Router หรือ Agent Framework แนวทางนี้อาจมีประสิทธิภาพและควบคุมได้ดีกว่าการใช้ LLM แบบ End-to-End เพียงอย่างเดียว

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

รับติดตั้งระบบป้ายโฆษณาดิจิตอล Digital Signage ตั้งเวลาทำงานและควบคุมผ่าน Internet ได้

แจกฟรี ระบบแสดงคิวงาน สำหรับร้านนวด สปา หรือ ร้านทำผม

บริการออกแบบ Character Agent สำหรับธุรกิจ

ป้ายดิจิตอลที่โต้ตอบได้