แชร์ผ่าน


ดัชนีข้อมูลเวกเตอร์ใน CosmosDB ใน Fabric

Cosmos DB in Fabric นําเสนอการจัดทําดัชนีและการค้นหาเวกเตอร์ที่มีประสิทธิภาพ คุณลักษณะนี้ออกแบบมาเพื่อจัดการเวกเตอร์หลายมิติและหลายมิติทําให้สามารถค้นหาเวกเตอร์ได้อย่างมีประสิทธิภาพและแม่นยําในทุกขนาด ตอนนี้คุณสามารถจัดเก็บเวกเตอร์ในเอกสารควบคู่ข้อมูลของคุณได้โดยตรง เอกสารแต่ละเอกสารในฐานข้อมูลของคุณสามารถประกอบด้วยข้อมูล schema-free แบบดั้งเดิมเท่านั้น แต่ยังประกอบด้วยเวกเตอร์มิติสูงหลายแบบที่เป็นคุณสมบัติอื่น ๆ ของเอกสาร Colocation ของข้อมูลและเวกเตอร์นี้ช่วยให้การทําดัชนีและการค้นหามีประสิทธิภาพเนื่องจากเวกเตอร์ถูกเก็บไว้ในหน่วยตรรกะเดียวกับข้อมูลที่เป็นตัวแทน การเก็บข้อมูลเวกเตอร์และข้อมูลเข้าด้วยกันทําได้ง่ายด้วยการจัดการข้อมูล สถาปัตยกรรมแอปพลิเคชัน AI และประสิทธิภาพการทํางานของเวกเตอร์

Cosmos DB ใน Fabric มีความยืดหยุ่นที่นําเสนอในการเลือกวิธีการทําดัชนีเวกเตอร์:

  • การค้นหาเพื่อนบ้านแบบ "flat" หรือ k-nearest (บางครั้งเรียกว่า brute-force) สามารถให้การเรียกคืนข้อมูลได้ 100% สําหรับการค้นหาเวกเตอร์ที่มีขนาดเล็กและโฟกัส โดยเฉพาะอย่างยิ่งเมื่อรวมกับตัวกรองคิวรีและคีย์พาร์ติชัน

  • ดัชนีแบนแบบเชิงปริมาณที่บีบอัดเวกเตอร์โดยใช้วิธีการวัดปริมาณตาม DiskANN เพื่อประสิทธิภาพที่ดีขึ้นในการค้นหา kNN

  • DiskANN ซึ่งเป็นชุดของอัลกอริทึมการจัดทําดัชนีเวกเตอร์ที่ทันสมัยซึ่งพัฒนาโดย Microsoft Research ให้มีประสิทธิภาพและความแม่นยําสูงในการค้นหาเวกเตอร์แบบหลายแบบในทุกมาตราส่วน

การค้นหาเวกเตอร์ใน Cosmos DB สามารถรวมกับตัวกรองคิวรี NoSQL ที่รองรับและดัชนีอื่น ๆ ทั้งหมดที่สนับสนุนโดยใช้ WHERE ส่วนคําสั่ง การผสมผสานนี้ช่วยให้เวกเตอร์ของคุณค้นหาให้เป็นข้อมูลที่เกี่ยวข้องมากที่สุดกับแอปพลิเคชันของคุณ

คุณลักษณะนี้ช่วยเพิ่มขีดความสามารถหลักของ Cosmos DB ทําให้สามารถจัดการข้อมูลเวกเตอร์และข้อกําหนดการค้นหาในแอปพลิเคชัน AI ได้มากขึ้น

ร้านค้าเวกเตอร์คืออะไร?

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

ที่เก็บเวกเตอร์ทํางานอย่างไร

ในที่เก็บเวกเตอร์ อัลกอริทึมการค้นหาเวกเตอร์จะถูกใช้เพื่อจัดทําดัชนีและการฝังคิวรี บางอัลกอริทึมการค้นหาเวกเตอร์ที่รู้จักกันดีได้แก่ ลําดับชั้นนําทางขนาดเล็กโลก (HNSW), แฟ้มผกผัน (IVF), DiskANN และอื่น ๆ การค้นหาเวกเตอร์เป็นวิธีช่วยให้คุณค้นหารายการที่คล้ายกันโดยยึดตามลักษณะข้อมูลแทนที่จะเป็นการจับคู่ที่แน่นอนในเขตข้อมูลคุณสมบัติ เทคนิคนี้มีประโยชน์ในแอปพลิเคชัน เช่น การค้นหาข้อความที่คล้ายกัน การค้นหารูปภาพที่เกี่ยวข้อง การให้คําแนะนํา หรือแม้แต่การตรวจหาสิ่งผิดปกติ ใช้เพื่อสืบค้นการ ฝังเวกเตอร์ ของข้อมูลที่คุณสร้างขึ้นโดยใช้โมเดลแมชชีนเลิร์นนิงโดยใช้ API การฝังตัว ตัวอย่างของการฝัง API คือ Azure OpenAI Embeddings หรือการกอดใบหน้าบน Azure การค้นหาเวกเตอร์วัดระยะห่างระหว่างเวกเตอร์ข้อมูลและเวกเตอร์คิวรีของคุณ เวกเตอร์ข้อมูลที่ใกล้เคียงกับเวกเตอร์คิวรี่ของคุณมากที่สุดคือรายการที่พบว่าใกล้เคียงกันมากที่สุด

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

นโยบายเวกเตอร์คอนเทนเนอร์

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

  • path: คุณสมบัติที่มีเวกเตอร์ (จําเป็น)

  • datatype: ชนิดข้อมูลของคุณสมบัติเวกเตอร์ ชนิดที่สนับสนุนคือ float32 (ค่าเริ่มต้น) และ int8uint8

  • dimensions: มิติหรือความยาวของแต่ละเวกเตอร์ในเส้นทาง เวกเตอร์ทั้งหมดในเส้นทางควรมีขนาดเท่ากัน (ค่าเริ่มต้น 1536)

  • distanceFunction: เมตริกที่ใช้ในการคํานวณระยะทาง/ความคล้ายคลึงกัน เมตริกที่สนับสนุนคือ:

    • cosineซึ่งมีค่าจาก $-1$ (อย่างน้อยที่คล้ายกัน) ถึง $+1$ (คล้ายกันมากที่สุด)

    • dot productซึ่งมีค่าจาก $-\infty$ (อย่างน้อยที่คล้ายกัน) ถึง $+\infty$ (คล้ายกันมากที่สุด)

    • euclideanซึ่งมีค่าจาก $0$ (คล้ายกับมากที่สุด) ไปยัง $+\infty$ (คล้ายกันน้อยที่สุด)

Note

แต่ละเส้นทางที่ไม่ซ้ํากันสามารถมีนโยบายได้มากที่สุดหนึ่งนโยบาย อย่างไรก็ตาม สามารถระบุหลายนโยบายได้หากทุกนโยบายกําหนดเป้าหมายเป็นเส้นทางอื่น

นโยบายเวกเตอร์คอนเทนเนอร์สามารถอธิบายได้ว่าเป็นวัตถุ JSON นี่คือสองตัวอย่างของนโยบายเวกเตอร์คอนเทนเนอร์ที่ถูกต้อง:

นโยบายที่มีเส้นทางเวกเตอร์เดียว

{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

นโยบายที่มีสองเส้นทางเวกเตอร์

{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

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

นโยบายการทําดัชนีเวกเตอร์

ดัชนีเวกเตอร์เพิ่มประสิทธิภาพเมื่อทําการค้นหาเวกเตอร์โดยใช้VectorDistanceฟังก์ชันระบบ การค้นหาเวกเตอร์มีเวลาแฝงที่ต่ํากว่า ปริมาณงานที่สูงกว่า และปริมาณการใช้ RU น้อยลงเมื่อใช้ดัชนีเวกเตอร์ คุณสามารถระบุประเภทของนโยบายดัชนีเวกเตอร์เหล่านี้ได้:

Description ขนาดสูงสุด
flat จัดเก็บเวกเตอร์บนดัชนีเดียวกันกับคุณสมบัติที่จัดทําดัชนีอื่น ๆ 505
quantizedFlat วัดเวกเตอร์ (บีบอัด) ก่อนจัดเก็บในดัชนี นโยบายนี้สามารถปรับปรุงเวลาแฝงและปริมาณงานที่ต้นทุนความแม่นยําเล็กน้อย 4096
diskANN สร้างดัชนีตาม DiskANN สําหรับการค้นหาโดยประมาณที่รวดเร็วและมีประสิทธิภาพ 4096

Note

quantizedFlatดัชนีและdiskANNต้องการให้แทรกเวกเตอร์อย่างน้อย 1,000 ตัว ค่าต่ําสุดนี้คือเพื่อให้แน่ใจว่าความถูกต้องของกระบวนการวัดปริมาณ หากมีเวกเตอร์น้อยกว่า 1,000 เวกเตอร์ การสแกนเต็มรูปแบบจะดําเนินการแทนและนําไปสู่ค่าใช้จ่าย RU ที่สูงขึ้นสําหรับคิวรีการค้นหาเวกเตอร์

สองสามประเด็นที่ควรทราบ:

  • flatประเภทดัชนี และ quantizedFlat ใช้ดัชนีของ Cosmos DB เพื่อจัดเก็บและอ่านเวกเตอร์แต่ละตัวในระหว่างการค้นหาเวกเตอร์ เวกเตอร์ค้นหาด้วย flat ดัชนีเป็นการค้นหาที่มีพลังเดรัจฉานและสร้างความแม่นยํา% หรือการเรียกคืน 100 รายการ นั่นคือรับประกันว่าพวกเขาจะค้นหาเวกเตอร์ที่คล้ายกันที่สุดในชุดข้อมูล อย่างไรก็ตาม มีข้อจํากัดของ 505 มิติสําหรับเวกเตอร์บนดัชนีแบน

  • ดัชนี quantizedFlat จัดเก็บเวกเตอร์ที่วัดจํานวน (บีบอัด) บนดัชนี เวกเตอร์ค้นหาด้วย quantizedFlat ดัชนียังเป็นการค้นหาแรงเดรัจฉาน อย่างไรก็ตามความแม่นยําอาจน้อยกว่า 100% เล็กน้อยเนื่องจากเวกเตอร์จะถูกวัดก่อนที่จะเพิ่มลงในดัชนี อย่างไรก็ตาม เวกเตอร์ที่ค้นหาควร quantized flat มีความล่าช้าต่ํากว่า ปริมาณงานที่สูงกว่า และค่าใช้จ่าย RU ต่ํากว่าการค้นหาเวกเตอร์บน flat ดัชนี ดัชนีนี้เป็นตัวเลือกที่ดีสําหรับสถานการณ์ที่มีขนาดเล็กหรือสถานการณ์ที่คุณกําลังใช้ตัวกรองคิวรีเพื่อจํากัดการค้นหาเวกเตอร์ให้แคบลงเป็นเวกเตอร์ที่ค่อนข้างเล็ก quantizedFlat แนะนําให้ใช้เมื่อจํานวนเวกเตอร์ที่จะทําดัชนีอยู่ที่ประมาณ 50,000 หรือน้อยกว่าต่อพาร์ติชันจริง อย่างไรก็ตาม คําแนะนํานี้เป็นเพียงแนวทางทั่วไปและประสิทธิภาพการทํางานจริงควรได้รับการทดสอบเนื่องจากแต่ละสถานการณ์อาจแตกต่างกัน

  • ดัชนีเป็น diskANN ดัชนีแยกต่างหากที่กําหนดไว้โดยเฉพาะสําหรับเวกเตอร์โดยใช้ DiskANN ซึ่งเป็นชุดอัลกอริธึมการจัดทําดัชนีเวกเตอร์ประสิทธิภาพสูงที่พัฒนาโดย Microsoft Research ดัชนี DiskANN สามารถเสนอเวลาแฝงต่ําสุด บางระดับ อัตราความเร็วสูงสุด และคิวรีค่าใช้จ่าย RU ต่ําสุด ในขณะที่ยังคงรักษาความแม่นยําสูง โดยทั่วไป DiskANN มีประสิทธิภาพสูงสุดของดัชนีทุกประเภทหากมีเวกเตอร์มากกว่า 50,000 ต่อพาร์ติชันจริง

นี่คือตัวอย่างของนโยบายดัชนีเวกเตอร์ที่ถูกต้อง:

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*"
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN"
    }
  ]
}
{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*",
    },
    {
      "path": "/vector2/*",
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "quantizedFlat"
    },
    {
      "path": "/vector2",
      "type": "diskANN"
    }
  ]
}

Important

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

Important

อักขระตัวแทนการ์ด (*, []) ยังไม่ได้รับการรองรับในนโยบายเวกเตอร์หรือดัชนีเวกเตอร์ในขณะนี้

ทําการค้นหาเวกเตอร์ด้วยคิวรีโดยใช้ VECTORDISTANCE

เมื่อคุณสร้างคอนเทนเนอร์ที่มีนโยบายเวกเตอร์ที่ต้องการแล้วและแทรกข้อมูลเวกเตอร์ลงในคอนเทนเนอร์คุณสามารถดําเนินการค้นหาเวกเตอร์โดยใช้ฟังก์ชันในตัวVECTORDISTANCEในคิวรีได้ ตัวอย่างของคิวรี NoSQL ที่ฉายคะแนนความคล้ายคลึงกันเป็นนามแฝง scoreและเรียงลําดับตามลําดับของคล้ายกับน้อยที่สุด:

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Important

ใช้ TOP N ส่วนคําสั่งใน SELECT คําสั่งของคิวรีเสมอ มิฉะนั้นการค้นหาเวกเตอร์จะพยายามส่งกลับผลลัพธ์เพิ่มเติมมากมายทําให้คิวรีมีต้นทุนหน่วยคําขอมากขึ้น (RUs) และมีเวลาแฝงที่สูงกว่าที่จําเป็น