แชร์ผ่าน


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

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

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

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

แนวคิดหลัก

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

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

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

Embeddings

การฝังเป็นวิธีทั่วไปในการแสดงข้อมูลในรูปแบบเวกเตอร์สําหรับการใช้งานในฐานข้อมูลเวกเตอร์ การฝังคือการแสดงข้อมูลทางคณิตศาสตร์ของข้อมูลส่วนหนึ่ง เช่น คํา เอกสารข้อความ หรือรูปภาพ ที่ออกแบบมาเพื่อบันทึกความหมายเชิงความหมาย การฝังถูกสร้างขึ้นโดยใช้อัลกอริทึมที่วิเคราะห์ข้อมูลและสร้างชุดของค่าตัวเลขที่แสดงถึงคุณลักษณะหลัก ตัวอย่างเช่น การฝังสําหรับคําอาจแสดงความหมาย บริบท และความสัมพันธ์กับคําอื่นๆ กระบวนการสร้างการฝังนั้นตรงไปตรงมา ในขณะที่สามารถสร้างได้โดยใช้แพ็คเกจ python มาตรฐาน (ตัวอย่างเช่น spaCy, sent2vec, Gensim), โมเดลภาษาขนาดใหญ่ (LLM) สร้างการฝังที่มีคุณภาพสูงสุดสําหรับการค้นหาข้อความเชิงความหมาย ตัวอย่างเช่น คุณสามารถส่งข้อความไปยังแบบจําลองการฝังใน Azure OpenAI และสร้างตัวแทนเวกเตอร์ที่สามารถจัดเก็บสําหรับการวิเคราะห์ได้ สําหรับข้อมูลเพิ่มเติม โปรดดู ทําความเข้าใจการฝังในบริการ Azure OpenAI

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

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

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

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

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

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

คอมโพเนนต์ต่อไปนี้ของเปิดใช้งานการใช้ฐานข้อมูลเวกเตอร์ Eventhouse:

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

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

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

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

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

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

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

  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. นําเข้าข้อมูลไปยังตารางที่สร้างและกําหนดในขั้นตอนก่อนหน้า

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