จะเริ่มสร้าง Gen AI ต้องเข้าใจ Vector Embeddings กันก่อน! (ภาคทฤษฎี)

Thakorn
Google Cloud Thailand
6 min readFeb 15, 2024

ในยุคปัจจุบัน ปัญญาประดิษฐ์ (AI) กลายเป็นเทคโนโลยีสำคัญที่ขับเคลื่อนการเปลี่ยนแปลงในหลากหลายอุตสาหกรรม หนึ่งในสาขา AI ที่น่าจับตามองคือ Generative AI (Gen AI) หรือ AI ที่สามารถสร้างเนื้อหาใหม่ ๆ เช่น ข้อความ รูปภาพ เสียง หรือวิดีโอ แต่ก่อนที่จะเริ่มสร้าง Gen AI ที่น่าทึ่ง เราจำเป็นต้องเข้าใจพื้นฐานสำคัญอย่าง Vector Embeddings

Vector Embeddings คืออะไร?

Vector Embeddings เป็นเทคนิคการแปลงข้อมูล เช่น Text, Photo, Video ให้เป็นเวกเตอร์ (Vector) ซึ่งเป็นชุดตัวเลขที่แทนความหมายของข้อมูลนั้น โดยส่วนใหญ่จะใช้แปลงข้อความเป็นเวกเตอร์เสียมากกว่า ซึ่งมักเรียกว่า Text Embeddings

แต่ก่อนที่ลงลึกกับ Embeddings ไปมากกว่านี้ผมอยากพาทุกไป จินตนาการถึง challenge ต่าง ๆ ที่เวลาจะใช้เทคโนโลยี Generative กับองค์กรของตนมักจะมีคำถามต่าง ๆ อาทิ

  • เราจะเอา LLMs ไปใส่ใน Chatbots หรือระบบ Search ที่เป็นข้อมูลขององค์กรได้อย่างไร?
  • หรือเรามีสินค้าต่าง ๆ อยู่เป็นหมื่น ๆ ชิ้น จะให้ LLMs จดจำอย่างแม่นยำได้อย่างไร?
  • หรือเราจะให้ LLMs ช่วยแนะนำสินค้าของเราอย่างไร?

มาลองดูตัวอย่างนี้บนเว็บไซต์ ai-demos.dev จาก Google กันครับ

ตัวอย่างข้างต้นจะเป็นการค้นหาด้วยข้อความและได้ผลลัพธ์เป็นกระทู้ที่เกี่ยวข้องบน Stackoverflow กว่า 8 ล้านคำถาม และตอบกลับมาในไม่กี่ milliseconds

สิ่งที่น่าสนใจของตัวอย่างนี้คือ

  • Semantic Search: คือการค้นหาด้วยคำถาม ไม่ใช่คีย์เวิร์ด ซึ่งตัว LLMs จะเข้าใจความหมายและความต้องการ (Semantics) และนำผลลัพธ์มาตอบได้สัมพันธ์กัน แม้ว่าจะไม่ได้มีคีย์เวิร์ดที่ตรงกับเอกสารนั้น ๆ เลยก็ตาม
  • Grounding LLMs: เนื่องจาก LLMs ไม่ใช่ Database ซึ่งการจดจำสิ่งต่าง ๆ ขององค์กรเพิ่มจำนวนมากอาจทำให้ LLM มีผลกระทบต่อหน่วยความจำทำให้เกิด Hallucinations ซึ่งการใช้เทคนิค Grounding เปรียบเสมือน attach Stackoverflow dataset ข้างต้นเป็น external memory โดยไม่ต้องจดจำกระทู้คำถามกว่า 8 ล้านเรื่อง และตอบกลับได้อย่างรวดเร็วในระดับ millisecond ด้วย Vector Search ซึ่งในทางปฎิบัติจริงการตั้งเครื่องประมวลผลเองหากออกแบบมาไม่ครอบคลุมหรือ Resource ไม่เพียงพอ อาจจะทำให้ใช้เวลาค้นหานานมาก ๆ ซึ่งผมจะอธิบายเทคโนโลยีนี้ในหัวข้อถัด ๆ ไปครับ

ผู้อ่านสามารถลองเล่นได้ที่ ai-demos.dev เพื่อลองดูการค้นหาแบบอื่น ๆ เช่น ค้นหารูปภาพด้วยข้อความ หรือค้นหารูปภาพด้วยรูปภาพก็ได้ซึ่งเบื้องหลังก็คือ Vector Search ครับ

Vector คืออะไร?

ทีนี้เมื่อผู้อ่านพอจะเห็น Use Case ของ Vector Search กันแล้ว คงจะเกิดคำถามในใจว่า Vector คืออะไร? ทำไมชื่อคุ้น ๆ ..

ใช่แล้วครับ Vector ตัวนี้เป็นตัวเดียวกับที่เราเคยได้เรียนในช่วงมัธยม หมายถึงปริมาณทางคณิตศาสตร์ที่มีขนาด (magnitude) และทิศทาง (direction) เช่น ความเร็วในทางฟิสิกส์ นั่นแปลว่าสิ่งที่เราเรียนทั้งหมดในวันนั้น จะมาใช้กับงานด้าน AI ในวันนี้ครับ

ตัวอย่างแบบจำลองเวกเตอร์หลายทิศทางจาก Wikipedia

Vector กับ Machine Learning เกี่ยวข้องกันอย่างไร?

ประการแรกเลยคือ Machine Learning นั้นเรียนรู้จากข้อมูล และข้อมูลมักจะอยู่ในรูปแบบ Vector ดังนั้น Vector ช่วยให้ Machine Learning เข้าใจความสัมพันธ์ระหว่างข้อมูล

ตัวอย่างเช่นเรามี AI ตัวหนึ่งที่ Train โมเดลภาษามาเรียบร้อยจะ embed พวกข้อมูลต่าง ๆ เช่น text หรือ รูปภาพ เจ้าตัว AI จะสร้าง space ขึ้นมาเรียกว่า Embedding Space ที่มีความสัมพันธ์กันของมิติ (dimension) ต่าง ๆ

หลังจาก embedding ข้อมูลของเรามันก็จะทราบตำแหน่งว่าข้อมูลของเราไปอยู่ตรงไหนของ Embedding Space นี้ เช่น คำว่า kohi.day coffee roaster จะมีความใกล้เคียงกับกลุ่ม Cafe, Coffee, Bakery โดยมีสัดส่วนที่ 20%, 50% และ 60% ตามลำดับซึ่งแสดงเป็นค่า embedding เป็น 0.2, 0.5 และ 0.6 ใน dimensional space หรือมิติความสัมพันธ์นี้

หลังจากนั้นเมื่อมีข้อมูลใหม่ที่ถูก Embedding ก็จะถูกจัดลงตำแหน่งบน Embedding Space เช่นกัน เนื้อหาที่มีข้อมูลคล้ายกันก็จะอยู่ใกล้กัน ทำให้เมื่อข้อมูลทั้งหลายถูก Embed เป็น Vector ก็จะหาความสัมพันธ์กันไม่ว่าจะใกล้หรือไกล ดังนั้นจึงสามารถทำ use case เช่น Product Recommendation หรือ ภาพยนตร์ที่เนื้อหาคล้ายกันบนแพลตฟอร์มภาพยนตร์ได้

ดังนั้นบริการของ Google ส่วนใหญ่ที่มีการแสดงผลลัพธ์หรือการแนะนำ (Recommendations) กับข้อมูลที่เกี่ยวข้องต่าง ๆ เช่น Google Search, Youtube, Play Store มีเทคนิคพื้นฐานมาจากสิ่งเหล่านี้

Use Case Google Lens ค้นหารูปภาพและสถานที่ใกล้เคียงของภาพนั้น ๆ

แม้กระทั่ง Google Lens เองที่ยกมือถือใช้กล้องส่องก็ได้ผลลัพธ์แล้ว ก็มีความเป็น Image Search เช่นกัน เราสามารถใช้ Image ที่ Crop แล้วนำเข้า Embedding Model เพื่อค้นหารูปภาพหรือผลิตภัณฑ์ที่ใกล้เคียงบน Embedding Space ซึ่งจะได้ผลลัพธ์ออกมาเป็นสินค้าที่คล้ายกันได้

ในมุม Embeddings จึงเป็นพื้นฐานที่นำไปต่อยอดในหลากหลาย use case ยอดนิยมดังนี้ครับ

  1. Recommendation Systems: การแนะนำหนัง, แนะนำสินค้าชิ้นถัดไปที่จะซื้อ
  2. Search: ลักษณะเดียวกับ Google Search ทั้ง Text และ Image
  3. Chatbot: ที่สามารถถาม-ตอบได้
  4. Incident Classification: ตรวจจับ incident แยกแยะแต่ละ issue และจัด priority
  5. Data preprocessing: การเตรียมข้อมูลก่อนป้อนเข้า Machine Learning Model
  6. Fraud Detection: ตรวจจับข้อมูลทุจริตหรือมักใช้ในระบบคความปลอดภัย
  7. Typo Detection: ตรวจจับการพิมพ์ผิดหรือคำที่คลุมเคลือหรือความหมายใกล้เคียง
  8. Model Monitoring: ตรวจจับว่าโมเดลเรามีการ drift ควรที่จะ re-training แล้วหรือไม่

ดังนั้น Embeddings จึงมีความสำคัญมาก ๆ ในการสร้างปฎิสัมพันธ์ระหว่างมนุษย์กับคอมพิวเตอร์ที่เรียกว่า Human Computer Interaction

ทำไม Vector Embeddings ถึงสำคัญสำหรับ Gen AI?

Gen AI จำเป็นต้องเข้าใจความหมายของข้อความที่เราถามเพื่อสร้างเนื้อหาที่ถูกต้องและเกี่ยวข้องกัน ดังนั้น Vector Embeddings จะช่วยทำให้ Gen AI

  • มีความเข้าใจความหมายของคำและวลีต่าง ๆ
  • เรียนรู้ถึงความสัมพันธ์ระหว่างคำหรือข้อมูล
  • สร้างเนื้อหาใหม่ที่มีความหลากหลายและน่าสนใจ

ดังนั้น Embeddings จึงมีความสำคัญมาก มีตัวอย่างหนึ่งที่ทำให้ผู้อ่านเข้าใจ Embedding Space ได้มากขึ้นที่ทาง Nomic AI ทำ Platform ที่ชื่อว่า Atlas สำหรับแสดงความสัมพันธ์บน Embedding Space ในการแสดงข้อมูลของคำถามบน Stack Overflow กว่า 8 ล้านคำถาม เช่นเดียวกับตัวอย่าง Search บน Vector Search ข้างต้น สามารถเข้าผ่านลิงค์นี้ครับ

ถ้าเราขยายเข้าไปข้างในจะเห็นแต่ละหัวข้อ แต่ละ node ที่มีเนื้อหาใกล้กันก็จะอยู่ใกล้ศูนย์กลางของแต่ละหัวข้อ เช่นตัวอย่างนี้จะเป็นหัวข้อ Installing Python Packages เมื่อนำ Cursor ไปวางก็จะเห็นรายละเอียดบน node นั้นครับ ซึ่ง node ก็แทน content ในคำถามนั้น ๆ บน Stackoverflow

ทีนี้สมมติว่าเราจะ Query คำถามเราแม้ว่าชื่อหัวข้อจะไม่ตรงกับแต่ละ Node เป๊ะ ๆ แต่ด้วยการ Embedding เป็น Vector ก็ทำให้ Query หรือคำถามของเราถูกไปวางบน Embedding Space แล้วหาว่าเราใกล้เคียงคำถามใดเป็นคำตอบออกมาครับ

การหาความใกล้เคียงหรือคล้ายคลึงกันบน Embedding Space เป็นอย่างไร?

โดยปกติเราจะเรียกวิธีหาความคล้ายคลึงกันของแต่ละอย่างว่า Similarities เช่น Products ในห้างที่มีความใกล้เคียงกันก็อาจวัดด้วย Similarity Score ซึ่งมีหลายเทคนิคที่หาความใกล้เคียงครับ

ในบทความนี้ที่เราพูดถึง Vector Embeddings นั้น เราก็จะคำนวณหา Similarity โดยใช้ Metrics ต่าง ๆ เช่น L2 Distance, Cosine Similarity, Inner Product แบบที่เราเรียนเรื่อง Vector ตอนมัธยมเหมือนกันเลยครับ

  • L2 Distance หรือ ระยะทางแบบยุคลิด (Euclidean Distance) เป็นการวัดแบบระยะทางที่มีพื้นฐานจากทฤษฎีพีทาโกรัสครับ เจ้าสามเหลี่ยมที่เราหาความยาวด้านตรงข้ามมุมฉากนี่แหละครับ นำมาหาความใกล้เคียงกันยิ่งระยะทางน้อยก็แปลว่ายิ่งใกล้มาก
  • Cosine Similarity เป็นการหาความใกล้เคียงโดยใช้มุมนั่นเองยิ่งมุมองศาใกล้กันเท่าไรก็ยิ่งใกล้เคียงกันเท่านั้น โดยปกติ cos(0) = 1 , cos(90) = 0 ใช่ไหมครับ ดังนั้นยิ่งมุมน้อย ๆ ก็จะได้เลขใกล้เคียง 1 ยิ่งเหมือนครับ
สูตร Cosine Similarity แท้จริงคือภาพกลับของสูตร Inner Product
  • Inner Product หรือ Dot Product เป็นวิธีการคูณของ Vector เหมาะกับ Long Vector ซึ่งมี Vector Length ที่กว้างหรือยาวมาก ทำให้คูณได้ค่าที่มากในแต่ละ Dimension บน Vector ซึ่งในโจทย์นี้ที่เราจะใช้ Google Cloud ด้วย Text Embedding Model ที่มี dimension ประมาณ 768 dimensional จะใช้เป็นตัวนี้ครับ

Metrics เหล่านี้เราใช้ในการหาความใกล้เคียงอาจใช้ในการแบ่งกลุ่ม เช่น K-Mean หรือ K-Nearest Negihbors ที่ใช้ L2 Distance และยังมี Metric อื่น ๆ ในโจทย์ Similiarities เช่น Jaccard Similarity, Manhattan Distance, Minkowski Distance, Chebyshev distance

สำหรับ Google เองก็มี Algorithm เหล่านี้โดยเป็น ANN (Approximate Nearest Neighbor) Algorithm ที่ทรงประสิทธิภาพที่นับไว้เป็น ANN ที่ดีที่สุดในโลกเรียกว่า ScaNN ที่นำมาสร้างเป็น Service Google มากมายอย่าง Google Search, Youtube เป็นต้น และถูกนำมาสร้างเป็น Service บน Google Cloud ที่ชื่อว่า Vector Search

Embeddings API และ Vector Search บน Vertex AI เป็นอย่างไร?

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

Embeddings API

จริง ๆ การ Embedding เราสามารถใช้ Open Source หรือ Library ต่าง ๆ Embed เป็น Vector ได้ ซึ่งบางครั้ง อาจะต้องใช้เวลาในการเตรียมข้อมูลหรือ Training Vocabulary ต่าง ๆ เพื่อความง่ายดายรวดเร็วและทรงพลัง เราสามารถใช้ Text Embeddings Model บน Vertex AI ได้ จะเป็นตัว Model ที่ชื่อว่า textembedding-gecko และมีตัวที่รองรับ multilingual ชื่อว่า textembedding-gecko-multilingual เราสามารถเรียกใช้บน Model Garden ได้เลยครับ

จริง ๆ ก็สามารถ Embedding ได้ทั้ง Text, Images หรือจะใช้ของค่าย Meta ก็ได้ครับ ลักษณะจะการใช้งานก็แค่ Call APIs จะได้ Vector กลับมาก็จบกระบวนการ เราสามารถใช้ Vector นี้ไปหา Similarity ด้วย Metric ต่าง ๆ ตามที่แนะนำข้างบนด้วยการโค้ดดิ้งครับ

แต่ปัญหาถัดไปคือหลังจากได้ Vector มาแล้ว เราจะหา Similarity ในการคำนวณแต่ละ Vector ทั้งหมดใน Embedding Space ของเรา อาจจะใช้หน่วยประมวลมาก อาจจะถึงขั้นตอนเก็บข้อมูลอยู่บน Memory เพื่อให้ค้นหาได้ไว ไม่งั้นอาจเกิด Latency นานไม่เหมือนตัวอย่างที่เราเล่นตอนต้นบทความ จึงต้องใช้เครื่องมือมาช่วย Match Vector ครับ นั่นคือ Vector Search

Vertex AI Vector Search

ชื่อเดิมคือ Vertex AI Matching Engine ซึ่งเปลี่ยนชื่อมาเป็น Vector Search นั้นทำให้เข้าใจตัว Product ได้ง่ายขึ้น เราสามารถใช้ตัวนี้ในการค้นหาแบบ Semantic ซึ่งใช้เทคนิคของ Vector Similarity-matching ในการทำ Use Case แนว Search & Recommendation

หากให้อธิบายง่าย ๆ โดยอ้างอิง demo ของ Google บนเว็บ ai-demos.dev สำหรับ Vector Search เราจะแบ่งเป็นภาพใหญ่ 2 step ครับ

  1. Build Index
  2. Deploy

Build Index

ในการ Build Index เราจะได้นำผลลัพธ์จาก Embedding ไปเก็บบน Cloud Storage ในรูปแบบ JSON ทั้งนี้ผลลัพธ์จากการ Embedding อาจจะเขียนเองตั้งแต่ก็ได้ หรือใช้ API สำเร็จรูปอย่าง Vertex AI Embeddings ทั้งแบบ Text ธรรมหรือ Multimodal ก็ได้ครับ

ถ้าจากภาพตัวอย่างนี้ Google จะใช้ Vertex AI Workbench เขียน Python บน Jupyter Notebook เรียก Vertex AI Multimodal Embedding แล้ว dump ผลลัพธ์ออกเป็นไฟล์ JSON ไปวางที่ Cloud Storage ครับ เดี๋ยวขั้นตอนเหล่านี้ผมจะเล่าวิธีการในภาคปฎิบัติครับ

Deploy

เมื่อได้ Indexing แล้ว ก็ทำการ Deploy indexing นี้บนตัว Vector Search ครับ จะได้ออกมาเป็น API Endpoint ไปให้แอพต่าง ๆ ที่เราเขียนมาเรียกดังภาพข้างต้นที่ใช้ Cloud Run มาเรียกครับ

ถ้าจำลองสถานการณ์นี้คือ User มาใช้งานแอพบน Cloud Run โดยมีการ Input Query เข้ามา Query ของ User จะนำไป Embedding เป็น Vector ในขั้นแรก จากนั้นนำ Vector ที่ได้ไปเข้า Vector Search เพื่อทำการค้นหา Vector ที่ใกล้เคียงและเมื่อรวม 2 ขั้นตอนนั้นเป็นภาพใหญ่เราก็จะได้แอพที่ทำงานใน Use Case ต่าง ๆ ได้มากมายดังภาพครับ

Conclusion

ผมหวังว่าผู้อ่านทุกท่านจะได้รู้จักกับ Vector Embedding กันมากขึ้น เพื่อต่อยอดในโลกของ Gen AI ต่อไปครับ ในบทถัดไปภาคปฎิบัติ ผมจะพาทุกท่านไปลองเขียนโค้ด Embedding + Vector Search กันและทำความรู้จักกับ RAG มากขึ้น เพื่อเข้าใจบริการ Gen AI ที่ดีมาก ๆ บน Google Cloud ตัวหนึ่งนั่นคือ Vertex AI Search & Conversation ครับ แล้วเจอกันในบทความหน้าครับ

หากมีคำถามใด ๆ สามารถติดต่อทีมงานได้ทันทีครับ เรามีผู้เชี่ยวชาญที่มีการรับรองในทุก ๆ สาขาพร้อมให้คำปรึกษาครับ

--

--

Thakorn
Google Cloud Thailand

✨ Solution Engineering Google Cloud Partner All-star 2023 🍊 Google Cloud by Tangerine