Oracle AI Vector Search Eğitimi: Python ile Gömüleri Depolayın ve Sorgulayın
Bu eğitim, Oracle AI Vector Search’ü tanıtır, temel özelliklerini açıklar ve pratik bir yerel projeyi adım adım anlatır. Kurulum gereksinimlerini, anlamsal aramayı, vektör indekslemeyi ve yaygın sorun giderme adımlarını da kapsar.
Bu eğitimde Oracle AI Vector Search, Python ve Oracle Database Free 26ai ile yerel bir anlamsal arama demosu oluşturacağız.
Önce mesafeyi gözle görebilmek için elle yazılmış üç boyutlu vektörlerle başlayacağız, ardından metin gömüleri üretecek ve bunları Oracle Database’ten SQL ile sorgulayacağız.
Bu eğitim, vektör aramasına yeni olan ve Docker, ortam değişkenleri, Python paketleri ve yerel veritabanı kurulumu konusunda rahat olan Python ve SQL geliştiricileri içindir.
Yapay zekâ destekli uygulamaların, yalnızca birebir kelimeleri değil, anlamı da anlayan bir aramaya ihtiyacı vardır. Bir destek uygulaması, dokümantasyon portalı veya iç bilgi aracı, en iyi eşleşen belge “yerel sütunlarda vektör gömülerini depolayın” dese bile “AI arama için veritabanı depolaması”nı bulabilmelidir.
Vektör gömüleri metni sayısal vektörler olarak temsil ederek bunu mümkün kılar. Oracle AI Vector Search bu vektörleri doğrudan Oracle Database içinde depolamamıza, SQL ile sorgulamamıza ve gömüleri ilişkisel uygulama verilerinin yanında tutmamıza olanak tanır.
Bu yerel iş akışı için ayrı bir vektör veritabanına ihtiyacımız yok.
Oracle Database Free 26ai’yi yerelde çalıştıracağız, Python’dan oracledb Thin modu ile bağlanacağız, önce manuel vektörleri, ardından OpenAI gömülerini depolayacağız, anlamsal arama çalıştıracağız, anlamsal getiriyi basit bir birebir ifade koşulu ile karşılaştıracağız ve USER_INDEXES üzerinden doğrulayacağımız bir vektör indeksi oluşturacağız.
Sonunda, gömüleri Oracle Database’te depolayan ve en benzer documents kayıtlarını yerelde getiren, Python ile çalışan bir anlamsal arama iş akışımız olacak.
Oracle AI Vector Search Nedir?
Oracle AI Vector Search, vektör gömülerini depolamak, indekslemek ve sorgulamak için Oracle Database yeteneklerinden oluşur. Bir vektör gömüsü, metin, görseller veya diğer verilerin anlamını, bir veritabanının matematiksel olarak karşılaştırabileceği biçimde temsil eden sabit boyutlu sayı listeleridir.
Bir gömme modeli sayısal vektörleri üretir. Girdi olarak bir cümle, paragraf, görsel açıklaması veya kod parçası alır ve sabit boyutlu bir vektör döndürür.
Benzer girdiler birbirine yakın vektörler üretmeli, ilgisiz girdiler ise birbirinden daha uzak olmalıdır. Bu nedenle depolanan documents ve gelen sorgular için aynı gömme modelini kullanmalıyız; çünkü mesafeler yalnızca vektörler aynı koordinat sistemini paylaştığında anlamlıdır.
Bu eğitimde, matematiği inceleyebilmek için manuel vektörler bilerek küçük tutulmuştur. Gerçek metin gömüleri çok daha büyüktür; çünkü modelin, kelimeler, ifadeler ve konular arasındaki ince ilişkileri kodlayabilmek için yeterli boyuta ihtiyacı vardır.
Vektör araması satırları vektörler arası mesafeye göre sıralar. Öklidyen ve kosinüs mesafesi sorgularında daha küçük değerler daha yakın eşleşmeleri ifade eder. Bu eğitimde önce mesafe davranışını doğrudan görebilmek için küçük bir VECTOR(3, FLOAT32) sütunu kullanacağız, sonra metinden üretilmiş VECTOR(1536, FLOAT32) gömülerine geçeceğiz.
Şekil 1. Oracle AI Vector Search akışı
Oracle AI Vector Search gömüleri yerel bir VECTOR sütununda depolar ve sonuçları vektör mesafesine göre sıralar.
Gömülerin belge kimlikleri, başlıklar, içerikler, kullanıcılar, ürünler, talepler veya metaveri gibi ilişkisel uygulama verilerinin yanında yer alması gerektiğinde Oracle Database kullanışlıdır.
Bazı uygulamalar özel getirme iş yükleri için ayrı bir vektör veritabanı veya arama motoru kullanır, ancak bu eğitimin yerel anlamsal arama iş akışı için Oracle Database ihtiyaç duyduğumuz vektör depolama ve arama özelliklerini sağlar.
Oracle AI Vector Search’ün Temel Özellikleri
Demoda dört Oracle AI Vector Search özelliği kullanacağız: yerel vektör depolama, mesafe fonksiyonları, vektör indeksleri ve ilişkisel entegrasyon.
Yerel vektör veri türü
Oracle Database, açık boyutlar ve eleman biçimleriyle yerel VECTOR sütunlarını destekler. Demoda, manuel vektörler için VECTOR(3, FLOAT32) ve varsayılan text-embedding-3-small gömme modeli için VECTOR(1536, FLOAT32) kullanacağız.
Mesafe fonksiyonları ve operatörleri
Çalıştırılabilir örneklerde VECTOR_DISTANCE() kullanıyoruz; çünkü mesafe metriğini SQL içinde açık tutar.
Manuel vektör örneği için Öklidyen mesafe, metin gömüleri için ise kosinüs mesafesi kullanacağız.
Oracle Database kısaltılmış vektör mesafe operatörlerini ve nokta çarpımıyla ilgili mesafe davranışını da içerir, ancak bu eğitim çalıştırılabilir SQL’i açık VECTOR_DISTANCE() patikasında tutar.
Farklı mesafe metrikleri “yakınlık” hakkında biraz farklı sorulara yanıt verir.
Küçük bir eğitim için kosinüs mesafesi, yön odağı nedeniyle sıklıkla anlamsal benzerlikle iyi eşleştiğinden metin gömüleri için iyi bir varsayılandır.
Öklidyen mesafe, elle yazılmış vektörlerle görselleştirmesi daha kolaydır ve vektör büyüklüğü ya da normalize vektörlerin model tasarımının parçası olduğu bazı getirme sistemlerinde nokta-çarpımı tarzı karşılaştırmalar faydalıdır.
Metrek
Karşılaştırdığı Şey
Uygun Olduğu Durum
Dikkat Edilecekler
Kosinüs
Vektör yönü
Metin gömüleri ve anlamsal benzerlik
Sonuçlar, aynı gömme modelinin ve tutarlı ön işlemenin kullanılmasına bağlıdır
Öklidyen
Doğrusal mesafe
Küçük örnekler, geometri sezgisi, bazı sayısal özellik vektörleri
Büyüklük mesafeyi etkiler, bu nedenle ölçekleme önemli olabilir
Nokta çarpımı
Yön ve büyüklük birlikte
Normalize vektörler veya iç-çarpım puanlaması etrafında tasarlanmış iş akışları
Puan yönü ve normalizasyon kuralları, sonuçları karşılaştırmadan önce anlaşılmalıdır
Vektör indeksleri
Doğru sonuç ve küçük veri kümeleri için kesin vektör araması kullanışlıdır. Veri kümeleri büyüdükçe vektör indeksleri yaklaşık en yakın komşu arama iş akışlarını destekler.
Oracle AI Vector Search, sıklıkla HNSW tarzı arama ile ilişkilendirilen bellek içi komşu grafik indekslerini ve sıklıkla IVF tarzı bölümleme ile ilişkilendirilen komşu-bölümleri indekslerini içerir.
Bu yerel demoda ORGANIZATION NEIGHBOR PARTITIONS kullanıyor ve indeksi USER_INDEXES ile doğruluyoruz.
Yaklaşık indeksler, ölçekte daha hızlı getirme için tüm kapsamlı aramadan küçük bir miktar kesinliği takas eder.
Doğru indeks ailesi iş yüküne, veri hacmine, güncelleme desenine ve hatırlama hedeflerine bağlıdır.
Bu eğitim, yerel kurulumu basit tuttuğu ve eğitimi bir indeks ayarlama kılavuzuna dönüştürmeden somut bir indeks oluşturma adımı sunduğu için IVF tarzı komşu-bölümleri indeksini kullanır.
İndeks Ailesi
Temel Fikir
Güçlü Yanlar
Takçlar
Ne Zaman Kullanabiliriz
IVF / komşu bölümleri
Vektör uzayını böl, sonra olası bölümleri ara
Basit zihinsel model, birçok toplu-yüklenen veri kümesi için pratik
Hatırlama ve hız, bölümleme ve arama ayarlarına bağlıdır
Büyüyen bir veri kümesi için doğrudan bir yaklaşık arama yolu istiyoruz
HNSW / komşu grafiği
Hızlı geçiş için yakın vektörleri bağlayan bir grafik oluştur
Birçok en yakın komşu iş yükü için güçlü hatırlama ve gecikme profili
Daha çok belleğe yöneliktir ve yapılandırma daha fazla önem taşıyabilir
Düşük gecikmeli arama gerekir ve bellek ile ayar çabasına bütçe ayırabiliriz
İlişkisel sorgularla entegrasyon
Bir vektör sütunu, sıradan ilişkisel sütunların yanında bulunabilir. documents tablomuz başlık, içerik ve gömüyü birlikte depolayacak; böylece SQL hem benzerlik puanını hem de özgün belge metnini döndürebilecek.
Oracle AI Vector Search ile Nasıl Başlanır
Tek bir yerel kurulum yolunu kullanacağız: Docker içinde Oracle Database Free 26ai, FREEPDB1 servisi ve özel bir vector_demo uygulama kullanıcısı.
Vektör araması kavramları erişilebilir olsa da, Docker, bir veritabanı şeması, Python paketleri, ortam değişkenleri ve bir gömme API anahtarı kullandığımız için kurulum orta düzeydedir.
Önkoşullar
Gerekenler:
Docker Desktop veya Docker Engine.
Oracle Container Registry erişimi.
Yerelde 1521 ve 5500 portlarının uygun olması.
Python 3.10 veya üstü.
Temel Python ve SQL bilgisi.
Temel Docker ve ortam değişkeni bilgisi.
Gömme adımları için bir OpenAI API anahtarı.
Bu demo, yerel VECTOR sütunları, VECTOR_DISTANCE() ve CREATE VECTOR INDEX dahil burada kullanılan vektör özelliklerini içeren bir Oracle Database sürümü veya ortamı gerektirir.
Yerel yol, aşağıda gösterilen imaj etiketiyle Oracle Database Free 26ai kullanır ve DSN, FREEPDB1 takılabilir veritabanı servisini kullanır.
Manuel vektör adımları bir OpenAI API anahtarı gerektirmez. Anlamsal adımlar, örnek belge metnini ve sorgu metnini yapılandırılmış gömme sağlayıcısına gönderir; bu nedenle yalnızca örnek veya hassas olmayan metinler kullanacağız.
Bu eğitimde Oracle Database için güncel Python sürücüsü olan oracledb kullanılır. python-oracledb varsayılan olarak Thin modda çalışır, bu nedenle bu yerel demo Oracle İstemci kütüphanelerini gerektirmez. Thick mod, diğer Oracle Database dağıtımlarında faydalıdır; ancak burada oracledb.init_oracle_client() çağrısı yapmayacağız.
Oracle Database Free 26ai’yi yerelde başlatın
Oluşturacağımız betikler için bir proje dizini oluşturun.
mkdir oracle-ai-vector-search-python
cd oracle-ai-vector-search-pythonAltyapı:
Oracle Database Free 26ai’yi yerel konteyner imajıyla başlatın.
docker run --name oracle-free-26ai-vector \--detach\--publish1521:1521 \--publish5500:5500 \
--shm-size=1g \--envORACLE_PWD="replace-with-a-strong-password"\
container-registry.oracle.com/database/free:23.26.1.0-lite-amd64Altyapı:
Konteyner günlüklerini kontrol edin ve veritabanı başlatmanın tamamlandığını bildirene kadar bekleyin.
FREEPDB1 bu yerel Oracle Database Free konteyner yolunda kullanılan takılabilir veritabanı servisidir. Python DSN’imiz localhost:1521/FREEPDB1 olacaktır.
FREEPDB1 içinde vector_demo şemasını oluşturun
SYS kullanıcısını yalnızca şema kurulum adımı için kullanın. sqlplus komutundaki parola, docker run komutundaki ORACLE_PWD değeridir; CREATE USER içindeki parola ise DB_PASSWORD olarak dışa aktaracağımız uygulama parolasıdır.
Kurulumu veritabanı konteynerinin içinde çalıştırın.
# Create the application user and grant the privileges needed for the demo.dockerexec-i oracle-free-26ai-vector \
sqlplus -s'sys/"replace-with-oracle-pwd"@FREEPDB1 as sysdba'<<'SQL'
WHENEVER SQLERROR EXIT SQL.SQLCODE
CREATE USER vector_demo IDENTIFIED BY "replace-with-vector-demo-password";
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, UNLIMITED TABLESPACE TO vector_demo;
EXIT
SQLAltyapı:
Bu, demo konteyneri için yerel geliştirme amaçlı bir kısayoldur. Tablolar kimlik sütunları kullandığı için CREATE SEQUENCE gereklidir.
Üretimde, ayrıcalıkları bir veritabanı yöneticisi ile gözden geçirir ve tam uygulama iş yüküsü için asgari ayrıcalığı uygularız.
OPENAI_API_KEY yalnızca gömme ve anlamsal arama adımları için gereklidir. EMBEDDING_DIM, seçilen gömme modelinin döndürdüğü boyut sayısı ile eşleşmelidir.
Oracle AI Vector Search Demo Projesi
Demoyu sekiz kontrol noktasında inşa edeceğiz. Her betik bir kavram ekler ve devam etmeden önce doğrulayabileceğimiz bir çıktı üretir.
Yalnızca veritabanı kontrol noktası 1–3. Adımlardan sonra tamamlanır. Bu noktada Oracle Database’e bağlanmış, manuel vektörleri depolamış, onları mesafeye göre sorgulamış ve anlamsal tabloyu oluşturmuş olacağız. OpenAI API anahtarı 4. adımda gerekli hale gelir.
Adım 1: Yerel veritabanına bağlanın
Önce Python’un Oracle Database’e vector_demo uygulama kullanıcısı olarak bağlanabildiğini doğrulayacağız. Bu betik, ortamdan DB_USER, DB_PASSWORD ve DB_DSN değerlerini okur ve sürücü modunu ve veritabanı sürümünü yazdırır.
Betik oluşturma
Aşağıdaki kodu 01_check_connection.py olarak kaydedin.
import os
import oracledb
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defmain():# Load required database settings from environment variables.
user = required_env("DB_USER")
password = required_env("DB_PASSWORD")
dsn = required_env("DB_DSN")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")# Open a Thin-mode connection with the application user.with oracledb.connect(user=user, password=password, dsn=dsn)as connection:
mode ="thin"if oracledb.is_thin_mode()else"thick"print("Connected to Oracle Database.")print(f"Driver mode: {mode}")print(f"Database version: {connection.version}")if __name__ =="__main__":
main()Altyapı:
Çıktı, bağlantının çalıştığını ve sürücünün Thin modunda olduğunu doğrulamalıdır.
Connected to Oracle Database.
Driver mode: thin
Database version: 23.26.1.0.0Altyapı:
Artık yerel veritabanının, servis adının, kimlik bilgilerinin ve Python sürücüsünün, herhangi bir vektör tablosu oluşturmadan önce çalıştığını biliyoruz.
Adım 2: Manuel vektörlerle sezgi geliştirin
Gömme modellerini tanıtmadan önce, üzerinde düşünebileceğimiz üç küçük vektör depolayalım. array.array("f", values) çağrısı, python-oracledb tarafından bir VECTOR(..., FLOAT32) sütununa bağlanabilen 32 bit kayan noktalı bir dizi oluşturur.
Şekil 2. Manuel vektörler ve Öklidyen mesafe.
Manuel örnek Öklidyen mesafeyi kullanır. Elma vektörü, sorgu vektörü ile eşleştiği için 0.0000 mesafesine sahiptir. Muz vektörü ikinci sırada yer alır; çünkü sqrt((1.0 - 0.9)^2 + (0.0 - 0.1)^2 + (0.0 - 0.0)^2) = 0.1414.
Betik oluşturma
Aşağıdaki kodu 02_manual_vectors.py olarak kaydedin.
import array
import os
import oracledb
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")# Define three small vectors so the distance calculation is easy to inspect.
rows =[("apple", array.array("f",[1.0,0.0,0.0])),("banana", array.array("f",[0.9,0.1,0.0])),("car", array.array("f",[0.0,1.0,0.0])),]with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:# Recreate the table so the script can be run repeatedly.
cursor.execute("""
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE manual_vectors PURGE';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE <> -942 THEN
RAISE;
END IF;
END;
""")
cursor.execute("""
CREATE TABLE manual_vectors (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
label VARCHAR2(100),
embedding VECTOR(3, FLOAT32)
)
""")# Bind each vector as a 32-bit floating-point array.
cursor.executemany("""
INSERT INTO manual_vectors (label, embedding)
VALUES (:1, :2)
""",
rows,)
connection.commit()# Rank rows by Euclidean distance from the query vector.
cursor.execute("""
SELECT label,
VECTOR_DISTANCE(
embedding,
:query_vector,
EUCLIDEAN
) AS distance
FROM manual_vectors
ORDER BY distance
FETCH EXACT FIRST 2 ROWS ONLY
""",
query_vector=array.array("f",[1.0,0.0,0.0]),)print("Created manual_vectors.")print("Inserted 3 manual vectors.")print("\nNearest manual vectors:")for rank,(label, distance)inenumerate(cursor, start=1):print(f"{rank}. {label:<6} distance={float(distance):.4f}")if __name__ =="__main__":
main()Altyapı:
Özdeş vektör, 0.0000 mesafesiyle ilk sırada görünür; yakın olan muz vektörü ikinci sırada yer alır.
Created manual_vectors.
Inserted 3 manual vectors.
Nearest manual vectors:
1. apple distance=0.0000
2. banana distance=0.1414Altyapı:
Vektör aramasının temel fikri budur: satırlar, bir sorgu vektörüne olan matematiksel yakınlığa göre sıralanır. Gömme modelleri daha büyük vektörler üretecek, ancak veritabanı davranışı aynı kalacaktır.
Adım 3: Anlamsal documents tablosunu oluşturun
Artık vektörlerin çalıştığını bildiğimize göre gerçek bir uygulama tarzı tablo oluşturacağız. Önemli ayrıntı, vektör sütunu boyutunun gömme modelinin çıktı boyutuyla eşleşmesi gerektiğidir.
Boyut, tablo sözleşmesinin bir parçasıdır. Bir gömme modeli 1.536 sayı döndürüyorsa, sütun VECTOR(1536, FLOAT32) olarak tanımlanmalıdır.
Daha sonra çıktı uzunluğu farklı olan bir modele geçersek, eklemelerin ve sorguların uyumlu vektörler kullanmaya devam etmesi için vektör sütununu yeniden oluşturmamız veya taşıma yapmamız gerekir.
DDL, vektör boyutunu normal bir SQL bağ değişkeni olarak bağlayamadığı için, betik EMBEDDING_DIM değerini CREATE TABLE ifadesinde kullanmadan önce tamsayıya çevirir.
Betik oluşturma
Aşağıdaki kodu 03_create_documents_table.py olarak kaydedin.
import os
import oracledb
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defconfigured_dimension():try:
dimension =int(required_env("EMBEDDING_DIM"))except ValueError as exc:raise SystemExit("EMBEDDING_DIM must be an integer.")from exc
if dimension <=0:raise SystemExit("EMBEDDING_DIM must be a positive integer.")return dimension
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")# Validate the configured model name and vector dimension.
model_name = required_env("EMBEDDING_MODEL")
dimension = configured_dimension()with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:# Recreate the documents table so the script is repeatable.
cursor.execute("""
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE documents PURGE';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE <> -942 THEN
RAISE;
END IF;
END;
""")
cursor.execute(f"""
CREATE TABLE documents (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
title VARCHAR2(200) NOT NULL,
content VARCHAR2(1000) NOT NULL,
embedding VECTOR({dimension}, FLOAT32)
)
""")print(f"Embedding model: {model_name}")print(f"Embedding dimension: {dimension}")print("Recreated documents table.")if __name__ =="__main__":
main()Altyapı:
Veritabanı-yalnız bölümü tamamladık. Oracle Database yerelde vektörleri depolayıp karşılaştırabilir; şimdi el yazısı vektörleri metinden üretilmiş gömelerle değiştireceğiz.
Adım 4: Gömme modeli boyutunu doğrulayın
Gömüleri eklemeden önce, gömme modelinden bir vektör isteyecek ve uzunluğunu doğrulayacağız. Bu, en yaygın vektör tablo hatasını önler: VECTOR sütunu boyutuyla eşleşmeyen bir vektör eklemek.
Bir gömme modeli yalnızca bir metin-sayılara dönüştürücü değildir; uygulamanın anlam uzayını tanımlar. Bu demodaki tüm belge ve sorgu gömüleri aynı modelden gelmelidir.
Tek bir model kullanmak, küçük bir mesafenin, şeklen benzer görünen ilgisiz iki vektörden ziyade benzer anlamı temsil etmesini sağlar. Model, vektör uzunluğunu da belirler; bu yüzden veri yüklemeden önce döndürülen boyutu kontrol ederiz.
Betik oluşturma
Aşağıdaki kodu 04_check_embedding_dimension.py olarak kaydedin.
import os
from openai import OpenAI
defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defconfigured_dimension():try:returnint(required_env("EMBEDDING_DIM"))except ValueError as exc:raise SystemExit("EMBEDDING_DIM must be an integer.")from exc
defmain():
required_env("OPENAI_API_KEY")
model_name = required_env("EMBEDDING_MODEL")
expected_dimension = configured_dimension()# Request one embedding to confirm the model output dimension.
client = OpenAI()
response = client.embeddings.create(
model=model_name,input="Oracle AI Vector Search dimension check",)
returned_dimension =len(response.data[0].embedding)print(f"Embedding model: {model_name}")print(f"Returned embedding length: {returned_dimension}")print(f"Configured EMBEDDING_DIM: {expected_dimension}")# Stop before loading data if the table dimension is incompatible.if returned_dimension != expected_dimension:raise SystemExit("Dimension check failed. Update EMBEDDING_DIM, rerun ""03_create_documents_table.py, and try again.")print("Dimension check passed.")if __name__ =="__main__":
main()Altyapı:
Daha sonra farklı bir gömme modeli seçersek, EMBEDDING_MODEL değerini güncellemeli, EMBEDDING_DIM değerini dönen vektör uzunluğuna ayarlamalı ve documents tablosunu yeniden oluşturmalıyız.
Adım 5: Belge gömülerini üretin ve ekleyin
Şimdi küçük, kendi içinde tutarlı bir veri kümesi için gömüler üretecek ve bunları Oracle Database’e ekleyeceğiz.
Her bir gömme, FLOAT32 vektör sütunuyla eşleşmesi için bağlamadan önce array.array("f", embedding) biçimine dönüştürülür.
Betik oluşturma
Aşağıdaki kodu 05_insert_embeddings.py olarak kaydedin.
import array
import os
import oracledb
from openai import OpenAI
DOCUMENTS =[("Oracle AI Vector Search","Oracle Database can store vector embeddings in native VECTOR ""columns and query them with SQL similarity search.",),("Semantic Search for Applications","Semantic search ranks results by meaning, helping applications ""find related content even when exact words differ.",),("Vector Index Workflow","Vector indexes help approximate nearest-neighbor search scale ""when datasets grow beyond small examples.",),("Local Docker Development","Docker containers make it practical to run a local database for ""development and repeatable tutorials.",),("Python Database Code","Python applications can connect to Oracle Database with the ""oracledb driver and use environment variables for credentials.",),("Acoustic Guitar Practice","Daily guitar practice improves timing, chord transitions, and ""confidence when learning new songs.",),("Weeknight Vegetable Soup","A simple soup can combine onions, carrots, beans, herbs, and ""broth for an easy weeknight meal.",),]
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defconfigured_dimension():try:returnint(required_env("EMBEDDING_DIM"))except ValueError as exc:raise SystemExit("EMBEDDING_DIM must be an integer.")from exc
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")
required_env("OPENAI_API_KEY")
model_name = required_env("EMBEDDING_MODEL")
expected_dimension = configured_dimension()# Generate embeddings for all sample documents in one API request.
client = OpenAI()
response = client.embeddings.create(
model=model_name,input=[content for _, content in DOCUMENTS],)# Restore the response order using each item's index.
embeddings =[
item.embedding
for item insorted(
response.data,
key=lambda item: item.index,)]ifany(len(embedding)!= expected_dimension for embedding in embeddings):raise SystemExit("An embedding length did not match EMBEDDING_DIM. ""Rerun 04_check_embedding_dimension.py.")# Bind each embedding as a 32-bit floating-point array.
rows =[(title, content, array.array("f", embedding))for(title, content), embedding inzip(DOCUMENTS, embeddings)]# Replace the sample rows and commit the transaction.with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:
cursor.execute("DELETE FROM documents")
cursor.executemany("""
INSERT INTO documents (title, content, embedding)
VALUES (:1, :2, :3)
""",
rows,)
cursor.execute("SELECT COUNT(*) FROM documents")
row_count = cursor.fetchone()[0]
connection.commit()print(f"Embedding model: {model_name}")print(f"Generated embeddings for {len(DOCUMENTS)} documents.")print(f"Inserted {len(DOCUMENTS)} documents.")print(f"documents row count: {row_count}")if __name__ =="__main__":
main()Altyapı:
Artık Oracle Database’te metin ve gömüler birlikte depolanıyor. Alakasız gitar ve çorba ile ilgili documents girdileri dahil edildi; böylece arama sonuçlarında bariz yakın ve uzak eşleşmeler olacak.
Adım 6: Anlamsal bir arama sorgusu çalıştırın
Şimdi doğal dilli bir sorguyu gömecek ve depolanan belge gömeleriyle karşılaştıracağız. Bu betik, vektör büyüklüğünden ziyade yön odaklı olduğu için metin gömülerinde yaygın olan kosinüs mesafesini kullanır.
Anlamsal arama için, sorgu documents ile aynı gömme modelinden geçer. SQL’in İngilizce cümleyi doğrudan anlamasını istemiyoruz.
Cümlenin bir vektöre dönüştürülmesini gömme modelinden istiyoruz; ardından Oracle Database’ten depolanan vektörleri o sorgu vektörüne olan mesafelerine göre sıralamasını istiyoruz.
Betik oluşturma
Aşağıdaki kodu 06_semantic_search.py olarak kaydedin.
import array
import os
import oracledb
from openai import OpenAI
QUERY_TEXT ="Where should an AI app keep meaning-based search data?"
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")
required_env("OPENAI_API_KEY")# Generate an embedding for the natural-language query.
client = OpenAI()
response = client.embeddings.create(
model=required_env("EMBEDDING_MODEL"),input=QUERY_TEXT,)
query_vector = array.array("f", response.data[0].embedding)with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:# Rank stored documents by cosine distance from the query vector.
cursor.execute("""
SELECT title,
content,
VECTOR_DISTANCE(
embedding,
:query_vector,
COSINE
) AS distance
FROM documents
ORDER BY distance
FETCH EXACT FIRST 5 ROWS ONLY
""",
query_vector=query_vector,)
rows = cursor.fetchall()ifnot rows:raise SystemExit("No documents found. Run 05_insert_embeddings.py first.")print(f"Query: {QUERY_TEXT}")print("\nTop 5 results:")for rank,(title, content, distance)inenumerate(rows, start=1):print(f"{rank}. {title}")print(f" distance: {float(distance):.6f}")print(f" {content[:90]}...")if __name__ =="__main__":
main()Altyapı:
Gömme modeli değiştiğinde tam sıralamalar ve mesafeler farklı olabilir. Ancak Oracle AI Vector Search, anlamsal arama, Python veritabanı kodu ve vektör indeksleme ile ilgili documents girdileri üst sıralarda yer almalıdır.
Query: Where should an AI app keep meaning-based search data?
Top 5 results:
1. Oracle AI Vector Search
distance: <cosine distance from your run>
Oracle Database can store vector embeddings in native VECTOR columns and query them with SQL...
2. Semantic Search for Applications
distance: <cosine distance from your run>
Semantic search ranks results by meaning, helping applications find related content even when...
3. Python Database Code
distance: <cosine distance from your run>
Python applications can connect to Oracle Database with the oracledb driver and use environment...
4. Vector Index Workflow
distance: <cosine distance from your run>
Vector indexes help approximate nearest-neighbor search scale when datasets grow beyond small...
5. Local Docker Development
distance: <cosine distance from your run>
Docker containers make it practical to run a local database for development and repeatable...Altyapı:
Bu eğitimdeki Öklidyen ve kosinüs mesafesi sorgularında daha küçük değerler daha yakın eşleşmeleri gösterir.
Nokta çarpımı, özellikle büyüklüğün veya normalize vektörlerin önemli olduğu birçok vektör arama iş akışında başka bir faydalı karşılaştırma yaklaşımıdır; ancak puan yönü ve normalizasyon dikkatli ele alınmalıdır.
Sonuç yorumunu basit tutmak için çalıştırılabilir kodu Öklidyen ve kosinüs mesafesi üzerinde tutacağız.
Gelecekteki bir uygulamada gömüleri kendimiz normalize edersek, depolanan belge gömelerini ve sorgu gömelerini tutarlı şekilde normalize etmemiz gerekir; aksi takdirde mesafeler ve sıralamalar değişebilir.
Adım 7: Anlamsal aramayı ifade eşleşmesiyle karşılaştırın
Anlamsal arama faydalıdır; çünkü belgenin aynı ifadeyi birebir içermesini gerektirmez.
Anlamsal sorguyu basit bir birebir ifade koşulu ile karşılaştıralım.
Bu bir tam metin arama motoru demosu değildir; bu, birebir eşleşme ile anlam temelli sıralama arasındaki farkı görünür kılan küçük bir SQL karşılaştırmasıdır.
Betik oluşturma
Aşağıdaki kodu 07_semantic_vs_keyword.py olarak kaydedin.
import array
import os
import oracledb
from openai import OpenAI
SEMANTIC_QUERY ="Where should an AI app keep meaning-based search data?"
KEYWORD_PHRASE ="meaning-based search data"
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")
required_env("OPENAI_API_KEY")# Generate an embedding for the semantic query.
client = OpenAI()
response = client.embeddings.create(
model=required_env("EMBEDDING_MODEL"),input=SEMANTIC_QUERY,)
query_vector = array.array("f", response.data[0].embedding)with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:# Rank documents by semantic similarity.
cursor.execute("""
SELECT title,
VECTOR_DISTANCE(embedding, :query_vector, COSINE)
FROM documents
ORDER BY VECTOR_DISTANCE(embedding, :query_vector, COSINE)
FETCH EXACT FIRST 3 ROWS ONLY
""",
query_vector=query_vector,)
semantic_rows = cursor.fetchall()# Compare semantic results with an exact phrase predicate.
cursor.execute("""
SELECT title
FROM documents
WHERE LOWER(title || ' ' || content)
LIKE '%' || :phrase || '%'
ORDER BY title
FETCH FIRST 3 ROWS ONLY
""",
phrase=KEYWORD_PHRASE.lower(),)
keyword_rows = cursor.fetchall()print(f"Semantic query: {SEMANTIC_QUERY}")print(f"Keyword phrase: {KEYWORD_PHRASE}")print("\nSemantic results:")for rank,(title, distance)inenumerate(semantic_rows, start=1):print(f"{rank}. {title}")print(f" distance: {float(distance):.6f}")print("\nKeyword results:")if keyword_rows:for rank,(title,)inenumerate(keyword_rows, start=1):print(f"{rank}. {title}")else:print("0 exact phrase matches")if __name__ =="__main__":
main()Altyapı:
Anlamsal arama, birebir anahtar ifade bulunmasa bile ilgili documents girdilerini döndürmelidir.
Semantic query: Where should an AI app keep meaning-based search data?
Keyword phrase: meaning-based search data
Semantic results:
1. Oracle AI Vector Search
distance: <cosine distance from your run>
2. Semantic Search for Applications
distance: <cosine distance from your run>
3. Python Database Code
distance: <cosine distance from your run>
Keyword results:
0 exact phrase matchesAltyapı:
Geleneksel SQL koşulları hâlâ filtreler, birleştirmeler, izinler ve birebir eşleşmeler için önemlidir. Vektör arama, bir uygulamanın anlamsal getirmeye ihtiyaç duyduğunda ilişkisel verilerle birleştirebileceğimiz anlam temelli bir sıralama sinyali ekler.
Adım 8: Bir vektör indeksi ekleyin ve doğrulayın
Son olarak bir vektör indeksi oluşturacak ve Oracle Database’in onu demo şemasına ait geçerli bir indeks olarak raporladığını doğrulayacağız.
Bu adım indeks oluşturma iş akışını gösterir; küçücük veri kümemiz anlamlı performans sonuçları çıkarmak için yeterli değildir.
İndeks olmadan Oracle Database, sorgu vektörünü her depolanan vektörle birebir karşılaştırabilir. Bu yaklaşım küçük veri kümeleri için uygundur ve öğrenirken kullanışlıdır.
Daha büyük veri kümelerinde, yaklaşık vektör indeksleri arama alanını azaltarak sorguların hızlı dönmesini sağlarken yakın komşuları bulmaya devam eder.
İndeks ailesini, veri boyutu, gecikme hedefleri, hatırlama gereksinimleri, bellek bütçesi ve vektörlerin değişim sıklığını göz önüne alarak seçin.
Sondaki sorgu, indeks oluşturulduktan sonra da anlamsal aramanın sonuç döndürdüğünü doğrular.
Bu eğitimde, indeks oluşturmayı sorgu planı davranışıyla değil şema metaverisiyle doğruladığımız için burada EXPLAIN PLAN veya DBMS_XPLAN kullanmayacağız.
Betik oluşturma
Aşağıdaki kodu 08_create_vector_index.py olarak kaydedin.
import array
import os
import oracledb
from openai import OpenAI
INDEX_NAME ="DOCUMENT_EMBEDDING_IDX"
QUERY_TEXT ="Where should an AI app keep meaning-based search data?"
ADMIN_USERS ={"SYS","SYSTEM","PDBADMIN"}defrequired_env(name):
value = os.getenv(name)ifnot value:raise SystemExit(f"Set {name} before running this script.")return value
defmain():
user = required_env("DB_USER")if user.upper()in ADMIN_USERS:raise SystemExit("Use the vector_demo application user, not an admin user.")
required_env("OPENAI_API_KEY")# Generate the query vector used for the validation search.
client = OpenAI()
response = client.embeddings.create(
model=required_env("EMBEDDING_MODEL"),input=QUERY_TEXT,)
query_vector = array.array("f", response.data[0].embedding)with oracledb.connect(
user=user,
password=required_env("DB_PASSWORD"),
dsn=required_env("DB_DSN"),)as connection:with connection.cursor()as cursor:# Remove a prior index so the script can be rerun safely.try:
cursor.execute(f"DROP INDEX {INDEX_NAME}")except oracledb.DatabaseError as exc:
error = exc.args[0]if error.code !=1418:raise# Create an approximate neighbor-partitions vector index.
cursor.execute("""
CREATE VECTOR INDEX document_embedding_idx
ON documents (embedding)
ORGANIZATION NEIGHBOR PARTITIONS
DISTANCE COSINE
WITH TARGET ACCURACY 95
""")# Confirm that Oracle reports the vector index as valid.
cursor.execute("""
SELECT index_name, index_type, status
FROM user_indexes
WHERE index_name = :index_name
""",
index_name=INDEX_NAME,)
index_row = cursor.fetchone()# Confirm that semantic search still returns rows after index creation.
cursor.execute("""
SELECT title
FROM documents
ORDER BY VECTOR_DISTANCE(embedding, :query_vector, COSINE)
FETCH EXACT FIRST 3 ROWS ONLY
""",
query_vector=query_vector,)
rows = cursor.fetchall()ifnot index_row:raise SystemExit("Vector index was not found in USER_INDEXES.")print("Created vector index DOCUMENT_EMBEDDING_IDX.")print("\nIndex validation:")print(f"Index name: {index_row[0]")}print(f"Index type: {index_row[1]")}print(f"Status: {index_row[2]")}
result_count =len(rows)print("\nSemantic search still returns "f"{result_count} results after index creation.")if __name__ =="__main__":
main()Altyapı:
Çıktı DOCUMENT_EMBEDDING_IDX için bir satır içermeli, INDEX_TYPEVECTOR, STATUS ise VALID olmalıdır.
Created vector index DOCUMENT_EMBEDDING_IDX.
Index validation:
Index name: DOCUMENT_EMBEDDING_IDX
Index type: VECTOR
Status: VALID
Semantic search still returns 3 results after index creation.Altyapı:
USER_INDEXES, indeksin var olduğunu ve geçerli olduğunu doğrular. Belirli bir sorgunun indeksi kullandığını kanıtlamaz ve bu eğitim doğrulama yöntemi olarak yürütme planı çıktısını kullanmaz.
Üretim iş yükülerinde, gerçekçi veri hacmi, sorgu desenleri ve performans hedefleriyle test yaparız.
Oracle AI Vector Search İpuçları ve Sorun Giderme
Veritabanı konteyneri hâlâ başlatılıyor
Başlatma tamamlanana kadar bekleyin, ardından docker logs oracle-free-26ai-vector komutunu tekrar çalıştırın. Python’un localhost:1521/FREEPDB1 adresine bağlanabilmesi için veritabanının hazır olması gerekir.
1521 portu zaten kullanımda
Çakışan yerel servisi durdurun veya Docker port eşlemesini değiştirin. Ana makine portu değişirse DB_DSN değerini güncelleyin.
Veritabanı bağlantısı başarısız
DB_USER, DB_PASSWORD ve DB_DSN değerlerini doğrulayın. DSN içinde FREEPDB1 kullanın ve uygulama betiklerini vector_demo olarak bağlayın; SYS, SYSTEM veya PDBADMIN olarak değil.
Gömme API anahtarı eksik
Adımlar 1-3 yalnızca veritabanıyla ilgilidir. Adımlar 4-8 OPENAI_API_KEY gerektirir ve API maliyetlerine yol açabilir.
Bir vektör boyutu eşleşmiyor
04_check_embedding_dimension.py betiğini çalıştırın, EMBEDDING_DIM değerini güncelleyin, 03_create_documents_table.py betiğini yeniden çalıştırın ve gömüleri 05_insert_embeddings.py ile yeniden yükleyin.
Bir vektör bağlama başarısız
Her FLOAT32 vektör bağlamanın array.array("f", values) kullandığından emin olun. Eğitim, bunu manuel vektörler, depolanan belge gömeleri ve sorgu gömeleri için kullanır.
Anlamsal sıralamalar örnekten farklı
Bu beklenir. Gömme sağlayıcıları modelleri güncelleyebilir ve kayan nokta mesafeleri çalıştırmalar arasında değişebilir.
Vektör indeks oluşturma başarısız
documents tablosunun var olduğunu, vector_demo şemasının ona sahip olduğunu ve DOCUMENT_EMBEDDING_IDX öğesinin yarım kalmış bir çalıştırmadan kalmadığını doğrulayın.
Üretime hazırlık
Bağlantı havuzu için oracledb.create_pool() kullanın, gerçekçi veri hacimlerini kıyaslayın, güvenlik ve gizli yönetimini gözden geçirin ve indeksleri gerçek sorgu desenlerine göre ayarlayın.
Konteyneri durdurun ve kaldırın
Eğitim tamamlandığında yerel konteyneri durdurup kaldırın.
Oracle AI Vector Search, Oracle Database Free 26ai ve Python ile yerel bir anlamsal arama iş akışı oluşturduk.
El yazısı VECTOR(3, FLOAT32) değerleriyle başladık, array.array("f", values) ile model tarafından üretilen gömüleri ekledik, VECTOR_DISTANCE() ile benzer documents girdilerini sorguladık, anlamsal getiriyi basit bir birebir ifade koşuluyla karşılaştırdık ve bir vektör indeksini USER_INDEXES üzerinden doğruladık.
Bu yaklaşım, gömülerin ilişkisel verilerin yanında bulunması ve yerel iş akışı için ayrı bir vektör veritabanı eklemeden SQL’de görünür depolama ve arama istememiz durumunda iyi uyum sağlar.
Demo kasten küçük tutulmuştur: ilke yapıtaşlarını öğretir, üretim ölçeğini değil. Daha büyük uygulamalar gerçekçi verilerle kıyaslamalı, güvenlik ve ayrıcalıkları gözden geçirmeli, bağlantı havuzlaması kullanmalı ve indeksleme tercihlerini gerçek sorgu desenleri altında doğrulamalıdır.
Sonrasında uygulamayı şu kaynaklarla derinleştirebiliriz:
Oracle AI Vector Search LiveLabs, vektör gömüleri, kesin ve yaklaşık arama, görsel arama ve getirmeyle artırılmış üretim için uygulamalı atölyeler sunar.
FAQs
Oracle AI Vector Search nedir?⌄
Oracle AI Vector Search, vektör gömülerini ilişkisel verilerin yanında depolamak, indekslemek ve sorgulamak için Oracle Database yeteneklerinden oluşur.
Eğitimi tamamlamak için OpenAI API anahtarına ihtiyacım var mı?⌄
Manuel vektör ve veritabanı kurulum adımları bir API anahtarı gerektirmez. Adımlar 4-8, bir gömme sağlayıcısı ve yapılandırılmış OPENAI_API_KEY gerektirir.
Neden EMBEDDING_DIM gömme modeline uymalı?⌄
VECTOR sütununun boyutu, gömme modelinin döndürdüğü değer sayısına eşit olmalıdır. Eşleşmeme, vektör eklemesinin başarısız olmasına neden olur.
Eğitim hangi mesafe metriklerini kullanıyor?⌄
Manuel vektör örneği Öklidyen mesafe kullanır. Anlamsal arama örnekleri kosinüs mesafesi kullanır.
Geçerli bir vektör indeks, bir sorgunun indeksi kullandığını kanıtlar mı?⌄
Hayır. USER_INDEXES, indeksin var olduğunu ve geçerli bir durumu olduğunu doğrular; ancak belirli bir sorgunun onu kullandığını doğrulamaz.
Mark Nelson, Oracle’da mimar ve geliştirici elçisidir. Yapay zekâ, mikro hizmetler ve veritabanı teknolojilerinin kesişiminde çalışır. Aktif bir blog yazarı, yayımlanmış bir yazar, Manning Publications’ta teknik değerlendirici, Stanford Code in Place’te bölüm lideri ve DeepLearning.ai'de mentordur. Düzenli olarak Java ve Oracle Kullanıcı Gruplarında, yapay zekâ buluşmalarında ve büyük konferanslarda sunum yapar. Öğrenmeye ve öğretmeye tutkuyla bağlıdır. IBM ve Oracle’da olmak üzere otuz yılı aşkın sektör deneyimine sahiptir.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
API'leri ve açık kaynak kütüphanelerini kullanarak yapay zekayı yazılım uygulamalarına nasıl entegre edeceğinizi öğrenin. Yapay Zeka Mühendisi olma yolculuğunuza bugün başlayın!
Bu eğitimde Oracle AI Vector Search, Python ve Oracle Database Free 26ai ile yerel bir anlamsal arama demosu oluşturacağız.
Önce mesafeyi gözle görebilmek için elle yazılmış üç boyutlu vektörlerle başlayacağız, ardından metin gömüleri üretecek ve bunları Oracle Database’ten SQL ile sorgulayacağız.
Bu eğitim, vektör aramasına yeni olan ve Docker, ortam değişkenleri, Python paketleri ve yerel veritabanı kurulumu konusunda rahat olan Python ve SQL geliştiricileri içindir.
Yapay zekâ destekli uygulamaların, yalnızca birebir kelimeleri değil, anlamı da anlayan bir aramaya ihtiyacı vardır. Bir destek uygulaması, dokümantasyon portalı veya iç bilgi aracı, en iyi eşleşen belge “yerel sütunlarda vektör gömülerini depolayın” dese bile “AI arama için veritabanı depolaması”nı bulabilmelidir.
Vektör gömüleri metni sayısal vektörler olarak temsil ederek bunu mümkün kılar. Oracle AI Vector Search bu vektörleri doğrudan Oracle Database içinde depolamamıza, SQL ile sorgulamamıza ve gömüleri ilişkisel uygulama verilerinin yanında tutmamıza olanak tanır.
Bu yerel iş akışı için ayrı bir vektör veritabanına ihtiyacımız yok.
Oracle Database Free 26ai’yi yerelde çalıştıracağız, Python’dan
oracledbThin modu ile bağlanacağız, önce manuel vektörleri, ardından OpenAI gömülerini depolayacağız, anlamsal arama çalıştıracağız, anlamsal getiriyi basit bir birebir ifade koşulu ile karşılaştıracağız veUSER_INDEXESüzerinden doğrulayacağımız bir vektör indeksi oluşturacağız.Sonunda, gömüleri Oracle Database’te depolayan ve en benzer
documentskayıtlarını yerelde getiren, Python ile çalışan bir anlamsal arama iş akışımız olacak.Oracle AI Vector Search Nedir?
Oracle AI Vector Search, vektör gömülerini depolamak, indekslemek ve sorgulamak için Oracle Database yeteneklerinden oluşur. Bir vektör gömüsü, metin, görseller veya diğer verilerin anlamını, bir veritabanının matematiksel olarak karşılaştırabileceği biçimde temsil eden sabit boyutlu sayı listeleridir.
Bir gömme modeli sayısal vektörleri üretir. Girdi olarak bir cümle, paragraf, görsel açıklaması veya kod parçası alır ve sabit boyutlu bir vektör döndürür.
Benzer girdiler birbirine yakın vektörler üretmeli, ilgisiz girdiler ise birbirinden daha uzak olmalıdır. Bu nedenle depolanan documents ve gelen sorgular için aynı gömme modelini kullanmalıyız; çünkü mesafeler yalnızca vektörler aynı koordinat sistemini paylaştığında anlamlıdır.
Bu eğitimde, matematiği inceleyebilmek için manuel vektörler bilerek küçük tutulmuştur. Gerçek metin gömüleri çok daha büyüktür; çünkü modelin, kelimeler, ifadeler ve konular arasındaki ince ilişkileri kodlayabilmek için yeterli boyuta ihtiyacı vardır.
Vektör araması satırları vektörler arası mesafeye göre sıralar. Öklidyen ve kosinüs mesafesi sorgularında daha küçük değerler daha yakın eşleşmeleri ifade eder. Bu eğitimde önce mesafe davranışını doğrudan görebilmek için küçük bir
VECTOR(3, FLOAT32)sütunu kullanacağız, sonra metinden üretilmişVECTOR(1536, FLOAT32)gömülerine geçeceğiz.Şekil 1. Oracle AI Vector Search akışı
Oracle AI Vector Search gömüleri yerel bir VECTOR sütununda depolar ve sonuçları vektör mesafesine göre sıralar.
Gömülerin belge kimlikleri, başlıklar, içerikler, kullanıcılar, ürünler, talepler veya metaveri gibi ilişkisel uygulama verilerinin yanında yer alması gerektiğinde Oracle Database kullanışlıdır.
Bazı uygulamalar özel getirme iş yükleri için ayrı bir vektör veritabanı veya arama motoru kullanır, ancak bu eğitimin yerel anlamsal arama iş akışı için Oracle Database ihtiyaç duyduğumuz vektör depolama ve arama özelliklerini sağlar.
Oracle AI Vector Search’ün Temel Özellikleri
Demoda dört Oracle AI Vector Search özelliği kullanacağız: yerel vektör depolama, mesafe fonksiyonları, vektör indeksleri ve ilişkisel entegrasyon.
Yerel vektör veri türü
Oracle Database, açık boyutlar ve eleman biçimleriyle yerel
VECTORsütunlarını destekler. Demoda, manuel vektörler içinVECTOR(3, FLOAT32)ve varsayılantext-embedding-3-smallgömme modeli içinVECTOR(1536, FLOAT32)kullanacağız.Mesafe fonksiyonları ve operatörleri
Çalıştırılabilir örneklerde
VECTOR_DISTANCE()kullanıyoruz; çünkü mesafe metriğini SQL içinde açık tutar.Manuel vektör örneği için Öklidyen mesafe, metin gömüleri için ise kosinüs mesafesi kullanacağız.
Oracle Database kısaltılmış vektör mesafe operatörlerini ve nokta çarpımıyla ilgili mesafe davranışını da içerir, ancak bu eğitim çalıştırılabilir SQL’i açık
VECTOR_DISTANCE()patikasında tutar.Farklı mesafe metrikleri “yakınlık” hakkında biraz farklı sorulara yanıt verir.
Küçük bir eğitim için kosinüs mesafesi, yön odağı nedeniyle sıklıkla anlamsal benzerlikle iyi eşleştiğinden metin gömüleri için iyi bir varsayılandır.
Öklidyen mesafe, elle yazılmış vektörlerle görselleştirmesi daha kolaydır ve vektör büyüklüğü ya da normalize vektörlerin model tasarımının parçası olduğu bazı getirme sistemlerinde nokta-çarpımı tarzı karşılaştırmalar faydalıdır.
Metrek
Karşılaştırdığı Şey
Uygun Olduğu Durum
Dikkat Edilecekler
Kosinüs
Vektör yönü
Metin gömüleri ve anlamsal benzerlik
Sonuçlar, aynı gömme modelinin ve tutarlı ön işlemenin kullanılmasına bağlıdır
Öklidyen
Doğrusal mesafe
Küçük örnekler, geometri sezgisi, bazı sayısal özellik vektörleri
Büyüklük mesafeyi etkiler, bu nedenle ölçekleme önemli olabilir
Nokta çarpımı
Yön ve büyüklük birlikte
Normalize vektörler veya iç-çarpım puanlaması etrafında tasarlanmış iş akışları
Puan yönü ve normalizasyon kuralları, sonuçları karşılaştırmadan önce anlaşılmalıdır
Vektör indeksleri
Doğru sonuç ve küçük veri kümeleri için kesin vektör araması kullanışlıdır. Veri kümeleri büyüdükçe vektör indeksleri yaklaşık en yakın komşu arama iş akışlarını destekler.
Oracle AI Vector Search, sıklıkla HNSW tarzı arama ile ilişkilendirilen bellek içi komşu grafik indekslerini ve sıklıkla IVF tarzı bölümleme ile ilişkilendirilen komşu-bölümleri indekslerini içerir.
Bu yerel demoda
ORGANIZATION NEIGHBOR PARTITIONSkullanıyor ve indeksiUSER_INDEXESile doğruluyoruz.Yaklaşık indeksler, ölçekte daha hızlı getirme için tüm kapsamlı aramadan küçük bir miktar kesinliği takas eder.
Doğru indeks ailesi iş yüküne, veri hacmine, güncelleme desenine ve hatırlama hedeflerine bağlıdır.
Bu eğitim, yerel kurulumu basit tuttuğu ve eğitimi bir indeks ayarlama kılavuzuna dönüştürmeden somut bir indeks oluşturma adımı sunduğu için IVF tarzı komşu-bölümleri indeksini kullanır.
İndeks Ailesi
Temel Fikir
Güçlü Yanlar
Takçlar
Ne Zaman Kullanabiliriz
IVF / komşu bölümleri
Vektör uzayını böl, sonra olası bölümleri ara
Basit zihinsel model, birçok toplu-yüklenen veri kümesi için pratik
Hatırlama ve hız, bölümleme ve arama ayarlarına bağlıdır
Büyüyen bir veri kümesi için doğrudan bir yaklaşık arama yolu istiyoruz
HNSW / komşu grafiği
Hızlı geçiş için yakın vektörleri bağlayan bir grafik oluştur
Birçok en yakın komşu iş yükü için güçlü hatırlama ve gecikme profili
Daha çok belleğe yöneliktir ve yapılandırma daha fazla önem taşıyabilir
Düşük gecikmeli arama gerekir ve bellek ile ayar çabasına bütçe ayırabiliriz
İlişkisel sorgularla entegrasyon
Bir vektör sütunu, sıradan ilişkisel sütunların yanında bulunabilir. documents tablomuz başlık, içerik ve gömüyü birlikte depolayacak; böylece SQL hem benzerlik puanını hem de özgün belge metnini döndürebilecek.
Oracle AI Vector Search ile Nasıl Başlanır
Tek bir yerel kurulum yolunu kullanacağız: Docker içinde Oracle Database Free 26ai,
FREEPDB1servisi ve özel birvector_demouygulama kullanıcısı.Vektör araması kavramları erişilebilir olsa da, Docker, bir veritabanı şeması, Python paketleri, ortam değişkenleri ve bir gömme API anahtarı kullandığımız için kurulum orta düzeydedir.
Önkoşullar
Gerekenler:
Bu demo, yerel
VECTORsütunları,VECTOR_DISTANCE()veCREATE VECTOR INDEXdahil burada kullanılan vektör özelliklerini içeren bir Oracle Database sürümü veya ortamı gerektirir.Yerel yol, aşağıda gösterilen imaj etiketiyle Oracle Database Free 26ai kullanır ve DSN,
FREEPDB1takılabilir veritabanı servisini kullanır.Manuel vektör adımları bir
OpenAIAPI anahtarı gerektirmez. Anlamsal adımlar, örnek belge metnini ve sorgu metnini yapılandırılmış gömme sağlayıcısına gönderir; bu nedenle yalnızca örnek veya hassas olmayan metinler kullanacağız.Bu eğitimde Oracle Database için güncel Python sürücüsü olan
oracledbkullanılır.python-oracledbvarsayılan olarak Thin modda çalışır, bu nedenle bu yerel demo Oracle İstemci kütüphanelerini gerektirmez. Thick mod, diğer Oracle Database dağıtımlarında faydalıdır; ancak buradaoracledb.init_oracle_client()çağrısı yapmayacağız.Oracle Database Free 26ai’yi yerelde başlatın
Oluşturacağımız betikler için bir proje dizini oluşturun.
Oracle Database Free 26ai’yi yerel konteyner imajıyla başlatın.
Konteyner günlüklerini kontrol edin ve veritabanı başlatmanın tamamlandığını bildirene kadar bekleyin.
FREEPDB1bu yerel Oracle Database Free konteyner yolunda kullanılan takılabilir veritabanı servisidir. Python DSN’imizlocalhost:1521/FREEPDB1olacaktır.FREEPDB1 içinde vector_demo şemasını oluşturun
SYSkullanıcısını yalnızca şema kurulum adımı için kullanın. sqlplus komutundaki parola, docker run komutundaki ORACLE_PWD değeridir; CREATE USER içindeki parola iseDB_PASSWORDolarak dışa aktaracağımız uygulama parolasıdır.Kurulumu veritabanı konteynerinin içinde çalıştırın.
Bu, demo konteyneri için yerel geliştirme amaçlı bir kısayoldur. Tablolar kimlik sütunları kullandığı için CREATE SEQUENCE gereklidir.
Üretimde, ayrıcalıkları bir veritabanı yöneticisi ile gözden geçirir ve tam uygulama iş yüküsü için asgari ayrıcalığı uygularız.
Python bağımlılıklarını kurun
Sanal bir ortam oluşturup etkinleştirin.
Demoda kullanılan Python paketlerini kurun.
Ortam değişkenlerini ayarlayın
Veritabanı kimlik bilgilerini ve gömme ayarlarını Python dosyalarına gömmek yerine ortam değişkenlerinde saklayın.
OPENAI_API_KEYyalnızca gömme ve anlamsal arama adımları için gereklidir.EMBEDDING_DIM, seçilen gömme modelinin döndürdüğü boyut sayısı ile eşleşmelidir.Oracle AI Vector Search Demo Projesi
Demoyu sekiz kontrol noktasında inşa edeceğiz. Her betik bir kavram ekler ve devam etmeden önce doğrulayabileceğimiz bir çıktı üretir.
Yalnızca veritabanı kontrol noktası 1–3. Adımlardan sonra tamamlanır. Bu noktada Oracle Database’e bağlanmış, manuel vektörleri depolamış, onları mesafeye göre sorgulamış ve anlamsal tabloyu oluşturmuş olacağız.
OpenAIAPI anahtarı 4. adımda gerekli hale gelir.Adım 1: Yerel veritabanına bağlanın
Önce Python’un Oracle Database’e
vector_demouygulama kullanıcısı olarak bağlanabildiğini doğrulayacağız. Bu betik, ortamdanDB_USER, DB_PASSWORDveDB_DSNdeğerlerini okur ve sürücü modunu ve veritabanı sürümünü yazdırır.Betik oluşturma
Aşağıdaki kodu
01_check_connection.pyolarak kaydedin.Betik çalıştırma
Bağlantı kontrolünü çalıştırın.
Beklenen çıktı
Çıktı, bağlantının çalıştığını ve sürücünün Thin modunda olduğunu doğrulamalıdır.
Artık yerel veritabanının, servis adının, kimlik bilgilerinin ve Python sürücüsünün, herhangi bir vektör tablosu oluşturmadan önce çalıştığını biliyoruz.
Adım 2: Manuel vektörlerle sezgi geliştirin
Gömme modellerini tanıtmadan önce, üzerinde düşünebileceğimiz üç küçük vektör depolayalım.
array.array("f", values)çağrısı,python-oracledbtarafından birVECTOR(..., FLOAT32)sütununa bağlanabilen 32 bit kayan noktalı bir dizi oluşturur.Şekil 2. Manuel vektörler ve Öklidyen mesafe.
Manuel örnek Öklidyen mesafeyi kullanır. Elma vektörü, sorgu vektörü ile eşleştiği için 0.0000 mesafesine sahiptir. Muz vektörü ikinci sırada yer alır; çünkü sqrt((1.0 - 0.9)^2 + (0.0 - 0.1)^2 + (0.0 - 0.0)^2) = 0.1414.
Betik oluşturma
Aşağıdaki kodu
02_manual_vectors.pyolarak kaydedin.Betik çalıştırma
Manuel vektör betiğini çalıştırın.
Beklenen çıktı
Özdeş vektör, 0.0000 mesafesiyle ilk sırada görünür; yakın olan muz vektörü ikinci sırada yer alır.
Vektör aramasının temel fikri budur: satırlar, bir sorgu vektörüne olan matematiksel yakınlığa göre sıralanır. Gömme modelleri daha büyük vektörler üretecek, ancak veritabanı davranışı aynı kalacaktır.
Adım 3: Anlamsal documents tablosunu oluşturun
Artık vektörlerin çalıştığını bildiğimize göre gerçek bir uygulama tarzı tablo oluşturacağız. Önemli ayrıntı, vektör sütunu boyutunun gömme modelinin çıktı boyutuyla eşleşmesi gerektiğidir.
Boyut, tablo sözleşmesinin bir parçasıdır. Bir gömme modeli 1.536 sayı döndürüyorsa, sütun
VECTOR(1536, FLOAT32)olarak tanımlanmalıdır.Daha sonra çıktı uzunluğu farklı olan bir modele geçersek, eklemelerin ve sorguların uyumlu vektörler kullanmaya devam etmesi için vektör sütununu yeniden oluşturmamız veya taşıma yapmamız gerekir.
DDL, vektör boyutunu normal bir SQL bağ değişkeni olarak bağlayamadığı için, betik
EMBEDDING_DIMdeğerini CREATE TABLE ifadesinde kullanmadan önce tamsayıya çevirir.Betik oluşturma
Aşağıdaki kodu
03_create_documents_table.pyolarak kaydedin.Betik çalıştırma
Tablo oluşturma betiğini çalıştırın.
Beklenen çıktı
Çıktı, yapılandırılmış gömme modelini ve vektör boyutunu göstermelidir.
Veritabanı-yalnız bölümü tamamladık. Oracle Database yerelde vektörleri depolayıp karşılaştırabilir; şimdi el yazısı vektörleri metinden üretilmiş gömelerle değiştireceğiz.
Adım 4: Gömme modeli boyutunu doğrulayın
Gömüleri eklemeden önce, gömme modelinden bir vektör isteyecek ve uzunluğunu doğrulayacağız. Bu, en yaygın vektör tablo hatasını önler:
VECTORsütunu boyutuyla eşleşmeyen bir vektör eklemek.Bir gömme modeli yalnızca bir metin-sayılara dönüştürücü değildir; uygulamanın anlam uzayını tanımlar. Bu demodaki tüm belge ve sorgu gömüleri aynı modelden gelmelidir.
Tek bir model kullanmak, küçük bir mesafenin, şeklen benzer görünen ilgisiz iki vektörden ziyade benzer anlamı temsil etmesini sağlar. Model, vektör uzunluğunu da belirler; bu yüzden veri yüklemeden önce döndürülen boyutu kontrol ederiz.
Betik oluşturma
Aşağıdaki kodu
04_check_embedding_dimension.pyolarak kaydedin.Betik çalıştırma
Boyut kontrolünü çalıştırın.
Beklenen çıktı
Varsayılan model ve boyut için çıktı şöyle görünmelidir.
Daha sonra farklı bir gömme modeli seçersek,
EMBEDDING_MODELdeğerini güncellemeli,EMBEDDING_DIMdeğerini dönen vektör uzunluğuna ayarlamalı vedocumentstablosunu yeniden oluşturmalıyız.Adım 5: Belge gömülerini üretin ve ekleyin
Şimdi küçük, kendi içinde tutarlı bir veri kümesi için gömüler üretecek ve bunları Oracle Database’e ekleyeceğiz.
Her bir gömme,
FLOAT32vektör sütunuyla eşleşmesi için bağlamadan öncearray.array("f", embedding)biçimine dönüştürülür.Betik oluşturma
Aşağıdaki kodu
05_insert_embeddings.pyolarak kaydedin.Betik çalıştırma
Ekleme betiğini çalıştırın.
Beklenen çıktı
Satır sayısı, satır içindeki yedi
documentsile eşleşmelidir.Artık Oracle Database’te metin ve gömüler birlikte depolanıyor. Alakasız gitar ve çorba ile ilgili
documentsgirdileri dahil edildi; böylece arama sonuçlarında bariz yakın ve uzak eşleşmeler olacak.Adım 6: Anlamsal bir arama sorgusu çalıştırın
Şimdi doğal dilli bir sorguyu gömecek ve depolanan belge gömeleriyle karşılaştıracağız. Bu betik, vektör büyüklüğünden ziyade yön odaklı olduğu için metin gömülerinde yaygın olan kosinüs mesafesini kullanır.
Anlamsal arama için, sorgu
documentsile aynı gömme modelinden geçer. SQL’in İngilizce cümleyi doğrudan anlamasını istemiyoruz.Cümlenin bir vektöre dönüştürülmesini gömme modelinden istiyoruz; ardından Oracle Database’ten depolanan vektörleri o sorgu vektörüne olan mesafelerine göre sıralamasını istiyoruz.
Betik oluşturma
Aşağıdaki kodu
06_semantic_search.pyolarak kaydedin.Betik çalıştırma
Anlamsal arama betiğini çalıştırın.
Beklenen çıktı
Gömme modeli değiştiğinde tam sıralamalar ve mesafeler farklı olabilir. Ancak Oracle AI Vector Search, anlamsal arama, Python veritabanı kodu ve vektör indeksleme ile ilgili
documentsgirdileri üst sıralarda yer almalıdır.Bu eğitimdeki Öklidyen ve kosinüs mesafesi sorgularında daha küçük değerler daha yakın eşleşmeleri gösterir.
Nokta çarpımı, özellikle büyüklüğün veya normalize vektörlerin önemli olduğu birçok vektör arama iş akışında başka bir faydalı karşılaştırma yaklaşımıdır; ancak puan yönü ve normalizasyon dikkatli ele alınmalıdır.
Sonuç yorumunu basit tutmak için çalıştırılabilir kodu Öklidyen ve kosinüs mesafesi üzerinde tutacağız.
Gelecekteki bir uygulamada gömüleri kendimiz normalize edersek, depolanan belge gömelerini ve sorgu gömelerini tutarlı şekilde normalize etmemiz gerekir; aksi takdirde mesafeler ve sıralamalar değişebilir.
Adım 7: Anlamsal aramayı ifade eşleşmesiyle karşılaştırın
Anlamsal arama faydalıdır; çünkü belgenin aynı ifadeyi birebir içermesini gerektirmez.
Anlamsal sorguyu basit bir birebir ifade koşulu ile karşılaştıralım.
Bu bir tam metin arama motoru demosu değildir; bu, birebir eşleşme ile anlam temelli sıralama arasındaki farkı görünür kılan küçük bir SQL karşılaştırmasıdır.
Betik oluşturma
Aşağıdaki kodu
07_semantic_vs_keyword.pyolarak kaydedin.Betik çalıştırma
Karşılaştırma betiğini çalıştırın.
Beklenen çıktı
Anlamsal arama, birebir anahtar ifade bulunmasa bile ilgili
documentsgirdilerini döndürmelidir.Geleneksel SQL koşulları hâlâ filtreler, birleştirmeler, izinler ve birebir eşleşmeler için önemlidir. Vektör arama, bir uygulamanın anlamsal getirmeye ihtiyaç duyduğunda ilişkisel verilerle birleştirebileceğimiz anlam temelli bir sıralama sinyali ekler.
Adım 8: Bir vektör indeksi ekleyin ve doğrulayın
Son olarak bir vektör indeksi oluşturacak ve Oracle Database’in onu demo şemasına ait geçerli bir indeks olarak raporladığını doğrulayacağız.
Bu adım indeks oluşturma iş akışını gösterir; küçücük veri kümemiz anlamlı performans sonuçları çıkarmak için yeterli değildir.
İndeks olmadan Oracle Database, sorgu vektörünü her depolanan vektörle birebir karşılaştırabilir. Bu yaklaşım küçük veri kümeleri için uygundur ve öğrenirken kullanışlıdır.
Daha büyük veri kümelerinde, yaklaşık vektör indeksleri arama alanını azaltarak sorguların hızlı dönmesini sağlarken yakın komşuları bulmaya devam eder.
İndeks ailesini, veri boyutu, gecikme hedefleri, hatırlama gereksinimleri, bellek bütçesi ve vektörlerin değişim sıklığını göz önüne alarak seçin.
Sondaki sorgu, indeks oluşturulduktan sonra da anlamsal aramanın sonuç döndürdüğünü doğrular.
Bu eğitimde, indeks oluşturmayı sorgu planı davranışıyla değil şema metaverisiyle doğruladığımız için burada EXPLAIN PLAN veya DBMS_XPLAN kullanmayacağız.
Betik oluşturma
Aşağıdaki kodu
08_create_vector_index.pyolarak kaydedin.Betik çalıştırma
Indeks betiğini çalıştırın.
Beklenen çıktı
Çıktı
DOCUMENT_EMBEDDING_IDXiçin bir satır içermeli,INDEX_TYPEVECTOR,STATUSiseVALIDolmalıdır.USER_INDEXES, indeksin var olduğunu ve geçerli olduğunu doğrular. Belirli bir sorgunun indeksi kullandığını kanıtlamaz ve bu eğitim doğrulama yöntemi olarak yürütme planı çıktısını kullanmaz.Üretim iş yükülerinde, gerçekçi veri hacmi, sorgu desenleri ve performans hedefleriyle test yaparız.
Oracle AI Vector Search İpuçları ve Sorun Giderme
Veritabanı konteyneri hâlâ başlatılıyor
Başlatma tamamlanana kadar bekleyin, ardından
docker logs oracle-free-26ai-vectorkomutunu tekrar çalıştırın. Python’unlocalhost:1521/FREEPDB1adresine bağlanabilmesi için veritabanının hazır olması gerekir.1521 portu zaten kullanımda
Çakışan yerel servisi durdurun veya Docker port eşlemesini değiştirin. Ana makine portu değişirse
DB_DSNdeğerini güncelleyin.Veritabanı bağlantısı başarısız
DB_USER, DB_PASSWORDveDB_DSNdeğerlerini doğrulayın. DSN içindeFREEPDB1kullanın ve uygulama betiklerinivector_demoolarak bağlayın;SYS, SYSTEMveyaPDBADMINolarak değil.Gömme API anahtarı eksik
Adımlar 1-3 yalnızca veritabanıyla ilgilidir. Adımlar 4-8
OPENAI_API_KEYgerektirir ve API maliyetlerine yol açabilir.Bir vektör boyutu eşleşmiyor
04_check_embedding_dimension.pybetiğini çalıştırın,EMBEDDING_DIMdeğerini güncelleyin,03_create_documents_table.pybetiğini yeniden çalıştırın ve gömüleri05_insert_embeddings.pyile yeniden yükleyin.Bir vektör bağlama başarısız
Her
FLOAT32vektör bağlamanınarray.array("f", values)kullandığından emin olun. Eğitim, bunu manuel vektörler, depolanan belge gömeleri ve sorgu gömeleri için kullanır.Anlamsal sıralamalar örnekten farklı
Bu beklenir. Gömme sağlayıcıları modelleri güncelleyebilir ve kayan nokta mesafeleri çalıştırmalar arasında değişebilir.
Vektör indeks oluşturma başarısız
documentstablosunun var olduğunu,vector_demoşemasının ona sahip olduğunu veDOCUMENT_EMBEDDING_IDXöğesinin yarım kalmış bir çalıştırmadan kalmadığını doğrulayın.Üretime hazırlık
Bağlantı havuzu için
oracledb.create_pool()kullanın, gerçekçi veri hacimlerini kıyaslayın, güvenlik ve gizli yönetimini gözden geçirin ve indeksleri gerçek sorgu desenlerine göre ayarlayın.Konteyneri durdurun ve kaldırın
Eğitim tamamlandığında yerel konteyneri durdurup kaldırın.
Sonuç
Oracle AI Vector Search, Oracle Database Free 26ai ve Python ile yerel bir anlamsal arama iş akışı oluşturduk.
El yazısı
VECTOR(3, FLOAT32)değerleriyle başladık,array.array("f", values)ile model tarafından üretilen gömüleri ekledik,VECTOR_DISTANCE()ile benzerdocumentsgirdilerini sorguladık, anlamsal getiriyi basit bir birebir ifade koşuluyla karşılaştırdık ve bir vektör indeksiniUSER_INDEXESüzerinden doğruladık.Bu yaklaşım, gömülerin ilişkisel verilerin yanında bulunması ve yerel iş akışı için ayrı bir vektör veritabanı eklemeden SQL’de görünür depolama ve arama istememiz durumunda iyi uyum sağlar.
Demo kasten küçük tutulmuştur: ilke yapıtaşlarını öğretir, üretim ölçeğini değil. Daha büyük uygulamalar gerçekçi verilerle kıyaslamalı, güvenlik ve ayrıcalıkları gözden geçirmeli, bağlantı havuzlaması kullanmalı ve indeksleme tercihlerini gerçek sorgu desenleri altında doğrulamalıdır.
Sonrasında uygulamayı şu kaynaklarla derinleştirebiliriz: