Python CLI สร้างเนื้อหาด้วย Gemini แบบทนทาน ไม่กลัว API ล่ม

สวัสดีครับ

วันนี้ผมจะมาคุยเรื่องการสร้างเนื้อหาสำหรับโปรเจกต์ของเรานะครับ แบบใช้ Python CLI มาช่วยงาน แล้วก็ผสานพลังกับ Gemini API ให้ชีวิตโปรแกรมเมอร์ง่ายขึ้นเยอะเลย แถมยังไงให้ระบบเรามันอึด ถึก ทน ไม่กลัว API ล่มง่ายๆ ด้วยนะครับ

ปัญหาคือ เวลาเราต้องสร้างคอนเทนต์เยอะๆ แบบพวกคำอธิบายสินค้า หรือหัวข้อบล็อก มันก็เหนื่อยเนอะ ถ้าจะมานั่งพิมพ์เองทุกวัน แล้วถ้า API ที่เราเรียกใช้มันเกิดคอขวด หรือมีปัญหาขึ้นมา ก็แย่เลยงานเราพังหมด

งั้นเรามาดูกันครับ ว่าจะทำยังไงให้งานพวกนี้มันง่ายขึ้น แล้วก็ปลอดภัยด้วย

1. เริ่มต้นสร้างเนื้อหาเบื้องต้นด้วย Gemini API

ก่อนอื่นเลย ต้องมี google-generativeai ติดตั้งก่อนนะครับ

pip install google-generativeai

จากนั้น ลองใช้ Gemini สร้างอะไรซักอย่างดูครับ ตัวอย่างนี้ผมจะให้มันช่วยคิดหัวข้อบทความง่ายๆ นะครับ

import google.generativeai as genai
import os

genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

model = genai.GenerativeModel('gemini-pro')

def generate_simple_content(prompt):
    try:
        response = model.generate_content(prompt)
        return response.text
    except Exception as e:
        return f"เกิดข้อผิดพลาด: {e}"

if __name__ == "__main__":
    my_prompt = "ช่วยคิดหัวข้อบทความเกี่ยวกับเทคนิคการเขียนโค้ดที่รวดเร็วให้หน่อยครับ"
    content = generate_simple_content(my_prompt)
    print(f"หัวข้อที่ Gemini แนะนำ:
{content}")

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

2. เสริมความทนทาน (Resilience) ให้กับการเรียก API

ทีนี้ ถ้า API มันล่ม หรือมีปัญหาชั่วคราว เราจะทำยังไงดีครับ ไม่ให้โปรแกรมเราพังไปเลยเนอะ เราก็ใช้เทคนิค Retry หรือลองใหม่นั่นแหละครับ ผมจะใช้ไลบรารี tenacity มาช่วยตรงนี้นะครับ

pip install tenacity

ดูตัวอย่างโค้ดนี้เลยครับ ผมจะเพิ่ม retry เข้าไปในการเรียก model.generate_content นะครับ

import google.generativeai as genai
import os
from tenacity import retry, wait_fixed, stop_after_attempt, before_log
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

model = genai.GenerativeModel('gemini-pro')

@retry(
    wait=wait_fixed(2), # รอ 2 วินาทีก่อนลองใหม่
    stop=stop_after_attempt(3), # ลองใหม่ได้มากสุด 3 ครั้ง
    before_sleep=before_log(logger, logging.INFO) # ก่อนลองใหม่จะ log บอกหน่อย
)
def generate_resilient_content(prompt):
    logger.info(f"กำลังเรียก Gemini API ด้วย prompt: {prompt}")
    response = model.generate_content(prompt)
    return response.text

if __name__ == "__main__":
    my_prompt = "ช่วยเขียนคำอธิบายสั้นๆ สำหรับโปรแกรมช่วยจัดการไฟล์ใน Python ที่รวดเร็วและปลอดภัยครับ"
    try:
        content = generate_resilient_content(my_prompt)
        print(f"คำอธิบายที่ได้จาก Gemini:
{content}")
    except Exception as e:
        print(f"เกิดข้อผิดพลาดหลังจากลองหลายครั้ง: {e}")

เห็นไหมครับ ตรง @retry เนี่ยแหละครับที่ช่วยให้เราไม่ต้องมานั่งเขียน try-except วนลูปเอง ช่วยได้เยอะเลยนะครับ

3. จัดเก็บเนื้อหาที่สร้างได้ลงไฟล์

พอได้เนื้อหาที่ต้องการแล้ว เราก็อยากจะ Save ลงไฟล์ไว้ใช้ต่อใช่ไหมครับ อันนี้ก็ง่ายๆ เลย ใช้ open() ใน Python นี่แหละครับ

import google.generativeai as genai
import os
from tenacity import retry, wait_fixed, stop_after_attempt, before_log
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

model = genai.GenerativeModel('gemini-pro')

@retry(
    wait=wait_fixed(2),
    stop=stop_after_attempt(3),
    before_sleep=before_log(logger, logging.INFO)
)
def generate_and_save_content(prompt, filename):
    logger.info(f"กำลังเรียก Gemini API เพื่อสร้างเนื้อหาสำหรับไฟล์: {filename}")
    response = model.generate_content(prompt)
    generated_text = response.text

    with open(filename, 'w', encoding='utf-8') as f:
        f.write(generated_text)
    logger.info(f"บันทึกเนื้อหาลงไฟล์ {filename} เรียบร้อยแล้วครับ")
    return generated_text

if __name__ == "__main__":
    my_prompt = "เขียนรีวิวสั้นๆ เกี่ยวกับประโยชน์ของ Cloud Computing สำหรับ SMEs ครับ"
    output_filename = "cloud_smes_review.txt"
    try:
        content = generate_and_save_content(my_prompt, output_filename)
        print(f"เนื้อหาถูกบันทึกลง {output_filename} แล้วครับ:
{content}")
    except Exception as e:
        print(f"เกิดข้อผิดพลาดในการสร้างและบันทึกเนื้อหา: {e}")

จากตัวอย่างนี้ เนื้อหาก็จะถูก Save ลงไฟล์ cloud_smes_review.txt ให้นะครับ สะดวกมากๆ เลยใช่ไหมครับ

เพื่อนๆ สามารถเอาเทคนิคนี้ไปปรับใช้กับโปรเจกต์ของตัวเองได้เลยนะครับ ไม่ว่าจะเป็นการสร้างคำอธิบายสินค้า บทความ หรือแม้แต่โค้ดเบื้องต้นก็ยังได้เลยครับ และด้วย tenacity ก็ทำให้เรามั่นใจได้ว่างานเราจะไม่ล่มกลางคันง่ายๆ นะครับ

ลองเอาไปปรับใช้กันดูนะครับ


Read more

ภาพปก Grand Theft Auto VI: เมื่อองค์ประกอบบางอย่างดู "ผิดเพี้ยน" จนแฟนเกมต้องตั้งคำถาม!

ภาพปก Grand Theft Auto VI: เมื่อองค์ประกอบบางอย่างดู "ผิดเพี้ยน" จนแฟนเกมต้องตั้งคำถาม!

Rockstar Games เปิดพรีออเดอร์ GTA VI พร้อมปล่อยภาพปกทางการ เจาะลึกองค์ประกอบที่ไม่คาดคิด ทั้งตัวละครและสัญลักษณ์สุดแปลกบนปกเกมใหม่

By ทีมงาน devdog
ไม่เลื่อนแน่! "Grand Theft Auto VI" เตรียมเปิดพรีออเดอร์ 25 มิ.ย.นี้ พร้อมภาพปกสุดอลังการ!

ไม่เลื่อนแน่! "Grand Theft Auto VI" เตรียมเปิดพรีออเดอร์ 25 มิ.ย.นี้ พร้อมภาพปกสุดอลังการ!

Grand Theft Auto VI เกมที่ทุกคนรอคอยเปิดให้สั่งจองล่วงหน้า 25 มิ.ย.นี้! หลัง Rockstar Games ปล่อยภาพปกทางการและยืนยันการพัฒนาตามกำหนด

By ทีมงาน devdog
ตุรกีบอล: ไก่งวงกู้ชีพ! ลุ้นเข้ารอบฟุตบอลโลก 2026 กับความหวัง อาร์ดา กือแลร์

ตุรกีบอล: ไก่งวงกู้ชีพ! ลุ้นเข้ารอบฟุตบอลโลก 2026 กับความหวัง อาร์ดา กือแลร์

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

By ทีมงาน devdog
สกอตแลนด์ vs โมร็อกโก: ศึกฟุตบอลโลก 2026 ที่เต็มไปด้วยประวัติศาสตร์และกลยุทธ์

สกอตแลนด์ vs โมร็อกโก: ศึกฟุตบอลโลก 2026 ที่เต็มไปด้วยประวัติศาสตร์และกลยุทธ์

สรุปผลและวิเคราะห์ศึกฟุตบอลโลก 2026 กลุ่ม C ระหว่างสกอตแลนด์และโมร็อกโก พร้อมสถิติประวัติศาสตร์ที่ Atlas Lions กำลังสร้าง

By ทีมงาน devdog