คู่มือใช้งานส่วนขยาย pgvector PostgreSQL ใน ServBay
pgvector เป็นส่วนขยายของ PostgreSQL จากนักพัฒนาภายนอกที่ทรงพลังซึ่งเสริมความสามารถให้ PostgreSQL ด้วยชนิดข้อมูลเวกเตอร์และวิธีการจัดทำดัชนีเวกเตอร์ประสิทธิภาพสูง เช่น IVFFlat และ HNSW ช่วยให้ PostgreSQL สามารถรองรับการจัดเก็บข้อมูลแบบเวกเตอร์และการค้นหาคล้ายคลึงโดยตรง เหมาะสำหรับการสร้างแอปพลิเคชัน AI, ระบบแนะนำ, การประมวลผลภาพ และการประมวลผลภาษาธรรมชาติที่ต้องจัดการข้อมูลเวกเตอร์ความมิติสูง
ServBay เป็นเครื่องมือรวมสภาพแวดล้อมการพัฒนาเว็บบนเครื่อง ซึ่งติดตั้ง PostgreSQL และส่วนขยาย pgvector มาพร้อมในตัว ทำให้กระบวนการเปิดใช้งานและใช้งานฐานข้อมูลเวกเตอร์ในเครื่องเป็นเรื่องง่ายมากขึ้น บทความนี้จะอธิบายวิธีใช้งาน pgvector กับ ServBay โดยละเอียด
pgvector คืออะไร และเหตุใดจึงสำคัญ
ในหลายกรณีการใช้งานแอปพลิเคชันยุคใหม่ ข้อมูลไม่ได้เป็นเพียงข้อความหรือค่าตัวเลขแบบโครงสร้างอีกต่อไป โดยเฉพาะเมื่อ AI และ Machine Learning เข้ามามีบทบาท ข้อมูลมักถูกแปลงเป็นเวกเตอร์ความมิติสูง หรือเรียกว่า “embeddings” ซึ่งเวกเตอร์เหล่านี้จับสาระสำคัญหรือคุณลักษณะของข้อมูล เช่น คุณลักษณะภาพ ความหมายของข้อความ หรือความชอบของผู้ใช้
ส่วนขยาย pgvector ช่วยให้ PostgreSQL สามารถบันทึกเวกเตอร์โดยตรง และทำการค้นหาคล้ายคลึงเวกเตอร์อย่างมีประสิทธิภาพ (“การค้นหา K-ใกล้เคียง”) ซึ่งหมายความว่าคุณสามารถใช้ภาษา SQL ที่คุ้นเคยในการค้นหาข้อมูลที่ใกล้เคียงกับเวกเตอร์เป้าหมาย โดยไม่ต้องแยกข้อมูลเวกเตอร์ไปยังฐานข้อมูลเฉพาะทาง ทำให้ลดความซับซ้อนของเทคโนโลยีที่ใช้
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้นใช้งาน pgvector กรุณาตรวจสอบว่าคุณมีสิ่งต่อไปนี้:
- ได้ติดตั้งและเปิดใช้งาน ServBay บน macOS แล้ว
- ในรายการ "ชุดโปรแกรม" (Packages) ของ ServBay ได้เปิดใช้งาน PostgreSQL หากยังไม่เปิดใช้งาน ให้ค้นหา PostgreSQL ในแอป ServBay และตั้งค่าให้ “Enabled”
เปิดใช้งานส่วนขยาย pgvector ใน PostgreSQL ของ ServBay
ServBay ได้ติดตั้งไฟล์ส่วนขยาย pgvector ไว้ในไดเรกทอรีของ PostgreSQL แล้ว คุณไม่ต้องดาวน์โหลดหรือคอมไพล์เอง เพียงเปิดใช้งานสำหรับฐานข้อมูลที่ต้องการใช้เท่านั้น
ขั้นตอนการเปิดใช้งาน pgvector ในฐานข้อมูล PostgreSQL ที่ ServBay ให้มา:
เชื่อมต่อกับฐานข้อมูล PostgreSQL
คุณสามารถใช้เครื่องมือบรรทัดคำสั่งpsqlเชื่อมต่อกับ PostgreSQL ของ ServBay โดย ServBay ตั้งค่ามาตรฐานให้เปิดเชื่อมต่อเฉพาะเครื่องอยู่แล้ว โดยผู้ใช้หลักอาจเป็นpostgresหรือservbayและพอร์ตมาตรฐานคือ5432หากมีการตั้งค่าแตกต่างออกไป กรุณาตรวจสอบการตั้งค่าฐานข้อมูลของ ServBayเปิดเทอร์มินัลแล้วรันคำสั่งต่อไปนี้ (ปรับเปลี่ยนชื่อผู้ใช้และฐานข้อมูลให้ตรงกับการตั้งค่าของคุณ):
bashpsql -U servbay -d your_database_name -h localhost -p 54321-U servbay: กำหนดชื่อผู้ใช้เป็นservbay(หรือpostgres)-d your_database_name: กำหนดฐานข้อมูลที่ต้องการเชื่อมต่อ หากฐานข้อมูลยังไม่ถูกสร้าง ให้สร้างก่อนด้วยคำสั่ง (เช่นCREATE DATABASE servbay_demo_db;)-h localhost: กำหนดโฮสต์เป็นเครื่องของคุณ-p 5432: กำหนดพอร์ต5432(พอร์ตมาตรฐานของ PostgreSQL ใน ServBay)
สร้างส่วนขยาย
vector
เมื่อเชื่อมต่อสำเร็จ รันคำสั่ง SQL ต่อไปนี้ที่ prompt ของpsqlเพื่อเปิดใช้งานส่วนขยายpgvector:sqlCREATE EXTENSION vector;1หากมีการเปิดใช้งานไว้แล้ว อาจมีข้อความแจ้งเตือนว่า extension มีอยู่แล้ว
ตรวจสอบการติดตั้ง
คุณสามารถตรวจสอบว่าติดตั้งpgvectorสำเร็จแล้วหรือไม่ โดยแสดงรายการ extension ที่ติดตั้งไว้:sql\dx1ในรายงานที่ออกมา คุณควรเห็น extension ชื่อ
vectorและแสดงข้อมูลเวอร์ชันList of installed extensions Name | Version | Schema | Description ----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language vector | 0.7.0 | public | vector data type and ivfflat and hnsw access methods (2 rows)1
2
3
4
5
6หมายเหตุ: หมายเลขเวอร์ชันอาจจะต่างออกไปตามเวอร์ชันที่ ServBay ติดตั้งไว้
การตั้งค่าและใช้งาน pgvector
เมื่อเปิดใช้งาน pgvector แล้ว คุณสามารถสร้างและจัดการข้อมูลเวกเตอร์ในฐานข้อมูลได้
สร้างตารางสำหรับบันทึกเวกเตอร์
ก่อนอื่นต้องสร้างตารางเพื่อบันทึกข้อมูลเวกเตอร์ โดย pgvector มีชนิดข้อมูลใหม่ VECTOR(dimensions) ซึ่ง dimensions คือจำนวนมิติของเวกเตอร์
ตัวอย่างการสร้างตารางชื่อ embeddings เพื่อบันทึกเวกเตอร์ 3 มิติ:
sql
CREATE TABLE embeddings (
id SERIAL PRIMARY KEY,
-- กำหนดคอลัมน์เวกเตอร์ที่มี 3 มิติ
vector VECTOR(3)
);1
2
3
4
5
2
3
4
5
ต่อมา ใส่ข้อมูลเวกเตอร์ตัวอย่าง:
sql
INSERT INTO embeddings (vector) VALUES
('[0.1, 0.2, 0.3]'),
('[0.4, 0.5, 0.6]'),
('[0.7, 0.8, 0.9]'),
('[0.15, 0.25, 0.35]'),
('[0.6, 0.5, 0.4]'); -- เพิ่มข้อมูลเพื่อให้การใช้งานตัวอย่างชัดเจนขึ้น1
2
3
4
5
6
2
3
4
5
6
หมายเหตุ: ค่าของเวกเตอร์ต้องอยู่ในวงเล็บเหลี่ยม [] และคั่นแต่ละมิติด้วยเครื่องหมายจุลภาค
สร้างดัชนีเวกเตอร์เพื่อเพิ่มประสิทธิภาพการค้นหา
สำหรับตารางที่มีข้อมูลเวกเตอร์จำนวนมาก การสร้างดัชนีเป็นสิ่งสำคัญมากในการเร่งความเร็วการค้นหาแบบคล้ายคลึงเวกเตอร์ โดย pgvector รองรับดัชนีแบบ IVFFlat และ HNSW โดยเลือกชนิดดัชนีตามกรณีการใช้งาน เช่น ต้องการความเร็วเท่าไร เวลาสร้าง ความจำที่ใช้ และเปอร์เซ็นต์การเรียกคืน
- IVFFlat (Inverted File Index with Flat compression): เหมาะกับชุดข้อมูลขนาดใหญ่ที่ไม่ต้องเน้นการเรียกคืนมากนัก สร้างดัชนีได้เร็ว
- HNSW (Hierarchical Navigable Small World): มักได้อัตราการเรียกคืนสูงและค้นหาได้เร็ว แต่สร้างดัชนีช้ากว่าและกินหน่วยความจำมากกว่า
ตัวอย่างการสร้างดัชนีให้กับคอลัมน์ vector ในตาราง embeddings ทั้งแบบ IVFFlat และ HNSW:
สร้างดัชนี IVFFlat
sql-- ก่อนสร้างดัชนี IVFFlat ควรรัน ANALYZE เพื่อเก็บสถิติข้อมูล ANALYZE embeddings; -- สร้างดัชนี IVFFlat -- WITH (lists = 100): กำหนดจำนวน inverted lists ค่า lists นี้ควรปรับตามขนาดข้อมูล -- lists มาก ดัชนีสร้างช้า แต่ผลลัพธ์ดีกว่า (แต่เสียเวลาค้นหา) -- คำแนะนำคือ lists = sqrt(จำนวนแถว) CREATE INDEX idx_ivfflat_vector ON embeddings USING ivfflat (vector) WITH (lists = 100);1
2
3
4
5
6
7
8สร้างดัชนี HNSW
sql-- สร้างดัชนี HNSW -- WITH (m = 16, ef_construction = 200): พารามิเตอร์ของ HNSW -- m: จำนวนชุดเชื่อมโยงมากสุดต่อหนึ่งจุด มีผลต่อความเร็วและการเชื่อมโยง -- ef_construction: ขอบเขตการค้นหาในการสร้างดัชนี มีผลต่อคุณภาพ-เวลา-หน่วยความจำ -- ปรับตามข้อมูลจริงและความต้องการ CREATE INDEX idx_hnsw_vector ON embeddings USING hnsw (vector) WITH (m = 16, ef_construction = 200);1
2
3
4
5
6หมายเหตุ: ค่า
lists,m,ef_constructionมีผลต่อประสิทธิภาพอย่างมาก แนะนำให้ศึกษากรณีการใช้งาน, ทดสอบ และดูเอกสาร pgvector อย่างเป็นทางการ เพื่อข้อมูลเชิงลึกและคำแนะนำในการปรับค่า
การค้นหาเวกเตอร์ด้วย pgvector
pgvector มีตัวดำเนินการสำหรับวัดระยะห่างระหว่างเวกเตอร์ ใช้สำหรับการค้นหาแบบคล้ายคลึง ได้แก่:
<->: ระยะทาง L2 (Euclidean distance) ใช้วัดระยะตรง<#>: inner product เกี่ยวข้องกับ cosine similarity ใช้ทิศทาง<=>: ระยะทาง cosine (1 - cosine similarity) วัดความคล้ายคลึงเน้นทิศทาง ไม่ขึ้นกับขนาดเวกเตอร์
ตัวอย่างการคิวรียอดฮิตสำหรับเวกเตอร์:
คิวรีหาเวกเตอร์ใกล้เคียงที่สุด (Nearest Neighbor Search)
ค้นหาข้อมูลที่คล้ายหรือใกล้กับเวกเตอร์เป้าหมายมากที่สุด โดยใช้ ORDER BY กับ operator วัดระยะ แล้วจำกัดจำนวนผลลัพธ์ด้วย LIMIT
- ค้นหาเวกเตอร์ที่มีระยะ L2 ใกล้กับ
[0.2, 0.3, 0.4]มากสุด 5 ตัวsqlSELECT id, vector, -- คำนวณระยะ L2 กับเวกเตอร์เป้าหมาย vector <-> '[0.2, 0.3, 0.4]' AS distance FROM embeddings ORDER BY distance -- เรียงจากน้อยไปมาก (ยิ่งน้อย ยิ่งคล้าย) LIMIT 5;1
2
3
4
5
6
7
8
9
10
ค้นหาความคล้ายคลึงของเวกเตอร์ (Similarity Search)
คล้ายกับ nearest neighbor แต่เน้นแสดงค่าความคล้ายคลึง
- ค้นหาเวกเตอร์ที่มี cosine distance กับ
[0.2, 0.3, 0.4]ต่ำสุด 5 รายการ และแสดงระยะsqlSELECT id, vector, -- คำนวณ cosine distance กับเวกเตอร์เป้าหมาย vector <=> '[0.2, 0.3, 0.4]' AS cosine_distance FROM embeddings ORDER BY cosine_distance -- เรียงจากน้อยไปมาก LIMIT 5;1
2
3
4
5
6
7
8
9
10
การแสดงผลข้อมูลเวกเตอร์ (ไม่บังคับ)
การนำเสนอข้อมูลเวกเตอร์ความมิติสูงจะช่วยให้เข้าใจการจัดกลุ่มและกระจายของข้อมูลได้ดียิ่งขึ้น สำหรับเวกเตอร์ 2D หรือ 3D สามารถใช้ scatter plot ได้โดยตรง กรณีเวกเตอร์หลายมิติกว่าต้องลดมิติด้วยวิธี PCA หรือ t-SNE ก่อน
ตัวอย่างด้านล่าง แสดงวิธีใช้ Python และ Matplotlib เพื่อ visualize ข้อมูลเวกเตอร์ 3 มิติ
เตรียมสภาพแวดล้อม Python
อาจติดตั้ง Python จาก ServBay หรือแยกต่างหาก ต้องเปิดใช้งานใน ServBay Package ด้วย และติดตั้งไลบรารีpsycopg2(เชื่อมต่อ PostgreSQL) และmatplotlib(plot กราฟ):bash# กรณีใช้ Python ทั่วไปหรือที่ติดตั้งเอง pip install psycopg2 matplotlib # ถ้าใช้ Python ของ ServBay อาจต้องเข้าผ่าน CLI หรือ bin path # /Applications/ServBay/软件包/python/bin/pip install psycopg2 matplotlib1
2
3
4
5ปรับคำสั่ง pip ให้ตรงกับ environment
สร้างสคริปต์ Python
สร้างไฟล์ (เช่นvisualize_vectors.py) แล้วคัดลอกโค้ดต่อไปนี้ แก้ไขพารามิเตอร์เชื่อมต่อฐานข้อมูลให้ตรงกับ ServBay (dbname,user,password,host,port)pythonimport psycopg2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # นำเข้าโมดูลสำหรับ 3D scatter plot # การตั้งค่าการเชื่อมต่อฐานข้อมูล - แก้ไขให้ตรงการตั้งค่าของ ServBay db_params = { "dbname": "your_database_name", # เปลี่ยนเป็นชื่อฐานข้อมูลของคุณ "user": "servbay", # เปลี่ยนเป็นชื่อผู้ใช้ (servbay หรือ postgres) "password": "", # ใส่รหัสผ่าน หากมี (หากเชื่อมต่อในเครื่องอาจว่างเปล่า) "host": "localhost", # ฐานข้อมูล PostgreSQL ของ ServBay อยู่ที่ localhost "port": "5432" # พอร์ตมาตรฐานของ ServBay } conn = None cur = None try: # เชื่อมต่อกับฐานข้อมูล conn = psycopg2.connect(**db_params) cur = conn.cursor() # ดึงข้อมูลเวกเตอร์ # หมายเหตุ: psycopg2 จะอ่าน vector type '[x, y, z]' เป็น string # ต้องแปลงเอง หรือพึ่ง driver ที่รองรับ pgvector โดยตรง # ที่นี่สมมติว่าได้ string มาและแปลงแบบง่ายๆ cur.execute("SELECT vector FROM embeddings") vectors_raw = cur.fetchall() # แปลง string เวกเตอร์เป็น list ของตัวเลข vectors = [] for row in vectors_raw: # ตัด [], แยกด้วย comma, แปลงเป็น float vec_str = row[0].strip('[]') coords = [float(c) for c in vec_str.split(',')] vectors.append(coords) if not vectors: print("ไม่พบข้อมูลเวกเตอร์ในฐานข้อมูล") exit() # ตรวจสอบว่าเป็นเวกเตอร์ 3 มิติทั้งหมด if any(len(v) != 3 for v in vectors): print("คำเตือน: มิติของเวกเตอร์ไม่ตรงกัน หรือไม่ใช่ 3D ไม่สามารถวาด 3D plot ได้") exit() x = [v[0] for v in vectors] y = [v[1] for v in vectors] z = [v[2] for v in vectors] # สร้าง scatter plot 3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z) ax.set_xlabel('Dimension 1') ax.set_ylabel('Dimension 2') ax.set_zlabel('Dimension 3') ax.set_title('3D Vector Visualization') plt.show() except psycopg2.Error as e: print(f"เกิดข้อผิดพลาดในการเชื่อมต่อหรือคิวรีฐานข้อมูล: {e}") except Exception as e: print(f"เกิดข้อผิดพลาด: {e}") finally: # ปิดการเชื่อมต่อฐานข้อมูล if cur: cur.close() if conn: conn.close()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71รันสคริปต์
ใช้ terminal เพื่อรัน Python script:bashpython visualize_vectors.py1สคริปต์จะเชื่อมต่อฐานข้อมูล PostgreSQL ดึงข้อมูลเวกเตอร์ และสร้างหน้าต่าง scatter plot 3D ด้วย Matplotlib
คำถามที่พบบ่อย (FAQ)
ถาม: ไม่พบส่วนขยาย
vectorในผลลัพธ์\dxต้องทำอย่างไร?
ตอบ: ตรวจสอบว่ารันคำสั่งCREATE EXTENSION vector;ถูกต้องและไม่มี error หากยังไม่เห็น extension อาจต้องตรวจสอบว่าชุดโปรแกรม PostgreSQL ของ ServBay ติดตั้งสมบูรณ์ และมีไฟล์ส่วนขยายอยู่ใน directoryshare/extensionของ PostgreSQL หากไฟล์หายไป อาจต้องติดตั้งหรืออัพเดต PostgreSQL ใน ServBay ใหม่ถาม: เชื่อมต่อฐานข้อมูลแล้วขึ้น Error เกี่ยวกับการยืนยันตัวตน?
ตอบ: ตรวจสอบชื่อผู้ใช้, รหัสผ่าน, โฮสต์ และพอร์ตให้ตรงกับการตั้งค่า ServBay PostgreSQL โดยผู้ใช้ที่ตั้งไว้สำหรับการเชื่อมต่อเครื่องมีทั้งservbayหรือpostgresและอาจไม่มีรหัสผ่านถาม: จะตั้งค่าพารามิเตอร์ของดัชนีเวกเตอร์ (
lists,m,ef_construction) อย่างไร?
ตอบ: พารามิเตอร์เหล่านี้มีผลต่อประสิทธิภาพอย่างมาก ค่าที่เหมาะสมขึ้นอยู่กับขนาดข้อมูล, มิติ, ความเร็วการค้นหา และอัตราการเรียกคืนของงาน ต้องทดลองปรับค่าและวัดผลตามความต้องการจริง โดยควรอ่านเอกสาร pgvector อย่างเป็นทางการ เพื่อข้อมูลและคำแนะนำเพิ่มเติม
สรุป
pgvector เสริมความสามารถฐานข้อมูลเวกเตอร์ทรงพลังให้กับระบบ PostgreSQL ที่เสถียร เหมาะกับการพัฒนา AI และงานข้อมูลเวกเตอร์ในเครื่อง ServBay ติดตั้งส่วนขยายไว้ล่วงหน้า ทำให้การตั้งค่าสภาพแวดล้อมและการบูรณาการง่ายขึ้น
โดยศึกษาคู่มือบทความนี้ คุณสามารถเปิดใช้งาน pgvector ใน PostgreSQL ของ ServBay ได้อย่างราบรื่น สร้างตารางบันทึกเวกเตอร์ สร้างดัชนีเพิ่มความเร็ว คิวรีข้อมูลคล้ายคลึง และใช้งานพัฒนาแอปพลิเคชันเว็บระบบใหม่ๆ อย่างมีประสิทธิภาพ ผสมผสานกับเครื่องมืออื่นๆ จาก ServBay เพื่อเพิ่มศักยภาพในการสร้างและทดสอบโครงการที่ใช้ข้อมูลปริมาณมากหรืองาน AI ได้อย่างมืออาชีพ
