จาก Regex สู่ LLMs: เส้นทางการดึงข้อมูลเว็บของผม

ผมสร้างเครื่องมือเปรียบเทียบราคา ผมจำเป็นต้องดึงข้อมูลสินค้าจากเว็บไซต์ e-commerce หลายสิบแห่ง แต่ละไซต์มีโครงสร้างที่แตกต่างกัน บางไซต์ใช้ CSS classes แบบสุ่ม บางไซต์ใช้ JavaScript ในการโหลดเนื้อหา

ตอนแรกผมลองใช้วิธีแบบดั้งเดิม โดยใช้ Regex และ BeautifulSoup

มันใช้งานได้กับสองไซต์แรก แต่แล้วไซต์หนึ่งก็เปลี่ยนเลย์เอาต์ ทำให้โค้ดของผมพัง อีกไซต์หนึ่งก็ใช้เนื้อหาแบบ dynamic ผมใช้เวลาไปกับการซ่อมตัว scraper มากกว่าการนำข้อมูลไปใช้งานเสียอีก

จากนั้นผมจึงลองใช้ AI โดยการป้อน HTML ดิบเข้าไปใน LLM

ผลลัพธ์ที่ได้นั้นแย่มาก เอาต์พุตไม่สม่ำเสมอ บางครั้งผมได้ JSON บางครั้งก็ได้เป็นย่อหน้า โมเดลเกิดอาการ hallucinate ข้อมูล และค่าใช้จ่ายก็สูงเกินไปเพราะผมส่ง token ไปมากเกินไป

ผมจึงพบทางสายกลาง และตอนนี้ผมใช้วิธีแบบ hybrid

นี่คือขั้นตอนของผม:

  • Preprocess HTML: ผมลบพวก script, style และ navigation bars ออก โดยเหลือไว้เพียงข้อความที่มองเห็นได้เท่านั้น วิธีนี้ช่วยลดจำนวน token และลดค่าใช้จ่าย
  • ใช้ JSON mode หรือ function calling: วิธีนี้จะบังคับให้ LLM ส่งข้อมูลกลับมาในรูปแบบที่มีโครงสร้าง (structured data)
  • ใช้ retry logic: หาก JSON ผิดพลาด โค้ดจะลองใหม่อีกครั้ง
  • ทำ Cache ผลลัพธ์: ผมบันทึกการดึงข้อมูลที่สำเร็จไว้ตาม URL เพื่อหลีกเลี่ยงการต้องจ่ายเงินซ้ำสำหรับหน้าเดิม

Regex และ BeautifulSoup ยังคงดีที่สุดสำหรับไซต์ที่เป็นแบบ static และมีโครงสร้างชัดเจน เพราะมันรวดเร็วและไม่มีค่าใช้จ่าย

LLMs จะเหมาะกว่าสำหรับไซต์ที่ยุ่งเหยิงและคาดเดาไม่ได้ แต่คุณต้องทำความสะอาดข้อมูลก่อนเพื่อควบคุมค่าใช้จ่ายให้ต่ำ

บทเรียนที่ผมได้รับ:

  • ตรวจสอบค่าใช้จ่ายและอัตราความสำเร็จของคุณ
  • ระวังเรื่อง latency การเรียกใช้ LLM ใช้เวลาเป็นวินาที ไม่ใช่ระดับมิลลิวินาที
  • ตรวจสอบความถูกต้องของเอาต์พุต (Validate output) เช่น เช็คว่าราคาที่ได้ดูเหมือนราคาจริงๆ หรือไม่
  • ใช้ระบบแบบ hybrid: ใช้ parser สำหรับไซต์ที่จัดการง่าย และใช้ LLM สำหรับไซต์ที่ยุ่งเหยิง

การตั้งค่าแบบนี้ช่วยประหยัดเวลาทำงานของผมไปได้หลายชั่วโมง ผมสามารถเพิ่มร้านค้าใหม่ได้ภายในเวลาไม่ถึงหนึ่งชั่วโมง

คุณจัดการกับข้อมูลเว็บที่ยุ่งเหยิงอย่างไร? คุณชอบใช้ parser หรือ LLMs มากกว่ากัน?

แหล่งที่มา: https://dev.to/__c1b9e06dc90a7e0a676b/from-regex-to-llms-my-journey-extracting-unstructured-web-data-5gmh

ชุมชนแห่งการเรียนรู้ (ไม่บังคับ): https://t.me/GyaanSetuAi