﻿
{"id":27975,"date":"2025-08-03T20:41:05","date_gmt":"2025-08-03T20:41:05","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=27975"},"modified":"2025-08-03T20:41:05","modified_gmt":"2025-08-03T20:41:05","slug":"sql-server-2025-vector-search","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/sql-server-2025-vector-search\/","title":{"rendered":"SQL Server 2025 &#8211; Vector Search"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>SQL Server 2025, yapay zek\u00e2 \u00e7a\u011f\u0131n\u0131n dinamiklerine uyum sa\u011flamak ad\u0131na kapsaml\u0131 bir d\u00f6n\u00fc\u015f\u00fcm ge\u00e7irerek, veritaban\u0131 motoruna yerle\u015fik vekt\u00f6r arama <em>(native <a href=\"https:\/\/www.gencayyildiz.com\/blog\/vector-search-nedir-teorik-degerlendirmede-bulunalim\/\" target=\"_blank\">vector search<\/a>)<\/em> yetene\u011fi kazand\u0131rm\u0131\u015ft\u0131r. Bu stratejik ad\u0131m SQL Server&#8217;\u0131 geleneksel veri y\u00f6nteminin \u00f6tesine ta\u015f\u0131yarak, yapay zek\u00e2ya \u00f6zg\u00fc semantik arama <em>(semantic search)<\/em> altyap\u0131s\u0131n\u0131 do\u011fal bir bile\u015fen haline getirmi\u015ftir. B\u00f6ylece metin, g\u00f6rsel ve ses gibi yap\u0131land\u0131r\u0131lmam\u0131\u015f veri t\u00fcrlerinde, yaln\u0131zca anahtar kelime e\u015fle\u015fmesine dayal\u0131 sorgularla s\u0131n\u0131rl\u0131 kalmaks\u0131z\u0131n, anlamsal benzerlik temelinde daha derinlikli ve ba\u011flamsal sorgulamalar m\u00fcmk\u00fcn hale gelmi\u015ftir.<\/p>\n<p>Anlayaca\u011f\u0131n\u0131z bu yenilik, yaln\u0131zca teknik bir g\u00fcncelleme de\u011fil, ayn\u0131 zamanda bilgi eri\u015fiminin, araman\u0131n ve analiz s\u00fcre\u00e7lerinin temel do\u011fas\u0131n\u0131 yeniden \u015fekillendiren ve yapay zek\u00e2 destekli uygulamalar geli\u015ftirirken ili\u015fkisel veritaban\u0131 olan SQL Server&#8217;\u0131 bir vekt\u00f6r depolama katman\u0131 olarak da kullanmam\u0131za olanak tan\u0131yan d\u00f6n\u00fc\u015f\u00fcmsel s\u00fcrecin ta kendisidir.<\/p>\n<p>\u015eimdi gelin SQL Server&#8217;\u0131n vector search ile ilgili bizlere sa\u011flad\u0131\u011f\u0131 olanaklar\u0131 inceleyelim ve bir yandan da pratiksel olarak Python dili e\u015fli\u011finde bu olanaklar\u0131 nas\u0131l kullanabilece\u011fimizi hep birlikte tecr\u00fcbe edelim&#8230;<\/p>\n<h3 style=\"color:#4886be;\">Vekt\u00f6r Veri T\u00fcr\u00fc &#8211; <code>Vector(n)<\/code><\/h3>\n<p>SQL Server 2025, art\u0131k <code>Vector(n)<\/code> ad\u0131nda yeni bir veri t\u00fcr\u00fc sunmaktad\u0131r. Bu t\u00fcr sayesinde metin, g\u00f6rsel, ses veya di\u011fer yap\u0131land\u0131r\u0131lmam\u0131\u015f verilerden elde edilen embedding vekt\u00f6rler do\u011frudan tablolar i\u00e7erisinde sakalanabilmektedir.<\/p>\n<p>Vekt\u00f6rler, tipik olarak float \u00f6\u011felerden olu\u015fan s\u0131ral\u0131 dizilerdir. SQL Server, vector veri t\u00fcr\u00fc sayesinde bu dizileri optimize edilmi\u015f ikili (binary) formatta saklamaktad\u0131r.<\/p>\n<h3 style=\"color:#4886be;\">Semantik Arama Fonksiyonlar\u0131<\/h3>\n<p>SQL Server 2025, klasik anahtar kelime tabanl\u0131 sorgulaman\u0131n \u00f6tesine ge\u00e7erek, anlamsal yak\u0131nl\u0131\u011fa dayal\u0131 (semantic similarity search) yapma olana\u011f\u0131 tan\u0131maktad\u0131r. Bu do\u011frultuda a\u015fa\u011f\u0131daki algoritmalar\u0131 benimseyen fonksiyonlar sunmaktad\u0131r;<\/p>\n<ul style=\"font-size:16px;\">\n<li><strong><em>Exact k-NN Aramas\u0131 &#8211; <code style=\"color:green;\">VECTOR_DISTANCE('cosine' | 'euclidean' | 'dot', v1, v2)<\/code><\/em><\/strong><br \/>\n<blockquote><p>\u0130ki vekt\u00f6r aras\u0131ndaki benzerli\u011fi \u00f6l\u00e7er.<\/p><\/blockquote>\n<p>Exact k-NN, verilen bir sorgu \u00f6rne\u011fi i\u00e7in veri k\u00fcmesindeki t\u00fcm noktalar\u0131 tarar ve ger\u00e7ek anlamda en yak\u0131n n adet kom\u015fuyu bularak getirir. Bu i\u015flem i\u00e7in SQL Server, <em>exact nearest neighbor (ENN)<\/em> ya da k-NN aramas\u0131n\u0131\/algoritmas\u0131n\u0131 kullanmaktad\u0131r. Bu y\u00f6ntem sayesinde tam do\u011fruluk sa\u011flanabilir ancak her vekt\u00f6rle mesafe hesapland\u0131\u011f\u0131 i\u00e7in b\u00fcy\u00fck veri setlerinde ister istemez ciddi maliyet s\u00f6z konusu olabilmektedir.<\/p>\n<p>\u00d6rnek kullan\u0131m;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @v1 VECTOR(2) = '&#x5B;1,1]';\r\nDECLARE @v2 VECTOR(2) = '&#x5B;-1,-1]';\r\nSELECT \r\n    VECTOR_DISTANCE('euclidean', @v1, @v2) AS euclidean,\r\n    VECTOR_DISTANCE('cosine', @v1, @v2) AS cosine,\r\n    VECTOR_DISTANCE('dot', @v1, @v2) AS negative_dot_product;\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelersek e\u011fer iki boyutlu <em>@v1<\/em> ve <em>@v2<\/em> vekt\u00f6rleri \u00fczerinden <code>VECTOR_DISTANCE<\/code> fonksiyonu ile \u00f6klid(euclidean) mesafesi, kosin\u00fcs(cosine) mesafesi ve nokta(dot) \u00e7arp\u0131m\u0131 mesafesi hesaplanmakta ve her bir metri\u011fe g\u00f6re hesaplanan mesafe a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi float olarak d\u00f6nd\u00fcr\u00fclmektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"307\" height=\"40\" class=\"aligncenter size-full wp-image-27979\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search.png 307w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-300x39.png 300w\" sizes=\"auto, (max-width: 307px) 100vw, 307px\" \/><\/a><em>Bu hesaplamalar ne anlama geliyor?<\/em> diye sorarsan\u0131z olay\u0131n pekte matematiksel tekni\u011fine girmeksizin \u015f\u00f6yle \u00f6zetlemekte fayda g\u00f6rmekteyim;<\/p>\n<p><strong><em style=\"color:purple;\">\u00d6klid mesafesi<\/em><\/strong>, iki vekt\u00f6r aras\u0131ndaki &#8216;d\u00fcz \u00e7izgi&#8217; mesafesini hesaplar. Haliyle \u00e7\u0131kt\u0131 olarak elde edilen say\u0131sal de\u011fer vekt\u00f6rlerin uzayda birbirlerine ne kadar uzakta  oldu\u011funu ifade eder. B\u00f6ylece, bu de\u011fer b\u00fcy\u00fcd\u00fck\u00e7e vekt\u00f6rlerin daha farkl\u0131 oldu\u011fu yorumunda bulunulabilir.<\/p>\n<p><strong><em style=\"color:purple;\">Kosin\u00fcs mesafesi<\/em><\/strong>, iki vekt\u00f6r aras\u0131ndaki a\u00e7\u0131sal fark\u0131 \u00f6l\u00e7mekte ve bu \u00f6l\u00e7\u00fcm neticesinde 0 ile 2 aras\u0131nda bir de\u011fer \u00fcretilerek benzerlik analizinde bulunulabilmektedir. 2 de\u011feri, vekt\u00f6rlerin tamamen z\u0131t y\u00f6nlerde (aralar\u0131ndaki a\u00e7\u0131 180 derece) oldu\u011funu g\u00f6stermektedir. Haliyle \u00f6rnekte verdi\u011fimiz <em>[1,1]<\/em> ve <em>[-1,-1]<\/em> vekt\u00f6rlerinin de birbirine tamamen ters y\u00f6nl\u00fc oldu\u011fu zahiren a\u015fikar olsa da kosin\u00fcs \u00f6l\u00e7\u00fcm\u00fc neticesinde de bu do\u011frulanmaktad\u0131r. Uzun laf\u0131n k\u0131sas\u0131 kosin\u00fcs mesafesinde \u00f6l\u00e7\u00fcn neticesi 0&#8217;a yakla\u015ft\u0131k\u00e7a benzerlik artmakta, bilakis 2&#8217;ye yakla\u015ft\u0131k\u00e7a azalmaktad\u0131r.<\/p>\n<p><strong><em style=\"color:purple;\">Nokta \u00e7arp\u0131m\u0131<\/em><\/strong> ise vekt\u00f6rlerin y\u00f6nelimine ve b\u00fcy\u00fckl\u00fc\u011f\u00fcne ba\u011fl\u0131 bir benzerlik \u00f6l\u00e7\u00fcs\u00fcd\u00fcr. Esas\u0131nda iki vekt\u00f6r\u00fcn elemanlar\u0131n\u0131n kar\u015f\u0131l\u0131kl\u0131 \u00e7arp\u0131mlar\u0131n\u0131n toplaml\u0131d\u0131r. Elde edilen netice ne kadar b\u00fcy\u00fck ve pozitifse, vekt\u00f6rler o kadar benzerdir. Ancak SQL Server&#8217;da nokta \u00e7arp\u0131m\u0131n\u0131n negatifi al\u0131nd\u0131\u011f\u0131 i\u00e7in bu mant\u0131\u011f\u0131n tam tersi ge\u00e7erlidir. Yani d\u00fc\u015f\u00fck veya negatif de\u011fer benzerlik g\u00f6sterirken, y\u00fcksek ve pozitif de\u011fer ise fark\u0131 g\u00f6sterecektir.<\/p>\n<p>Ayr\u0131ca a\u015fa\u011f\u0131daki \u00f6rnek vekt\u00f6r tabanl\u0131 benzerlik aramas\u0131n\u0131 da inceleyelim;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @v AS VECTOR(512);\r\nSELECT TOP 1 @v = embedding FROM embeddings \r\n\r\nSELECT TOP(10) \r\n    VECTOR_DISTANCE('cosine', @v, embedding) AS distance \r\nFROM embeddings ORDER BY distance\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki sorguyu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-1.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"160\" height=\"38\" class=\"aligncenter size-full wp-image-27980\" \/><\/a>de\u011ferinin \u00fcretildi\u011fini g\u00f6zlemlemekteyiz. Bu da yakla\u015f\u0131k 0.0000000596 de\u011ferine yani 0 (s\u0131f\u0131r)&#8217;a yak\u0131n diyebiliriz. Ee haliyle kosin\u00fcs \u00f6l\u00e7\u00fcm\u00fcne g\u00f6re bu vekt\u00f6rler ayn\u0131 vekt\u00f6rlerdir diyebiliriz.<\/p>\n<blockquote><p>Tavsiye odur ki, k-NN aramas\u0131 50.000 (elli bin) vekt\u00f6rden az veriye uygulanmal\u0131d\u0131r. Daha b\u00fcy\u00fck verilerde ise tabloda arama yap\u0131lacak verinin kapsam\u0131n\u0131n \u00f6nceden daralt\u0131lmas\u0131 gerekmektedir. Evet, k-NN aramas\u0131, do\u011fruluk a\u00e7\u0131s\u0131ndan en y\u00fcksek garantiyi sa\u011flamaktad\u0131r sa\u011flamas\u0131na ancak yapay zek\u00e2 sistemlerinde, embedded edilmi\u015f veriler bir t\u00fcr soyutlama oldu\u011fundan %100 do\u011frulu\u011fa da ihtiya\u00e7 duyulmamaktad\u0131r. Bundan kaynakl\u0131 k\u00fc\u00e7\u00fck veri setlerinde bu yakla\u015f\u0131m etkiliyken, b\u00fcy\u00fck kurumsal \u00e7al\u0131\u015fmalarda ise daha verimli yakla\u015f\u0131mlar hesaba kat\u0131lmal\u0131d\u0131r.<\/p><\/blockquote>\n<\/li>\n<li><strong><em>Approximate k-NN | ANN Algoritmas\u0131 &#8211; <code style=\"color:green;\">VECTOR_SEARCH(...)<\/code><\/em><\/strong><br \/>\n<blockquote><p>ANN indekslerini kullanarak y\u00fcksek hacimli veri i\u00e7inde en benzer kay\u0131tlar\u0131 getirir.<\/p><\/blockquote>\n<p>Yukar\u0131daki sat\u0131rlarda k-NN aramas\u0131 i\u00e7in, t\u00fcm veri noktalar\u0131yla mesafe hesaplad\u0131\u011f\u0131ndan ve kesin sonu\u00e7lar verdi\u011finden ancak bunun b\u00fcy\u00fck veri setleri i\u00e7in yava\u015f olabilece\u011finden bahsetmi\u015ftik. ANN aramas\u0131 ise kesin sonu\u00e7lar yerine <u>yakla\u015f\u0131k (approximate)<\/u> en yak\u0131n kom\u015fular\u0131 bulmak i\u00e7in optimizasyonlar sunmakta ve b\u00f6ylece sorgulama h\u0131z\u0131n\u0131 art\u0131rmaktad\u0131r. <\/p>\n<p>SQL Server 2025&#8217;te <code>VECTOR_SEARCH<\/code> fonksiyonu ile ANN aramalar\u0131 ger\u00e7ekle\u015ftirilebilmektedir. Bu fonksiyon, vekt\u00f6r indekslerini kullanarak yakla\u015f\u0131k en yak\u0131n kom\u015fular\u0131 bulmaktad\u0131r. Bu davran\u0131\u015f\u0131 sayesinde \u00f6zellikle milyonlarca vekt\u00f6r i\u00e7eren veri setlerinde k-NN aramas\u0131na k\u0131yasla \u00e7ok daha h\u0131zl\u0131 arama ger\u00e7ekle\u015ftirebilmektedir.<\/p>\n<p>Bunun i\u00e7in, ANN algoritmas\u0131n\u0131 yukar\u0131daki k-NN algoritmas\u0131nda kulland\u0131\u011f\u0131m\u0131z sorguyla ili\u015fkilendirerek \u00f6rneklendirirsek e\u011fer;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @v AS VECTOR(512);\r\nSELECT TOP 1 @v = embedding FROM embeddings \r\n \r\nSELECT TOP(10) \r\n    VECTOR_DISTANCE('cosine', @v, embedding) AS distance \r\nFROM embeddings ORDER BY distance\r\n<\/pre>\n<\/div>\n<p>Bu sorguda, tam olarak k-NN aramas\u0131 yap\u0131lmaktad\u0131r ve t\u00fcm vekt\u00f6rlerle kosin\u00fcs mesafesi hesaplanmaktad\u0131r. Bundan kaynakl\u0131 da \u00f6nceki sat\u0131rlarda konu\u015ftu\u011fumuz gibi b\u00fcy\u00fck veri setlerinde yava\u015fl\u0131k ve y\u00fcksek maliyet s\u00f6z konusu olabilmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDECLARE @v AS VECTOR(512);\r\nSELECT TOP 1 @v = embedding FROM embeddings \r\n \r\nSELECT TOP(10) \r\n    VECTOR_DISTANCE('cosine', @v, embedding) AS distance \r\nFROM embeddings WHERE VECTOR_SEARCH(@v, embedding, 'cosine', 10)\r\n<\/pre>\n<\/div>\n<p>Bu sorguda ise vekt\u00f6r indeksleri kullan\u0131larak yakla\u015f\u0131k en yak\u0131n 10 vekt\u00f6r bulunmakta ve ard\u0131ndan k-NN aramas\u0131 yap\u0131lmaktad\u0131r. B\u00f6ylece t\u00fcm tabloyu taramak yerine indeks tabanl\u0131 bir arama yap\u0131lmakta ve b\u00f6ylece \u00e7ok daha h\u0131zl\u0131 davran\u0131\u015f sergilenmektedir.<\/p>\n<blockquote><p>ANN aramas\u0131, vekt\u00f6rler aras\u0131ndaki yak\u0131nl\u0131k hesaplar\u0131n\u0131 grafik tabanl\u0131 veriler \u00fczerinden gezerek yapmaktad\u0131rlar. Bu sayede; i\u015flemci ve bellek kullan\u0131m\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr, y\u00fcksek sorgu ba\u015f\u0131na i\u015flem (QPS) ve d\u00fc\u015f\u00fck gecikme sa\u011flar.<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<h3 style=\"color:#4886be;\">AI \u0130le Entegrasyon: Embedding \u00dcretimi<\/h3>\n<p>SQL Server 2025, Azure OpenAI, OpenAI API ve Ollama gibi yerel LLM \u00e7\u00f6z\u00fcmleriyle do\u011frudan entegre olarak vekt\u00f6r verisi olu\u015fturabilmektedir. Bu entegrasyon sayesinde, T-SQL \u00fczerinden <code>AI_GENERATE_EMBEDDINGS<\/code> fonksiyonu kullan\u0131larak kullan\u0131c\u0131dan gelen metinler otomatik olarak vekt\u00f6r temsillerine (embeddings) d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir.<\/p>\n<p>Bunun d\u0131\u015f\u0131nda tabi ki de <code>AI_GENERATE_EMBEDDINGS<\/code> fonksiyonu yerine \u00f6zel embedding \u00e7al\u0131\u015fmalar\u0131 ger\u00e7ekle\u015ftirmek de m\u00fcmk\u00fcnd\u00fcr. Ancak bu, SQL Server&#8217;\u0131n do\u011frudan sa\u011flad\u0131\u011f\u0131 entegrasyonlar d\u0131\u015f\u0131nda ek geli\u015ftirme ve yap\u0131land\u0131rma gerektirebilmektedir. \u00d6zellikle i\u00e7eri\u011fimizin devam\u0131nda pratiksel olarak sunaca\u011f\u0131m\u0131z <code>SentenceTransformer('all-MiniLM-L6-v2')<\/code> gibi bir model e\u015fli\u011finde bu durumu \u00f6rneklendiriyor olaca\u011f\u0131z.<\/p>\n<h3 style=\"color:#4886be;\">Yaz\u0131l\u0131mc\u0131 Bak\u0131\u015f A\u00e7\u0131s\u0131<\/h3>\n<p>Vekt\u00f6r indeksleri, ili\u015fkisel indekslerden farkl\u0131d\u0131rlar. Biliyorsunuz ki biz yaz\u0131l\u0131mc\u0131lar, h\u0131z ve do\u011fruluk aras\u0131nda bir denge kurmak mecburiyetindeyiz. E\u011fer sorgular d\u00fc\u015f\u00fck gecikme gerektiriyorsa <em>Yakla\u015f\u0131k En Yak\u0131n Kom\u015fu (ANN)<\/em> indeksleri ideal bir se\u00e7im olacakt\u0131r. Ancak kesinlik kritik \u00f6nem ta\u015f\u0131yorsa ve vekt\u00f6r say\u0131s\u0131 makul bir seviyedeyse, <em>Tam En Yak\u0131n Kom\u015fu (ENN)<\/em> daha uygun bir tercih olacakt\u0131r. Yani gerekti\u011fi yerde maliyet g\u00f6zden \u00e7\u0131kar\u0131lmal\u0131d\u0131r.<\/p>\n<p>SQL Server&#8217;\u0131n vekt\u00f6r arama yetenekleri, ili\u015fkisel veritaban\u0131 sorgular\u0131yla entegre \u00e7al\u0131\u015fabildi\u011fi i\u00e7in g\u00fc\u00e7l\u00fc bir avantaj sa\u011flamaktad\u0131r. Bu sayede, hem embedded edilmi\u015f vekt\u00f6rleri hem de yap\u0131sal verileri ayn\u0131 anda i\u015fleyen \u00e7ok boyutlu sorgular olu\u015fturulabilir. Bu \u00f6zellik, <em>Retrieval-Augmented Generation (RAG)<\/em> mimarilerinde yaln\u0131zca anlamsal benzerliklere dayal\u0131 sonu\u00e7lar de\u011fil, ayn\u0131 zamanda ba\u011flamsal filtrelerle (\u00f6rne\u011fin; tarih, kullan\u0131c\u0131 grubu veya eri\u015fim d\u00fczeyi) zenginle\u015ftirilmi\u015f, hedef odakl\u0131 bilgi getirimi sa\u011flamaktad\u0131r. B\u00f6ylece RAG sistemleri, daha anlaml\u0131, kontroll\u00fc ve alana \u00f6zg\u00fc yan\u0131tlar \u00fcretebilme kapasitesine eri\u015febilir.<\/p>\n<h3 style=\"color:#4886be;\">Pratiksel Olarak Vector Embedding ve Vector Search \u00c7al\u0131\u015fmas\u0131<\/h3>\n<p>Evet&#8230; Art\u0131k s\u0131ra, vector embedding ve vector search davran\u0131\u015flar\u0131n\u0131 pratiksel olarak uygulamaya geldi diyebiliriz. Tabi t\u00fcm bu \u00e7al\u0131\u015fmada veritaban\u0131 olarak SQL Server 2025&#8217;i tercih edece\u011fiz. Ancak s\u00fcre\u00e7te SQL Server&#8217;\u0131n yapay zek\u00e2 ile ilgili getirisi olan AI ile bir entegrasyon ger\u00e7ekle\u015ftirmeyecek ve t\u00fcm embedding ve search \u00e7al\u0131\u015fmas\u0131n\u0131 \u00f6zelle\u015ftirilmi\u015f bir vaziyette y\u00fcr\u00fctece\u011fiz. Ee haliyle <code>AI_GENERATE_EMBEDDINGS<\/code> fonksiyonunu bu makalede deneyimlemeyecek, o konuyu belki ba\u015fka bir i\u00e7eri\u011fe yahut sizlere b\u0131rakm\u0131\u015f olaca\u011f\u0131z.<\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde \u00f6nergeleri s\u0131ral\u0131 bir \u015fekilde seyrederek pratik \u00e7al\u0131\u015fmaya e\u015flik edebilirsiniz:<\/p>\n<ol style=\"font-size:16px;\">\n<li>\n<h5>Temel Kurulumlar<\/h5>\n<p>\u0130lk olarak <em>SQL Server 2025<\/em> ile birlikte uygulamalarla SQL Server veritaban\u0131 aras\u0131nda ileti\u015fim kurmam\u0131z\u0131 sa\u011flayacak olan <em>ODBC Driver<\/em> gibi temel kurulumlar\u0131n ger\u00e7ekle\u015ftirilmesi gerekmektedir. Bunun i\u00e7in a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde ilgili altyap\u0131y\u0131 sa\u011flayabilirsiniz.<\/p>\n<ul>\n<li><em><u>SQL Server 2025<\/u><\/em><br \/>\nSQL Server 2025&#8217;i bu talimat neticeisnde Docker container olarak aya\u011fa kald\u0131r\u0131n:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndocker run -e &quot;ACCEPT_EULA=Y&quot; -e &quot;MSSQL_SA_PASSWORD=Test123!&quot; -p 1433:1433 --name sqlserver2025 -d mcr.microsoft.com\/mssql\/server:2025-latest\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>ODBC Driver<\/u><\/em><br \/>\nODBC Driver&#8217;\u0131 bu linkten indirip, y\u00fckleyin:<br \/>\n<a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/connect\/odbc\/download-odbc-driver-for-sql-server?view=sql-server-ver17\" target=\"_blank\">https:\/\/learn.microsoft.com\/en-us\/sql\/connect\/odbc\/download-odbc-driver-for-sql-server?view=sql-server-ver17<\/a>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<h5>Proje Dosyalar\u0131n\u0131n ve Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h5>\n<p>Ard\u0131ndan proje dosyalar\u0131n\u0131n ve ortam\u0131n\u0131n haz\u0131rlanmas\u0131 gerekmektedir.<\/p>\n<ul>\n<li><em><u>Proje Klas\u00f6r\u00fcn\u00fcn Olu\u015fturulmas\u0131<\/u><\/em><br \/>\nUygun bir yerde istedi\u011finiz isimde bir klas\u00f6r olu\u015fturun. (Benim tercih etti\u011fim isim : SQL_Server_2025_Vector_Embedding_And_Vector_Search)\n<\/li>\n<li><em><u>requirements.txt&#8217;nin Olu\u015fturulmas\u0131<\/u><\/em><br \/>\nOlu\u015fturulan klas\u00f6rde <em>requirements.txt<\/em> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7eri\u011fine a\u015fa\u011f\u0131daki k\u00fct\u00fcphane isimlerini yaz\u0131n:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nflask\r\npyodbc\r\nsentence-transformers\r\nPillow\r\ntorch\r\nnumpy \r\n<\/pre>\n<\/div>\n<p><em>&#8216;Nedir bu k\u00fct\u00fcphanelerin i\u015flevselli\u011fi?&#8217;<\/em> diye sorarsan\u0131z h\u0131zl\u0131ca \u00f6zetleyelim;<\/p>\n<ul style=\"font-size:12px;\">\n<li><strong><em>flask<\/em><\/strong> : Hafif bir Python web framework&#8217;\u00fcd\u00fcr. Web uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><em>pyodbc<\/em><\/strong> : Python&#8217;dan ODBC veritabanlar\u0131na ba\u011flanmak ve veri sorgulamak i\u00e7in kullan\u0131lan bir k\u00fct\u00fcphanedir.<\/li>\n<li><strong><em>sentence-transformers<\/em><\/strong> : C\u00fcmle ve metinleri vekt\u00f6r temsillerine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131lan bir NLP k\u00fct\u00fcphanesidir.<\/li>\n<li><strong><em>Pillow<\/em><\/strong> : Python&#8217;da g\u00f6r\u00fcnt\u00fc i\u015fleme ve manip\u00fclasyonu i\u00e7in kullan\u0131lan bir k\u00fct\u00fcphanedir.<\/li>\n<li><strong><em>torch<\/em><\/strong> : Derin \u00f6\u011frenme modelleri olu\u015fturmak ve e\u011fitmek i\u00e7in kullan\u0131lan bir makine \u00f6\u011frenimi k\u00fct\u00fcphanesidir.<\/li>\n<li><strong><em>numpy <\/em><\/strong> : Bilimsel hesaplamalar i\u00e7in \u00e7ok boyutlu diziler ve matematiksel i\u015flemler sa\u011flayan bir k\u00fct\u00fcphanedir.<\/li>\n<\/ul>\n<\/li>\n<li><em><u>Python Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n Kurulumu<\/u><\/em><br \/>\n\u0130lgili dizinde <em>requirements.txt<\/em> i\u00e7erisinde belirtilen Python k\u00fct\u00fcphanelerini a\u015fa\u011f\u0131daki talimat e\u015fli\u011finde kurun:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npip install -r requirements.txt\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>app.py Dosyas\u0131n\u0131n Olu\u015fturulmas\u0131<\/u><\/em><br \/>\nVector embedding ve vector search i\u015flemlerinin Python ile y\u00fcr\u00fct\u00fclece\u011fi <em>app.py<\/em> isimli dosyay\u0131 olu\u015fturun.\n<\/li>\n<\/ul>\n<li>\n<h5>Uygulaman\u0131n Geli\u015ftirilmesi<\/h5>\n<p>Art\u0131k uygulamay\u0131 geli\u015ftirebiliriz. Bunun i\u00e7in <em>app.py<\/em> dosyas\u0131nda, hem vector embedding hem de vector search \u00e7al\u0131\u015fmalar\u0131n\u0131n yan\u0131nda bir yandan da bu \u00e7al\u0131\u015fmalar\u0131 test edebilmemizi sa\u011flayacak olan API \u00e7al\u0131\u015fmalar\u0131n\u0131 da Python&#8217;da y\u00fcr\u00fctmemiz gerekecektir. Buradaki ilerleme mutlak s\u0131ral\u0131 takip gerektirece\u011fi i\u00e7in her bir \u00f6nergenin ba\u015f\u0131na koydu\u011fum ad\u0131m numaras\u0131n\u0131 ard\u0131\u015f\u0131k takip etmeye \u00f6zen g\u00f6stermenize dikkatinizi \u00e7ekerim.<\/p>\n<ul>\n<li><em><u>1-) Gerekli K\u00fct\u00fcphanelerin Import Edilmesi<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Gerekli k\u00fct\u00fcphaneler import ediliyor\r\nfrom flask import Flask, request, jsonify\r\nfrom sentence_transformers import SentenceTransformer\r\nfrom PIL import Image\r\nimport io\r\nimport base64\r\nimport pyodbc\r\nimport numpy as np\r\nimport torch\r\nimport os\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>2-) Temel Flask Nesnesinin Olu\u015fturulmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Flask uygulamas\u0131 ba\u015flat\u0131l\u0131yor\r\napp = Flask(__name__)\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>3-) Metin ve G\u00f6rsel Veriler \u0130\u00e7in Modellerin Y\u00fcklenmesi<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Metin verileri i\u00e7in embedding modeli y\u00fckleniyor\r\ntext_model = SentenceTransformer('all-MiniLM-L6-v2')\r\n\r\n# G\u00f6rsel veriler i\u00e7in CLIP tabanl\u0131 embedding modeli y\u00fckleniyor\r\nclip_model = SentenceTransformer('clip-ViT-B-32')\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>4-) SQL Server Veritaban\u0131na Ba\u011flant\u0131 Kurulmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# SQL Server veritaban\u0131na ba\u011flant\u0131 kuruluyor\r\ntry:\r\n    # Direkt Example veritaban\u0131na ba\u011flan\r\n    conn = pyodbc.connect(\r\n        'DRIVER={ODBC Driver 17 for SQL Server};'\r\n        'SERVER=localhost,1433;'\r\n        'DATABASE=Example;'\r\n        'UID=sa;'\r\n        'PWD=Test123!;'\r\n        'TrustServerCertificate=yes;'\r\n    )\r\n    cursor = conn.cursor()\r\n    print(&quot;Example veritaban\u0131na ba\u011flant\u0131 ba\u015far\u0131l\u0131!&quot;)\r\n    \r\nexcept Exception as e:\r\n    print(f&quot;SQL Server ba\u011flant\u0131s\u0131 hatas\u0131: {e}&quot;)\r\n    print(&quot;L\u00fctfen SQL Server'\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve Example veritaban\u0131n\u0131n mevcut oldu\u011fundan emin olun!&quot;)\r\n    raise\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>5-) Embeddings Tablosunun Olu\u015fturulmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Embeddings tablosu olu\u015fturuluyor\r\ndef create_table():\r\n    try:\r\n        # Tablo var m\u0131 kontrol et\r\n        cursor.execute(&quot;&quot;&quot;\r\n        IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='embeddings' and xtype='U')\r\n        BEGIN\r\n            CREATE TABLE embeddings (\r\n                id INT IDENTITY(1,1) PRIMARY KEY,\r\n                data_type NVARCHAR(10),\r\n                original_data NVARCHAR(MAX),\r\n                embedding VECTOR(512),  -- SQL Server 2025 VECTOR t\u00fcr\u00fc - CLIP modeli 512 boyutlu\r\n                original_data_type NVARCHAR(20),\r\n                file_path NVARCHAR(255),\r\n                label NVARCHAR(100)\r\n            )\r\n            PRINT 'VECTOR embeddings tablosu olu\u015fturuldu!'\r\n        END\r\n        ELSE\r\n        BEGIN\r\n            PRINT 'Embeddings tablosu zaten mevcut!'\r\n        END\r\n        &quot;&quot;&quot;)\r\n        \r\n        conn.commit()\r\n    except Exception as e:\r\n        print(f&quot;Tablo olu\u015fturulurken hata: {e}&quot;)\r\n        raise\r\n\r\n# Tabloyu olu\u015ftur\r\ncreate_table()\r\n<\/pre>\n<\/div>\n<p>Vector embedding s\u00fcrecinde verileri tutaca\u011f\u0131m\u0131z tablo &#8216;Example&#8217; isimli veritaban\u0131 i\u00e7erisine var m\u0131 yok mu kontrol edilmekte, yoksa e\u011fer olu\u015fturulmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca burada <em>embedding<\/em> kolonunun <em>VECTOR(512)<\/em> t\u00fcr\u00fcnden oldu\u011funa dikkatinizi \u00e7ekerim. \u0130\u015fte bu, SQL Server 2025 ile hayat\u0131m\u0131za girmi\u015f olan vector t\u00fcr\u00fcn\u00fc ilk deneyimlememiz \ud83d\ude42 G\u00fcn\u00fcn sonunda bu kolon<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-2.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"175\" height=\"27\" class=\"aligncenter size-full wp-image-27982\" \/><\/a>g\u00f6rselde de g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere vector t\u00fcr\u00fcnden olu\u015fturulacakt\u0131r.\n<\/li>\n<li><em><u>6-) embed Endpoint&#8217;inin Haz\u0131rlanmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# \/embed endpoint'i\r\n@app.route('\/embed', methods=&#x5B;'POST'])\r\ndef embed():\r\n    try:\r\n        data_type = request.form.get('type')\r\n        file_path = None\r\n        original_data_type = data_type\r\n        label = request.form.get('label')\r\n\r\n        if data_type == 'text':\r\n            text = request.form.get('data')\r\n            if not text:\r\n                return jsonify({'error': 'Metin verisi eksik!'}), 400\r\n\r\n            try:\r\n                embedding = text_model.encode(text)\r\n            except Exception as e:\r\n                return jsonify({'error': f'Embedding al\u0131n\u0131rken hata: {e}'}), 500\r\n\r\n            original_data = text\r\n            file_path = None\r\n\r\n        elif data_type == 'image':\r\n            if 'data' not in request.files:\r\n                return jsonify({'error': 'G\u00f6rsel dosyas\u0131 eksik!'}), 400\r\n\r\n            image_file = request.files&#x5B;'data']\r\n            try:\r\n                image = Image.open(image_file.stream).convert('RGB')\r\n            except Exception as e:\r\n                return jsonify({'error': f'G\u00f6rsel okunamad\u0131: {e}'}), 400\r\n\r\n            save_dir = 'uploaded_images'\r\n            os.makedirs(save_dir, exist_ok=True)\r\n            image_filename = image_file.filename\r\n            save_path = os.path.join(save_dir, image_filename)\r\n            try:\r\n                image.save(save_path)\r\n            except Exception as e:\r\n                return jsonify({'error': f'G\u00f6rsel kaydedilemedi: {e}'}), 500\r\n\r\n            file_path = save_path\r\n\r\n            try:\r\n                embedding = clip_model.encode(image)\r\n            except Exception as e:\r\n                return jsonify({'error': f'Embedding al\u0131n\u0131rken hata: {e}'}), 500\r\n\r\n            try:\r\n                buffered = io.BytesIO()\r\n                image.save(buffered, format=&quot;PNG&quot;)\r\n                original_data = base64.b64encode(buffered.getvalue()).decode()\r\n            except Exception as e:\r\n                return jsonify({'error': f'Base64 d\u00f6n\u00fc\u015ft\u00fcrme hatas\u0131: {e}'}), 500\r\n\r\n        else:\r\n            return jsonify({'error': 'type must be text or image'}), 400\r\n\r\n        # Embedding'i haz\u0131rla\r\n        try:\r\n            embedding_array = embedding.astype(np.float32)\r\n            embedding_str = f&quot;&#x5B;{','.join(map(str, embedding_array))}]&quot;\r\n        except Exception as e:\r\n            return jsonify({'error': f'Embedding vectore d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcrken hata: {e}'}), 500\r\n\r\n        # Veritaban\u0131na ekle\r\n        try:\r\n            # \u00d6nce tablo t\u00fcr\u00fcn\u00fc kontrol et\r\n            cursor.execute(&quot;SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'embeddings' AND COLUMN_NAME = 'embedding'&quot;)\r\n            column_type = cursor.fetchone()&#x5B;0]\r\n            \r\n            if column_type == 'vector':\r\n                # Vector t\u00fcr\u00fc i\u00e7in do\u011frudan SQL kullan\r\n                embedding_values = ','.join(map(str, embedding.astype(np.float32)))\r\n                sql = f&quot;INSERT INTO embeddings (data_type, original_data, embedding, original_data_type, file_path, label) VALUES (?, ?, CAST('&#x5B;{embedding_values}]' AS VECTOR(512)), ?, ?, ?)&quot;\r\n                cursor.execute(sql, data_type, original_data, original_data_type, file_path, label)\r\n            else:\r\n                # VARBINARY kullan\r\n                embedding_bytes = embedding.astype(np.float32).tobytes()\r\n                cursor.execute(\r\n                    &quot;INSERT INTO embeddings (data_type, original_data, embedding, original_data_type, file_path, label) VALUES (?, ?, ?, ?, ?, ?)&quot;,\r\n                    data_type, original_data, embedding_bytes, original_data_type, file_path, label\r\n                )\r\n        except Exception as e:\r\n            return jsonify({'error': f'Veritaban\u0131na ekleme hatas\u0131: {e}'}), 500\r\n        \r\n        conn.commit()\r\n        return jsonify({'status': 'success'})\r\n\r\n    except Exception as e:\r\n        return jsonify({'error': f'Bilinmeyen hata: {e}'}), 500\r\n<\/pre>\n<\/div>\n<p>Burada dikkat ederseniz kullan\u0131c\u0131dan POST request&#8217;i ile gelecek olan verinin i\u00e7eri\u011fine bak\u0131lmakta ve yap\u0131lacak davran\u0131\u015f bu i\u00e7eri\u011fe g\u00f6re belirlenmektedir. 10 ile 21. sat\u0131r aral\u0131\u011f\u0131nda gelen metinsel veriler analiz edilerek, embedding edilmektedir. 23 ile 54. sat\u0131r aral\u0131\u011f\u0131nda ise g\u00f6rsel veriler analiz edilmekte, embedding edilebilmesi i\u00e7in \u00f6nce RGB&#8217;ye d\u00f6n\u00fc\u015ft\u00fcr\u00fclmekte ve \u00f6ylece embedding edilmektedir. Ayr\u0131ca fiziksel olarak hangi g\u00f6rselin oldu\u011funu da takip edebilmemiz i\u00e7in &#8216;uploaded_images&#8217; isimli klas\u00f6re g\u00f6rselin orjinal hali de eklenmektedir.<\/p>\n<p>60 ile 64. sat\u0131r aral\u0131\u011f\u0131nda embedding edilmi\u015f olan veriler vekt\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fclmekte ve 67 ile 83. sat\u0131r aral\u0131\u011f\u0131nda ise elde edilen vekt\u00f6r veritaban\u0131na eklenmektedir.\n<\/li>\n<li><em><u>7-) Vector Search Endpoint&#8217;inin Haz\u0131rlanmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# \/vector_search endpoint'i\r\n@app.route('\/vector_search', methods=&#x5B;'POST'])\r\ndef vector_search():\r\n    try:\r\n        data_type = request.form.get('type')\r\n        \r\n        if data_type == 'text':\r\n            text = request.form.get('data')\r\n            if not text:\r\n                return jsonify({'error': 'Metin verisi eksik!'}), 400\r\n            query_embedding = text_model.encode(text)\r\n        elif data_type == 'image':\r\n            if 'data' not in request.files:\r\n                return jsonify({'error': 'G\u00f6rsel dosyas\u0131 eksik!'}), 400\r\n            image_file = request.files&#x5B;'data']\r\n            image = Image.open(image_file.stream).convert('RGB')\r\n            query_embedding = clip_model.encode(image)\r\n        else:\r\n            return jsonify({'error': 'type must be text or image'}), 400\r\n\r\n        # T\u00fcm embedding'leri \u00e7ek\r\n        cursor.execute(&quot;SELECT id, data_type, original_data, embedding, original_data_type, file_path, label FROM embeddings&quot;)\r\n        results = cursor.fetchall()\r\n\r\n        if not results:\r\n            return jsonify({'error': 'Hi\u00e7 embedding bulunamad\u0131.'}), 404\r\n\r\n        # Tablo t\u00fcr\u00fcn\u00fc kontrol et\r\n        cursor.execute(&quot;SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'embeddings' AND COLUMN_NAME = 'embedding'&quot;)\r\n        column_type = cursor.fetchone()&#x5B;0]\r\n\r\n        # En benzer sonucu bul\r\n        best_match = None\r\n        best_similarity = -1\r\n\r\n        print(f&quot;Toplam {len(results)} embedding bulundu&quot;)\r\n        print(f&quot;Tablo t\u00fcr\u00fc: {column_type}&quot;)\r\n\r\n        for row in results:\r\n            db_id, db_data_type, db_original_data, db_embedding, db_original_data_type, db_file_path, db_label = row\r\n            \r\n            try:\r\n                if column_type == 'vector':\r\n                    # Vector t\u00fcr\u00fc i\u00e7in Python'da cosine similarity kullan\r\n                    # Vector'\u00fc string'den parse et\r\n                    vector_str = str(db_embedding)\r\n                    # &#x5B;1.0,2.0,3.0] format\u0131ndan array'e \u00e7evir\r\n                    vector_values = vector_str.strip('&#x5B;]').split(',')\r\n                    db_embedding_array = np.array(&#x5B;float(x.strip()) for x in vector_values], dtype=np.float32)\r\n                    \r\n                    # Cosine similarity hesapla\r\n                    similarity = np.dot(query_embedding, db_embedding_array) \/ (np.linalg.norm(query_embedding) * np.linalg.norm(db_embedding_array))\r\n                    print(f&quot;ID {db_id} vector cosine similarity: {similarity}&quot;)\r\n                else:\r\n                    # VARBINARY i\u00e7in cosine similarity\r\n                    db_embedding_array = np.frombuffer(db_embedding, dtype=np.float32)\r\n                    similarity = np.dot(query_embedding, db_embedding_array) \/ (np.linalg.norm(query_embedding) * np.linalg.norm(db_embedding_array))\r\n                    print(f&quot;ID {db_id} varbinary cosine similarity: {similarity}&quot;)\r\n                \r\n                # Threshold'u d\u00fc\u015f\u00fcr - 0.1'den b\u00fcy\u00fck olanlar\u0131 kabul et\r\n                if similarity &gt; 0.1 and similarity &gt; best_similarity:\r\n                    best_similarity = similarity\r\n                    best_match = {\r\n                        'id': db_id,\r\n                        #'data_type': db_data_type,\r\n                        #'original_data': db_original_data,\r\n                        #'original_data_type': db_original_data_type,\r\n                        'file_path': db_file_path,\r\n                        'label': db_label,\r\n                        'similarity': float(similarity)\r\n                    }\r\n            except Exception as e:\r\n                print(f&quot;Similarity hesaplama hatas\u0131 ID {db_id}: {e}&quot;)\r\n                continue\r\n\r\n        print(f&quot;En iyi similarity: {best_similarity}&quot;)\r\n        print(f&quot;En iyi match: {best_match}&quot;)\r\n\r\n        if best_match:\r\n            return jsonify(best_match)\r\n        else:\r\n            return jsonify({'error': 'Benzer sonu\u00e7 bulunamad\u0131.'}), 404\r\n\r\n    except Exception as e:\r\n        return jsonify({'error': f'Hata: {e}'}), 500\r\n\r\n<\/pre>\n<\/div>\n<p>Yine POST edilerek gelen request \u00fczerindeki verilere g\u00f6re vector search&#8217;\u00fcn nas\u0131l yap\u0131laca\u011f\u0131 kararla\u015ft\u0131r\u0131lmakta ve davran\u0131\u015f ona g\u00f6re olu\u015fturulmaktad\u0131r. 22 ile 23. sat\u0131r aral\u0131\u011f\u0131nda <em>embeddings<\/em> tablosundaki t\u00fcm veriler elde edilmekte ve 43 ile 53. sat\u0131r aral\u0131\u011f\u0131nda vector t\u00fcr\u00fcne g\u00f6re kosin\u00fcs \u00f6l\u00e7e\u011fi e\u015fli\u011finde vector search ger\u00e7ekle\u015ftirilmektedir. Ayr\u0131ca 56 ile 58. sat\u0131r aral\u0131\u011f\u0131nda ise kolonun t\u00fcr\u00fc vector yerine &#8216;VARBINARY&#8217; olma ihtimaline kar\u015f\u0131n, bu duruma uygun vector search i\u015flemi ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>61 ile 71. sat\u0131r aral\u0131\u011f\u0131nda ise yap\u0131lan vector search neticesinde elde edilen vekt\u00f6rlerden benzerlik (similarity) de\u011feri 0.1&#8217;in \u00fcst\u00fc olanlar ayr\u0131lmakta ve b\u00f6ylece istenen verideki hassasiyet e\u015fi\u011fi manuel olarak taraf\u0131m\u0131zca biraz daha optimize edilerek, verinin aranana yak\u0131nl\u0131k ihtimali daha da art\u0131r\u0131lmaktad\u0131r.\n<\/li>\n<li><em><u>8 -) Debug Endpoint&#8217;inin Olu\u015fturulmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Debug endpoint'i - embedding say\u0131s\u0131n\u0131 kontrol et\r\n@app.route('\/debug', methods=&#x5B;'GET'])\r\ndef debug():\r\n    try:\r\n        cursor.execute(&quot;SELECT COUNT(*) FROM embeddings&quot;)\r\n        count = cursor.fetchone()&#x5B;0]\r\n        \r\n        cursor.execute(&quot;SELECT id, data_type, label FROM embeddings&quot;)\r\n        embeddings = cursor.fetchall()\r\n        \r\n        return jsonify({\r\n            'total_embeddings': count,\r\n            'embeddings': &#x5B;{'id': row&#x5B;0], 'type': row&#x5B;1], 'label': row&#x5B;2]} for row in embeddings]\r\n        })\r\n    except Exception as e:\r\n        return jsonify({'error': f'Debug hatas\u0131: {e}'}), 500\r\n\r\n<\/pre>\n<\/div>\n<p>Ka\u00e7 verinin embedded edildi\u011fine dair istatisti\u011fi h\u0131zl\u0131ca edinebilmek i\u00e7in bu endpoint geli\u015ftirilmi\u015ftir.\n<\/li>\n<li><em><u>9-) Flask Uygulamas\u0131n\u0131n Ba\u015flat\u0131lmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Flask uygulamas\u0131 ba\u015flat\u0131l\u0131yor\r\nif __name__ == '__main__':\r\n    app.run(debug=True) \r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<p>\u0130\u015fte bu kadar \ud83d\ude42 Uygulamay\u0131 art\u0131k olmas\u0131 gerekti\u011fi gibi geli\u015ftirmi\u015f bulunuyoruz. \u015eimdi teste ge\u00e7ebiliriz.\n<\/li>\n<li>\n<h5>Test Edilmesi<\/h5>\n<p>Hem vector embedding hem de vector search i\u00e7in testlerin ger\u00e7ekle\u015ftirilmesi gerekmektedir.<\/p>\n<ul>\n<li><em><u>Uygulaman\u0131n Aya\u011fa Kald\u0131r\u0131lmas\u0131<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npython app.py\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>Vector Embedding Testi<\/u><\/em><br \/>\nG\u00f6rsel veriler i\u00e7in;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncurl -X POST -F &quot;type=image&quot; -F &quot;data=@g\u00f6rsel.path.jpg&quot; -F &quot;label=g\u00f6rsel veri ismi&quot; http:\/\/localhost:5000\/embed\r\n<\/pre>\n<\/div>\n<p>Birka\u00e7 g\u00f6rsel veri \u00fczerinden \u00f6rnek embedding talebinin \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi olacakt\u0131r;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"1781\" height=\"460\" class=\"aligncenter size-full wp-image-27983\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3.png 1781w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3-300x77.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3-1024x264.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3-768x198.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-3-1536x397.png 1536w\" sizes=\"auto, (max-width: 1781px) 100vw, 1781px\" \/><\/a>Metinsel veriler i\u00e7in;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncurl -X POST -F &quot;type=text&quot; -F &quot;data=metinsel veri&quot; -F &quot;label=metinsel veri ismi&quot; http:\/\/localhost:5000\/embed\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em><u>Vector Search Testi<\/u><\/em><br \/>\nG\u00f6rsel veriler i\u00e7in;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncurl -X POST -F &quot;type=image&quot; -F &quot;data=@g\u00f6rsel.path.jpg&quot; http:\/\/localhost:5000\/vector_search\r\n<\/pre>\n<\/div>\n<p>G\u00f6rsel veriler \u00fczerinden \u00f6rnek vector search ise a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"1645\" height=\"450\" class=\"aligncenter size-full wp-image-27984\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4.png 1645w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4-300x82.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4-1024x280.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4-768x210.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-4-1536x420.png 1536w\" sizes=\"auto, (max-width: 1645px) 100vw, 1645px\" \/><\/a>Metinsel veriler i\u00e7in;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncurl -X POST -F &quot;type=text&quot; -F &quot;data=metinsel veri&quot; http:\/\/localhost:5000\/vector_search\r\n<\/pre>\n<\/div>\n<p>T\u00fcm \u00e7al\u0131\u015fmalar neticesinde veritaban\u0131n\u0131n son halide a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"1200\" height=\"200\" class=\"aligncenter size-full wp-image-27985\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5.png 1200w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5-300x50.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5-1024x171.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-5-768x128.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a>\n<\/li>\n<li><em><u>Debug Testi<\/u><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhttp:\/\/localhost:5000\/debug\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-6.png\" alt=\"SQL Server 2025 - Vector Search\" width=\"445\" height=\"693\" class=\"aligncenter size-full wp-image-27986\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-6.png 445w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/08\/SQL-Server-2025-Vector-Search-6-193x300.png 193w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\" \/><\/a>\n<\/li>\n<\/ul>\n<\/li>\n<\/li>\n<\/ol>\n<p>Ve b\u00f6ylece pratiksel \u00e7al\u0131\u015fmam\u0131z\u0131 da tamamlam\u0131\u015f ve SQL Server 2025 e\u015fli\u011finde hem vector embedding&#8217;i, hem vector search&#8217;\u00fc hem de bir yandan SQL Server 2025&#8217;in <code>vector<\/code> t\u00fcr\u00fcn\u00fc hep birlikte deneyimlemi\u015f olduk. Art\u0131k teoride kalan son dokunu\u015flara d\u00f6nebilir ve azar azar i\u00e7eri\u011fimizi nihayete erdirebiliriz.<\/p>\n<h3 style=\"color:#4886be;\">Teknik Avantajlar ve Fark Yaratan \u00d6zellikler<\/h3>\n<p>SQL Server&#8217;\u0131n vekt\u00f6r arama yetenekleri, vekt\u00f6rel arama ile ili\u015fsek veriler aras\u0131nda k\u00f6pr\u00fc kuran g\u00fc\u00e7l\u00fc bir altyap\u0131ya sahiptir. \u015e\u00f6yle ki; <code>vector<\/code> veri t\u00fcr\u00fcn\u00fc kullanarak, \u00f6rnekte de deneyimledi\u011fimiz gibi embedding edilmi\u015f verilerle yap\u0131land\u0131r\u0131lm\u0131\u015f verileri ayn\u0131 tabloda saklama olana\u011f\u0131 s\u00f6z konusudur. B\u00f6ylece tek bir veritaban\u0131 ile AI destekli uygulama geli\u015ftirme biz yaz\u0131l\u0131mc\u0131lar a\u00e7\u0131s\u0131ndan olduk\u00e7a kolayla\u015fabilmektedir.<\/p>\n<p>Ayr\u0131ca bu teknolojinin sundu\u011fu avantajlar, \u00f6zellikle veri mahremiyetine duyarl\u0131 projeler i\u00e7in dikkat \u00e7ekicidir. Ek bir araca gerek kalmaks\u0131z\u0131n yapay zek\u00e2 yeteneklerini do\u011frudan T-SQL komutlar\u0131 ile y\u00f6netebilir, geleneksel SQL uzmanl\u0131\u011f\u0131na gerek olmaks\u0131z\u0131n semantic search yapabilir ve t\u00fcm s\u00fcre\u00e7ler tamamen on-prem ortam\u0131nda ger\u00e7ekle\u015febilir.<\/p>\n<p>Nihai olarak;<\/p>\n<p>SQL Server 2025&#8217;in vekt\u00f6r arama \u00f6zelli\u011fi, yapay zek\u00e2 \u00e7a\u011f\u0131n\u0131n ihtiya\u00e7 duydu\u011fu semantik d\u00fczeyde sorgulama yeteneklerini kurumsal veritabanlar\u0131na entegre ederek devrimsel bir s\u0131\u00e7rama sunmaktad\u0131r. Bu \u00f6zellik, yaln\u0131zca teknolojik olarak de\u011fil, ayn\u0131 zamanda veriye eri\u015fim, yorumlama ve karar verme bi\u00e7imimiz \u00fczerinde de k\u00f6kl\u00fc de\u011fi\u015fiklikler yaratma potansiyeline sahiptir.<\/p>\n<p>Fark\u0131ndaysan\u0131z, gelece\u011fi in\u015fa eden sistemler art\u0131k sadece veriye de\u011fil, verinin anlam\u0131na da eri\u015fmek mecburiyetindedir. \u0130\u015fte SQL Server, tam da bu noktada 2025 ile varl\u0131k g\u00f6stermektedir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub adresinden eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/SQL_Server_2025_Vector_Embedding_And_Vector_Search\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/SQL_Server_2025_Vector_Embedding_And_Vector_Search<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, SQL Server 2025, yapay zek\u00e2 \u00e7a\u011f\u0131n\u0131n dinamiklerine uyum sa\u011flamak ad\u0131na kapsaml\u0131 bir d\u00f6n\u00fc\u015f\u00fcm ge\u00e7irerek, veritaban\u0131 motoruna yerle\u015fik vekt\u00f6r arama (native vector search) yetene\u011fi kazand\u0131rm\u0131\u015ft\u0131r. Bu stratejik ad\u0131m SQL Server&#8217;\u0131 geleneksel veri y\u00f6nteminin \u00f6tesine&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":27987,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5222,1082,5418,5220],"tags":[5429,5427,5426,5425,5422,5424,5420,5305,5304,5421,245,5419,5394,5423,5428],"class_list":["post-27975","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-llm","category-sql-server","category-sql-server-2025","category-yapay-zeka-ai","tag-ai_generate_embeddings","tag-ann-algoritmasi","tag-approximate-k-nn","tag-enn","tag-exact-k-nn","tag-exact-nearest-neighbor","tag-native-vector-search","tag-rag","tag-retrieval-augmented-generation","tag-semantic-search","tag-sql-server","tag-sql-server-2025","tag-vector-search","tag-vector_distance","tag-vector_search"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=27975"}],"version-history":[{"count":5,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27975\/revisions"}],"predecessor-version":[{"id":27988,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27975\/revisions\/27988"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/27987"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=27975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=27975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=27975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}