289 การอ่าน

The AI Engineer's Playbook: Mastering Vector Search & Management (ส่วน 2)

โดย Paolo Perrone20m2025/04/30
Read on Terminal Reader

นานเกินไป; อ่าน

การบูรณาการเวกเตอร์เป็นโครงสร้างพื้นฐานของระบบอัจฉริยะอัจฉริยะที่ทันสมัย พวกเขาครอบคลุมรูปแบบที่ซับซ้อนจากข้อความภาพเสียงและประเภทข้อมูลอื่น ๆ แม้แต่การบูรณาการที่ดีที่สุดจะไร้ประโยชน์โดยไม่มีระบบที่แข็งแกร่งในการจัดเก็บการกู้คืนและจัดการได้อย่างมีประสิทธิภาพในขนาด องค์ประกอบนี้ที่มักจะลืมรู้จักกันในชื่อ Vector Search & Management (VS&M) เป็นสิ่งสําคัญในการเปลี่ยนข้อมูลของคุณเป็นสิ่งที่สร้างมูลค่าจริง ๆ
featured image - The AI Engineer's Playbook: Mastering Vector Search & Management (ส่วน 2)
Paolo Perrone HackerNoon profile picture
0-item


Vector embeddings are the backbone of modern AI systems, encapsulating complex patterns from text, images, audio, and other data types. However, แม้แต่การบูรณาการที่ดีที่สุดก็ไม่มีประโยชน์โดยไม่มีระบบที่แข็งแกร่งในการจัดเก็บและจัดการได้อย่างมีประสิทธิภาพในขนาด.


องค์ประกอบนี้ซึ่งมักจะเบี่ยงเบนซึ่งเรียกว่า Vector Search & Management (VS&M) เป็นสิ่งสําคัญในการเปลี่ยนข้อมูลของคุณเป็นสิ่งที่สร้างมูลค่าอย่างแท้จริง หากไม่มีมันระบบไม่สามารถมีศักยภาพเต็มรูปแบบได้


This article presents a systematic approach to vector search and managementขึ้นอยู่กับสามปัจจัยหลัก:(1) access patterns, (2) performance requirements, and (3) data characteristics.


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

วิธีการระบบการค้นหาและจัดการเวกเตอร์

ในช่วงไม่กี่ปีที่ผ่านมาในการสร้างระบบ ML ฉันได้เห็นทีมงานพยายามอย่างจริงจังในการสร้างการบูรณาการเวกเตอร์ที่ซับซ้อน พวกเขาจับรูปแบบที่ละเอียดอ่อนผ่านข้อความภาพเสียง - คุณเรียกมัน แต่บ่อยครั้งที่ศักยภาพนั้นติดอยู่


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


  • คุณไม่สามารถพื้นผิวผลที่เกี่ยวข้อง
  • Embeddings ไป stable แทนที่จะปรับปรุงด้วย feedback
  • ความล่าช้าและค่าใช้จ่ายออกจากการควบคุมเมื่อข้อมูลของคุณเติบโต


นี่คือส่วนที่ทําให้ระบบทํางาน มันเป็นเครื่องมือที่อยู่เบื้องหลังการค้นหาเชิงบวกคําแนะนําและคุณสมบัติอัจฉริยะทั้งหมดที่ผู้ใช้คาดหวัง เพลิดเพลินไปกับมันและคุณได้สร้างสมองที่ไม่มีระบบประสาท


ก่อนที่จะเจาะเข้าไปในรายละเอียดทางเทคนิคให้สร้างกรอบการตัดสินใจที่จะนําทางเลือกการใช้งานของเรา:


(1) Define System Requirements

  • วัตถุประสงค์ประสิทธิภาพ (ความล่าช้าผ่านการเรียกคืน)
  • คุณสมบัติข้อมูล (ปริมาณมิติความถี่การอัปเดต)
  • ข้อ จํากัด การดําเนินงาน (ค่าใช้จ่ายพื้นฐานความเชี่ยวชาญของทีม)


(2) Choose Access Patterns

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


(3) Select Technical Implementation

  • อัลกอริทึมการค้นหา (แน่นอน vs. ประมาณ)
  • เทคนิคการเพิ่มประสิทธิภาพ (ปริมาณการกรอง)
  • กลยุทธ์การจัดเก็บและดัชนี


(4) Establish Evaluation Framework

  • เมตริกระบบ (การไหลเวียนความล่าช้าการใช้ทรัพยากร)
  • เมตริกคุณภาพ (การเตือนจําความแม่นยําความเกี่ยวข้อง)
  • เมตรการดําเนินงาน (เวลาสร้างความล่าช้าการอัปเดต)

กรอบนี้ให้แน่ใจว่าการตัดสินใจทางเทคนิคสอดคล้องกับกรณีการใช้งานและข้อกําหนดทางธุรกิจของคุณ

แนวคิดหลัก

Vector Search & Management ประกอบด้วยสองส่วนประกอบที่เชื่อมต่อกัน:


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

ทําไมการประมวลผลการค้นหาและจัดการเวกเตอร์ไม่สามารถทําธุรกรรมได้

ความสามารถในการค้นหาและจัดการเวกเตอร์ที่มีประสิทธิภาพเปิดเผยประโยชน์หลักสามประการ:


  • การประเมินและปรับปรุงการบูรณาการ: วิธีที่คุณรู้ว่าการบูรณาการของคุณทํางานได้ดีในทางปฏิบัติหรือไม่? เพื่อตอบคําถามนี้คุณต้องสอบถามพวกเขากับชุดข้อมูลที่เป็นตัวแทนและประเมินพวกเขาโดยใช้เมตริกเช่น recall@k ไม่มีการค้นหาเวกเตอร์ที่มีประสิทธิภาพการประเมินการบูรณาการในหลายล้านหรือหลายพันล้านรายการจะช้าอย่างมาก จํากัด การทดสอบไปยังตัวอย่างขนาดเล็กหรือกรณีที่เรียบง่าย ไม่มีการค้นหาและจัดการเวกเตอร์ที่แข็งแกร่งคุณจะได้รับความเข้าใจที่ จํากัด ของประสิทธิภาพการบูรณาการในการผลิต
  • วัตถุประสงค์ใหม่ ๆ ที่เกี่ยวข้องกับโมเดล ML: รูปแบบที่ใช้การเรียนรู้การถ่ายโอน, RL, Recommendations, Anomaly Detection หรือ Active Learning ขึ้นอยู่กับ embeddings เป็น input นอกจากนี้ความสามารถในการค้นหาเวกเตอร์ช่วยให้การค้นหาเวกเตอร์ที่เฉพาะเจาะจงที่จําเป็นสําหรับการฝึกอบรมที่ซับซ้อน (เช่นการค้นหาเชิงลบที่แข็งแกร่งสําหรับการเรียนรู้ที่ใช้งาน) ได้อย่างมีประสิทธิภาพ หากไม่มีการค้นหาและจัดการเวกเตอร์ที่แข็งแกร่งโมเดลสามารถทํางานไม่ดีและกระบวนการฝึกอบรมอาจไม่มีประสิทธิภาพ
  • ความสามารถในการใช้งานแบบเรียลไทม์: แอปพลิเคชันที่นําไปใช้กับผู้ใช้เช่นการค้นหาคําอธิบายคําแนะนําและการค้นหาความคล้ายคลึงกันทางภาพต้องการการตอบคําถามความล่าช้าต่ําและส่งผ่านสูงโดยเฉพาะอย่างยิ่งเนื่องจากข้อมูลกําลังเปลี่ยนแปลงอย่างต่อเนื่อง ในขณะที่ embeddings ระบุความคล้ายคลึงกันก็เป็นเครื่องมือค้นหาเวกเตอร์ที่ส่งผลในมิลลิสวินาทีในขนาด ฐานข้อมูลแบบดั้งเดิมพยายามที่จะตอบสนองความต้องการเหล่านี้ทําให้ระบบการค้นหาและการจัดการเวกเตอร์เฉพาะอย่างยิ่ง หากไม่มีความสามารถเหล่านี้ประสบการณ์ของผู้ใช้ได้รับผลกระทบอย่างมาก

Navigating the Design Trade-offs สําหรับ Vector Search & Management

การประยุกต์ใช้ Vector Search & Management ที่ประสบความสําเร็จต้องสมดุลความสําคัญของคู่แข่ง ลองพิจารณามิติการออกแบบที่สําคัญ:

ข้อกําหนดประสิทธิภาพ

ทุกระบบค้นหาเวกเตอร์ทําแลกเปลี่ยนระหว่าง:

(1) Speed/Latency:ความเร็วในการตอบสนองของระบบคือเท่าไหร่? ความล่าช้าต่ํากว่า 100 มม. เป็นสิ่งจําเป็นหรือความล่าช้าที่สองเป็นที่ยอมรับได้หรือไม่? ความต้องการความล่าช้าที่ต่ํากว่ามักจะต้องการทรัพยากรการคํานวณมากขึ้นและอาจต้องเสียค่าความแม่นยํา


(2) Accuracy/Recall:ระดับความแม่นยําใดที่จําเป็น? การค้นหา 95% ของผลลัพธ์ที่เกี่ยวข้องเพียงพอหรือคุณต้องจับภาพ 99.9%? ความต้องการในการเรียกคืนที่สูงขึ้นมักจะเพิ่มค่าใช้จ่ายในการคํานวณและอาจลดความเร็ว


(3) Cost:มีข้อ จํากัด ในงบประมาณอะไร? ประสิทธิภาพที่สูงขึ้นโดยทั่วไปต้องใช้ทรัพยากรมากขึ้นซึ่งจะนําไปสู่ค่าใช้จ่ายที่เพิ่มขึ้น การทําความเข้าใจเกี่ยวกับข้อ จํากัด ของคุณทางเศรษฐกิจเป็นสิ่งจําเป็นสําหรับการออกแบบที่ยั่งยืน


(4) Scalability:ระบบควรมีขนาดเท่าไหร่เมื่อข้อมูลเติบโตได้อย่างไร? มันจําเป็นต้องจัดการกับหลายล้านคําถามในหลายพันล้านเวคเตอร์หรือไม่? ความต้องการการปรับขนาดมีอิทธิพลต่อการเลือกสถาปัตยกรรมตั้งแต่เริ่มต้น

ข้อมูลจําเพาะ

การเข้าใจข้อมูลของคุณเป็นสิ่งสําคัญสําหรับการออกแบบการค้นหาเวกเตอร์:


(1) Data Volume:จํานวนเวกเตอร์ในชุดข้อมูลของคุณมีผลต่อการเลือกสถาปัตยกรรม ระบบที่จัดการกับพันล้านหรือพันล้านเวกเตอร์ต้องใช้วิธีการที่แตกต่างกัน


(2) Vector Dimensionality:มิติสูงกว่า (1024 +) vs มิติต่ํากว่า (128) มีผลต่อการใช้หน่วยความจําความต้องการการคํานวณและการเลือกอัลกอริทึม


(3) Update Frequency:บ่อยครั้งที่เวกเตอร์เปลี่ยนรูปร่างท่อทั้งหมดของคุณ:

  • สตรีมมิ่งแบบเรียลไทม์: การอัปเดตทันทีที่จําเป็นต้องมีการดัชนีอย่างต่อเนื่อง
  • แพทช์ที่พบบ่อย: การอัปเดตเป็นประจํา (ชั่วโมง / วัน) ช่วยให้การรีอินเดกซ์เป็นประจํา
  • การโหลดจํานวนมากที่หายาก: การอัปเดตที่หายากช่วยให้การเพิ่มประสิทธิภาพแบบคงที่

Query Access รูปแบบ

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


(1) High-throughput single lookups:คําถามส่วนบุคคลที่รวดเร็วที่ต้องการเส้นทางการค้นหาที่เพิ่มประสิทธิภาพ

(2) Complex batch queries:โหลดงานวิเคราะห์ที่ประมวลผลเวกเตอร์หลายตัวพร้อมกัน

(3) Filtering before search:สถานการณ์ที่จําเป็นต้องกรองข้อมูลเมตาก่อนหรือพร้อมกับความคล้ายคลึงกันของเวคเตอร์


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

Synthesizing the Tradeoffs: The Design Triangle


แต่ละโครงการเกี่ยวข้องกับการทําความชดเชยอย่างมีนัยสําคัญโดยเฉพาะอย่างยิ่งเมื่อกําหนดเป้าหมายสําคัญของคุณและตัดสินใจว่า Aspects ที่จะให้ความสําคัญตัวอย่างเช่นในe-commerce recommendation systemความต้องการความล่าช้าต่ํา (ความเร็ว) และการอัปเดตแบบเรียลไทม์อาจเป็นสิ่งสําคัญ

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


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


So, how do we achieve the desired speed and accuracy within these constraints?สิ่งนี้นําเราไปสู่ห้องเครื่องมือของ Vector Search

เครื่องมือหลัก: อัลกอริทึมค้นหาเพื่อนบ้านที่ใกล้ที่สุด

การค้นหาเวกเตอร์ขึ้นอยู่กับความเร็ว - ความสามารถในการสแกนชุดข้อมูลได้อย่างรวดเร็วและคํานวณความคล้ายคลึงกันระหว่างเวกเตอร์ ในใจกลางของงานนี้คือการค้นหาเพื่อนบ้านใกล้ที่สุด (NN) วัตถุประสงค์ที่เรียบง่าย: ให้มีเวกเตอร์คําถามให้พบเวกเตอร์ในชุดข้อมูลที่ดัชนีของคุณที่ใกล้ที่สุดตามวัดระยะทางที่เลือก (เช่นความคล้ายคลึงกันของ Cosine หรือระยะ Euclidean) มีหลายวิธีในการค้นหาเพื่อนบ้านใกล้ที่สุด ลองเริ่มต้นด้วยวิธีการที่เรียบง่ายที่สุด

การสแกนเต็มรูปแบบ (Brute Force Approach)

ลองจินตนาการว่าเรามีชุดข้อมูล 1 ล้านเวกเตอร์ 1000 มิติและต้องการค้นหาเวกเตอร์ที่คล้ายคลึงกันสําหรับคําถามที่กําหนด วิธีที่สุภาพจะเปรียบเทียบเวกเตอร์คําถามกับเวกเตอร์แต่ละเวกเตอร์โดยการดําเนินการ 1 พันล้านขั้นตอน (1M เวกเตอร์ * 1000 มิติ) ต่อคําถาม


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


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


Performance characteristics:

  • ความล่าช้า: O(n×d) ที่ n = จํานวนเวกเตอร์และ d = มิติ
  • หน่วยความจํา: O(n×d) - ต้องใช้ชุดข้อมูลที่สมบูรณ์ในหน่วยความจําเพื่อประสิทธิภาพที่ดีที่สุด
  • ความแม่นยํา: 100% การเรียกคืน (รับประกันเพื่อหาเพื่อนบ้านที่ใกล้ที่สุดจริง)
  • เวลาในการสร้าง: O(1) – ไม่จําเป็นต้องอ้างอิง


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

Approximate Nearest Neighbor (ANN) Algorithms

นี่คือจุดที่อัลกอริทึม Approximate Nearest Neighbor (ANN) เข้าไปในภาพ

อัลกอริทึม ANN นําเสนอการประมาณการสําหรับการปรับปรุงความเร็วอย่างมาก นี่คือวิธีการหลัก:


(1) Tree-based methods (KD-trees, Ball trees)

เหล่านี้แบ่งพื้นที่เวกเตอร์เป็นภูมิภาคที่แนบมาเพื่อให้คุณไม่จําเป็นต้องค้นหาทุกอย่าง

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


(2) Locality-Sensitive Hashing (LSH)

นี้แฮชเวกเตอร์เพื่อให้คล้ายคลึงกันลงในถังเดียวกันบ่อยกว่าไม่

  • ขนาดได้ดีกับจํานวนมิติและขนาดชุดข้อมูล
  • ไม่จําเป็นต้องสแกนพื้นที่ทั้งหมด
  • แต่: ต้องการปรับตัวอย่างระมัดระวังของฟังก์ชั่นแฮชและขอบเขตเพื่อรับการกู้คืนที่ดี


(3) Graph-based methods

เหล่านี้สร้างกราฟที่แต่ละแกน (เวกเตอร์) เชื่อมต่อกับเพื่อนบ้านที่ใกล้ที่สุด - การค้นหาจะกลายเป็นการข้ามอย่างรวดเร็ว

  • HNSW (Hierarchical Navigable Small World): สร้างกราฟหลายชั้นเพื่อนําทางชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพ
  • NSG (Navigable Spreading-out Graph): มุ่งเน้นไปที่การสร้างกราฟที่ยึดมั่นอย่างดีเพื่อลดการล้มเหลวและลดต้นทุนการค้นหา
  • DiskANN: ปรับปรุงสําหรับชุดข้อมูลระดับพันล้าน, ออกแบบมาเพื่อปิด SSDs แทนที่จะเก็บทุกอย่างใน RAM


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

Plots for glove-100-angular (k = 10) Recall/Queries per second (1/s) form ANN-benchmarks


ตัวอย่างรหัส: Full Scan vs. ANN

เพื่อให้แนวคิดเหล่านี้มีประติมากรรมมากขึ้นโปรดแสดงการเปรียบเทียบขั้นพื้นฐานระหว่างการสแกนเต็มรูปแบบ (การค้นหาเชิงเส้น) และวิธีการ ANN โดยใช้ดัชนี IVFFlat โดยใช้ตัวอักษรที่นิยมห้องสมุด Faiss.


import numpy as np
import faiss
import time

# 1. Create a synthetic dataset
num_vectors = 1000000  # One million vectors
vector_dim = 1000      # 1000 dimensions
print(f"Creating dataset with {num_vectors} vectors of dimension {vector_dim}...")
dataset = np.random.rand(num_vectors, vector_dim).astype('float32')

# 2. Define a sample query vector
query_vector = np.random.rand(vector_dim).astype('float32')
query_vector_reshaped = query_vector.reshape(1, vector_dim)

# --- Linear Scan (Full Scan) Example ---
print("\n--- Linear Scan (using IndexFlatL2) ---")

# 3. Create a Faiss index for exact L2 distance search (Full Scan)
index_flat = faiss.IndexFlatL2(vector_dim)

# 4. Add the dataset vectors to the index
print("Adding vectors to IndexFlatL2...")
index_flat.add(dataset)
print(f"Index contains {index_flat.ntotal} vectors.")

# 5. Perform the search
print("Performing linear scan search...")
start_time = time.time()
distances_flat, indices_flat = index_flat.search(query_vector_reshaped, k=1)
end_time = time.time()

# On typical hardware, this might take 1-2 seconds for this dataset size
print(f"Linear scan time: {end_time - start_time:.4f} seconds")
print(f"Nearest neighbor index (Linear): {indices_flat[0][0]}, Distance: {distances_flat[0][0]}")

# --- Approximate Nearest Neighbor (ANN) Example ---
print("\n--- ANN Scan (using IndexIVFFlat) ---")

# 6. Define and create an ANN index (IVFFlat)
# IVF1024 partitions the data into 1024 clusters (voronoi cells)
nlist = 1024  # Number of clusters/cells
quantizer = faiss.IndexFlatL2(vector_dim)
index_ivf = faiss.IndexIVFFlat(quantizer, vector_dim, nlist)

# 7. Train the index on the dataset (learns the cluster centroids)
# This is a one-time operation that can be slow but improves query performance
print(f"Training IndexIVFFlat with {nlist} clusters...")
index_ivf.train(dataset)
print("Training complete.")

# 8. Add the dataset vectors to the trained index
print("Adding vectors to IndexIVFFlat...")
index_ivf.add(dataset)
print(f"Index contains {index_ivf.ntotal} vectors.")

# 9. Perform the ANN search
# nprobe controls search accuracy vs. speed tradeoff
# Higher values = better recall but slower search
index_ivf.nprobe = 10  # Search within the 10 nearest clusters
print(f"Performing ANN search (nprobe={index_ivf.nprobe})...")
start_time = time.time()
distances_ivf, indices_ivf = index_ivf.search(query_vector_reshaped, k=1)
end_time = time.time()

# On typical hardware, this might take 10-20ms - about 100x faster than brute force
print(f"ANN scan time: {end_time - start_time:.4f} seconds")
print(f"Nearest neighbor index (ANN): {indices_ivf[0][0]}, Distance: {distances_ivf[0][0]}")

# Expected recall rate at nprobe=10 is approximately 90-95%
# To verify, we could compute overlap between exact and approximate results


ในตัวอย่างนี้เราสร้างชุดข้อมูลขนาดใหญ่ของเวกเตอร์แบบสุ่ม เราใช้IndexFlatL2สําหรับการสแกนเชิงเส้น ตัวอักษรนี้เพียงแค่บันทึกเวคเตอร์ทั้งหมดและเปรียบเทียบคําถามกับแต่ละคําถามในระหว่างการค้นหา - หลักฐานแรงบิดของเรา


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


การเรียกใช้รหัสนี้ (เวลาจริงขึ้นอยู่กับฮาร์ดแวร์อย่างมาก) แสดงให้เห็นว่าการค้นหา ANN (IndexIVFFlat), แม้ว่าการฝึกอบรมครั้งแรกจะดําเนินการค้นหาได้อย่างรวดเร็วกว่าการสแกนเชิงเส้น (IndexFlatL2), แสดงให้เห็นถึงข้อได้เปรียบของความเร็วทางปฏิบัติของวิธีการ ANN สําหรับชุดข้อมูลขนาดใหญ่


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

การลดนิทรรศการหน่วยความจํา: ปริมาณ

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


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


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


มีวิธีการหลายวิธีในการกําหนดปริมาณเวกเตอร์ที่มีสามประเภททั่วไปคือ:


(1) Scalar Quantization

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

Performance impact:

  • การลดหน่วยความจํา: 4x (32-bit → 8-bit)
  • ผลกระทบความเร็ว: น้อยที่สุด (บางครั้งเร็วขึ้นเนื่องจากความกว้างแบนด์วิดธ์ของหน่วยความจําที่ลดลง)
  • ผลกระทบของความแม่นยํา: ประมาณ 1-3% ลดการกู้คืน
  • กรณีการใช้งาน: ตัวเลือกทั่วไปที่ดีสําหรับการเพิ่มประสิทธิภาพหน่วยความจําเริ่มต้น


(2) Binary Quantization

Takes compression further by representing vector components with binary codes, often using just 1 bit per component or group of components. This results in high compression and very fast distance calculations (e.g., Hamming distance). However, BQ can lead to significant information loss, which can reduce accuracy, so it is best suited for cases where speed is critical and the data is well-suited for binary representation.

Performance impact:

  • การลดหน่วยความจํา: 8–64x ขึ้นอยู่กับการกําหนดค่า
  • ผลกระทบความเร็ว: การคํานวณระยะทางที่ซับซ้อนสามารถช้าลง
  • ผลกระทบของความแม่นยํา: ลดการเรียกคืน 5-15% (ขึ้นอยู่กับการกําหนดค่า)
  • กรณีการใช้งาน: ระบบขนาดใหญ่ซึ่งหน่วยความจําเป็นข้อ จํากัด หลัก


(3) Product Quantization

เทคนิคนี้ใช้วิธีการที่แตกต่างกัน มันแบ่งแต่ละเวกเตอร์ขนาดสูงเป็น sub-vectors ขนาดเล็กกว่าซึ่งจะมีปริมาณโดยอิสระโดยใช้เทคนิคการรวบรวมเช่น k-means แต่ละ sub-vector เป็นตัวแทนโดยโค้ดจากหนังสือโค้ดซึ่งนําไปสู่การบีบอัดอย่างมีนัยสําคัญ ในขณะที่ PQ มีการใช้หน่วยความจําต่ํากระบวนการคํานวณระยะทางและทําการค้นหาอาจมีความเข้มข้นทางคอมพิวเตอร์มากขึ้นกว่า SQ ซึ่งส่งผลให้เวลาการสอบถามที่ช้าลงและความแม่นยําที่ต่ํากว่าในระดับการบีบอัดที่คล้ายคลึงกัน

Performance impact:

  • การลดหน่วยความจํา: 32x เมื่อเทียบกับ floats 32 บิต
  • ผลกระทบความเร็ว: มีความเร็วสูงโดยใช้การคํานวณระยะทาง
  • ผลกระทบของความแม่นยํา: มีความสําคัญ (20% + ลดการกู้คืน)
  • กรณีการใช้งาน: แอพพลิเคชันความเร็วสูงที่ความแม่นยําที่สมบูรณ์แบบ


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


การเลือกกลยุทธ์การวัดปริมาณที่เหมาะสมเช่นการเลือกวิธีการ ANN ที่เหมาะสมจําเป็นต้องเข้าใจข้อตกลงและปรับให้ตรงกับความต้องการของระบบและลักษณะข้อมูลของคุณ

กลยุทธ์การกรอง

ในสถานการณ์ของโลกจริงส่วนใหญ่จําเป็นต้องรวมความคล้ายคลึงกันของเวกเตอร์กับการกรองข้อมูลเมตา. Think about queries like “find similar products that are in stock and under $50.” This hybrid search presents its own set of challenges:

วิธีการกรอง

(1) Pre-filtering

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

Example: ก่อนอื่นคุณกรองผลิตภัณฑ์ที่ต่ํากว่า $ 50 จากนั้นคํานวณความคล้ายคลึงกันเฉพาะในส่วนประกอบที่ตอบสนองเกณฑ์


(2) Post-filtering

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

Example: ค้นหา 1000 ผลิตภัณฑ์ที่คล้ายคลึงกันชั้นนําแล้วลดลงให้ต่ํากว่า $ 50


(3) Hybrid filtering

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

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

กลยุทธ์การดําเนินการ

(1) Inverted Index + Vector Index

ด้วยกลยุทธ์นี้คุณจะสร้างดัชนีแยกต่างหากสําหรับเมตาเดทและเวกเตอร์ ครั้งแรกดัชนีเมตาเดทจะช่วยให้คุณระบุตัวเลือกที่เล็กกว่า จากนั้นคุณจะใช้การค้นหาเวกเตอร์เฉพาะสําหรับตัวเลือกเหล่านี้เพื่อประหยัดเวลา วิธีนี้เหมาะเมื่อตัวกรองของคุณเป็นตัวเลือกอย่างแท้จริง


(2) Joint Indexing

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


(3) Filter-Aware ANN

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

รูปแบบการเข้าถึงที่สําคัญ

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

การเข้าถึงในหน่วยความจําแบบคงที่

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


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


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


Implementation Considerations

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

  • สําหรับการตั้งค่าน้ําหนักเบา – ตัวอย่างเช่นต่ํากว่า 100,000 วัตถุ – NumPy อาจเพียงพอ มันช่วยให้การดําเนินงานในหน่วยความจําที่มีประสิทธิภาพเช่นความคล้ายคลึงกันของ cosine โดยใช้แถบที่เรียบง่าย นี่เป็นตัวเลือกที่ดีเมื่อความซับซ้อนของคําถามต่ําและความต้องการในการทํางานมีขนาดเล็ก
  • เมื่อชุดข้อมูลเข้าถึงช่วงเวคเตอร์ล้านความต้องการในการทํางานมักจะเพิ่มขึ้น ในกรณีเหล่านี้ห้องสมุดเช่น Faiss ให้การอ้างอิงและค้นหาความคล้ายคลึงกันที่มีประสิทธิภาพมากขึ้นรวมถึงการสนับสนุน ANN และปริมาณการทํางานในหน่วยความจําทั้งหมด
  • หากแอพพลิเคชันของคุณต้องการกรองด้วยข้อมูลเมตาตามความคล้ายคลึงกันของเวกเตอร์หรือหากชุดข้อมูลในหน่วยความจําของคุณมีขนาดใหญ่ แต่ยังคงพอดีกับหน่วยความจํา RAM เครื่องมือเช่น LanceDB หรือ Chroma อาจเหมาะได้ดีขึ้น “ฐานข้อมูลเวกเตอร์ในกระบวนการ” เหล่านี้ทํางานภายในแอพพลิเคชันของคุณรวมความเร็วในการเข้าถึงหน่วยความจําท้องถิ่นกับโครงสร้างและความยืดหยุ่นของฐานข้อมูลโดยไม่ต้องใช้การโทรเครือข่าย


Service Restart Implications

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

การเข้าถึงแบบไดนามิก

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


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


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


  1. ฐานข้อมูล vector-native (เช่น Weaviate, Pinecone, Milvus, Vespa, Qdrant): ได้รับการเพิ่มประสิทธิภาพโดยเฉพาะสําหรับการจัดเก็บการดัชนีและดําเนินการค้นหาความคล้ายคลึงกันอย่างรวดเร็วในข้อมูล vector ขนาดสูง การออกแบบของพวกเขามุ่งเน้นไปที่การดําเนินงาน vector ทําให้มีประสิทธิภาพสูงสําหรับวัตถุประสงค์นี้ อย่างไรก็ตามพวกเขาอาจขาดคุณสมบัติที่ครอบคลุมที่พบในฐานข้อมูลวัตถุประสงค์ทั่วไปสําหรับการจัดการข้อมูลแบบโครงสร้างหรือไม่โครงสร้างแบบดั้งเดิม
  2. ฐานข้อมูลไฮบริด (เช่น MongoDB Atlas Vector Search, PostgreSQL with pgvector, Redis with redis-vss): เป็นฐานข้อมูลที่แข็งแกร่ง (NoSQL, relational, key-value) ซึ่งรวมการค้นหาเวกเตอร์ผ่านการขยายตัวหรือคุณสมบัติในตัว พวกเขามีประโยชน์จากการจัดการทั้งประเภทข้อมูลเวกเตอร์และประเภทข้อมูลแบบดั้งเดิมในระบบเดียวให้ความยืดหยุ่นสําหรับแอพพลิเคชันที่ต้องการทั้งสอง อย่างไรก็ตามประสิทธิภาพการค้นหาเวกเตอร์ของพวกเขาอาจไม่สอดคล้องกับความสามารถเฉพาะของฐานข้อมูลเวกเตอร์
  3. เครื่องมือค้นหาที่มีความสามารถของเวกเตอร์ (เช่น Elasticsearch, OpenSearch): ที่สร้างขึ้นเดิมสําหรับการค้นหาข้อความและการวิเคราะห์บันทึกเครื่องมือค้นหาเหล่านี้มีคุณสมบัติการค้นหาเวกเตอร์แบบบูรณาการ สําหรับองค์กรที่ใช้พวกเขาแล้วสิ่งนี้ช่วยให้สามารถใช้โครงสร้างพื้นฐานที่มีอยู่สําหรับการค้นหาความคล้ายคลึงกันทั้งข้อความและเวกเตอร์ อย่างไรก็ตามประสิทธิภาพการค้นหาเวกเตอร์และอัลกอริทึมที่มีอยู่อาจไม่เป็นพิเศษหรือมีประสิทธิภาพเท่าที่พบในฐานข้อมูลเวกเตอร์เฉพาะ

การเปรียบเทียบด้านข้างของข้อดีและข้อเสียของแต่ละประเภทฐานข้อมูล

การเข้าถึงแบทช์

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


การประมวลผลแบตเตอรี่มีคุณค่าโดยเฉพาะอย่างยิ่งสําหรับงานการจัดการเวกเตอร์พื้นฐานที่สําคัญสําหรับบริการการค้นหาเวกเตอร์ที่มีประสิทธิภาพเช่น:

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


เพื่อเพิ่มประสิทธิภาพในการประมวลผลชุดสําหรับแอปพลิเคชันของคุณเป็นสิ่งสําคัญที่จะพิจารณาปัจจัยหลายประการ:


(1) Storage Technologies

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


  • โซลูชั่นการจัดเก็บวัตถุ (เช่น Amazon S3, Google Cloud Storage, Azure Blob Storage): โซลูชั่นการจัดเก็บวัตถุนี้มีความยืดหยุ่นและมีค่าใช้จ่ายสูงซึ่งทําให้เหมาะสําหรับการจัดเก็บชุดเวกเตอร์แบบคงที่ขนาดใหญ่ มันบูรณาการได้ดีกับเครื่องมือการประมวลผลบนคลาวด์เช่น Spark และ Flink อย่างไรก็ตามข้อเสียหลักของมันคือความล่าช้าในการเข้าถึงที่สูงขึ้นเมื่อเทียบกับระบบไฟล์ซึ่งทําให้มันไม่เหมาะสําหรับการดําเนินงานที่มีความเข้มข้นของ I/O ที่ต้องการการอ่านหรือเขียนความล่าช้าที่รวดเร็วและต่ํา การจัดเก็บวัตถุเหมาะสําหรับการประมวลผลข้อมูลในเวลาว่างแทนการประมวลผลในเวลาจริง
  • ระบบไฟล์กระจาย (เช่น HDFS, GlusterFS): ระบบเหล่านี้ได้รับการออกแบบมาเพื่อจัดเก็บชุดข้อมูลขนาดใหญ่บนเซิร์ฟเวอร์หลายเซิร์ฟเวอร์ซึ่งให้การเข้าถึงการไหลสูงที่เหมาะสําหรับกรอบข้อมูลขนาดใหญ่เช่น Hadoop และ Spark พวกเขาให้ความอุดมสมบูรณ์ของข้อมูลและได้รับการเพิ่มประสิทธิภาพสําหรับการอ่านตามลําดับ อย่างไรก็ตามพวกเขามาพร้อมกับความซับซ้อนของการตั้งค่าการจัดการและการบํารุงรักษาซึ่งอาจเป็นเรื่องยากกว่าโซลูชันการจัดเก็บวัตถุคลาวด์ที่จัดการ


(2) Data Serialization Formats

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

  • Avro and Parquet: These are binary serialization formats widely used in the big data ecosystem (e.g., Hadoop, Spark). Both offer excellent compression and support schema evolution, which is particularly useful if vector dimensions or metadata change over time. Avro is typically preferred for row-oriented operations or write-heavy workloads, while Parquet, with its columnar format, is optimized for read-heavy analytical queries, which is ideal for batch processing jobs. These formats also integrate seamlessly with distributed processing engines and cloud storage, making them versatile options for large-scale data operations.
  • การบีบอัด NumPy Arrays: สําหรับท่อที่เรียบง่ายขึ้นตาม Python การ serializing NumPy Arrays โดยใช้รูปแบบเช่น .npz หรือการ serialization ที่กําหนดเองด้วยห้องสมุดการบีบอัดเช่น zlib หรือ lz4 เป็นวิธีการที่มีประสิทธิภาพ วิธีการนี้เป็นประโยชน์โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมทางวิทยาศาสตร์ Python และรวมกันได้อย่างง่ายดายกับห้องสมุดเช่น NumPy และ SciPy อย่างไรก็ตามอาจไม่เป็นแบบพกพาหรือมีประสิทธิภาพสําหรับสภาพแวดล้อมที่มีขนาดใหญ่หลายภาษาซึ่งรูปแบบเช่น Parquet โดยปกติจะนําเสนอการปรับขนาดและประสิทธิภาพที่ดีขึ้น


(3) Execution Environment

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

  • การดําเนินการในสถานที่: การใช้เครื่องมือเช่น Apache Hadoop หรือ Apache Spark บนโครงสร้างพื้นฐานของคุณเองช่วยให้คุณสามารถควบคุมสภาพแวดล้อมความปลอดภัยและการกําหนดค่าได้อย่างสมบูรณ์ อย่างไรก็ตามสิ่งนี้มีค่าใช้จ่ายอย่างมีนัยสําคัญที่เกี่ยวข้องกับการตั้งค่าโครงสร้างพื้นฐานการบํารุงรักษาและความต้องการความเชี่ยวชาญในการดําเนินงาน นอกจากนี้การปรับขนาดทรัพยากรอาจมีความยืดหยุ่นน้อยลงและซับซ้อนขึ้นเมื่อเทียบกับโซลูชั่นคลาวด์
  • บริการคลาวด์: แพลตฟอร์มเช่น Amazon EMR, Google Cloud Dataproc หรือ Azure HDInsight ให้โซลูชั่นการประมวลผลชุดที่จัดการขึ้นอยู่กับกรอบที่เป็นที่นิยมเช่น Spark บริการเหล่านี้ลบการจัดการโครงสร้างพื้นฐานส่วนใหญ่ให้การปรับขนาดได้ตามค่าธรรมเนียมและสามารถบูรณาการได้อย่างง่ายดายกับบริการคลาวด์อื่น ๆ เช่นการจัดเก็บวัตถุได้ ข้อเสนอแนะที่นี่คือคุณอาจสูญเสียการควบคุมสภาพแวดล้อมของคุณและอาจเผชิญกับการล็อคซัพพลายเออร์ที่มีศักยภาพ


Choosing a batch processing setup


โดยสรุปการเลือกเทคโนโลยีการจัดเก็บข้อมูลที่เหมาะสมรูปแบบการ serialization ของข้อมูลและสภาพแวดล้อมการดําเนินการสําหรับการประมวลผล vector batchเป็นการตัดสินใจที่ซับซ้อน มันขึ้นอยู่กับปัจจัยเช่น:


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

ข้อสรุป: สร้างระบบค้นหาเวคเตอร์ที่มีประสิทธิภาพ

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

การนําทั้งหมดเข้าด้วยกัน: รายการตรวจสอบการใช้งานที่สําคัญ

(1) Define clear requirements:

  • Document latency, throughput, and recall targets
  • กําหนดความต้องการการอัปเดตความถี่
  • ระบุรูปแบบการกรองและสอบถาม


(2) Choose appropriate architecture:

  • เลือกรูปแบบการเข้าถึง (static, dynamic, batch)
  • กําหนดฐานข้อมูลเวคเตอร์หรือโซลูชั่นการจัดเก็บข้อมูล
  • การออกแบบสําหรับขนาดและการเจริญเติบโตที่เหมาะสม


(3) Optimize for your use case:

  • เลือกและปรับอัลกอริทึม ANN
  • ใช้ปริมาณที่เหมาะสม
  • การออกแบบกลยุทธ์การกรองที่มีประสิทธิภาพ


(4) Implement comprehensive evaluation:

  • การตั้งค่ามาตรฐานคุณภาพ
  • ระบบตรวจสอบประสิทธิภาพ
  • ติดตามวัดผลกระทบธุรกิจ


(5) Plan for operational excellence:

  • การออกแบบสําหรับการสังเกต
  • การประมวลผลข้อผิดพลาด
  • สร้างกรอบการทดสอบและยืนยัน


ในส่วนต่อไปของ The AI Engineer's Playbook เราจะสํารวจวิธีการใช้ประโยชน์อย่างมีประสิทธิภาพจากความสามารถของเวกเตอร์เหล่านี้ในแอปพลิเคชัน AI ในโลกจริง

ต้องการที่จะได้ยินจากฉันบ่อยขึ้นติดต่อฉันบน LinkedIn!

ติดต่อฉันบน LinkedIn

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

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks