ฐานข้อมูลเวกเตอร์

ฐานข้อมูลเวกเตอร์จัดเก็บและจัดการข้อมูลในรูปแบบของเวกเตอร์ซึ่งเป็นอาร์เรย์เชิงตัวเลขของจุดข้อมูล

ฐานข้อมูลแบบดั้งเดิมไม่เหมาะกับการจัดการข้อมูลมิติสูงที่กลายเป็นเรื่องธรรมดามากขึ้นในการวิเคราะห์ข้อมูล อย่างไรก็ตามฐานข้อมูลเวกเตอร์ถูกออกแบบมาเพื่อจัดการข้อมูลหลายมิติเช่นข้อความรูปภาพและเสียงโดยแสดงเป็นเวกเตอร์ ฐานข้อมูลเวกเตอร์มีประโยชน์สําหรับงานเช่นการเรียนรู้ของเครื่องการประมวลผลภาษาธรรมชาติและการจดจําภาพซึ่งเป้าหมายคือการระบุรูปแบบหรือความคล้ายคลึงกันในชุดข้อมูลขนาดใหญ่

บทความนี้ให้ข้อมูลพื้นฐานเกี่ยวกับฐานข้อมูลเวกเตอร์และอธิบายแนวคิดว่าคุณสามารถใช้ Eventhouse เป็นฐานข้อมูลเวกเตอร์ใน Real-Time Intelligence ใน Microsoft Fabric ได้อย่างไร สําหรับตัวอย่างที่ใช้งานได้จริง โปรดดู บทช่วยสอน: ใช้ Eventhouse เป็นฐานข้อมูลเวกเตอร์ที่มีการฝัง LLM และ บทช่วยสอน: ใช้ Eventhouse เป็นฐานข้อมูลเวกเตอร์ที่มีการฝัง SLM

แนวคิดหลัก

แนวคิดหลักต่อไปนี้ถูกใช้ในฐานข้อมูลเวกเตอร์:

ความคล้ายคลึงกันของเวกเตอร์

ความคล้ายคลึงกันของเวกเตอร์คือการวัดว่าเวกเตอร์สองตัวหรือมากกว่านั้นแตกต่างกัน (หรือคล้ายกัน) การค้นหาความคล้ายคลึงกันของเวกเตอร์เป็นเทคนิคที่ใช้ในการค้นหาเวกเตอร์ที่คล้ายกันในชุดข้อมูล คุณเปรียบเทียบเวกเตอร์โดยใช้เมตริกระยะทาง เช่น ระยะทางแบบยุคลิดหรือความคล้ายคลึงกันของโคไซน์ เวกเตอร์สองตัวที่ใกล้กว่านั้นยิ่งคล้ายกันมาก

Embeddings

การฝังเป็นวิธีทั่วไปในการแสดงข้อมูลในรูปแบบเวกเตอร์สําหรับการใช้งานในฐานข้อมูลเวกเตอร์ การฝังคือการแสดงข้อมูลทางคณิตศาสตร์ เช่น คํา เอกสารข้อความ หรือรูปภาพ ที่รวบรวมความหมายของข้อมูล คุณสร้างการฝังตัว โดยใช้อัลกอริทึมที่วิเคราะห์ข้อมูล และสร้างชุดของค่าตัวเลขที่แสดงถึงคุณลักษณะหลักของข้อมูล ตัวอย่างเช่น การฝังสําหรับคําอาจแสดงความหมาย บริบท และความสัมพันธ์กับคําอื่นๆ การฝังเป็นวิธีทั่วไปในการแสดงข้อมูลในรูปแบบเวกเตอร์สําหรับการใช้งานในฐานข้อมูลเวกเตอร์ การฝังคือการแสดงข้อมูลทางคณิตศาสตร์ เช่น คํา เอกสารข้อความ หรือรูปภาพ ที่รวบรวมความหมายของข้อมูล คุณสร้างการฝังตัว โดยใช้อัลกอริทึมที่วิเคราะห์ข้อมูล และสร้างชุดของค่าตัวเลขที่แสดงถึงคุณลักษณะหลักของข้อมูล ตัวอย่างเช่น การฝังสําหรับคําอาจแสดงความหมาย บริบท และความสัมพันธ์กับคําอื่นๆ Eventhouse รองรับสองวิธีในการสร้างการฝังโดยตรงใน KQL:

  • ปลั๊กอิน ai_embeddings: เรียกใช้ปลายทาง OpenAI Azure ภายนอกเพื่อสร้างการฝังโดยใช้โมเดลภาษาขนาดใหญ่ (LLM) วิธีนี้สร้างการฝังที่มีคุณภาพสูงสุดและเหมาะที่สุดสําหรับปริมาณงานการค้นหาความหมายการผลิต

  • slm_embeddings_fl(): เรียกใช้โมเดลภาษาขนาดเล็ก (SLM) ภายในแซนด์บ็อกซ์ Kusto Python สร้างการฝังโดยไม่มีปลายทางภายนอก วิธีนี้ไม่ต้องใช้ทรัพยากร Azure OpenAI และไม่มีค่าใช้จ่ายต่อการฝังตัว

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการฝังตัวใน Azure OpenAI โปรดดู ทําความเข้าใจการฝังใน Azure OpenAI Service

เลือกวิธีการฝัง

ใช้ตารางต่อไปนี้เพื่อเลือกวิธีการที่เหมาะกับสถานการณ์ของคุณมากที่สุด:

ข้อควรพิจารณา ปลั๊กอิน ai_embeddings (LLM) slm_embeddings_fl() (เอสแอลเอ็ม)
คุณภาพของโมเดล คุณภาพสูงสุด; ใช้โมเดล Azure OpenAI เช่นtext-embedding-3-large คุณภาพดี; ใช้ SLM โอเพนซอร์ส เช่น harrier-v1-270m, jina-v2-smallและ e5-small-v2
การพึ่งพาภายนอก ต้องใช้ทรัพยากร Azure OpenAI ที่มีโมเดลการฝังตัวที่ปรับใช้ ไม่มี; โมเดลทํางานในเครื่องในแซนด์บ็อกซ์ Python
ค่า ราคาต่อคําขอตามการใช้งาน Azure OpenAI ไม่มีค่าใช้จ่ายต่อการฝัง
ปริมาณงาน อยู่ภายใต้ขีดจํากัดอัตราของ Azure OpenAI ต้องใช้ตรรกะการแบทช์และลองใหม่ จํากัดด้วยทรัพยากรการประมวลผลแบบคลัสเตอร์เท่านั้น ปรับขนาดตามธรรมชาติด้วยขนาดคลัสเตอร์
การตั้งค่า ต้องมีการปรับใช้ Azure OpenAI การกําหนดค่านโยบายคําบรรยายภาพ และการตั้งค่าข้อมูลประจําตัว ต้องเปิดใช้งานปลั๊กอิน Python และอัปโหลดสิ่งประดิษฐ์ SLM ไปยังเลคเฮาส์
ความยาวบริบทสูงสุด ขึ้นอยู่กับโมเดลที่ปรับใช้ (เช่น 8,192 โทเค็นสําหรับ text-embedding-3-large) มากถึง 32,768 โทเค็นที่มี harrier-v1-270m, 8,192 กับ jina-v2-small และ 512 กับ และ e5-small-v2
เหมาะสําหรับ การค้นหาความหมายการผลิตที่คุณภาพการฝังเป็นสิ่งสําคัญที่สุด เวิร์กโฟลว์ที่คํานึงถึงความเป็นส่วนตัว การสร้างต้นแบบอย่างรวดเร็ว การฝังแบทช์ปริมาณมาก หรือสถานการณ์ที่ไม่มีการเข้าถึง Azure OpenAI

เวิร์กโฟลว์ทั่วไป

Schematic ของวิธีการฝัง จัดเก็บ และข้อความคิวรีที่จัดเก็บเป็นเวกเตอร์

เวิร์กโฟลว์ทั่วไปสําหรับการใช้ฐานข้อมูลเวกเตอร์มีดังนี้:

  1. ฝังข้อมูล: แปลงข้อมูลเป็นรูปแบบเวกเตอร์โดยใช้โมเดลการฝัง
  2. จัดเก็บเวกเตอร์: จัดเก็บเวกเตอร์แบบฝังตัวในฐานข้อมูลเวกเตอร์ คุณสามารถส่งข้อมูลแบบฝังตัวไปยัง Eventhouse เพื่อจัดเก็บและจัดการเวกเตอร์ได้
  3. คิวรีแบบฝังตัว: แปลงข้อมูลคิวรีเป็นรูปแบบเวกเตอร์โดยใช้แบบจําลองการฝังตัวเดียวกันกับที่ใช้ในการฝังข้อมูลที่จัดเก็บไว้
  4. เวกเตอร์คิวรี่: ใช้การค้นหาความคล้ายคลึงกันของเวกเตอร์เพื่อค้นหารายการในฐานข้อมูลที่คล้ายกับคิวรี

Eventhouse เป็นฐานข้อมูลเวกเตอร์

หัวใจสําคัญของการค้นหาความคล้ายคลึงกันของเวกเตอร์คือความสามารถในการจัดเก็บ จัดทําดัชนี และสืบค้นข้อมูลเวกเตอร์ Eventhouses มีโซลูชันสําหรับการจัดการและวิเคราะห์ข้อมูลปริมาณมาก โดยเฉพาะอย่างยิ่งในสถานการณ์ที่จําเป็นต้องมีการวิเคราะห์และการสํารวจแบบเรียลไทม์ ความสามารถนี้ทําให้ Eventhouse เป็นตัวเลือกที่ยอดเยี่ยมสําหรับการจัดเก็บและค้นหาเวกเตอร์

ส่วนประกอบต่อไปนี้ของ Eventhouse ช่วยให้คุณสามารถใช้เป็นฐานข้อมูลเวกเตอร์ได้:

  • ชนิดข้อมูล แบบไดนามิก ซึ่งสามารถจัดเก็บข้อมูลที่ไม่มีโครงสร้างเช่น อาร์เรย์ และกระเป๋าคุณสมบัติได้ ใช้ชนิดข้อมูลนี้เพื่อจัดเก็บค่าเวกเตอร์ คุณสามารถเพิ่มค่าเวกเตอร์ได้โดยการจัดเก็บเมตาดาต้าที่เกี่ยวข้องกับวัตถุต้นฉบับเป็นคอลัมน์แยกต่างหากในตารางของคุณ
  • ประเภทVector16ที่ออกแบบมาสําหรับการจัดเก็บเวกเตอร์ของตัวเลขทศนิยมด้วยความแม่นยํา 16 บิต การเข้ารหัสนี้ใช้แทน Bfloat16 64 บิตเริ่มต้น ใช้การเข้ารหัสนี้เพื่อจัดเก็บการฝังเวกเตอร์ เนื่องจากช่วยลดความต้องการในการจัดเก็บข้อมูลได้สี่เท่า และเร่งฟังก์ชันการประมวลผลเวกเตอร์ เช่น series_dot_product() และ series_cosine_similarity() ได้อย่างมาก
  • ฟังก์ชัน series_cosine_similarity ซึ่งคุณสามารถใช้เพื่อค้นหาความคล้ายคลึงกันของเวกเตอร์ที่ด้านบนของเวกเตอร์ที่จัดเก็บไว้ใน Eventhouse

ปรับให้เหมาะสมสําหรับมาตราส่วน

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพการค้นหาความคล้ายคลึงกันของเวกเตอร์ โปรดดูบล็อก

เมื่อต้องการเพิ่มประสิทธิภาพและเวลาในการค้นหาที่ได้สูงสุด ให้ทําตามขั้นตอนเหล่านี้:

  1. ตั้งค่าการเข้ารหัสของคอลัมน์ที่ฝังตัวเป็น Vector16 การเข้ารหัส 16 บิตของสัมประสิทธิ์เวกเตอร์ (แทนค่าเริ่มต้น 64 บิต)
  2. จัดเก็บตารางเวกเตอร์การฝังบนโหนดคลัสเตอร์ทั้งหมดที่มีอย่างน้อยหนึ่งส่วนต่อโปรเซสเซอร์ เมื่อต้องการทําเป้าหมายนี้ ให้ทําตามขั้นตอนเหล่านี้:
    1. จํากัดจํานวนของเวกเตอร์การฝังต่อการแชร์โดยการเปลี่ยนแปลง นโยบายการแชร์ของ ShardEngineMaxRowCount ของ นโยบายการแชร์ การตั้งค่านี้จะกระจายข้อมูลของคุณไปยังทรัพยากรการประมวลผลที่มีอยู่ทั้งหมดเพื่อการค้นหาที่รวดเร็วขึ้น
    2. เปลี่ยน RowCountUpperBoundForMerge ของนโยบายการผสาน จําเป็นต้องมีนโยบายการผสานเพื่อระงับขอบเขตการผสานหลังจากการนําเข้า

ขั้นตอนการปรับให้เหมาะสมตามตัวอย่าง

ในตัวอย่างต่อไปนี้ คุณกําหนดตารางเวกเตอร์แบบคงที่สําหรับการจัดเก็บเวกเตอร์ 1 ล้าน คุณกําหนดนโยบายการฝังเป็น Vector16 และตั้งค่านโยบายการแบ่งส่วนข้อมูลและการผสานเพื่อเพิ่มประสิทธิภาพตารางสําหรับการค้นหาความคล้ายคลึงกันของเวกเตอร์ สําหรับตัวอย่างนี้ สมมติว่าคลัสเตอร์มี 20 โหนด และแต่ละโหนดมีตัวประมวลผล 16 ตัว ส่วนแบ่งของตารางควรมีมากที่สุด 1,000,000/(20*16)=3,125 แถว

  1. เรียกใช้คําสั่ง KQL ต่อไปนี้ทีละรายการเพื่อสร้างตารางว่างและตั้งค่านโยบายและการเข้ารหัสที่จําเป็น:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. นําเข้าข้อมูลไปยังตารางที่สร้างและกําหนดในขั้นตอนก่อนหน้า

ขั้นตอนถัดไป