นี่คือเวอร์ชัน WebAssembly (WASM) ของไลบรารีดัชนี HNSWLIB ที่เขียนใน C ++ พอร์ต WASM นี้ถูกสร้างขึ้นโดย @ShraVansudent โดยใช้คอมไพเลอร์ EMCC WASM ดูที่เก็บที่นี่
แรงบันดาลใจจากห้องสมุด hnswlib-node @yoshoku ได้จัดทำเอกสารที่ยอดเยี่ยมสำหรับ hnswlib-node ขอบคุณ @yoshoku!
หมายเหตุ: ห้องสมุดนี้ยังอยู่ในช่วงแรก! มันถูกสร้างขึ้นสำหรับกรณีการใช้งานที่ต้องใช้ hnswlib ในเบราว์เซอร์
hnswlib-wasm ให้การเชื่อมโยง WASM สำหรับ HNSWLIB ซึ่งใช้การค้นหาที่ใกล้ที่สุดโดยประมาณโดยใช้กราฟโลกขนาดเล็กที่นำทางได้ตามลำดับชั้น มันทำงานในเบราว์เซอร์และรวบรวมด้วย emscripten
$ yarn add hnswlib-wasmดูแพ็คเกจ NPM ที่นี่
indexedDB (ในเบราว์เซอร์) และใช้ FS จาก Emscripten เพื่อบันทึกและโหลดดัชนีผ่านระบบไฟล์เสมือนจริงและ IDBFShnswlib-node สำหรับรายละเอียดเพิ่มเติมโดย @Yoshoku Changelogก่อนอื่นสร้างอินสแตนซ์รันไทม์ของไลบรารี:
import { loadHnswlib } from 'hnswlib-wasm' ;
const lib = await loadHnswlib ( ) ;นี่คือตัวอย่างเต็มของการโหลดดัชนีหากมีอยู่หรือสร้างดัชนีใหม่หากไม่มีอยู่:
const filename = 'ghost.dat' ;
const { loadHnswlib } = await import ( 'hnswlib-wasm' ) ;
this . hnswlib = await loadHnswlib ( ) ;
this . hnswlib . EmscriptenFileSystemManager . setDebugLogs ( true ) ;
this . vectorHnswIndex = new this . hnswlib . HierarchicalNSW ( 'cosine' , 1536 ) ;
await syncFileSystem ( 'read' ) ;
const exists = this . hnswlib . EmscriptenFileSystemManager . checkFileExists ( filename ) ;
if ( ! exists ) {
this . vectorHnswIndex . initIndex ( 100000 , 48 , 128 , 100 ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
this . vectorHnswIndex . writeIndex ( 'ghost.dat' ) ;
} else {
this . vectorHnswIndex . readIndex ( filename , 100000 , true ) ;
this . vectorHnswIndex . setEfSearch ( 32 ) ;
}คุณสามารถสร้างดัชนีและใช้งานได้เช่นนั้น
// Here you're creating a new index with the L2 distance metric and 1000 as the max number of elements
const hnswIndex = lib . HierarchicalNSW ( 'l2' , 100 ) ;
// Initialize the index with the dimensions (1536), m, efConstruction. See the section below on parameters for more details. These cannot be changed after the index is created.
index . initIndex ( 1536 , 36 , 16 , 200 ) ;
// Set efSearch parameters. This can be changed after the index is created.
index . setEfSearch ( efSearch ) ;
// Now you can add items to the index, labels are returned as an array for the vectors. It will reuse deleted labels if possible based on the second parameter.
const labels = index . addItems ( vectors , true ) ;
// Now you can search the index
const result1 = index . searchKnn ( vectors [ 10 ] , 10 , undefined ) ;
// You can also search the index with a label filter
const labelFilter = ( label : number ) => {
return label >= 10 && label < 20 ;
}
const result2 = index . searchKnn ( testVectorData . vectors [ 10 ] , 10 , labelFilter ) ;ตัวอย่างการใช้งานเพิ่มเติมที่จะเพิ่ม
สำหรับตอนนี้ดูไฟล์
HierarchicalNSW.test.tsในโฟลเดอร์การทดสอบและอ้างอิงถึงเอกสาร HNSWLIB-Node API
ไลบรารี hnswlib-wasm ให้การสนับสนุนเพิ่มเติมสำหรับ indexedDB (IDBFs) เพื่อจัดเก็บและจัดการดัชนีการค้นหาในเบราว์เซอร์ สิ่งนี้ช่วยให้คุณสามารถบันทึกและโหลดดัชนีการค้นหาได้อย่างง่ายดายในสภาพแวดล้อมเว็บและคุณไม่จำเป็นต้องย้ายข้อมูลจากระบบไฟล์ EMCC ไปยังหน่วยความจำ JavaScript มันใช้ FS จาก Emscripten เพื่อบันทึกและโหลดดัชนีผ่านระบบไฟล์เสมือนจริง ระบบไฟล์เสมือนถูกซิงโครไนซ์กับ IDBFS
ในการบันทึกดัชนีการค้นหาให้ใช้เมธอด writeIndex :
await index . writeIndex ( 'savedIndex' ) ; ในการโหลดดัชนีการค้นหาที่บันทึกไว้ก่อนหน้านี้ให้ใช้วิธี readIndex :
await index . readIndex ( 'savedIndex' , false ) ; วิธีการ syncFs ใช้เพื่อซิงโครไนซ์ระบบไฟล์ emscripten กับ IDBF ที่เก็บข้อมูลถาวร คุณสามารถใช้วิธีนี้เพื่อบันทึกหรืออ่านข้อมูลจากแหล่งที่มาถาวรของระบบไฟล์
await lib . EmscriptenFileSystemManager . syncFS ( true , emscripten :: val :: undefined ( ) ) ; // Read data from the persistent source
await lib . EmscriptenFileSystemManager . syncFS ( false , emscripten :: val :: undefined ( ) ) ; // Save data to the persistent source ส่วนนี้จะให้ภาพรวมของพารามิเตอร์อัลกอริทึม HNSW และผลกระทบต่อประสิทธิภาพเมื่อใช้ไลบรารี HNSWLIB-WASS HNSW (โลกขนาดเล็กนำทางแบบลำดับชั้น) เป็นโครงสร้างดัชนีที่ใช้กราฟสำหรับการค้นหาความคล้ายคลึงกันอย่างมีประสิทธิภาพในพื้นที่มิติสูง
รูปภาพจาก pinecone.io
มันมีพารามิเตอร์หลายอย่างที่สามารถปรับแต่งเพื่อควบคุมการแลกเปลี่ยนระหว่างคุณภาพการค้นหาและขนาดดัชนีหรือเวลาการก่อสร้าง นี่คือพารามิเตอร์สำคัญบางส่วน
Efsearch เป็นขนาดของรายการไดนามิกสำหรับเพื่อนบ้านที่ใกล้ที่สุดที่ใช้ในระหว่างการค้นหา ค่า efsearch ที่สูงขึ้นนำไปสู่การค้นหาที่แม่นยำยิ่งขึ้น แต่ช้าลง Efsearch ไม่สามารถตั้งค่าต่ำกว่าจำนวนเพื่อนบ้านที่ใกล้ที่สุด K และสามารถเป็นค่าใด ๆ ระหว่าง K และขนาดของชุดข้อมูล
M คือจำนวนลิงก์สองทิศทางที่สร้างขึ้นสำหรับทุกองค์ประกอบใหม่ในระหว่างการก่อสร้างดัชนี ช่วงที่เหมาะสมสำหรับ M คือ 2-100 ค่า M ที่สูงขึ้นทำงานได้ดีขึ้นในชุดข้อมูลที่มีมิติที่แท้จริงสูงและ/หรือการเรียกคืนสูงในขณะที่ค่า M ที่ต่ำกว่าทำงานได้ดีขึ้นสำหรับชุดข้อมูลที่มีมิติที่แท้จริงต่ำและ/หรือการเรียกคืนต่ำ พารามิเตอร์ยังกำหนดการใช้หน่วยความจำอัลกอริทึมซึ่งเป็นประมาณ M * 8-10 ไบต์ต่อองค์ประกอบที่เก็บไว้
Efconstruction ควบคุมเวลาการก่อสร้างดัชนีและความแม่นยำ ค่า efconstruction ที่ใหญ่กว่านำไปสู่เวลาการก่อสร้างที่ยาวนานขึ้น แต่คุณภาพดัชนีที่ดีขึ้น ในบางจุดการเพิ่ม efconstruction ไม่ได้ปรับปรุงคุณภาพของดัชนี หากต้องการตรวจสอบว่าค่า efconstruction ที่เลือกนั้นเหมาะสมหรือไม่ให้วัดการเรียกคืนสำหรับการค้นหาเพื่อนบ้านที่ใกล้ที่สุดเมื่อ efsearch = efconstruction หากการเรียกคืนต่ำกว่า 0.9 มีที่ว่างสำหรับการปรับปรุง
เมื่อใช้ HNSWLIB-WASS เป็นสิ่งสำคัญในการเลือกค่าที่เหมาะสมสำหรับ M, EFSearch และ EFConstruction ตามขนาดและมิติของชุดข้อมูลของคุณ เนื่องจาก HNSWLIB-WASS ทำงานในเบราว์เซอร์คุณควรพิจารณาข้อ จำกัด ของหน่วยความจำและประสิทธิภาพที่มีอยู่ นี่คือคำแนะนำบางอย่าง:
เลือกค่าในช่วง 12-48 เนื่องจากทำงานได้ดีสำหรับกรณีการใช้งานส่วนใหญ่ คุณอาจต้องทดลองเพื่อค้นหาค่าที่เหมาะสมที่สุดสำหรับชุดข้อมูลเฉพาะของคุณ
เริ่มต้นด้วยค่าใกล้กับ M และปรับตามการแลกเปลี่ยนที่คุณต้องการระหว่างความเร็วในการค้นหาและความแม่นยำ ค่าที่ต่ำกว่าจะเร็วขึ้น แต่แม่นยำน้อยกว่าในขณะที่ค่าที่สูงขึ้นจะแม่นยำยิ่งขึ้น แต่ช้าลง
ตั้งค่านี้โดยพิจารณาปริมาณแบบสอบถามที่คาดหวัง หากคุณคาดว่าจะมีปริมาณการสืบค้นต่ำคุณสามารถกำหนดค่าที่สูงขึ้นสำหรับ efconstruction เพื่อปรับปรุงการเรียกคืนด้วยผลกระทบน้อยที่สุดในเวลาการค้นหาโดยเฉพาะอย่างยิ่งเมื่อใช้ค่า M ที่ต่ำกว่า
โปรดจำไว้ว่าค่า M ที่สูงขึ้นจะเพิ่มการใช้หน่วยความจำของดัชนีดังนั้นคุณควรปรับสมดุลประสิทธิภาพและข้อ จำกัด ของหน่วยความจำเมื่อเลือกพารามิเตอร์ของคุณสำหรับ HNSWLIB-WASS
เรียนรู้ HNSW โดย pinecone
ดัชนีเวกเตอร์โดย pinecone
รูปภาพจาก pinecone.io
HNSWLIB-WASS มีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต Apache-2.0
เพื่อสร้าง
yarn install
make rebuild
yarn build
เพื่อทดสอบ
yarn test
ติดต่อ @shravansunder ก่อน!