,

Embedding & VectorStore with Bigquery

ทำความรู้จัก Embedding และ VectorStore แล้วมาลองทำบน Google Bigquery กัน🚀

ตัวอย่าง Embedding visualize https://projector.tensorflow.org/

ในยุคที่ AI และข้อมูลมีบทบาทสำคัญ การทำ Embedding กลายเป็นขั้นตอนที่จำเป็นในการป้อนข้อมูลให้ AI ทำงานได้อย่างมีประสิทธิภาพ ไม่ว่าจะเป็นการสร้างโมเดลตอบคำถามแบบ RAG(Retrieval-Augmented Generation) หรือระบบแนะนำสินค้า เพื่อให้ AI สามารถเข้าใจและประมวลผลข้อมูลได้อย่างลึกซึ้งยิ่งขึ้น

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

โดยในบทความจะประกอบไปด้วย 
1. Introduction with Embedding and Vectorstore
2. Implement embedding & Vector search on Bigquery


Introduction with Embedding and Vectorstore

Embedding

ถ้าแปลตรงตัวตาม Dictionary ก็คือ ฝัง ติดตรึง ซึ่งเราก็จะไม่ค่อยเข้าใจกันถ้าแปลแค่นี้😅 แต่ถ้าจะอธิบายง่ายๆให้เห็นภาพอีกนิดจะเข้าใจว่าการทำ Embedding นั้นคือการที่เราให้ Model ทำการแปลงข้อมูลของเราไปเป็นตัวเลขในรูปแบบ Vector ไม่ว่าจะเป็น text, image หรือ graph และฝังเข้าไปที่ embedding space ซึ่งตัวเลขที่ถูกสร้างขึ้นมานั้นจะเป็นการบ่งบอกคุณสมบัติของสิ่งนั้นๆตามแต่ละ Dimension(มิติ) ซึ่งถ้าสิ่งนั้นมีคุณสมบัติใกล้เคียงก็ถูกจัดวางให้อยู่ใกล้เคียงกัน

จำนวน Dimension และ ความหมายของแต่ละ Dimension จะไม่ใช่ความหมายที่ตายตัวทั้งนี้ขึ้นอยู่กับข้อมูล📖

(จะไม่ขอลงลึกไปขนาดที่ว่าได้มาซึ่งตัวเลขยังไงซึ่งจะยาวเกินไปนิดนะครับ🤓)

ตัวอย่างการทำ Embedding อาจมีได้เกิน 100+ Dimension

ถ้ายังไม่เข้าใจมาดูการเปรียบเทียบ Embedding จาก 1 มิติไป 3 มิติ

1 มิติ จะมีแค่ความใกล้เคียงของการเป็น sandwich
2 มิติ จะมีมิติความใกล้เคียงของการเป็น sandwich และมิติของหวาน
3 มิติ จะมีมิติความใกล้เคียงของการเป็น sandwich ,มิติของหวาน และมิติของเหลว

“การทำ Embedding นั้นเปรียบเสมือนการสร้างแผนที่ให้กับข้อมูลของเรา โดยแต่ละจุดบนแผนที่ (หรือแต่ละ Vector) จะแทนข้อมูลหนึ่งชิ้น และระยะห่างระหว่างจุดต่างๆ บนแผนที่ก็จะบ่งบอกถึงความสัมพันธ์ระหว่างข้อมูลนั้นๆ เช่น คำที่มีความหมายใกล้เคียงกันก็จะถูกวางไว้ใกล้กันบนแผนที่”


Vector Store — Database — Index

ความหมายของ Vector แปลตรงตัวก็ “เส้นสมมุติหรือลูกศรสมมุติแสดงปริมาณและทิศทาง” เอาเป็นว่าการที่เราได้ค่า Embedding มามันจะอยู่ในรูปแบบ Vector โดยมีค่าเริ่มต้นจากแกนกลางไปจนถึงจุดที่ตัวมันอยู่ ถ้าอยากลงลึกก็คงต้องย้อนไปเรียน คณิตศาสตร์ ม.ปลายกันเลยทีเดียว😅

รูปอธิบายแบบง่ายๆ ว่า Vector คืออะไร

VectorStore

ในบทความนี้คือการจัดเก็บข้อมูลตัวเลข Vector ที่ได้มาซึ่งการทำ Embedding หรือก็คือ Embedding vector โดยเราจะจัดเก็บได้ที่ Database ที่มีการรองรับ Vector ไม่งั้นที่ๆเราไปจัดเก็บจะมองว่าเป็นเพียงแค่ Array of number (ชุดข้อมูลตัวเลข) เท่านั้นไม่สามารถใช้ประโยชน์ได้เต็มที่

ตัวอย่าง Embedding vector ตัวเลขแต่ละตำแหน่งบ่งบอกถึงค่าตัวเลขในแต่ละมิติ อย่างในรูปมีทั้งหมด 100 Dimension (มิติ)

Vector Database

ฐานข้อมูลที่มีความสามารถในการจัดเก็บข้อมูลที่เป็น Embedding Vector ได้และสามารถทำการ Index พร้อมทั้งใช้ประโยชน์ของ Vector ได้ เช่น Semantic Search การค้นหาคำที่ใกล้ ซึ่งในบทความจะใช้ Bigquery เป็น Vector Database

ตัวอย่าง Vector database ยังมีอื่นๆอีกมากมาย

Vector Index

เป็นส่วนสำคัญที่จะทำให้ Vector database ได้รู้จักมักคุ้นชินกับ Embedding vector นั้นเอง เพื่อเวลาที่มีการเรียกใช้จะสามารถทำงานได้อย่างเต็มที่ อย่างบาง Database ถ้าเราไม่ทำ Index เราก็ไม่สามารถใช้คำสั่งพวก find nearest (ค้นหาใกล้เคียง)ได้นั้นเอง


Implement embedding & Vector search on Bigquery

อย่างที่ทราบว่า Bigquery นั้นเป็น Data warehouse ที่มีศักยภาพที่สูงตัวหนึ่งในโลกของ Data เป็นหนึ่งในบริการของ Google Cloud Platform และ สมมุติว่าเรามี Data อยู่ใน Bigquery อยู่แล้วบางกรณีเราก็ไม่จำเป็นจะต้องเอา Data เราไปเก็บที่ Vector Database ข้างนอก ทาง Google ก็เลยเพิ่ม feature ตรงนี้มาให้ (vendor lock-in สุดๆไปเลย😂)

เมื่อไม่นานมานี้ GCP ได้ประกาศว่าเปิดให้ใช้งาน Vector search เป็น GA(General available) เรียบร้อยแล้ว (GA ประกาศเมื่อเดือนกันยายน 2024 และบทความนี้สร้างขึ้นตอน ตุลาคม 2024)

ซึ่งในบทความนี้ก็จะพาลงมือทำว่าเราสามารถสร้าง จัดเก็บและเรียกใช้ Embedding ได้ยังไงบน Bigquery

ตัวอย่าง usecase ของ Bigquery vector search

Always start with a plan

เป็นทุกครั้งที่จะทำอะไรต้องวางแผนเสมอจะได้เข้าใจได้ง่ายขึ้น⬇️

  1. สร้าง Dataset, Table จาก ข้อมูลที่เตรียมไว้
  2. สร้าง Remote connection และ Grant permission IAM
  3. สร้าง Remote Embedding model และ สร้าง Embedding table ใหม่จากข้อมูลเดิม
  4. ทำ Index vector
  5. ทดสอบ Vector search

1. สร้าง Dataset, Table จาก ข้อมูลที่เตรียมไว้

ทำการสร้าง Table จากข้อมูลที่แนบไว้ให้ ถ้าได้ใช้ข้อมูลที่เตรียมให้ระวังเรื่องชื่อ Field ต่างๆด้วยครับ

โดยทุกขั้นตอนต่อจากนี้ขอให้อยู่ใน Location เดียวกันโดยจะเป็นอะไรก็ได้ โดยผู้เขียนใช้เป็น US-central 1 เพราะถูกดี😅

dataset:https://github.com/peetck/IMDB-Top1000-Movies/blob/master/IMDB-Movie-Data.csv

2. สร้าง Remote connection และ Grant permission IAM

ทำการสร้าง Remote connection เพราะเราจะต้องมีการเรียกใช้ Vertex ai model โดยไปที่ +ADD ที่อยู่ด้านบนแท็บที่เราเอาไว้ดู Table ต่างๆของเรา

+Add แล้วสร้าง New connection เอาไว้เรียก Vertex ai model

มอบสิทธิ์การใช้งาน Vertex ai user ให้กับ Remote connection service account ได้ที่ IAM

service account id จะอยู่ด้านล่างสุดของ connection info
เพิ่มสิทธิ์ Vertex ai user ให้กับ connection service account

3. สร้าง Remote Embedding model และ สร้าง Embedding table ใหม่จากข้อมูลเดิม

เริ่มต้นเป็นการสร้าง Model remote บน dataset ของเราโดยใช้ SQL ดังนี้

CREATE OR REPLACE MODEL `{Projectid}.{datasetID}.{name}`
REMOTE WITH CONNECTION `{ให้เอามาจาก Connection ID ใน connection info}`
OPTIONS (ENDPOINT = 'text-embedding-004');
-- ENDPOINT เราสามารถเลือก model ได้
-- ถ้าข้อมูลเรามีภาษาไทยแนะนำให้ใช้ 'text-multilingual-embedding-002'
-- ตัวอย่าง ⬇️
CREATE OR REPLACE MODEL `your-project.embedding_demo.embedding_model`
REMOTE WITH CONNECTION `projects/your-project/locations/us-central1/connections/demo-connection`
OPTIONS (ENDPOINT = 'text-embedding-004');

หลังจากมี model พร้อมใช้สำหรับ Embedding แล้วก็มาทำการ Embedding กัน

CREATE TABLE `{Projectid}.{datasetID}.{name}` 
AS (
SELECT *
FROM
ML.GENERATE_EMBEDDING(
MODEL {ชื่อ model ที่เพิ่งสร้างก่อนหน้า},
(SELECT {Column ที่อยาก Embed} as content
,{Title หรือ id ที่สามารถเอากลับไป join table เก่าได้} as title
,{column แถมที่อยากเก็บไว้แสดงผลที่หลัง จะใส่ไม่ใส่ก็ได้}
FROM `{Projectid}.{datasetID}.{table name}`),
STRUCT(TRUE AS flatten_json_output
,'RETRIEVAL_DOCUMENT' as task_type -- ประเภทการใช้งานสามารถดูได้ที่ Document
256 AS output_dimensionality) -- จำนวน Dimension หรือมิติ

)
);

-- ตัวอย่างเมื่อเติมข้อมูลต่างๆ
CREATE TABLE `your-project.embedding_demo.movies_embedding`
AS (
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL `your-project.embedding_demo.embedding_model`,
(
SELECT Title as title, Description as content, Rank
FROM `your-project.embedding_demo.movies`
),
STRUCT( True AS flatten_json_output,
'SEMANTIC_SIMILARITY' AS task_type,
256 AS output_dimensionality)
)
);
เมื่อทำการ Embedding เสร็จแล้วเมื่อไปดูข้อมูลจะเห็น column ใหม่ที่เป็น Embedding vector

4. ทำ Index vector

เนื่องด้วยข้อมูลขั้นต่ำในการทำต้องเป็น 5000 rows เราเลยจะไม่ได้ทำ แต่ถ้าผู้อ่านมีข้อมูลมากกว่า 5000 rows กรุณาทำ index ด้วยเพื่อความแม่นยำ

CREATE VECTOR INDEX my_index ON `your-project.embedding_demo.movies_embedding`(ml_generate_embedding_result)
OPTIONS(distance_type='COSINE'
, index_type='IVF'
, ivf_options='{"num_lists": 1000}');
-- ในส่วนของ OPTIONS เป็นการเลือกและตั้งค่า algorithm ของการทำ index สามารถดูเพิ่มเติมที่ Document ได้

5. ทดสอบ Vector search

พอทุกอย่างครบถ้วนแล้วเราก็มาทำการทดสอบโดยเราจะทดสอบหาค่า Similarity search ตัวอย่างตามด้านล่าง

DECLARE QUERY STRING;
SET QUERY = 'Comedy'; # คำที่เราอยากค้นหา

SELECT query.query, base.title, base.Rank, base.content,
FROM VECTOR_SEARCH(
TABLE `your-project.embedding_demo.movies_embedding`,
'ml_generate_embedding_result',
(
SELECT ml_generate_embedding_result, content AS query
FROM ML.GENERATE_EMBEDDING(
MODEL `your-project.embedding_demo.embedding_model`,
(SELECT QUERY AS content), # ตรงนี้จะใส่เป็นค่า string ลงไปเลยก็ได้แต่ผู้เขียนสร้างเป็นตัวแปรเพื่อที่จะได้เปลี่ยนคำค้นหาได้ง่าย
STRUCT( True AS flatten_json_output,
'SEMANTIC_SIMILARITY' AS task_type,
256 AS output_dimensionality)
) # ส่วนนี้จะคล้ายกับตอนที่เราสร้าง table ก่อนหน้า
),
top_k => 5 # ต้องการ output ข้อมูล 5 ต่ำแหน่งที่ใกล้ที่สุด
)
ตัวอย่าง output ผ่านการทำ Vector search ☺️
ผลลัพธ์ที่ได้ตามเป้าหมาย แฮ่

สรุป

เราก็ได้รู้ไปแล้วว่า Embedding คืออะไร Vector คืออะไรทั้ง Database, search, index ในตัวอย่างนั้นเป็นเพียงการทำแบบให้พอเข้าใจเบื้องต้นเท่านั้น ในการใช้งานจริงๆอาจจะต้องมีการ query ที่ซับซ้อนมากขึ้นหรือจะมีการเชื่อมต่อกับ LLM อย่าง Gemini เพื่อทำ RAG ไปช่วยในการตอบคำถามเป็นต้น ในยุคที่ AI กำลังเข้ามาการที่เราเข้าใจว่า Embedding ทำงานยังไงก็เป็นเรื่องที่ไม่เสียหายอะไร


Source:

https://cloud.google.com/bigquery/docs/generate-text-embedding

Follow me here!

Medium: https://medium.com/@puk.kriangsak
FB page: https://www.facebook.com/profile.php?id=61563097228247

Please subscribe!

Leave a comment