Ana içeriğe atla

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.
Güncel 3 Eki 2026  · 15 dk. oku

Yapay Zeka ile Keşfedin

ChatGPTClaudePerplexity

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.

Oracle AI Vector Search flow

Ş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-python

Oracle Database Free 26ai’yi yerel konteyner imajıyla başlatın.

docker run --name oracle-free-26ai-vector \
   --detach \
   --publish 1521:1521 \
   --publish 5500:5500 \
   --shm-size=1g \
   --env ORACLE_PWD="replace-with-a-strong-password" \
   container-registry.oracle.com/database/free:23.26.1.0-lite-amd64

Konteyner günlüklerini kontrol edin ve veritabanı başlatmanın tamamlandığını bildirene kadar bekleyin.

docker logs oracle-free-26ai-vector

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.
 docker exec -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
 SQL

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.

python -m venv .venv
 source .venv/bin/activate
 python -m pip install --upgrade pip

Demoda kullanılan Python paketlerini kurun.

python -m pip install oracledb openai

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.

export DB_USER="vector_demo"
 export DB_PASSWORD="replace-with-vector-demo-password"
 export DB_DSN="localhost:1521/FREEPDB1"
 export OPENAI_API_KEY="replace-with-your-api-key"
 export EMBEDDING_MODEL="text-embedding-3-small"
 export EMBEDDING_DIM="1536"

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def main():
 	# 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()

Betik çalıştırma

Bağlantı kontrolünü çalıştırın.

python 01_check_connection.py

Beklenen çıktı

Çı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.0

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.

Three-dimensional apple, banana, and car vectors showing Euclidean distance from the apple query vector.

Ş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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def main():
 	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) in enumerate(cursor, start=1):
                 print(f"{rank}. {label:<6} distance={float(distance):.4f}")


 if __name__ == "__main__":
 	main()

Betik çalıştırma

Manuel vektör betiğini çalıştırın.

python 02_manual_vectors.py

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.

Created manual_vectors.
 Inserted 3 manual vectors.

 Nearest manual vectors:
 1. apple  distance=0.0000
 2. banana distance=0.1414

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def configured_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


 def main():
 	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()

Betik çalıştırma

Tablo oluşturma betiğini çalıştırın.

python 03_create_documents_table.py

Beklenen çıktı

Çıktı, yapılandırılmış gömme modelini ve vektör boyutunu göstermelidir.

Embedding model: text-embedding-3-small
 Embedding dimension: 1536
 Recreated documents table.

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


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def configured_dimension():
 	try:
         return int(required_env("EMBEDDING_DIM"))
 	except ValueError as exc:
         raise SystemExit("EMBEDDING_DIM must be an integer.") from exc


 def main():
     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()

Betik çalıştırma

Boyut kontrolünü çalıştırın.

python 04_check_embedding_dimension.py

Beklenen çıktı

Varsayılan model ve boyut için çıktı şöyle görünmelidir.

Embedding model: text-embedding-3-small
 Returned embedding length: 1536
 Configured EMBEDDING_DIM: 1536
 Dimension check passed.

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def configured_dimension():
 	try:
         return int(required_env("EMBEDDING_DIM"))
 	except ValueError as exc:
         raise SystemExit("EMBEDDING_DIM must be an integer.") from exc


 def main():
 	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 in sorted(
             response.data,
             key=lambda item: item.index,
     	)
 	]

 	if any(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 in zip(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()

Betik çalıştırma

Ekleme betiğini çalıştırın.

python 05_insert_embeddings.py

Beklenen çıktı

Satır sayısı, satır içindeki yedi documents ile eşleşmelidir.

Embedding model: text-embedding-3-small
 Generated embeddings for 7 documents.
 Inserted 7 documents.
 documents row count: 7

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def main():
 	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()

 	if not 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) in enumerate(rows, start=1):
         print(f"{rank}. {title}")
         print(f"   distance: {float(distance):.6f}")
         print(f"   {content[:90]}...")


 if __name__ == "__main__":
 	main()

Betik çalıştırma

Anlamsal arama betiğini çalıştırın.

python 06_semantic_search.py

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 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...

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def main():
 	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) in enumerate(semantic_rows, start=1):
         print(f"{rank}. {title}")
         print(f"   distance: {float(distance):.6f}")

     print("\nKeyword results:")
 	if keyword_rows:
     	for rank, (title,) in enumerate(keyword_rows, start=1):
             print(f"{rank}. {title}")
 	else:
         print("0 exact phrase matches")


 if __name__ == "__main__":
 	main()

Betik çalıştırma

Karşılaştırma betiğini çalıştırın.

python 07_semantic_vs_keyword.py

Beklenen çıktı

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 matches

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"}


 def required_env(name):
 	value = os.getenv(name)
 	if not value:
         raise SystemExit(f"Set {name} before running this script.")
 	return value


 def main():
 	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()

 	if not 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()

Betik çalıştırma

Indeks betiğini çalıştırın.

python 08_create_vector_index.py

Beklenen çıktı

Çıktı DOCUMENT_EMBEDDING_IDX için bir satır içermeli, INDEX_TYPE VECTOR, 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.

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.

docker stop oracle-free-26ai-vector
docker rm oracle-free-26ai-vector

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 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:

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's photo
Author
Mark Nelson
LinkedIn

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.

Konular
Yapay Zeka
Python

En İyi DataCamp Kursları

Kurs

Oracle SQL'ye Giriş

4 sa
18.5K
SQL temelleri, verilerin toplanması, birleştirilmesi ve özelleştirilmesi dahil olmak üzere Oracle SQL becerilerinizi geliştirin.
Ayrıntıları GörüntüleRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

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.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

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!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Devamını GörDevamını Gör