paint-brush
Vektör Veritabanları - Python'da Vektör Arama ve Langchain Paketinin Temelleriile@shyamganesh
18,016 okumalar
18,016 okumalar

Vektör Veritabanları - Python'da Vektör Arama ve Langchain Paketinin Temelleri

ile Shyam Ganesh S7m2023/09/30
Read on Terminal Reader
Read this story w/o Javascript

Çok uzun; Okumak

Bu makalede, benzer vektörleri depolamak ve sorgulamak için Python'da vektör veritabanları, vektör arama ve Langchain paketinin temelleri konusunda size yol göstereceğim. Öğrenme yolculuğumuza başlamak için "Yerleştirmeler" adlı anahtar kavramla başlayacağız. Gömmeler, verileri bir makineye kendi anlaşılır formatında sunmanın bir yoludur.
featured image - Vektör Veritabanları - Python'da Vektör Arama ve Langchain Paketinin Temelleri
Shyam Ganesh S HackerNoon profile picture

Bu blog yazısında, vektör veritabanlarının, vektör aramanın ve karşılaştırılabilir vektörlerin depolanmasını ve alınmasını kolaylaştıran Python'daki Langchain paketinin temelleri konusunda size rehberlik edeceğim.


Yolculuğumuza başlamak için "Gömmeler" olarak bilinen çok önemli bir konseptle başlayacağız.

Gömmeler Nelerdir?

Bu makalede, metinsel verileri makinelerin kolaylıkla kavrayabileceği bir biçimde temsil etmemizi sağlayan, makine öğreniminin temel bir yönü olan yerleştirme kavramını inceleyeceğiz.


Esasen, yerleştirmeler metnin vektör temsilleri olarak hizmet eder; kelimelerin, cümlelerin ve pasajların karmaşık ağını makinelerin işleyebileceği sayısal bir formata dönüştürür.


Acil bir sorun ortaya çıkıyor: İnsanlar bu yerleştirmeleri çözebilir mi? Cevap hayır. Gömmeler esasen metinsel bilgiyi kapsayan sayı dizileridir.


Sonuç olarak, yerleştirme vektörünü anlamak ve onunla çalışmak insanlar için göz korkutucu bir görev olabilirken makineler bunu kolaylıkla halledebilir.


Metinden yerleştirmeler oluşturmak için sayısız teknik mevcuttur. Dikkate değer yöntemler arasında diğerleri arasında TF-IDF, Word2Vec, Glove ve BERT yer alır. Çağdaş makine öğrenimi alanında cümle yerleştirmeler, kelime yerleştirmelere göre popülerlik kazanmıştır.


Bir metnin özünü temsil eden bu cümle yerleştirmeleri, "all-MiniLM-L6-V2" ve "all-mpnet-base-v2" gibi önceden eğitilmiş cümle dönüştürücü modellerinden elde edilebilir.


Bu modeller, belirli bir metin için genellikle 384 veya 768 boyut olmak üzere sabit boyutlara sahip gömmeler üretir.


Artık yerleştirmelerin temellerini ve bunların oluşturulmasına yönelik çeşitli teknikleri araştırdığımıza göre, odak noktamızı bu yüksek boyutlu gömme vektörlerini bir vektör deposunda saklama zorluğuna kaydıralım.

Vektör Mağazaları

Vektör veri deposu, ses, video, görüntüler, metin ve daha fazlası dahil olmak üzere çeşitli veri türlerinin yüksek boyutlu gömme temsillerini depolamak için tasarlanmış özel bir veritabanıdır.


Temel işlevlerinden biri, mağaza içinde belirli bir sorgu vektörüne çok benzeyen vektörleri verimli bir şekilde arama yeteneğidir.



Vektör depoları, yerleştirmelerin saklanması ve bu vektörler arasında benzerlik aramalarının gerçekleştirilmesi sürecini düzene sokarak, yüksek boyutlu veri temsillerinin yönetimini ve alınmasını basitleştirir.


Vektör yerleştirmeler alanında benzerlik araştırması, iki veya daha fazla yerleştirme arasındaki yakınlığın veya ilişkinin ölçülmesini içerir. Tipik olarak bu, çeşitli mesafe ölçümleri kullanılarak benzerliğin hesaplanmasıyla gerçekleştirilir. Yaygın olarak kullanılan ve yaygın olarak tanınan mesafe ölçümlerinden bazıları, diğerlerinin yanı sıra Öklid mesafesi, Manhattan mesafesi ve kosinüs mesafesini içerir. Bu ölçümler, vektörler arasındaki benzerlik veya farklılığın derecesini ölçmemize yardımcı olarak veriler içinde etkili benzerlik aramalarını kolaylaştırır.


Örnek olarak, bir grafikteki iki nokta arasındaki benzerliği veya yakınlığı belirlerken yaygın olarak Öklid mesafesi kullanılır. Bu mesafe aşağıdaki formül kullanılarak hesaplanabilir:


Öklid Uzaklığı = [(x2 - x1)^2 + (y2 - y1)^2]^0,5



2B'de 2 nokta arasındaki mesafe


Burada (x1, y1) grafikteki birinci noktanın koordinatlarını, (x2, y2) ise ikinci noktanın koordinatlarını temsil etmektedir. Bu hesaplamanın sonucu, iki nokta arasındaki uzaysal ayrımın bir ölçüsünü sağlar ve grafikteki konumları açısından benzerliklerini veya farklılıklarını gösterir.


Benzer şekilde, benzerlik aramasında, yerleştirmeler yüksek boyutlu bir alanda tasvir edilir ve her kayıt bir veri noktası görevi görür.


Aşağıdaki kod satırı, belirli bir giriş verisi için en iyi 5 benzer yerleştirmenin nasıl alınacağını gösterir:

 distance, n = vector_store.search(input_embedding, k=5)


Bu kod, giriş verilerine çok benzeyen en iyi 5 yerleştirmenin bir listesini döndürerek onu öneri sistemleri, içerik alma ve daha fazlası gibi çeşitli uygulamalar için değerli bir araç haline getirir.


Vector_store.search() işlevinin çıktısı, üst-k benzer yerleştirmeleri ve bunların input_embedding'e olan mesafelerini içerir. "k" parametresi, benzerlik aramasında alınacak en yakın yerleştirmelerin sayısını belirleyen, yapılandırılabilir bir değerdir. Arama işlemi tarafından döndürülen sonuçların istenen sayısını kontrol etmek için "k" ayarını yapabilirsiniz.


Artık vektör mağazalarına ilişkin temel bir anlayış oluşturduğumuza göre, LangChain paketini ve FAISS'i derinlemesine incelemeye devam edelim. Bu araçlar, yüksek boyutlu yerleştirmelerle çalışma ve verimli benzerlik aramaları yapma yeteneğimizi daha da geliştirecek.

Python'da LangChain

Basitçe söylemek gerekirse LangChain, Büyük Dil Modellerinin (LLM'ler) yeteneklerinden yararlanan uygulamalar oluşturmak için tasarlanmış bir çerçevedir. Daha detaylı bilgi ve kaynaklar için resmi LangChain belgelerine başvurabilirsiniz.


Python'da LangChain


Bunun aksine, "Facebook Yapay Zeka Benzerlik Araması" anlamına gelen FAISS, geliştiricilere geleneksel hash tabanlı yaklaşımlardan farklı olarak benzer yerleştirmeleri aramanın hızlı ve etkili yollarını sağlayan bir Python kütüphanesidir.


Bu kitaplık, Facebook AI ekibi tarafından geliştirildi ve yüksek boyutlu alanlarda benzerlik arama görevleri için güçlü yetenekler sunuyor.


FAISS, kendi sunucunuzda barındırılabilen açık kaynaklı bir kütüphanedir.


LangChain ve FAISS araştırmamızda artık FAISS'ı LangChain çerçevesinde uygulamayı hedefleyeceğiz. LangChain'in FAISS entegrasyonundan bu makalede odaklanacağımız bazı önemli API'ler aşağıda verilmiştir:


  1. add_documents() : Bu işlev, vektör deposuna ek belgeler eklememize olanak tanır.


  2. add_embeddings() : Vektör deposuna daha fazla yerleştirme eklenmesini sağlar.


  3. from_documents() : Bu API, sağlanan belgelere dayalı olarak bir VectorStore döndürür.


  4. from_embeddings() : Bu işlev, verilen yerleştirmelerden oluşturulan bir FAISS dizini sağlar.


  5. load_local() : FAISS dizinini diskten yüklemek için bunu kullanın.


  6. save_local() : FAISS indeksini diske kaydetmenizi sağlar.


  7. benzerlik_arama() : Bu işlev, belirli bir sorguya en çok benzeyen belgeleri getirir.


  8. benzerlik_search_by_vector() : Belirli bir yerleştirmeye en çok benzeyen belgeleri getirir.


Bu API'ler, LangChain'in yeteneklerini FAISS ile birleştirmenin temelini oluşturarak, uygulamalarınızda yerleştirmelerle çalışmanıza ve etkili benzerlik aramaları gerçekleştirmenize olanak tanır.


Meta filtreleme, LangChain FAISS'ta bir arama sorgusunun sonuçlarını iyileştirmek için kullanılan değerli bir tekniktir. Tipik olarak iki tür meta filtreleme vardır: Ön filtreleme ve Son filtreleme. Çerçevemizde, özellikle arama sorguları için sonradan filtrelemeyi destekliyoruz.


Arama sonuçlarına yönelik meta filtreleme kavramının, FAISS'ın LangChain sürümünde bulunan bir özellik olduğunu ve FAISS'in orijinal uygulamasında mevcut olmadığını unutmamak önemlidir. Bu son filtreleme özelliği, arama sonuçlarının kesinliğini ve alaka düzeyini artırarak kullanıcılara daha özel sonuçlar sunar.


LangChain FAISS API'lerinin bilgisiyle donanmış olarak LangChain FAISS'ın Python uygulamasına dalalım. Bu uygulama, yerleştirmelerle çalışmanıza, benzerlik aramaları yapmanıza ve LangChain çerçevesinde arama sonuçlarınıza ince ayar yapmak için filtreleme sonrası teknikler uygulamanıza olanak tanıyacaktır.


Büyük Dil Modellerinin gücünden ve FAISS ile gelişmiş benzerlik aramasından yararlanan uygulamalar oluşturmak için bu yetenekleri keşfetmekten ve bunlardan yararlanmaktan çekinmeyin.

LangChain FAISS Python Demosu

Veri kümesi

Bu eğitici kılavuzda, temel veri kümesi olarak Stanford Veri Kümesini seçtik ve LangChain FAISS'teki meta filtrelemenin çalışmasını göstermek için birkaç sütun ekledik.


Gerekli paketleri kurup içe aktararak başlayacağız

 !pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
 from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle


Şimdi veri kümesini içe aktaracağız:

 passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data 

Veri kümesine genel bakış


Veri kümesine sahip olduğumuzda, metin verilerini vektörlere dönüştürmek için bir gömme fonksiyonu başlatmamız gerekiyor. 384 boyutta gömmeler üreten “sentence-transformers/all-MiniLM-L6-V2” kullandık,

 from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")


Meta veri bilgilerini ayarlayacağız. Meta verilere, her yerleştirme (içerik) için belge kimliğini ve belge dilini ekledik,

 start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)


İşte bu kadar… Şimdi FAISS endeksimizi oluşturacağız,

 faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)


Şimdi FAISS indeksini diske kaydedip geri yüklemeyi deneyeceğiz:

 faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")


FAISS indeksini oluşturma, depolama ve yükleme işlemlerini tamamladık. Şimdi çıkarım zamanı. Bazı sorguları aramaya ve FAISS indeksini test etmeye çalışacağız.


Öncelikle “ateizm” ile ilgili en benzer beş belgeyi alacağız.

 start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5) 

"Ateizm" çıktısı


Sonuçlar ikna edici. Ama yine de daha fazlasını keşfedeceğiz…


Bu sefer, bazı meta filtrelemelerle farklı bir dil sorgusu deneyeceğiz. Filtreleme kriterlerinin {lang: 'ru_RU'} olması gerektiğini belirten Rusça bir sorgu soracağız.

 #Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)


Burada, vektör deposundan birbirine en çok benzeyen 10 belgeyi alıp, ardından filtreleme koşulumuzu uygulayarak sorgumuz için en iyi 5 belgeyi elde etmekten bahsetmiştik.

Filtreleme sonrası sorgunun çıktısı


Bu makaleyi bitirdiğinizde, vektör mağazaları ve vektör arama konusunda sağlam bir anlayış kazandığınıza inanıyorum. Ayrıca işlevselliğini göstermek için LangChain FAISS'in bir gösterimini de sunduk.


ChromaDb, Qdrant, Milvus ve daha fazlası gibi diğer vektör mağazalarını keşfetmenizi şiddetle tavsiye ediyorum.


Her vektör mağazasının kendine özgü avantaj ve dezavantajları vardır; bu nedenle seçiminizi kullanım durumunuzun özel gereksinimlerine göre yapın.


Keyifli ve verimli bir öğrenme yolculuğu dileriz!