สร้าง AI Agent แปลง Fleeting Notes เป็น Permanent Notes: ยกระดับความคิดจดเร็วสู่โน้ตถาวรอัจฉริยะด้วย Python + Ollama

แก้ปัญหาโน้ตจดเร็ว (Fleeting Notes) พอกพูนจนกลายเป็นสุสานไอเดีย ด้วยการสร้าง AI Agent ส่วนตัวที่จะช่วยเกลา ขยายความ และแปลงบันทึกย่อของคุณให้เป็น Permanent Notes ตามหลัก Zettelkasten แบบ Local 100%

Share
สร้าง AI Agent แปลง Fleeting Notes เป็น Permanent Notes: ยกระดับความคิดจดเร็วสู่โน้ตถาวรอัจฉริยะด้วย Python + Ollama

เมื่อใดก็ตามที่เราเกิดไอเดียใหม่ๆ ขึ้นมาในหัว ไม่ว่าจะเป็นขณะกำลังฟังพ็อดคาสท์ อ่านบทความ หรือระหว่างการเดินทาง สิ่งที่ดีที่สุดที่เราทำได้คือการรีบจดบันทึกมันลงไปทันที สิ่งนี้เรียกว่า "Fleeting Note (โน้ตจดเร็ว)" ในระบบจดบันทึกแบบ Zettelkasten หรือสมองส่วนที่สอง (Second Brain)

โน้ตจดเร็วเหล่านี้มักจะเป็นคำย่อ ประโยคสั้นๆ หรือแนวคิดดิบๆ ที่ไม่มีโครงสร้างที่ชัดเจน ปัญหาสำคัญที่หลายคนเจอคือ เมื่อเวลาผ่านไป โน้ตจดเร็วเหล่านี้จะพอกพูนขึ้นเรื่อยๆ จนกลายเป็น "สุสานไอเดีย" เพราะเราไม่มีเวลาหรือพลังสมองเพียงพอที่จะกลับมาอ่าน ขยายความ และเรียบเรียงพวกมันให้กลายเป็น "Permanent Note (โน้ตถาวร)" ซึ่งเป็นโน้ตที่มีใจความเดียว ชัดเจนในตัวเอง (Atomic Note) และพร้อมนำไปเชื่อมโยงกับความรู้อื่นๆ ในระยะยาว

เพื่อลดแรงต้านในกระบวนการนี้ เราสามารถใช้ Cognitive Automation เข้ามาช่วยผ่อนแรงสมองได้ ในบทความนี้ เราจะมาสร้าง AI Agent ส่วนตัวที่ประมวลผลภายในเครื่องแบบ Local 100% ด้วย Python และ Ollama เพื่อทำหน้าที่สแกนกล่องข้อความจดเร็ว (Fleeting Inbox) จากนั้นเกลาเนื้อหา ขยายไอเดียดิบให้สมบูรณ์ และบันทึกมันเป็นโน้ตถาวรที่พร้อมใช้งานใน Obsidian ทันที


ทำไมต้องแปลง Fleeting Notes เป็น Permanent Notes?

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

  • Fleeting Note: เปรียบเสมือนรอยเหน็บไอเดียชั่วคราว เช่น "ไอเดียทำคลิป: AI ทำงานแทนคนในบ้าน" ซึ่งในอีก 3 เดือนข้างหน้าคุณอาจจะลืมไปแล้วว่าต้องการจะสื่ออะไรกันแน่
  • Permanent Note: เป็นโน้ตที่ผ่านการเรียบเรียงและตกผลึกแล้ว บรรจุแนวคิดเดียวอย่างสมบูรณ์แบบที่ใครมาอ่าน (รวมถึงตัวคุณเองในอนาคต) ก็สามารถเข้าใจเนื้อหาและบริบทได้ทันทีโดยไม่ต้องพึ่งพาเอกสารอื่น

การใช้ Local AI ในการขยายความและจัดโครงสร้างโน้ตถาวร ช่วยป้องกันไม่ให้ไอเดียสดใหม่ของคุณสูญหาย และที่สำคัญที่สุดคือ ความเป็นส่วนตัวและความปลอดภัยของข้อมูล (Data Privacy) เนื่องจากไอเดียและความคิดดิบของคุณจะไม่ถูกส่งไปยังคลาวด์ภายนอกเพื่อใช้ในการเทรนโมเดลเลย


โครงสร้างการทำงานของ Fleeting to Permanent Agent

ระบบนี้ถูกออกแบบมาให้เป็นวงจรแบบอัตโนมัติและไร้การพึ่งพาไลบรารีภายนอก (Zero-dependency) โดยมีขั้นตอนหลักดังนี้:

  1. การดึงข้อมูล (Scan): ค้นหาไฟล์ .md ทั้งหมดในโฟลเดอร์ Fleeting ของ Obsidian Vault
  2. การเรียบเรียง (Formulate): ส่งเนื้อหาทีละโน้ตไปยัง Ollama เพื่อให้โมเดล AI ช่วยแปลงประโยคย่อ ขยายความ และจัดโครงสร้าง Markdown ตามเทมเพลต Zettelkasten ที่กำหนด
  3. การบันทึกและย้ายไฟล์ (Store & Archive): บันทึกโน้ตถาวรฉบับใหม่ที่ได้ลงในโฟลเดอร์ Permanent และทำการย้ายไฟล์โน้ตจดเร็วเดิมไปยังโฟลเดอร์ Archive เพื่อป้องกันการประมวลผลซ้ำ (Idempotency)

สิ่งที่ต้องจัดเตรียมก่อนเริ่มต้น

ขอให้ตรวจสอบว่าคุณมีเครื่องมือเหล่านี้ติดตั้งในระบบเรียบร้อยแล้ว:

  • Python 3: สำหรับรันสคริปต์ควบคุมหลัก
  • Ollama: ติดตั้งและเปิดรันในเครื่องแล้ว (ดาวน์โหลดฟรีที่ ollama.com)
  • Obsidian: แอปพลิเคชันจดโน้ต หรือจะใช้โฟลเดอร์ไฟล์ทั่วไปก็ได้

ในโปรเจกต์นี้เราจะเลือกใช้โมเดลภาษาขนาดเล็กที่มีความสามารถโดดเด่น เช่น gemma2 หรือ llama3.2 ที่ทำงานได้ดีกับภาษาไทยออฟไลน์ โดยสามารถติดตั้งได้ผ่าน Terminal:

ollama pull gemma2

เขียนสคริปต์ Python สำหรับ Fleeting to Permanent Agent

สร้างไฟล์ชื่อ fleeting_agent.py ในเครื่องของคุณ และระบุโค้ด Python ต่อไปนี้:

import os
import urllib.request
import json
import shutil
import re
from datetime import datetime

# ================= ตั้งค่าระบบ (Configuration) =================
# ปรับเปลี่ยนพาร์ทโฟลเดอร์ให้ตรงกับ Obsidian Vault ของคุณ
OBSIDIAN_VAULT_PATH = "/home/linn/notes"
FLEETING_DIR = os.path.join(OBSIDIAN_VAULT_PATH, "Fleeting")
PERMANENT_DIR = os.path.join(OBSIDIAN_VAULT_PATH, "Permanent")
ARCHIVE_DIR = os.path.join(OBSIDIAN_VAULT_PATH, "Archive")
LLM_MODEL = "gemma2"  # เปลี่ยนเป็น llama3.2 หรือโมเดลอื่นตามต้องการ
# =============================================================

def init_folders():
    """สร้างโฟลเดอร์ที่จำเป็นหากยังไม่มีในระบบ"""
    for folder in [FLEETING_DIR, PERMANENT_DIR, ARCHIVE_DIR]:
        os.makedirs(folder, exist_ok=True)

def read_fleeting_notes():
    """ดึงข้อมูลไฟล์โน้ตดิบทั้งหมดในโฟลเดอร์ Fleeting"""
    notes = []
    for file_name in os.listdir(FLEETING_DIR):
        if file_name.endswith(".md"):
            file_path = os.path.join(FLEETING_DIR, file_name)
            notes.append((file_name, file_path))
    return notes

def call_ollama(content):
    """ส่งโน้ตดิบให้ Ollama ช่วยจัดรูปและขยายความตามโครงสร้าง Zettelkasten"""
    url = "http://localhost:11434/api/generate"

    prompt = f"""
คุณคือ AI Agent ผู้เชี่ยวชาญด้านการจัดการความรู้ส่วนบุคคล (PKM) และระบบ Zettelkasten
หน้าที่ของคุณคือการแปลง "Fleeting Note (โน้ตจดเร็ว)" ต่อไปนี้ ให้เป็น "Permanent Note (โน้ตถาวร)" ภาษาไทยที่สละสลวย เข้าใจง่าย และพร้อมใช้งานในระยะยาว

ข้อกำหนดของ Permanent Note:
1. เป็นโน้ตแบบอะตอมมิก (Atomic Note) บรรจุเพียง 1 ไอเดียหรือแนวคิดสำคัญเป็นหลัก
2. ขยายความแนวคิดดิบหรือลายแทงไอเดียสั้นๆ ให้กลายเป็นข้อความที่สมบูรณ์และกระจ่างในตัวเอง
3. สรุปใจความหลักเป็นหัวข้อย่อยและเนื้อหาที่นำไปปรับใช้ได้จริง

[ข้อมูล Fleeting Note]
{content}

[โครงสร้าง Permanent Note ที่ต้องการให้คุณส่งกลับ]
กรุณาตอบกลับในรูปแบบ Markdown ตามโครงสร้างและหัวข้อนี้เท่านั้น (ห้ามพูดเกริ่นนำหรือลงท้ายใดๆ ทั้งสิ้น):

---
title: "<ตั้งชื่อโน้ตภาษาไทยที่ระบุแนวคิดหลักชัดเจน>"
date: "{datetime.now().strftime('%Y-%m-%d')}"
tags: ["cognitive-automation", "second-brain"]
---

# <ชื่อโน้ตภาษาไทย>

## 💡 แนวคิดหลัก (Core Concept)
<เขียนอธิบายแนวคิดนี้อย่างละเอียด 3-5 ประโยค ให้เข้าใจง่ายในตัวเอง>

## 🔍 รายละเอียดและบริบท (Details & Context)
<อธิบายขยายความเพิ่มเติมเชิงทฤษฎี วิธีการ หรือตัวอย่างประยุกต์ใช้งานจริง>

## 🔗 ลิงก์เชื่อมโยง (Connections)
- [[Zettelkasten]]
- [[Second Brain]]
- [ระบุชื่อโน้ตหรือไอเดียที่เกี่ยวข้องอื่นๆ]
"""

    payload = {
        "model": LLM_MODEL,
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.3
        }
    }

    try:
        req = urllib.request.Request(
            url,
            data=json.dumps(payload).encode("utf-8"),
            headers={"Content-Type": "application/json"}
        )
        with urllib.request.urlopen(req) as res:
            response_data = json.loads(res.read().decode("utf-8"))
            return response_data.get("response", "").strip()
    except Exception as e:
        print(f"❌ เกิดข้อผิดพลาดในการเชื่อมต่อ Ollama: {str(e)}")
        return None

def process_notes():
    init_folders()
    fleeting_notes = read_fleeting_notes()

    if not fleeting_notes:
        print("📭 ไม่พบ Fleeting Notes ใหม่ในโฟลเดอร์ที่กำหนด")
        return

    print(f"🚀 พบ Fleeting Notes รอประมวลผลจำนวน {len(fleeting_notes)} ไฟล์")

    for file_name, file_path in fleeting_notes:
        print(f"\n📄 กำลังประมวลผลไฟล์: {file_name}...")

        try:
            with open(file_path, "r", encoding="utf-8") as f:
                content = f.read().strip()

            if len(content) < 5:
                print(f"⚠️ เนื้อหาในไฟล์ {file_name} สั้นเกินไป ข้ามการประมวลผล")
                continue

            # ส่งเนื้อหาให้ AI ประมวลผล
            permanent_content = call_ollama(content)

            if not permanent_content:
                print(f"⚠️ ไม่สามารถเรียบเรียงเนื้อหาสำหรับ {file_name} ได้")
                continue

            # สกัดหาหัวข้อเพื่อตั้งชื่อไฟล์ใหม่แบบเป็นมิตร
            title_match = re.search(r'title:\s*"(.*?)"', permanent_content)
            if title_match:
                new_title = title_match.group(1)
                # แปลงอักษรที่ไม่เหมาะสมสำหรับตั้งชื่อไฟล์
                safe_title = re.sub(r'[\/:*?"<>|]', '', new_title).strip()
                new_file_name = f"{safe_title}.md"
            else:
                new_file_name = f"permanent-{file_name}"

            new_file_path = os.path.join(PERMANENT_DIR, new_file_name)

            # บันทึกเป็น Permanent Note
            with open(new_file_path, "w", encoding="utf-8") as f:
                f.write(permanent_content)
            print(f"📝 สร้าง Permanent Note สำเร็จ: {new_file_name}")

            # ย้าย Fleeting Note ไปยัง Archive
            archive_path = os.path.join(ARCHIVE_DIR, file_name)
            shutil.move(file_path, archive_path)
            print(f"📦 ย้ายไฟล์จดเร็วไปยังโฟลเดอร์อาร์ไคฟ์เรียบร้อย")

        except Exception as e:
            print(f"❌ เกิดข้อผิดพลาดขณะจัดการไฟล์ {file_name}: {str(e)}")

if __name__ == "__main__":
    process_notes()

เจาะลึกเทคนิคการปรับปรุงประสิทธิภาพของ Agent

เพื่อประโยชน์สูงสุดในการใช้งานจริง สคริปต์นี้สอดแทรกแนวคิดและการออกแบบที่สำคัญ 3 ประการ:

  1. ระบบหลีกเลี่ยงงานซ้ำซ้อน (Archive State): เมื่อบันทึก Permanent Note สำเร็จแล้ว สคริปต์จะใช้ shutil.move เพื่อย้ายไฟล์ Fleeting Note ดั้งเดิมออกทันที ทำให้การรันสคริปต์ซ้ำหลายรอบไม่เกิดการประมวลผลไฟล์เดิมซ้ำ ช่วยประหยัดเวลาและพลังงานสมอง
  2. การตั้งชื่อไฟล์อัจฉริยะ (Smart Renaming): ตัว Agent จะทำหน้าที่ดึงค่าจาก Frontmatter title ที่ AI ร่างขึ้นมาและกำจัดอักขระพิเศษออก ก่อนนำมาตั้งเป็นชื่อไฟล์ใหม่โดยอัตโนมัติ ทำให้ไฟล์โน้ตใน Obsidian มีความสวยงามและสะท้อนเนื้อหาภายในชัดเจนโดยที่คุณไม่ต้องเปลี่ยนชื่อเอง
  3. การจำกัดอุณหภูมิการคิดสร้างสรรค์ (Low Temperature Option): กำหนดค่า temperature ของ Ollama ไว้ที่ 0.3 เพื่อลดความก้าวร้าวในการคิดและควบคุมไม่ให้ AI นึกจินตนาการเรื่องนอกกรอบจนเกินไป เน้นการขยายความและจัดรูปความคิดตามข้อมูลจริงใน Fleeting Note เท่านั้น

วิธีนำไปใช้และปรับแต่งชีวิตการทำโน้ต

หากคุณอยากให้ระบบ Cognitive Automation นี้ประมวลผลสมองอย่างสมบูรณ์แบบ ให้ทดลองวางระบบการจดดังนี้:

  • จดอย่างรวดเร็ว (Inbox): ในระหว่างวัน ให้จดโน้ตสั้นๆ เช่น ไอเดียโปรเจกต์ ลิงก์ที่ชอบ หรือคีย์เวิร์ดที่เพิ่งเรียนรู้ลงในแอปจดโน้ตบนมือถือ หรือโยนเข้าโฟลเดอร์ /Fleeting/ โดยตรง
  • ตั้งเวลาประมวลผลอัตโนมัติ: รันสคริปต์ทุกค่ำวันทำงานผ่านระบบ Cron Job (สำหรับ macOS/Linux) หรือ Task Scheduler (สำหรับ Windows) เพื่อให้ระบบสแกนและแปลงร่างไอเดียดิบของคุณให้กลายเป็นเครือข่ายความรู้ถาวรที่พร้อมสำหรับสัปดาห์ใหม่
  • ทบทวนเชื่อมโยง (Human-in-the-loop): เมื่อ AI แปลงโน้ตถาวรเรียบร้อยแล้ว ให้สละเวลา 5-10 นาทีในการเปิดโฟลเดอร์ /Permanent/ เพื่อตรวจทานและใส่ลิงก์เชื่อมโยงระหว่างโน้ตหลัก (Wiki links [[ ]]) ด้วยตนเองเพื่อให้สอดคล้องกับเส้นทางการคิดเฉพาะตัวของคุณ

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

Read more

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python + Ollama

เปลี่ยนเอกสารและโน้ตข้อความร้อยแก้วให้เป็น Knowledge Graph แบบโครงสร้าง (Subject-Predicate-Object) โดยอัตโนมัติ ด้วยสคริปต์ Python ร่วมกับ Local LLM ในเครื่อง ช่วยสกัดความสัมพันธ์ระหว่างความคิด เทคโนโลยี และบุคคลอย่างเป็นระบบออฟไลน์ 100%

By Linn
บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

เปลี่ยนคลังหนังสือเสียงและดิจิทัลไฟล์ของคุณให้กลายเป็นเซิร์ฟเวอร์สตรีมมิ่งส่วนตัว ด้วย Audiobookshelf บน Home Server ผ่าน Docker พร้อมวิธีซิงค์ความคืบหน้าการฟังข้ามอุปกรณ์แบบเรียลไทม์

By Linn
สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + O

สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + Ollama

เปลี่ยนไฮไลต์และโน้ตย่อยจากการอ่านหนังสือให้กลายเป็น Book Summary ที่ทรงคุณค่าด้วย AI Agent ออฟไลน์ส่วนตัวที่จะสกัด Core Key Takeaways, Actionable Insights และเชื่อมโยงเข้ากับระบบ Second Brain แบบ Local 100%

By Linn
สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

เรียนรู้วิธีตั้งค่า LiteLLM เป็น AI Gateway และ Router ในเครื่องตัวเอง เพื่อสลับรันโมเดล Ollama อัตโนมัติ ทั้งโมเดลเน้นความเร็ว โมเดลคิดวิเคราะห์เชิงลึก และโมเดลวิเคราะห์ภาพ ปลอดภัย 100% ไม่ต้องพึ่งคลาวด์

By Linn