Database vektor minimal untuk tujuan pendidikan.
Tagline: Tetap sederhana dan mereka akan belajar ...
Ingin belajar lebih banyak? Lihat bagian 'Referensi' di bawah ini?

Dalam contoh ini, kami akan menggunakan dataset Sekolah Tinggi Matematika 8K (GSM8K)
from datasets import load_dataset
# Number of samples we want to process
N_SAMPLES = 100
# Load dataset
# https://huggingface.co/datasets/openai/gsm8k
ds = load_dataset ( "openai/gsm8k" , "main" , split = "train" )[: N_SAMPLES ]
questions = ds [ 'question' ]
answers = ds [ 'answer' ] yang berisi "masalah kata matematika sekolah dasar yang beragam secara linguistik" dalam bentuk pasangan question-answer seperti yang ditunjukkan di bawah ini
### Question
Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May.
How many clips did Natalia sell altogether in April and May?
### Answer
Natalia sold 48/2 = <<48/2=24>>24 clips in May.
Natalia sold 48+24 = <<48+24=72>>72 clips altogether in April and May. #### 72
Tujuan kami adalah untuk mengubah pasangan question-answer ini menjadi embeddings, menyimpannya di Vektordb dan melakukan beberapa operasi.
Embeddings hanyalah representasi numerik dari sepotong informasi, biasanya dalam bentuk vektor. Anda dapat mengubah data apa pun menjadi embeddings (mis.???) Dan mereka akan mempertahankan arti dari data asli. Jika Anda ingin mempelajari lebih lanjut tentang embeddings , lihat pemetaan embeddings: Dari makna ke vektor dan kembali.
Mari kita tentukan fungsi pembantu untuk memanggil model embed cohere melalui Amazon Bedrock
import json
import boto3
# Initialize Bedrock client
bedrock = boto3 . client ( "bedrock-runtime" )
def embed ( texts : list , model_id = "cohere.embed-english-v3" ):
"""Generates embeddings for an array of strings using Cohere Embed models."""
model_provider = model_id . split ( '.' )[ 0 ]
assert model_provider == "cohere" ,
f"Invalid model provider (Got: { model_provider } , Expected: cohere)"
# Prepare payload
accept = "*/*"
content_type = "application/json"
body = json . dumps ({
'texts' : texts ,
'input_type' : "search_document"
})
# Call model
response = bedrock . invoke_model (
body = body ,
modelId = model_id ,
accept = accept ,
contentType = content_type
)
# Process response
response_body = json . loads ( response . get ( 'body' ). read ())
return response_body . get ( 'embeddings' )dan menggunakannya untuk menghasilkan embeddings untuk sebagian kecil dari data kami (hanya jawaban, untuk saat ini)
from tqdm import tqdm
# Text call limit for Cohere Embed models via Amazon Bedrock
# https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-embed.html
MAX_TEXTS_PER_CALL = 96
embeddings = []
for idx in tqdm ( range ( 0 , len ( answers ), MAX_TEXTS_PER_CALL ), "Generating embeddings" ):
embeddings += embed ( answers [ idx : idx + MAX_TEXTS_PER_CALL ])Kami sekarang siap untuk menginisialisasi Vektordb dan mulai memuat data
from vektordb import ANNVectorDatabase
from vektordb . types import Vector
# Initialize database
vector_db = ANNVectorDatabase ()
# Load embeddings into the database
for idx in tqdm ( range ( len ( embeddings )), "Loading embeddings" ):
vector_db . insert ( idx , Vector ( embeddings [ idx ], { 'answer' : answers [ idx ][: 20 ]}))Sebagai pemeriksaan kewarasan, kami dapat mencetak sampel kecil dari database kami
vector_db . display (
np_format = {
'edgeitems' : 1 ,
'precision' : 5 ,
'threshold' : 3 ,
'suppress' : True
},
keys = range ( 10 )
) +-----+-------------------------+------------------------------------+
| Key | Data | Metadata |
+-----+-------------------------+------------------------------------+
| 0 | [-0.00618 ... -0.00047] | {'answer': 'Natalia sold 48/2 = '} |
| 1 | [-0.01997 ... -0.01791] | {'answer': 'Weng earns 12/60 = $'} |
| 2 | [-0.00623 ... -0.0061 ] | {'answer': 'In the beginning, Be'} |
| 3 | [-0.07849 ... 0.00721] | {'answer': 'Maila read 12 x 2 = '} |
| 4 | [-0.01669 ... 0.01263] | {'answer': 'He writes each frien'} |
| 5 | [0.02484 ... 0.05185] | {'answer': 'There are 80/100 * 1'} |
| 6 | [-0.01807 ... -0.01859] | {'answer': 'He eats 32 from the '} |
| 7 | [ 0.01265 ... -0.02016] | {'answer': 'To the initial 2 pou'} |
| 8 | [-0.00504 ... 0.0143 ] | {'answer': 'Let S be the amount '} |
| 9 | [-0.0239 ... -0.00905] | {'answer': 'She works 8 hours a '} |
+-----+-------------------------+------------------------------------+
Contoh Vektordb kami didukung oleh implementasi pencarian perkiraan tetangga terdekat (JST) yang menggunakan pohon biner untuk mewakili berbagai partisi/pemisahan hyperspace.
Partisi ini dihasilkan dengan memilih dua vektor secara acak, menemukan hyperplane yang sama antara keduanya dan kemudian membagi titik -titik lain ke left dan right tergantung pada sisi mana mereka berada
Proses ini diulangi sampai kita memiliki paling banyak item k di setiap node (partisi)
Kita bisa mendapatkan hasil yang lebih baik dengan menghasilkan hutan pohon *? Dan mencari semuanya, jadi mari kita lakukan itu:
import random
# Set seed value for replication
random . seed ( 42 )
# Plant a bunch of trees ?️
vector_db . build ( n_trees = 3 , k = 3 )
print ( vector_db . trees [ 0 ], " n " )Berikut adalah representasi dari pohon pertama di hutan kami (node menunjukkan jumlah contoh di setiap partisi)
__________100______________
/
________________________________________________63______ __________37___________
/ /
_51__ _12_ 16____ ___21____
/ / / /
6 45____________________ _7 5 2 _14___ _10_ _11_____
/ / / / / / /
3 3 3 __________42_____________ 4 3 2 3 5 _9 _5 5 4 ___7
/ / / / / / / /
___18____ _____24____ 2 2 3 2 6 3 4 1 2 3 3 1 6_ 1
/ / / / /
_8_ _10_ ___11___ _13_ 3 3 1 3 2 4
/ / / / /
4 4 4 6_ 6_ _5 5 8_ 3 1
/ / / / / / / /
2 2 3 1 1 3 2 4 2 4 4 1 2 3 3 5
/ / / /
1 3 3 1 2 2 2 3
Akhirnya, kita dapat menjalankan kueri dengan hanya mencari jawaban database yang mirip dengan pertanyaan target.
Kami menggunakan fungsi jarak seperti yang ditunjukkan di bawah ini untuk mengukur seberapa mirip dua vektor satu sama lain.
Misalnya, jika kami mengajukan pertanyaan pertama dalam dataset pelatihan kami
from vektordb . utils import print_similarity_scores
# Extract first question
query = questions [ 0 ]
print ( " n Query:" , query , " n " )
# Run search and display similarity scores
results = vector_db . search ( embed ([ query ])[ 0 ], 3 )
print_similarity_scores ( results ) Kami berharap jawaban dengan indeks yang sama ( 0 ) menjadi hasil teratas:
Query: Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May.
How many clips did Natalia sell altogether in April and May?
+-----+---------------------+
| Key | Score |
+-----+---------------------+
| 0 | 0.15148634752350043 |
| 15 | 0.6105711817572272 |
| 83 | 0.6823805943068366 |
+-----+---------------------+
COS 597A (Princeton): Memori jangka panjang dalam pencarian dan database vektor AICMU 15-445/645 (Carnegie Mellon): Sistem Database