สร้าง AI Agent แปลง Fleeting Notes เป็น Permanent Notes: ยกระดับความคิดจดเร็วสู่โน้ตถาวรอัจฉริยะด้วย Python + Ollama
แก้ปัญหาโน้ตจดเร็ว (Fleeting Notes) พอกพูนจนกลายเป็นสุสานไอเดีย ด้วยการสร้าง AI Agent ส่วนตัวที่จะช่วยเกลา ขยายความ และแปลงบันทึกย่อของคุณให้เป็น Permanent Notes ตามหลัก Zettelkasten แบบ Local 100%
เมื่อใดก็ตามที่เราเกิดไอเดียใหม่ๆ ขึ้นมาในหัว ไม่ว่าจะเป็นขณะกำลังฟังพ็อดคาสท์ อ่านบทความ หรือระหว่างการเดินทาง สิ่งที่ดีที่สุดที่เราทำได้คือการรีบจดบันทึกมันลงไปทันที สิ่งนี้เรียกว่า "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) โดยมีขั้นตอนหลักดังนี้:
- การดึงข้อมูล (Scan): ค้นหาไฟล์
.mdทั้งหมดในโฟลเดอร์Fleetingของ Obsidian Vault - การเรียบเรียง (Formulate): ส่งเนื้อหาทีละโน้ตไปยัง Ollama เพื่อให้โมเดล AI ช่วยแปลงประโยคย่อ ขยายความ และจัดโครงสร้าง Markdown ตามเทมเพลต Zettelkasten ที่กำหนด
- การบันทึกและย้ายไฟล์ (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 ประการ:
- ระบบหลีกเลี่ยงงานซ้ำซ้อน (Archive State): เมื่อบันทึก Permanent Note สำเร็จแล้ว สคริปต์จะใช้
shutil.moveเพื่อย้ายไฟล์ Fleeting Note ดั้งเดิมออกทันที ทำให้การรันสคริปต์ซ้ำหลายรอบไม่เกิดการประมวลผลไฟล์เดิมซ้ำ ช่วยประหยัดเวลาและพลังงานสมอง - การตั้งชื่อไฟล์อัจฉริยะ (Smart Renaming): ตัว Agent จะทำหน้าที่ดึงค่าจาก Frontmatter
titleที่ AI ร่างขึ้นมาและกำจัดอักขระพิเศษออก ก่อนนำมาตั้งเป็นชื่อไฟล์ใหม่โดยอัตโนมัติ ทำให้ไฟล์โน้ตใน Obsidian มีความสวยงามและสะท้อนเนื้อหาภายในชัดเจนโดยที่คุณไม่ต้องเปลี่ยนชื่อเอง - การจำกัดอุณหภูมิการคิดสร้างสรรค์ (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 เป็นผู้ช่วยเกลาความเข้าใจเบื้องต้นและจัดหมวดหมู่ให้กับข้อมูลที่ยังไม่เป็นระเบียบ จะช่วยปลดล็อกให้สมองของคุณโฟกัสไปกับการวิเคราะห์ เชื่อมโยง และนำความรู้ไปผลิตชิ้นงานจริงได้อย่างเต็มที่ โดยไม่ต้องกังวลเรื่องไอเดียจดด่วนจะเลือนหายไปอีกต่อไป