คู่มือการใช้งานส่วนขยาย pgvector กับ PostgreSQL ใน ServBay
pgvector
คือส่วนขยายทรงพลังของ PostgreSQL ที่เพิ่มชนิดข้อมูลเวกเตอร์และวิธีการจัดทำดัชนีเวกเตอร์ประสิทธิภาพสูง เช่น IVFFlat และ HNSW ทำให้ PostgreSQL รองรับการจัดเก็บและค้นหาเวกเตอร์ได้อย่างเป็นธรรมชาติ เหมาะสำหรับการสร้างแอปพลิเคชัน AI ระบบแนะนำ การรู้จำภาพ และประมวลผลภาษาธรรมชาติที่ต้องจัดการกับข้อมูลเวกเตอร์หลายมิติ
ServBay ในฐานะสภาพแวดล้อมพัฒนาเว็บแบบโลคอลได้ติดตั้ง PostgreSQL และส่วนขยาย pgvector
เอาไว้ล่วงหน้า ช่วยให้คุณเปิดใช้งานฐานข้อมูลเวกเตอร์ได้สะดวกขึ้น บทความนี้จะอธิบายวิธีใช้งาน pgvector
บน ServBay อย่างละเอียด
pgvector คืออะไร และสำคัญอย่างไร?
ในแอปยุคใหม่จำนวนมาก ข้อมูลไม่ได้มีแค่ข้อความหรือจำนวนเท่านั้น โดยเฉพาะในงานด้าน AI และ Machine Learning ข้อมูลมักถูกแทนด้วยเวกเตอร์หลายมิติ หรือที่เรียกว่า “embedding” เพื่อสะท้อนความหมายหรือคุณสมบัติสำคัญ อาทิ ลักษณะการมองเห็นของภาพ, ความหมายของข้อความ หรือรสนิยมของผู้ใช้
ส่วนขยาย pgvector
ทำให้ PostgreSQL สามารถจัดเก็บเวกเตอร์เหล่านี้ได้โดยตรง และค้นหาความคล้ายคลึงกันระหว่างเวกเตอร์ได้อย่างมีประสิทธิภาพ (Nearest Neighbor Search) นั่นหมายความว่าคุณสามารถใช้ภาษา SQL ที่คุ้นเคยในการค้นหาข้อมูลที่คล้ายกับเวกเตอร์ที่กำหนด โดยไม่ต้องใช้ฐานข้อมูลเวกเตอร์แยกต่างหาก จึงช่วยลดความซับซ้อนของเทคโนโลยีเบื้องหลัง
ข้อกำหนดเบื้องต้น
ก่อนเริ่มใช้งาน pgvector
กรุณาตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้ครบถ้วน:
- ติดตั้งและเปิดใช้งาน ServBay บน macOS แล้ว
- เปิดใช้งานแพ็คเกจ PostgreSQL ในหน้า "Packages" ของ ServBay หากยังไม่ได้เปิด ให้ไปที่แอป ServBay แล้วตั้งค่า PostgreSQL ให้เป็น "Enabled"
เปิดใช้งานส่วนขยาย pgvector ใน PostgreSQL ของ ServBay
ServBay ได้เตรียมไฟล์ส่วนขยาย pgvector
เอาไว้ในไดเร็กทอรีของ PostgreSQL แล้ว คุณไม่ต้องดาวน์โหลดหรือคอมไพล์เอง เพียงแค่เปิดใช้งานในฐานข้อมูลที่ต้องการก็เพียงพอ
ขั้นตอนการเปิดใช้งาน pgvector
ใน PostgreSQL ของ ServBay มีดังนี้:
เชื่อมต่อกับฐานข้อมูล PostgreSQL
คุณสามารถใช้เครื่องมือpsql
บน Command Line เพื่อเชื่อมต่อกับ PostgreSQL ที่ ServBay เตรียมไว้ การตั้งค่าเริ่มต้นมักจะอนุญาตการเชื่อมต่อภายในเครื่อง โดยผู้ใช้มักเป็นpostgres
หรือservbay
และพอร์ตเริ่มต้นคือ5432
หากการตั้งค่าแตกต่าง กรุณาตรวจสอบข้อมูลใน ServBayเปิดเทอร์มินัลแล้วใช้คำสั่งนี้ (ปรับ username/database ตามความเหมาะสม):
bashpsql -U servbay -d your_database_name -h localhost -p 5432
1-U servbay
: ระบุชื่อผู้ใช้ (อาจเป็นservbay
หรือpostgres
)-d your_database_name
: ระบุชื่อฐานข้อมูลที่ต้องการเชื่อมต่อ ถ้าไม่มีอาจต้องสร้างใหม่ (เช่นCREATE DATABASE servbay_demo_db;
)-h localhost
: ระบุโฮสต์เป็นเครื่องตัวเอง-p 5432
: ระบุพอร์ต (ค่าดีฟอลต์ของ PostgreSQL ใน ServBay)
สร้างส่วนขยาย
vector
เมื่อเชื่อมต่อสำเร็จ ให้รันคำสั่ง SQL นี้เพื่อเปิดใช้งานpgvector
:sqlCREATE EXTENSION vector;
1ถ้าสร้างไว้แล้ว ระบบจะแจ้งเตือนว่า extension ดังกล่าวมีอยู่แล้ว
ตรวจสอบการติดตั้ง
สามารถเช็คดูว่าpgvector
เปิดใช้งานสำเร็จหรือยัง ด้วยคำสั่งนี้:sql\dx
1หากเรียบร้อยจะเห็นรายการ
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
หมายเหตุ: ค่าเวกเตอร์ต้องครอบด้วยวงเล็บเหลี่ยม []
และคั่นด้วยคอมมา
สร้างดัชนีเวกเตอร์ (Index) เพื่อความเร็วในการค้นหา
ถ้าตารางมีข้อมูลเวกเตอร์จำนวนมาก ควรสร้าง index เพื่อเพิ่มประสิทธิภาพการค้นหา pgvector
รองรับ IVFFlat และ HNSW เป็นหลัก การเลือกประเภท index ขึ้นอยู่กับ use case (ทั้งเรื่องความเร็ว การใช้หน่วยความจำ และอัตราส่วนการพบผลลัพธ์)
- IVFFlat (Inverted File Index with Flat compression): เหมาะกับชุดข้อมูลขนาดใหญ่แต่ไม่ต้องการ recall สูงมาก สร้าง index ได้เร็ว
- HNSW (Hierarchical Navigable Small World): ให้ recall และความเร็วสูง สร้าง index ช้ากว่า ใช้หน่วยความจำมากกว่า
ตัวอย่างการสร้าง IVFFlat และ HNSW index สำหรับคอลัมน์ vector
ในตาราง embeddings
:
สร้าง IVFFlat Index
sql-- ก่อนสร้าง IVFFlat index ควรรัน ANALYZE เพื่อเก็บสถิติ ANALYZE embeddings; -- สร้าง IVFFlat index -- WITH (lists = 100): ตั้งค่าจำนวน inverted list เลือกตามขนาดข้อมูล -- ยิ่ง lists มาก สร้าง index ช้าขึ้น ใช้งาน query อาจช้าขึ้น แต่ recall สูงขึ้น -- คู่มือแนะนำ lists = sqrt(จำนวนแถว) CREATE INDEX idx_ivfflat_vector ON embeddings USING ivfflat (vector) WITH (lists = 100);
1
2
3
4
5
6
7
8สร้าง HNSW Index
sql-- สร้าง HNSW index -- WITH (m = 16, ef_construction = 200): ปรับค่าได้ตามกำลังของเซิร์ฟเวอร์/ขนาดข้อมูล -- m: จำนวนเชื่อมโยงสูงสุดต่อ node -- ef_construction: ขอบเขตการค้นหาเวลาสร้าง index (ยิ่งสูงสร้างช้านาน ใช้แรมเยอะ แต่คุณภาพ index ดีขึ้น) CREATE INDEX idx_hnsw_vector ON embeddings USING hnsw (vector) WITH (m = 16, ef_construction = 200);
1
2
3
4
5หมายเหตุ: ค่าพารามิเตอร์ index (
lists
,m
,ef_construction
) ส่งผลต่อประสิทธิภาพและ recall มาก โปรดทดสอบกับข้อมูลจริงและอ่าน pgvector documentation สำหรับคำแนะนำที่เหมาะสม
การค้นหาด้วย pgvector
ส่วนขยาย pgvector
มีโอเปอเรเตอร์ให้คำนวณระยะห่างของเวกเตอร์เพื่อรองรับการค้นหาความคล้ายคลึงกัน (similarity search) โอเปอเรเตอร์ที่ใช้บ่อย ได้แก่:
<->
: L2 distance (Euclidean Distance) – วัดระยะห่างเชิงเส้นตรง<#>
: Inner Product – เกี่ยวข้องกับ cosine similarity สำหรับวัดความคล้ายคลึงเชิงทิศทาง<=>
: Cosine Distance –(1 - cosine similarity)
โดยเน้นวัดทิศทางมากกว่าความยาวเวกเตอร์
ตัวอย่างคำสั่ง SQL สำหรับค้นหาเวกเตอร์:
การค้นหา Nearest Neighbor
ค้นหาเวกเตอร์ที่ใกล้เคียงกับเวกเตอร์ที่กำหนดมากที่สุด (ระยะทางน้อยสุด) โดยใช้ ORDER BY
กับโอเปอเรเตอร์ระยะทาง และ LIMIT
จำกัดจำนวนผลลัพธ์
- ค้นหาข้อมูล 5 รายการที่มีระยะทาง L2 ใกล้กับเวกเตอร์
[0.2, 0.3, 0.4]
มากที่สุดsqlSELECT id, vector, -- คำนวณ L2 distance กับเวกเตอร์เป้าหมาย 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
การค้นหาความคล้ายคลึงของเวกเตอร์
คล้ายกับ nearest neighbor แต่เน้นแสดงคะแนนความคล้ายคลึง
- ค้นหาข้อมูล 5 รายการที่มี Cosine Distance ใกล้กับเวกเตอร์
[0.2, 0.3, 0.4]
ที่สุด พร้อมแสดงค่าระยะทาง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
การแสดงผลข้อมูลเวกเตอร์ (Optional)
การวิเคราะห์หรือดูข้อมูลเวกเตอร์ในมิติสูงอาจทำได้ยาก หากเป็น 2D หรือ 3D สามารถวาด scatter plot ได้เลย แต่ถ้าเวกเตอร์มิติสูงกว่านี้ ต้องใช้เทคนิคลดมิติ (เช่น PCA, t-SNE) ก่อน
ด้านล่างคือตัวอย่างใช้ Python และ Matplotlib แสดงผลเวกเตอร์ 3 มิติ
เตรียมสภาพแวดล้อม Python
สามารถรันสคริปต์บน ServBay หรือภายนอกก็ได้ ให้ติดตั้งpsycopg2
กับmatplotlib
ตามนี้bash# สำหรับ Python ทั่วไป pip install psycopg2 matplotlib # ถ้าใช้ Python ใน ServBay อาจต้องรันจากไดเร็กทอรีของ ServBay โดยตรง # /Applications/ServBay/软件包/python/bin/pip install psycopg2 matplotlib
1
2
3
4
5เลือกใช้ pip ตามเส้นทาง Python ของคุณ
สร้างสคริปต์ Python
สร้างไฟล์ (เช่นvisualize_vectors.py
) แล้ววางโค้ดด้านล่างนี้ จากนั้นปรับค่าเชื่อมต่อฐานข้อมูลตรงdbname
,user
,password
,host
,port
ให้ตรงกับ ServBay ของคุณpythonimport psycopg2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # โมดูลสำหรับ 3D scatter plot # พารามิเตอร์เชื่อมต่อฐานข้อมูล - กรุณาแก้ไขให้ตรงกับของคุณ db_params = { "dbname": "your_database_name", # ใส่ชื่อฐานข้อมูล "user": "servbay", # ใส่ username ของ ServBay PostgreSQL (อาจเป็น servbay หรือ postgres) "password": "", # ใส่รหัสผ่าน (หากตั้งไว้) "host": "localhost", # โดยปกติจะเป็น localhost "port": "5432" # พอร์ตเริ่มต้นของ ServBay PostgreSQL } conn = None cur = None try: # เชื่อมต่อ PostgreSQL conn = psycopg2.connect(**db_params) cur = conn.cursor() # ดึงข้อมูลเวกเตอร์ # หมายเหตุ: psycopg2 จะอ่านเวกเตอร์ '[x, y, z]' เป็นสตริง # จึงต้องแปลงเป็นลิสต์ของ float ด้วยตนเอง cur.execute("SELECT vector FROM embeddings") vectors_raw = cur.fetchall() # แปลงเวกเตอร์จากสตริง -> ลิสต์ของตัวเลข vectors = [] for row in vectors_raw: 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("คำเตือน: เวกเตอร์ไม่ได้ขนาด 3 มิติเหมือนกันทั้งหมด ไม่สามารถวาดกราฟ 3D ได้") exit() x = [v[0] for v in vectors] y = [v[1] for v in vectors] z = [v[2] for v in vectors] # วาดกราฟ scatter 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รันสคริปต์
เข้าเทอร์มินัลแล้วสั่งรันสคริปต์นี้bashpython visualize_vectors.py
1สคริปต์จะเชื่อมต่อฐานข้อมูล PostgreSQL, ดึงข้อมูลเวกเตอร์ และโชว์กราฟ 3D หน้าต่างใหม่
คำถามที่พบบ่อย (FAQ)
ถาม: ถ้าใช้คำสั่ง
\dx
แล้วไม่เห็นส่วนขยายvector
ต้องทำอย่างไร?
ตอบ: ตรวจสอบว่าคุณรันCREATE EXTENSION vector;
แบบไม่มีข้อผิดพลาด หากยังไม่พบ ให้ตรวจสอบว่า PostgreSQL package ของ ServBay ติดตั้งถูกต้องและเปิดใช้งานแล้วหรือไม่ ไฟล์ pgvector extension ควรอยู่ในโฟลเดอร์share/extension
ของ PostgreSQL หากหายไป ให้ลองติดตั้งหรือตั้งค่า ServBay PostgreSQL ใหม่ถาม: เชื่อมต่อฐานข้อมูลไม่ได้ Authentication failed ทำยังไง?
ตอบ: ตรวจสอบ username, password, host, port ที่ใส่ในคำสั่งpsql
หรือในสคริปต์ Python ว่าตรงกับการตั้งค่า PostgreSQL ใน ServBay หรือไม่ ปกติ user จะเป็นservbay
หรือpostgres
(โดยอาจไม่มีรหัสผ่าน)ถาม: จะเลือกค่าพารามิเตอร์ index อย่าง
lists
,m
,ef_construction
อย่างไร?
ตอบ: ค่านี้มีผลมากต่อประสิทธิภาพและคุณภาพการค้นหา ไม่มีค่าตายตัวควรทดลองและปรับให้เหมาะกับข้อมูลจริงโดยพิจารณาขนาด ชนิดข้อมูล ความเร็วที่ต้องการ และ recall อ่านรายละเอียดและแนวทางได้จากเอกสารทางการของ pgvector
สรุป
pgvector
ได้เสริมพลังเวกเตอร์ให้กับ PostgreSQL ที่มั่นคงและได้รับการพิสูจน์มาแล้ว ช่วยให้นักพัฒนาสามารถสร้างแอปพลิเคชัน AI หรือแอปที่ใช้เวกเตอร์ได้สะดวกยิ่งขึ้นบนโลคอล ServBay ด้วยการติดตั้งล่วงหน้า extension ตัวนี้ทำให้ใช้งานง่ายขึ้น
เพียงทำตามขั้นตอนในบทความนี้ คุณก็จะเปิดใช้ pgvector
ใน PostgreSQL ของ ServBay สร้างตารางเวกเตอร์ จัด index ให้ query ได้เร็ว และใช้งานฟีเจอร์ similarity search ได้เต็มที่ พร้อมทุนเครื่องมืออื่น ๆ ของ ServBay ให้คุณสร้าง พัฒนา และทดสอบแอปเว็บหรือโปรเจกต์วิเคราะห์ข้อมูลสมัยใหม่ได้อย่างมีประสิทธิภาพ