เพิ่ม Semantic Search ให้ DynamoDB ด้วย Vector Indexes
เจาะลึกวิธีเพิ่มระบบค้นหาเชิงความหมายลงในตาราง DynamoDB ที่มีอยู่แล้วโดยไม่ต้องพึ่งพาเซิร์ฟเวอร์แยกภายนอก พร้อมใช้ Amazon Bedrock

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เพิ่มระบบ Semantic Search ใน DynamoDB ได้โดยไม่ต้องแยกบริการ
- ใช้ Amazon Bedrock รุ่น Titan Text Embeddings V2 สร้างเวกเตอร์ 1024 มิติ
- รวมฟิลด์ข้อมูลสูตรอาหารเป็นสตริงเดียวเพื่อรองรับการค้นหาที่ครอบคลุม
- จัดการข้อมูลย้อนหลัง (Backfill) สำหรับตารางที่มีอยู่เดิมด้วยสคริปต์ครั้งเดียว
การเพิ่มฟังก์ชันการค้นหาให้กับแอปพลิเคชันมักมาพร้อมกับความยุ่งยากในการจัดการคอมโพเนนต์ส่วนเกิน จุดที่อาจเกิดความผิดพลาด และปัญหาการซิงโครไนซ์ข้อมูล แต่ด้วยฟีเจอร์ Vector Search ใน DynamoDB นักพัฒนาสามารถเก็บเวกเตอร์ embeddings ควบคู่ไปกับข้อมูลเดิมและทำการค้นหาได้โดยตรง ทำให้ผู้ใช้งานสามารถค้นหาสูตรอาหารด้วยภาษามธรรมชาติได้ทันทีโดยไม่ต้องพึ่งพาการจับคู่คำสำคัญแบบเป๊ะๆ อีกต่อไป
ระบบตัวอย่างนี้ถูกพัฒนาขึ้นบนสถาปัตยกรรมแบบ Serverless โดยใช้ SAM สำหรับโครงสร้างพื้นฐาน, API Gateway, ฟังก์ชัน Lambda และ DynamoDB สำหรับจัดเก็บข้อมูลสูตรอาหารที่มีการทำงาน CRUD พื้นฐาน ความซับซ้อนในอดีตเกิดขึ้นเมื่อต้องการเพิ่มตัวกรองข้อมูลที่ต้องอาศัย Global Secondary Indexes (GSI) จำนวนมาก ซึ่งไม่สามารถขยายระบบได้อย่างมีประสิทธิภาพ จนกระทั่งการรองรับ Vector Index แบบเนทีฟเข้ามาช่วยแก้ปัญหานี้

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
หัวใจสำคัญของการทำ Semantic Search คือการแปลงข้อความให้อยู่ในรูปของ embeddings ซึ่งเป็นชุดตัวเลขที่แสดงถึงความหมาย โดยผู้เขียนได้เลือกใช้โมเดล Amazon Bedrock Titan Text Embeddings V2 เนื่องจากให้เวกเตอร์ขนาด 1024 มิติที่มีการ normalized เรียบร้อยและทำงานร่วมกับ cosine similarity ได้เป็นอย่างดี การเลือกข้อความที่จะนำมาแปลงเป็นสิ่งสำคัญ โดยในกรณีนี้ได้รวมฟิลด์สำคัญ เช่น ชื่อ, คำอธิบาย, ประเภทอาหาร, ป้ายกำกับด้านอาหาร และส่วนผสม เข้าไว้ด้วยกันในสตริงเดียวเพื่อให้การค้นหาครอบคลุมทุกมิติ
เนื่องจากในปัจจุบัน Vector Index ยังไม่รองรับการกำหนดค่าผ่าน CloudFormation จึงต้องใช้สคริปต์เสริมเพื่อรันคำสั่ง UpdateTable หลังการ deployment โดยดัชนีนี้ถูกสร้างขึ้นด้วยระยะทางแบบ cosine distance พร้อมกำหนดมิติ 1024 และเพิ่มการกรองแบบอินไลน์สำหรับประเภทอาหาร สำหรับแอปพลิเคชันที่ไม่สามารถรองรับความหน่วงระดับ 100-150 มิลลิวินาทีจากการเรียก embedding ได้โดยตรง จำเป็นต้องสร้าง embeddings แบบอะซิงโครนัสผ่าน DynamoDB Streams และ Lambda ฟังก์ชัน พร้อมระมัดระวังเรื่องลูปอนันต์ที่อาจเกิดขึ้นจากการอัปเดตไอเทม
"The biggest takeaway for me is that choosing what text to embed matters more than I expected."
AWS Community Builder
การนำ Vector Index มาใส่ใน DynamoDB โดยตรงช่วยตัดปัญหาเรื่องการดูแลรักษา Data Pipeline แยกต่างหาก ซึ่งปกติมักจะเป็นจุดตายของระบบค้นหาขนาดเล็ก การรวมข้อมูลหลายฟิลด์เข้าเป็นข้อความเดียวก่อนสร้าง embedding ถือเป็นเทคนิคที่มีประโยชน์อย่างมากในการเพิ่มความแม่นยำของการค้นหาเชิงความหมายโดยไม่ต้องออกแบบโครงสร้างฐานข้อมูลใหม่ทั้งหมด
สำหรับตารางที่มีข้อมูลอยู่เดิมซึ่งยังไม่มีการสร้าง embeddings จําเป็นต้องรันกระบวนการ Backfill เพื่อสแกนตารางและอัปเดตข้อมูลทีละรายการ หรือใช้งาน DynamoDB Export ไปยัง S3 ในกรณีที่ไม่สามารถสแกนข้อมูลทั้งหมดได้โดยตรง ทั้งหมดนี้ช่วยให้ระบบค้นหาเชิงความหมายสามารถทำงานอยู่บนฐานข้อมูลเดิมได้ทันทีโดยไม่ต้องเพิ่มโครงสร้างพื้นฐานอื่นให้ซับซ้อน
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น