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

รมว.พลังงาน ปรับส่วนต่าง E20 ห่างโซฮอล์ 95 ลิตรละ 3 บาท กระตุ้นคนไทยใช้พลังงานสะอาด พร้อมขอความร่วมมือประหยัดไฟ

รมว.พลังงาน ปรับส่วนต่าง E20 ห่างโซฮอล์ 95 ลิตรละ 3 บาท กระตุ้นคนไทยใช้พลังงานสะอาด พร้อมขอความร่วมมือประหยัดไฟ

รมว.พลังงาน ประกาศปรับส่วนต่าง E20 ห่างโซฮอล์ 95 เป็น 3 บาท กระตุ้นใช้เชื้อเพลิงชีวภาพ พร้อมรณรงค์คนไทยประหยัดพลังงาน สร้างความมั่นคงพลังงานของชาติ

By ทีมงาน devdog
DMC: จากปรากฏการณ์ดนตรีระดับโลกสู่แสงธรรมนำทางชีวิต

DMC: จากปรากฏการณ์ดนตรีระดับโลกสู่แสงธรรมนำทางชีวิต

สำรวจสองความหมายสำคัญของ DMC! จาก Run-DMC ผู้บุกเบิกการร่วมงานฮิปฮอป-ร็อกที่พลิกโฉมวงการ สู่ dmc.tv ช่องธรรมะนำทางจิตใจเพื่อสันติสุขภายใน.

By ทีมงาน devdog
PM 2.5 กลับมาคลุ้ง! เปิด 12 อันดับค่าฝุ่นสูงสุดในกรุงเทพมหานคร

PM 2.5 กลับมาคลุ้ง! เปิด 12 อันดับค่าฝุ่นสูงสุดในกรุงเทพมหานคร

อัปเดตสถานการณ์ PM 2.5 ในกรุงเทพฯ ประจำวันที่ 10 มี.ค. 2569 พร้อมเปิด 12 เขตค่าฝุ่นสูงสุด และคำแนะนำป้องกันผลกระทบต่อสุขภาพ

By ทีมงาน devdog
One Piece Netflix ภาค 2: การผจญภัยสู่แกรนด์ไลน์ พร้อมกิจกรรมสุดอลังการที่สวนลุมฯ!

One Piece Netflix ภาค 2: การผจญภัยสู่แกรนด์ไลน์ พร้อมกิจกรรมสุดอลังการที่สวนลุมฯ!

One Piece Netflix ซีซัน 2 "มุ่งหน้าสู่แกรนด์ไลน์" เตรียมลงจอ 10 มี.ค. 2569 พร้อมกิจกรรม "GRAND LINE IN THAILAND" ที่สวนลุมพินี ห้ามพลาด!

By ทีมงาน devdog