Database
น้องๆ เคยเจอไหม เวลาเสิร์ชหาของใน Shopee Lazada แล้วมัน "ฉลาด" เหลือเกิน? พิมพ์ไปครึ่งคำ มันรู้แล้วว่าเราจะหาอะไร หรือ Netflix แนะนำหนังที่เราน่าจะชอบได้แม่นยำ นั่นแหละครับ ส่วนหนึ่งเป็นเพราะ Vector Database นี่แหละ
Vector Database เนี่ย มันไม่ใช่ database ธรรมดาๆ ที่เก็บข้อมูลเป็นตาราง หรือเป็น JSON นะ มันเก็บข้อมูลในรูปแบบของ "vector" หรือเวกเตอร์ ซึ่งเวกเตอร์เนี่ย มันคือชุดตัวเลขที่บ่งบอก "ความหมาย" หรือ "คุณลักษณะ" ของข้อมูลนั้นๆ ยกตัวอย่างง่ายๆ ถ้าเรามีรูปแมว 1 รูป Vector Database มันจะแปลงรูปแมวเป็นเวกเตอร์ โดยที่แต่ละตัวเลขในเวกเตอร์ อาจจะแทนสีขน รูปทรงหน้า ขนาดตา อะไรแบบนั้น
แล้วทำไมมันถึงสำคัญ? เพราะว่าการเก็บข้อมูลเป็นเวกเตอร์ ทำให้เราสามารถ "เปรียบเทียบความคล้ายคลึง" ของข้อมูลได้ง่ายมากๆ สมมติเรามีรูปแมวอีกรูปนึง เราก็แปลงเป็นเวกเตอร์ แล้วเอาไปเทียบกับเวกเตอร์ของรูปแมวรูปแรก ถ้าเวกเตอร์มัน "ใกล้กัน" แสดงว่ารูปแมวสองรูปนี้คล้ายกัน ซึ่งการเทียบความคล้ายคลึงแบบนี้ มันเป็นหัวใจสำคัญของ AI Machine Learning และ Search Engine ยุคใหม่เลยล่ะ
Vector Embedding คือกระบวนการแปลงข้อมูลให้อยู่ในรูปของเวกเตอร์ ไอ้ที่พี่บอกว่าแปลงรูปแมวเป็นตัวเลขนั่นแหละ แต่ไม่ใช่แค่รูปภาพนะ ข้อความ เสียง วิดีโอ อะไรก็ได้ เราสามารถแปลงเป็นเวกเตอร์ได้หมด โดยใช้เทคนิคต่างๆ เช่น Word Embedding (สำหรับข้อความ) Image Embedding (สำหรับรูปภาพ) ซึ่งเทคนิคเหล่านี้ ส่วนใหญ่แล้ว จะใช้ Machine Learning Model ในการเรียนรู้และสร้างเวกเตอร์
สมัยพี่ทำร้านเน็ต พี่เคยเจอเคสลูกค้าอยากทำระบบค้นหารูปภาพ สมัยนั้นยังไม่มี Vector Database แบบนี้ พี่ต้องเขียน code เองทั้งหมด โคตรเหนื่อย ต้องมานั่ง extract features จากรูปภาพ แล้วเขียน algorithm ในการเทียบความคล้ายคลึง แถม performance ก็ไม่ค่อยดีเท่าไหร่ ถ้ามี Vector Database ตั้งแต่สมัยนั้น ชีวิตพี่คงง่ายขึ้นเยอะ
Similarity Search คือการค้นหาข้อมูลที่ "คล้าย" กับข้อมูลที่เรามี โดยใช้ Vector Database นี่แหละ หลักการก็คือ เราแปลงข้อมูลที่เราต้องการค้นหา ให้เป็นเวกเตอร์ แล้วเอาไปเทียบกับเวกเตอร์ทั้งหมดที่อยู่ใน database Vector ที่ "ใกล้" กับเวกเตอร์ที่เราค้นหา ก็คือข้อมูลที่ "คล้าย" กัน
ยกตัวอย่าง ถ้าเรามีข้อความ "ฉันชอบกินไอติม" แล้วเราอยากหาข้อความอื่นๆ ที่มีความหมายคล้ายกัน เราก็แปลงข้อความนี้เป็นเวกเตอร์ แล้วเอาไปค้นหาใน Vector Database เราอาจจะได้ผลลัพธ์เป็นข้อความ "ฉันโปรดปรานไอศกรีม" หรือ "ไอติมอร่อยมาก" อะไรแบบนี้ เห็นไหมว่ามัน "ฉลาด" กว่าการค้นหาด้วย keyword ธรรมดาๆ เยอะเลย
เอาล่ะ มาถึงส่วนที่สำคัญที่สุด คือการใช้งาน Vector Database พี่จะยกตัวอย่างการใช้งาน Pinecone และ Weaviate นะ เพราะเป็นสองตัวที่คนนิยมใช้กันเยอะที่สุด
Pinecone เป็น Vector Database แบบ Cloud-based ใช้งานง่าย ไม่ต้อง setup อะไรเยอะ เหมาะสำหรับคนที่อยากเริ่มใช้งาน Vector Database อย่างรวดเร็ว
pip install pinecone-clientimport pinecone
pinecone.init(api_key="YOUR_API_KEY", environment="YOUR_ENVIRONMENT")
index_name = "my-index"
if index_name not in pinecone.list_indexes():
pinecone.create_index(index_name, dimension=128, metric="cosine")
index = pinecone.Index(index_name)
vectors = [
("vec1", [0.1, 0.2, 0.3, ...], {"genre": "comedy"}),
("vec2", [0.4, 0.5, 0.6, ...], {"genre": "action"}),
]
index.upsert(vectors=vectors)
results = index.query(
vector=[0.15, 0.25, 0.35, ...],
top_k=2,
filter={"genre": {"$eq": "comedy"}}
)
print(results)
Code นี้ พี่อธิบายสั้นๆ นะ เริ่มจาก import library แล้วก็ init Pinecone ด้วย API key ของเรา จากนั้นก็สร้าง index (ถ้ายังไม่มี) แล้วก็ insert vectors เข้าไป แต่ละ vector จะมี ID vector เอง และ metadata (ข้อมูลเพิ่มเติม) สุดท้ายก็ query หา vector ที่คล้ายกัน โดย filter ตาม genre ที่เราต้องการ
Weaviate เป็น Vector Database แบบ Open-source ติดตั้งได้เอง มีความยืดหยุ่นสูง เหมาะสำหรับคนที่ต้องการควบคุมทุกอย่างด้วยตัวเอง หรือต้องการใช้ Vector Database ใน environment ที่เป็นส่วนตัว
version: '3.4'
services:
weaviate:
image: semitechnologies/weaviate:1.18.0
ports:
- "8080:8080"
- "50051:50051"
restart: on-failure:0
environment:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none'
ENABLE_MODULES: 'text2vec-openai'
volumes:
- weaviate_data:/var/lib/weaviate
volumes:
weaviate_data:
docker-compose up -dimport weaviate
import json
client = weaviate.Client(
url="http://localhost:8080", # Replace with your Weaviate URL
)
class_obj = {
"class": "MyClass",
"description": "A class to hold my objects",
"vectorizerConfig": {
"vectorizer": "none"
},
"properties": [
{
"name": "name",
"dataType": ["text"]
},
{
"name": "description",
"dataType": ["text"]
}
]
}
client.schema.create_class(class_obj)
data_obj = {
"name": "Object 1",
"description": "This is the first object"
}
vector = [0.1, 0.2, 0.3, 0.4, 0.5] # Replace with your own vector
client.data_object.create(data_obj, "MyClass", vector=vector)
response = (
client.query
.get("MyClass", ["name", "description"])
.with_near_vector({
"vector": [0.11, 0.22, 0.33, 0.44, 0.55]
})
.with_limit(2)
.do()
)
print(json.dumps(response, indent=4))
Code นี้ ก็จะซับซ้อนกว่า Pinecone นิดนึง เพราะเราต้อง setup environment เอง เริ่มจากติดตั้ง Docker แล้วก็สร้าง Docker Compose file เพื่อ run Weaviate จากนั้นก็เขียน code เพื่อสร้าง class (คล้ายๆ table ใน database ทั่วไป) แล้วก็ insert objects เข้าไป แต่ละ object จะมี properties (ข้อมูล) และ vector สุดท้ายก็ query หา object ที่คล้ายกัน โดยใช้ near_vector
สมัยพี่ทำร้านเน็ต พี่เคยใช้ Weaviate ทำระบบค้นหาบทความ พี่เอาบทความทั้งหมดมาแปลงเป็นเวกเตอร์ แล้วเก็บไว้ใน Weaviate เวลาลูกค้าค้นหา พี่ก็แปลง query ของลูกค้าเป็นเวกเตอร์ แล้วเอาไปค้นหาใน Weaviate ผลลัพธ์ที่ได้ แม่นยำกว่าการค้นหาด้วย keyword ธรรมดาๆ เยอะเลย
Vector Database ไม่ได้มีแค่ Pinecone กับ Weaviate นะ ยังมีทางเลือกอื่นๆ อีกเยอะ เช่น Milvus Qdrant FAISS แต่ละตัวก็มีข้อดีข้อเสียต่างกัน พี่จะสรุปเป็นตารางให้ดูง่ายๆ นะ
| Database | ประเภท | จุดเด่น | จุดด้อย | เหมาะกับ |
|---|---|---|---|---|
| Pinecone | Cloud-based | ใช้งานง่าย ไม่ต้อง setup เยอะ | ราคาแพง ควบคุมได้น้อย | คนที่ต้องการเริ่มใช้งาน Vector Database อย่างรวดเร็ว |
| Weaviate | Open-source | ยืดหยุ่นสูง ควบคุมได้เยอะ | setup ยาก ต้องดูแลเอง | คนที่ต้องการควบคุมทุกอย่างด้วยตัวเอง |
| Milvus | Open-source | ประสิทธิภาพสูง รองรับข้อมูลขนาดใหญ่ | setup ยาก ต้องมีความรู้เรื่อง distributed systems | คนที่ต้องการประสิทธิภาพสูง และมีทีมงานดูแล |
| Qdrant | Open-source | เขียนด้วย Rust performance ดี กิน resource น้อย | ยังใหม่ community เล็ก | คนที่ต้องการ performance ดี และชอบ Rust |
| FAISS | Library | เร็วมาก เหมาะกับ in-memory search | ต้อง load data เข้า memory ทั้งหมด | คนที่ต้องการความเร็วสูง และมี memory เพียงพอ |
น้องๆ ลองเลือกดูนะ ว่าตัวไหนเหมาะกับ use case ของตัวเอง ไม่มีตัวไหน "ดีที่สุด" มีแต่ตัวที่ "เหมาะที่สุด" SiamCafe Blog เรามีบทความเกี่ยวกับ database อีกเยอะ ลองเข้าไปอ่านดูได้
สมัยพี่ทำร้านเน็ต พี่เคยลองเล่น FAISS เพราะมันเร็วมาก แต่ปัญหาคือ พี่ต้อง load data เข้า memory ทั้งหมด ซึ่ง memory ของ server พี่ มันไม่พอ สุดท้ายก็ต้องเปลี่ยนไปใช้ตัวอื่น
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไร ถามมาได้เลย พี่พร้อมตอบเสมอ SiamCafe Blog ยินดีต้อนรับเสมอ
ดูวิดีโอเพิ่มเติมเกี่ยวกับVector Database Pinecone Weavi:
เอาล่ะน้องๆ หลังจากที่เราพอเข้าใจ Vector Database กันแล้ว คราวนี้มาดูเคล็ดลับที่พี่บอมสั่งสมมาจากการใช้งานจริงบ้างดีกว่า สมัยผมทำร้านเน็ตนี่เจอปัญหามาเยอะ บอกเลยว่าประสบการณ์สอนเราได้ดีที่สุด
การเลือก Vector Database นี่สำคัญนะ ไม่ใช่ว่าอันไหนก็ใช้ได้หมด ต้องดู use case ของเราเป็นหลัก อย่าง Pinecone เนี่ยเหมาะกับ scale ใหญ่ๆ performance สูงๆ แต่ถ้า project เล็กๆ Weaviate ก็เหลือๆ แล้ว ประหยัดเงินในกระเป๋าไปได้เยอะ
1. Data Preprocessing is Key: ก่อนจะเอาข้อมูลอะไรยัดเข้าไปใน Vector Database เนี่ย ต้อง clean ข้อมูลให้ดีก่อนนะ พวก null value, duplicate data นี่จัดการให้เรียบร้อย ไม่งั้น vector embedding ที่ได้มามันจะเพี้ยน แล้ว search result ก็จะมั่วตามไปด้วย
# ตัวอย่าง Python code สำหรับ data cleaning
import pandas as pd
df = pd.read_csv('your_data.csv')
df = df.dropna() # ลบ row ที่มีค่า null
df = df.drop_duplicates() # ลบ row ที่ซ้ำ
2. Optimize Embedding Model: เลือก embedding model ให้เหมาะกับภาษาและ domain ของข้อมูลเราด้วย สมัยก่อนผมเคยใช้ model ที่ train มากับภาษาอังกฤษอย่างเดียว แล้วเอามาใช้กับภาษาไทย ผลคือเละ! ตอนหลังถึงรู้ว่าต้อง fine-tune model เอง หรือใช้ model ที่รองรับภาษาไทยโดยเฉพาะ
3. Indexing Strategy Matters: Vector Database แต่ละตัวก็มี indexing algorithm ที่แตกต่างกันไป ลองศึกษาดูว่าอันไหนเหมาะกับ data distribution ของเรามากที่สุด บางทีการเปลี่ยน indexing algorithm แค่อย่างเดียว ก็ทำให้ performance ดีขึ้นแบบก้าวกระโดดเลย
ยกตัวอย่าง Pinecone เนี่ย เค้าจะมี index types ให้เลือก เช่น "hnsw" (Hierarchical Navigable Small World) ซึ่งเหมาะกับ nearest neighbor search บน dataset ขนาดใหญ่มากๆ แต่ก็ต้องแลกมาด้วย memory consumption ที่สูงขึ้น
อย่าลืม iCafeForex นะน้องๆ เผื่อใครอยากลงทุน
Database ทั่วไป (relational database) เนี่ยเน้นเก็บข้อมูลแบบ structured เช่น ชื่อ ที่อยู่ เบอร์โทรศัพท์ แล้ว query ข้อมูลด้วย SQL ที่แม่นยำ แต่ Vector Database เนี่ยเน้นเก็บข้อมูลแบบ unstructured เช่น รูปภาพ ข้อความ เสียง แล้ว query ข้อมูลด้วยความหมาย (semantic similarity) ไม่ใช่แค่ keyword matching
เหมาะกับ use case ที่ต้องการความสามารถในการ search ที่มีความหมาย เช่น search รูปภาพที่คล้ายกัน, recommendation engine, chatbot ที่เข้าใจคำถามของผู้ใช้, fraud detection ที่จับความผิดปกติของ transaction
สมัยนี้มี cloud-based Vector Database ให้ใช้เยอะแยะ อย่าง Pinecone หรือ Weaviate เนี่ย ก็มี free tier ให้ลองเล่นได้สบายๆ แต่ถ้าอยากจะ deploy เอง ก็ต้องมีความรู้เรื่อง infrastructure พอสมควร
ถ้าแค่ใช้งานพื้นฐาน ก็ไม่จำเป็นต้องมีความรู้ Machine Learning ลึกซึ้ง แค่เข้าใจ concept ของ vector embedding ก็พอ แต่ถ้าอยากจะปรับแต่ง model เอง หรือ optimize performance ก็ต้องศึกษา Machine Learning เพิ่มเติม
Vector Database เนี่ยเป็นเครื่องมือที่ทรงพลังมากๆ สำหรับการจัดการข้อมูลแบบ unstructured ที่ต้องการความสามารถในการ search ที่มีความหมาย แต่ก็ต้องเลือกใช้ให้เหมาะสมกับ use case และมีความรู้ความเข้าใจใน concept พื้นฐาน เพื่อให้ใช้งานได้อย่างมีประสิทธิภาพ
อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะน้องๆ มีอะไรดีๆ อีกเยอะ