สร้าง AI Agent ช่วยทบทวนและสะท้อนผลงานรายสัปดาห์: เปลี่ยน Daily Notes ใน Obsidian เป็น Weekly Review อัจฉริยะด้วย Python + Ollama

ขจัดความเหนื่อยล้าในการทบทวนงานประจำสัปดาห์ด้วย AI Agent ออฟไลน์ส่วนตัวที่จะสแกน Daily Notes ย้อนหลัง 7 วันใน Obsidian แล้วสังเคราะห์เป็นบทวิเคราะห์ความคืบหน้า ปัญหา และแผนงานสัปดาห์ถัดไปแบบอัตโนมัติและปลอดภัย 100%

Share
สร้าง AI Agent ช่วยทบทวนและสะท้อนผลงานรายสัปดาห์: เปลี่ยน Daily Notes ใน Obsidian เป็น Weekly Review อัจฉริยะด้วย Python + Ol

การพัฒนาตนเองและการรักษาประสิทธิภาพในการทำงาน (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) โดยมีกระบวนการทำงานดังนี้:

  1. ดึงข้อมูล (Collect): สคริปต์จะค้นหาและอ่านไฟล์ Daily Notes ย้อนหลัง 7 วัน (ตามรูปแบบชื่อไฟล์ YYYY-MM-DD.md) จากโฟลเดอร์จดบันทึกของคุณ
  2. สังเคราะห์ข้อมูล (Synthesize): นำเนื้อหาทั้งหมดมารวมกัน ลบข้อมูลส่วนหัว (Frontmatter) ออกเพื่อประหยัดโทเค็น จากนั้นส่งไปยัง Ollama ด้วยระบบพร้อมท์ (Prompt) ที่ปรับแต่งมาเพื่อการสรุปเชิงลึก
  3. เขียนผลลัพธ์ (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 ด้าน:

  1. การลดสัญญาณรบกวนของโทเค็น (Token Cleanup): เนื่องจาก LLM มีขีดจำกัดด้าน Context Window สคริปต์นี้จึงใช้คำสั่ง Regex ลบ Frontmatter ออกจากโน้ตรายวัน เนื่องจากพวกแท็ก วันที่ หรือตัวแปรอื่นๆ ไม่ได้มีประโยชน์ต่อเนื้อหาการวิเคราะห์โดยตรง ทำให้โมเดลได้อ่านแต่เนื้อความเนื้อๆ
  2. การควบคุมภาษาและข้อเท็จจริง (Strict Grounding): การกำชับใน Prompt ว่า "ห้ามจินตนาการหรือต่อเติมข้อมูลที่ไม่ได้ระบุในโน้ตดิบเด็ดขาด" เป็นเรื่องจำเป็นอย่างยิ่ง เพื่อป้องกันปัญหาการหลอนของ AI (Hallucination) ทำให้ผลสรุปสะท้อนสิ่งที่คุณทำและพบเจอจริงๆ เท่านั้น
  3. ความสอดคล้องกับระบบ 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% ปลอดภัยจากการสอดส่องและพร้อมเคียงข้างระบบสมองที่สองของคุณไปอีกหลายทศวรรษ

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