สร้าง AI Agent ช่วยทบทวนและสะท้อนผลงานรายสัปดาห์: เปลี่ยน Daily Notes ใน Obsidian เป็น Weekly Review อัจฉริยะด้วย Python + Ollama
ขจัดความเหนื่อยล้าในการทบทวนงานประจำสัปดาห์ด้วย AI Agent ออฟไลน์ส่วนตัวที่จะสแกน Daily Notes ย้อนหลัง 7 วันใน Obsidian แล้วสังเคราะห์เป็นบทวิเคราะห์ความคืบหน้า ปัญหา และแผนงานสัปดาห์ถัดไปแบบอัตโนมัติและปลอดภัย 100%
การพัฒนาตนเองและการรักษาประสิทธิภาพในการทำงาน (Productivity) อย่างยั่งยืน ไม่ได้เกิดจากการก้มหน้าก้มตาทำงานให้เสร็จไปวันๆ แต่เกิดจากกระบวนการที่เรียกว่า "การทบทวนและสะท้อนผล (Reflection)" ซึ่งเป็นหัวใจสำคัญของระบบบริหารจัดการระดับสากลอย่าง GTD (Getting Things Done) และระบบ Second Brain
ในระบบจดบันทึกยุคใหม่ หลายคนเลือกใช้งาน Daily Notes (โน้ตรายวัน) ในแอปพลิเคชันอย่าง Obsidian เพื่อบันทึกสิ่งที่ทำ ความรู้สึก ความสำเร็จ และปัญหาที่พบในแต่ละวัน ทว่าเมื่อถึงสิ้นสัปดาห์ การต้องย้อนกลับไปเปิดอ่านโน้ตทั้ง 7 วันเพื่อสรุปประเด็นมักจะสร้างความเหนื่อยล้าทางสมอง (Cognitive Load) จนทำให้หลายคนละเลยขั้นตอนที่สำคัญที่สุดนี้ไป
ในบทความนี้ เราจะมาสร้างระบบ Cognitive Automation ส่วนตัวด้วยการเขียนสคริปต์ Python ร่วมกับ Ollama เพื่อสร้าง AI Agent ที่จะสแกน Daily Notes ย้อนหลัง 7 วันโดยอัตโนมัติ สังเคราะห์ข้อมูลดิบเหล่านั้น แล้วสร้างขึ้นมาเป็น Weekly Review (โน้ตทบทวนรายสัปดาห์) ที่เป็นระบบระเบียบใน Obsidian Vault ของคุณ โดยกระบวนการทั้งหมดเกิดขึ้นภายในเครื่องคอมพิวเตอร์ของคุณเองแบบ Local 100%
ทำไมระบบทบทวนรายสัปดาห์ต้องรันแบบ Local 100%?
โน้ตรายวันคือพื้นที่สะท้อนความคิดที่ซื่อสัตย์ที่สุด มันมักจะบรรจุข้อมูลที่มีความอ่อนไหวสูง เช่น: * ความรู้สึก ความกังวล และความขัดแย้งในการทำงาน * ข้อมูลธุรกรรมทางการเงินและไอเดียธุรกิจใหม่ที่ยังไม่เปิดเผย * บันทึกสุขภาพส่วนตัวหรือเรื่องราวของคนในครอบครัว
หากเรานำข้อมูลเหล่านี้ไปวิเคราะห์ผ่าน Cloud AI ทั่วไป ข้อมูลส่วนตัวอันมีค่าจะถูกส่งไปยังเซิร์ฟเวอร์ภายนอกและอาจถูกนำไปใช้เทรนโมเดลต่อ การเลือกใช้ Local LLM ผ่าน Ollama จึงเป็นคำตอบเดียวที่ตอบโจทย์เรื่อง ความปลอดภัยและความเป็นส่วนตัวของข้อมูล (Data Privacy) ได้อย่างแท้จริง
โครงสร้างการทำงานของ Weekly Review Agent
สคริปต์ที่เราจะเขียนขึ้นนี้ได้รับการออกแบบให้เรียบง่าย ทำงานได้รวดเร็ว และไม่มีการติดตั้งไลบรารีภายนอกเพิ่มเติม (Zero-dependency) โดยมีกระบวนการทำงานดังนี้:
- ดึงข้อมูล (Collect): สคริปต์จะค้นหาและอ่านไฟล์ Daily Notes ย้อนหลัง 7 วัน (ตามรูปแบบชื่อไฟล์
YYYY-MM-DD.md) จากโฟลเดอร์จดบันทึกของคุณ - สังเคราะห์ข้อมูล (Synthesize): นำเนื้อหาทั้งหมดมารวมกัน ลบข้อมูลส่วนหัว (Frontmatter) ออกเพื่อประหยัดโทเค็น จากนั้นส่งไปยัง Ollama ด้วยระบบพร้อมท์ (Prompt) ที่ปรับแต่งมาเพื่อการสรุปเชิงลึก
- เขียนผลลัพธ์ (Store): บันทึกผลลัพธ์ที่ได้ออกมาเป็นไฟล์
Weekly Reviewฉบับใหม่ลงในโฟลเดอร์เป้าหมายของ Obsidian ทันที
สิ่งที่ต้องจัดเตรียมก่อนเริ่มต้น
ก่อนจะรันสคริปต์นี้ ขอให้ตรวจสอบว่าในเครื่องคอมพิวเตอร์ของคุณมีสิ่งเหล่านี้พร้อมใช้งานแล้ว:
- Python 3: ภาษาหลักสำหรับรันระบบ
- Ollama: ติดตั้งและเปิดการใช้งานเรียบร้อย (ดาวน์โหลดได้จาก ollama.com)
- Obsidian: แหล่งเก็บข้อมูลโน้ตส่วนตัวของคุณ
ในบทความนี้เราจะเลือกใช้โมเดล gemma2 หรือ llama3.2 เนื่องจากเป็นโมเดลที่เด่นด้านการประมวลผลข้อความ มีขนาดเบา และเข้าใจบริบทภาษาไทยได้ดี คุณสามารถดาวน์โหลดโมเดลได้ผ่าน Terminal:
ollama pull gemma2
[!NOTE] สคริปต์นี้จะถือว่าคุณจด Daily Notes โดยตั้งชื่อไฟล์เป็นวันที่ในรูปแบบมาตรฐานสากล เช่น 2026-07-12.md หากคุณใช้รูปแบบอื่น สามารถปรับแก้ไขฟังก์ชันจัดรูปแบบเวลาในสคริปต์ได้ตามสะดวกเขียนสคริปต์ Python ควบคุม AI Weekly Review Agent
ให้สร้างไฟล์ Python ขึ้นมาหนึ่งไฟล์ ชื่อว่า weekly_review_agent.py แล้วคัดลอกโค้ดด้านล่างนี้ลงไป:
import os
import urllib.request
import json
import re
from datetime import datetime, timedelta
# ================= ตั้งค่าระบบ (Configuration) =================
# แก้ไข Path ให้ตรงกับโฟลเดอร์ Obsidian Vault จริงของคุณ
OBSIDIAN_VAULT_PATH = "/home/linn/notes"
DAILY_NOTES_DIR = os.path.join(OBSIDIAN_VAULT_PATH, "Daily")
WEEKLY_REVIEWS_DIR = os.path.join(OBSIDIAN_VAULT_PATH, "Weekly")
LLM_MODEL = "gemma2" # โมเดล Ollama ที่ต้องการใช้งาน
# =============================================================
def read_last_7_days_notes():
notes_content = []
today = datetime.now()
print("กำลังตรวจสอบ Daily Notes ย้อนหลัง 7 วัน...")
for i in range(7):
# ค้นหาย้อนหลังตั้งแต่วันนี้กลับไป 6 วันก่อนหน้า
target_date = today - timedelta(days=i)
date_str = target_date.strftime("%Y-%m-%d")
file_path = os.path.join(DAILY_NOTES_DIR, f"{date_str}.md")
if os.path.exists(file_path):
try:
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# ลบ Frontmatter ออกเพื่อช่วยลดจำนวน Token ของ LLM
clean_content = re.sub(r'^---.*?---', '', content, flags=re.DOTALL)
notes_content.append(f"### วันที่ {date_str}\n{clean_content.strip()}")
print(f"📖 พบโน้ตวันที่: {date_str}")
except Exception as e:
print(f"⚠️ ไม่สามารถอ่านไฟล์ {date_str}.md ได้: {str(e)}")
else:
notes_content.append(f"### วันที่ {date_str}\n(ไม่มีบันทึกโน้ตรายวันสำหรับวันนี้)")
# เรียงข้อมูลย้อนกลับเพื่อให้ผลลัพธ์แสดงจากวันเก่าไปหาวันล่าสุด
return "\n\n".join(notes_content[::-1])
def call_ollama(combined_notes):
prompt = f"""
คุณคือ AI Agent ผู้เชี่ยวชาญด้าน Productivity, การพัฒนาตนเอง และระบบ Second Brain
หน้าที่ของคุณคือการวิเคราะห์ "โน้ตรายวัน (Daily Notes)" ย้อนหลัง 7 วันต่อไปนี้ แล้วสังเคราะห์ออกมาเป็น "รายงานทบทวนรายสัปดาห์ (Weekly Review)" ภาษาไทยที่กระชับ จับประเด็นสำคัญชัดเจน และเน้นข้อมูลที่นำไปปฏิบัติได้จริง
[ข้อมูลโน้ตรายวันย้อนหลัง 7 วัน]
{combined_notes}
[โครงสร้างรายงานทบทวนรายสัปดาห์ที่ต้องสร้าง]
กรุณาสร้างรายงานทบทวนรายสัปดาห์ในรูปแบบ Markdown ตามโครงสร้างนี้เท่านั้น:
# 📊 สรุปภาพรวมรายสัปดาห์ (Weekly Review)
**ช่วงเวลาที่วิเคราะห์:** [ระบุวันเริ่มต้น - วันสิ้นสุด เช่น YYYY-MM-DD ถึง YYYY-MM-DD]
## 🏆 ผลงานและความสำเร็จหลัก (Weekly Wins)
- [วิเคราะห์งานที่ทำสำเร็จ โครงการที่คืบหน้า หรือพฤติกรรมเชิงบวกที่คุณทำได้ดีในสัปดาห์นี้ สรุปเป็นข้อๆ พร้อมระบุบริบทสั้นๆ]
## ⚠️ ปัญหา อุปสรรค และสิ่งที่ไม่เป็นไปตามแผน (Blockers & Challenges)
- [วิเคราะห์งานที่ล่าช้า ปัญหาที่พบ หรือจุดที่ทำให้เสียพลังงานสมอง พร้อมวิเคราะห์สั้นๆ ว่ามีสาเหตุจากอะไร]
## 💡 สิ่งที่ได้เรียนรู้และแนวทางปรับปรุง (Key Insights & Improvements)
- [สรุปบทเรียนสำคัญที่ได้เรียนรู้จากทั้งความสำเร็จและความล้มเหลวในสัปดาห์นี้ พร้อมแนวทางปรับปรุงตัวที่เป็นรูปธรรมในสัปดาห์หน้า]
## 🎯 แผนงานหลักและเป้าหมายในสัปดาห์ถัดไป (Focus for Next Week)
- [กำหนดประเด็นหรือเป้าหมายหลัก 3-5 ข้อที่ต้องโฟกัสในสัปดาห์หน้าตามลำดับความสำคัญ]
กรุณาเขียนผลลัพธ์ทั้งหมดเป็นภาษาไทยที่สุภาพ กระชับ ตรงประเด็น โดยอ้างอิงข้อมูลจริงจากโน้ตที่ระบุไว้ ห้ามจินตนาการหรือต่อเติมข้อมูลที่ไม่ได้ระบุในโน้ตดิบเด็ดขาด
"""
url = "http://localhost:11434/api/generate"
payload = {
"model": LLM_MODEL,
"prompt": prompt,
"stream": False
}
req = urllib.request.Request(
url,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"}
)
try:
with urllib.request.urlopen(req) as response:
res_data = json.loads(response.read().decode("utf-8"))
return res_data.get("response", "ไม่สามารถอ่านผลลัพธ์ได้")
except Exception as e:
return f"พบความขัดข้องในการเชื่อมต่อระบบ Ollama: {str(e)}"
def main():
# 1. ตรวจสอบและสร้างโฟลเดอร์สำหรับผลลัพธ์
os.makedirs(WEEKLY_REVIEWS_DIR, exist_ok=True)
# 2. อ่านโน้ตย้อนหลัง 7 วัน
combined_notes = read_last_7_days_notes()
# นับจำนวนตัวอักษรเพื่อเช็กความเหมาะสมของข้อมูล
char_count = sum(len(line.strip()) for line in combined_notes.split('\n')
if not line.startswith("### วันที่") and not line.startswith("(ไม่มีบันทึก"))
if char_count < 30:
print("❌ ข้อผิดพลาด: ไม่พบเนื้อหาใน Daily Notes ย้อนหลัง 7 วันเพียงพอที่จะวิเคราะห์")
print(f"กรุณาตรวจสอบว่าได้เขียน Daily Notes ไว้ในโฟลเดอร์: {DAILY_NOTES_DIR}")
return
print(f"\n✅ อ่านข้อมูลเรียบร้อย (พบข้อมูลดิบยาวประมาณ {char_count} ตัวอักษร)")
print("🤖 กำลังส่งข้อมูลให้ Ollama ประมวลผลและสังเคราะห์รายงาน...")
# 3. ประมวลผลด้วย Ollama
analysis_result = call_ollama(combined_notes)
# 4. บันทึกผลลัพธ์ลง Obsidian
today = datetime.now()
start_date = (today - timedelta(days=6)).strftime("%Y-%m-%d")
end_date = today.strftime("%Y-%m-%d")
# คำนวณเลขสัปดาห์และปีเพื่อตั้งชื่อไฟล์
week_num = today.strftime("%U")
year_str = today.strftime("%Y")
file_name = f"{year_str}-W{week_num} - Weekly Review.md"
file_path = os.path.join(WEEKLY_REVIEWS_DIR, file_name)
# เจน Frontmatter เพื่อให้ง่ายต่อการดึงค่าด้วย Dataview ในภายหลัง
frontmatter = f"""---
type: weekly-review
start_date: {start_date}
end_date: {end_date}
analyzed_at: {today.strftime("%Y-%m-%d %H:%M:%S")}
tags: [weekly-review, productivity, local-ai]
---
"""
try:
with open(file_path, "w", encoding="utf-8") as f:
f.write(frontmatter + analysis_result)
print(f"\n🎉 บันทึกรายงานทบทวนรายสัปดาห์เรียบร้อยแล้วที่: {file_path}")
except Exception as e:
print(f"❌ ไม่สามารถเขียนไฟล์รายงานทบทวนได้: {str(e)}")
if __name__ == "__main__":
main()
เจาะลึกการออกแบบสคริปต์และ Prompt สำหรับระบบ
ความสำเร็จของ AI Agent ตัวนี้มาจากแนวคิดการออกแบบเฉพาะตัว 3 ด้าน:
- การลดสัญญาณรบกวนของโทเค็น (Token Cleanup): เนื่องจาก LLM มีขีดจำกัดด้าน Context Window สคริปต์นี้จึงใช้คำสั่ง Regex ลบ Frontmatter ออกจากโน้ตรายวัน เนื่องจากพวกแท็ก วันที่ หรือตัวแปรอื่นๆ ไม่ได้มีประโยชน์ต่อเนื้อหาการวิเคราะห์โดยตรง ทำให้โมเดลได้อ่านแต่เนื้อความเนื้อๆ
- การควบคุมภาษาและข้อเท็จจริง (Strict Grounding): การกำชับใน Prompt ว่า "ห้ามจินตนาการหรือต่อเติมข้อมูลที่ไม่ได้ระบุในโน้ตดิบเด็ดขาด" เป็นเรื่องจำเป็นอย่างยิ่ง เพื่อป้องกันปัญหาการหลอนของ AI (Hallucination) ทำให้ผลสรุปสะท้อนสิ่งที่คุณทำและพบเจอจริงๆ เท่านั้น
- ความสอดคล้องกับระบบ Second Brain (Obsidian integration): ชื่อไฟล์และเนื้อความที่สร้างขึ้นมา จะสอดแทรกโครงสร้าง metadata ที่จำเป็นเพื่อให้คุณนำระบบยอดนิยมอย่าง Obsidian Dataview มาสแกนดึงข้อมูลความสำเร็จหรือปัญหาประจำปีไปใช้ได้อย่างมีประสิทธิภาพในอนาคต
วิธีการใช้งานและการต่อยอดสู่ความอัตโนมัติ
คุณสามารถจัดตารางเวลาการรันสคริปต์นี้ได้ง่ายๆ เช่น รันทุกเย็นวันอาทิตย์เวลา 20:00 น. เพื่อให้พร้อมสำหรับทบทวนและวางแผนสัปดาห์หน้า:
- บน macOS / Linux: สามารถตั้งค่าใช้งานผ่านระบบ Cron Job
bash 0 20 * * 7 /usr/bin/python3 /path/to/weekly_review_agent.py >> /path/to/review_log.log 2>&1 - บน Windows: สามารถใช้งานแอปพลิเคชัน Task Scheduler เพื่อตั้งเวลาเปิดรันสคริปต์ Python ตัวนี้ได้เช่นกัน
[!TIP] เพื่อประสิทธิภาพที่ดีขึ้น คุณสามารถสร้างไฟล์เทมเพลต Daily Note ที่บังคับให้ตัวเองเขียนสรุปสั้นๆ ในหัวข้อเฉพาะ เช่น# สิ่งที่ทําสําเร็จวันนี้และ# ปัญหาที่พบซึ่งจะช่วยให้ AI แยกแยะเนื้อความและนำมาประมวลผลสรุป Weekly Wins และ Blockers ได้อย่างแม่นยำยิ่งขึ้นเป็นสองเท่า
การสร้าง AI Agent ส่วนตัวเพื่อทำหน้าที่นี้ ไม่เพียงแต่จะช่วยลดแรงต้าน (Friction) ในการทำรีวิวประจำสัปดาห์ลงเหลือเกือบศูนย์ แต่ยังทำให้คุณสามารถเก็บรักษาความทรงจำ ความก้าวหน้า และบทเรียนชีวิตให้อยู่ในอุปกรณ์ของคุณเองอย่างปลอดภัย 100% ปลอดภัยจากการสอดส่องและพร้อมเคียงข้างระบบสมองที่สองของคุณไปอีกหลายทศวรรษ