Vectra เป็นฐานข้อมูลเวกเตอร์ในเครื่องสำหรับ Node.js ที่มีคุณสมบัติคล้ายกับ Pinecone หรือ Qdrant แต่สร้างขึ้นโดยใช้ไฟล์ในเครื่อง ดัชนี Vectra แต่ละรายการเป็นโฟลเดอร์บนดิสก์ มีไฟล์ index.json
ในโฟลเดอร์ที่มีเวกเตอร์ทั้งหมดสำหรับดัชนีพร้อมกับข้อมูลเมตาที่จัดทำดัชนีไว้ เมื่อคุณสร้างดัชนี คุณสามารถระบุคุณสมบัติข้อมูลเมตาที่จะทำดัชนีได้ และเฉพาะฟิลด์เหล่านั้นเท่านั้นที่จะถูกเก็บไว้ในไฟล์ index.json
ข้อมูลเมตาอื่น ๆ ทั้งหมดของรายการจะถูกจัดเก็บไว้ในดิสก์ในไฟล์แยกต่างหากที่คีย์โดย GUID
เมื่อทำการสืบค้น Vectra คุณจะสามารถใช้ชุดย่อยของตัวดำเนินการสืบค้น Mongo DB ที่ Pinecone รองรับ และผลลัพธ์จะถูกส่งกลับโดยจัดเรียงตามความคล้ายคลึงกัน ทุกรายการในดัชนีจะถูกกรองตามข้อมูลเมตาก่อน จากนั้นจึงจัดอันดับเพื่อความคล้ายคลึงกัน แม้ว่าทุกรายการจะได้รับการประเมินทั้งหมดอยู่ในหน่วยความจำ ดังนั้นจึงควรจะเกิดขึ้นแทบจะในทันที มีแนวโน้ม 1ms - 2ms สำหรับดัชนีที่ค่อนข้างใหญ่ ดัชนีที่เล็กกว่าควร <1ms
โปรดทราบว่าดัชนี Vectra ทั้งหมดของคุณถูกโหลดลงในหน่วยความจำ ดังนั้นจึงไม่เหมาะกับสถานการณ์ เช่น หน่วยความจำแชทบอทในระยะยาว ใช้ฐานข้อมูลเวกเตอร์จริงสำหรับสิ่งนั้น Vectra มีวัตถุประสงค์เพื่อใช้ในสถานการณ์ที่คุณมีคลังข้อมูลขนาดเล็กซึ่งส่วนใหญ่เป็นข้อมูลคงที่ซึ่งคุณต้องการรวมไว้ในข้อความแจ้งของคุณ ตัวอย่างช็อตไม่กี่ตัวอย่างที่ไม่มีที่สิ้นสุดอาจเป็นกรณีการใช้งานที่ยอดเยี่ยมสำหรับ Vectra หรือแม้แต่เอกสารเดียวที่คุณต้องการถามคำถาม
เนมสเปซสไตล์ Pinecone ไม่ได้รับการสนับสนุนโดยตรง แต่คุณสามารถเลียนแบบได้อย่างง่ายดายโดยการสร้างดัชนี Vectra (และโฟลเดอร์) แยกต่างหากสำหรับแต่ละเนมสเปซ
repo นี้มีการผูก TypeScript/JavaScript สำหรับ Vectra แต่กำลังสร้างการผูกภาษาอื่น เนื่องจาก Vectra เป็นแบบไฟล์ การผูกภาษาจึงสามารถใช้เพื่ออ่านหรือเขียนดัชนี Vectra ได้ นั่นหมายความว่าคุณสามารถสร้างดัชนี Vectra โดยใช้ JS แล้วอ่านโดยใช้ Python
$ npm install vectra
ขั้นแรกให้สร้างอินสแตนซ์ของ LocalIndex
ด้วยเส้นทางไปยังโฟลเดอร์ที่คุณต้องการจัดเก็บรายการ:
import { LocalIndex } from 'vectra' ;
const index = new LocalIndex ( path . join ( __dirname , '..' , 'index' ) ) ;
ถัดไป จากภายในฟังก์ชัน async ให้สร้างดัชนีของคุณ:
if ( ! ( await index . isIndexCreated ( ) ) ) {
await index . createIndex ( ) ;
}
เพิ่มบางรายการลงในดัชนีของคุณ:
import { OpenAI } from 'openai' ;
const openai = new OpenAI ( {
apiKey : `` ,
} ) ;
async function getVector ( text : string ) {
const response = await openai . embeddings . create ( {
'model' : 'text-embedding-ada-002' ,
'input' : text ,
} ) ;
return response . data [ 0 ] . embedding ;
}
async function addItem ( text : string ) {
await index . insertItem ( {
vector : await getVector ( text ) ,
metadata : { text } ,
} ) ;
}
// Add items
await addItem ( 'apple' ) ;
await addItem ( 'oranges' ) ;
await addItem ( 'red' ) ;
await addItem ( 'blue' ) ;
จากนั้นสอบถามรายการ:
async function query ( text : string ) {
const vector = await getVector ( text ) ;
const results = await index . queryItems ( vector , 3 ) ;
if ( results . length > 0 ) {
for ( const result of results ) {
console . log ( `[ ${ result . score } ] ${ result . item . metadata . text } ` ) ;
}
} else {
console . log ( `No results found.` ) ;
}
}
await query ( 'green' ) ;
/*
[0.9036569942401076] blue
[0.8758153664568566] red
[0.8323828606103998] apple
*/
await query ( 'banana' ) ;
/*
[0.9033128691220631] apple
[0.8493374123092652] oranges
[0.8415324469533297] blue
*/