﻿
{"id":28319,"date":"2026-01-25T21:21:56","date_gmt":"2026-01-25T21:21:56","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28319"},"modified":"2026-01-25T21:21:56","modified_gmt":"2026-01-25T21:21:56","slug":"ragretrieval-augmented-generation-nedir-nasil-uygulanir-detaylica-inceleyelim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/ragretrieval-augmented-generation-nedir-nasil-uygulanir-detaylica-inceleyelim\/","title":{"rendered":"RAG(Retrieval-Augmented Generation) Nedir? Nas\u0131l Uygulan\u0131r? Detayl\u0131ca \u0130nceleyelim&#8230;"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, AI modellerini dura\u011fan e\u011fitim verilerinin \u00f6tesine ta\u015f\u0131yarak, g\u00fcncel verilere eri\u015fmesini sa\u011flayan RAG (Retrieval-Augmented Generation) davran\u0131\u015f\u0131n\u0131 mercek alt\u0131na alacak ve nedir, ne de\u011fildir tam teferruatl\u0131 bir de\u011ferlendirmede bulunuyor olaca\u011f\u0131z.<\/p>\n<h4>RAG(Retrieval-Augmented Generation) Nedir?<\/h4>\n<p>RAG; bir LLM&#8217;in, gelen soruya cevap vermeden \u00f6nce, kendi ezberiyle cevap vermesi yerine, harici ve g\u00fcvenilir bir bilgi\/veri kayna\u011f\u0131ndan<span style=\"font-size:14px;\">(PDF&#8217;ler, veri tabanlar\u0131, web sayfalar\u0131 vs.)<\/span> ilgili bilgileri bulup, bu bilgiler \u0131\u015f\u0131\u011f\u0131nda cevap \u00fcretmesi davran\u0131\u015f\u0131d\u0131r.<\/p>\n<p>RAG&#8217;\u0131n ak\u0131\u015f mant\u0131\u011f\u0131 olduk\u00e7a basittir:<\/p>\n<div style=\"\n    max-width:700px;\n    margin:30px auto;\n    padding:20px;\n    background:#f9fafb;\n    border:1px solid #e5e7eb;\n    border-radius:12px;\n    font-family:Arial, sans-serif;\n    color:#111827;text-align:center;\n\"><\/p>\n<h3 style=\"\n        margin-top:0;\n        text-align:center;\n        color:#1f2937;\n    \"><br \/>\n        \ud83d\udd04 RAG Ak\u0131\u015f Mant\u0131\u011f\u0131<br \/>\n    <\/h3>\n<div style=\"\n        padding:12px 16px;\n        background:#e0f2fe;\n        border-left:5px solid #0284c7;\n        border-radius:6px;\n        margin-bottom:12px;\n    \">        <strong>Sorgu (Query)<\/strong><br \/>\nKullan\u0131c\u0131 bir soru sorar.\n    <\/div>\n<div style=\"text-align:center; font-size:20px; margin:8px 0;\">\u2b07\ufe0f<\/div>\n<div style=\"\n        padding:12px 16px;\n        background:#ecfeff;\n        border-left:5px solid #0891b2;\n        border-radius:6px;\n        margin-bottom:12px;\n    \">        <strong>Arama (Retrieval)<\/strong><br \/>\nSistem, \u015firket i\u00e7i belgelerinizde veya g\u00fcncel verilerde bu soruyla ilgili par\u00e7alar\u0131 arar.\n    <\/div>\n<div style=\"text-align:center; font-size:20px; margin:8px 0;\">\u2b07\ufe0f<\/div>\n<div style=\"\n        padding:12px 16px;\n        background:#f0fdf4;\n        border-left:5px solid #16a34a;\n        border-radius:6px;\n        margin-bottom:12px;\n    \">        <strong>Zenginle\u015ftirme (Augmentation)<\/strong><br \/>\nBulunan bu ham bilgiler, kullan\u0131c\u0131n\u0131n sorusuyla birle\u015ftirilir.\n    <\/div>\n<div style=\"text-align:center; font-size:20px; margin:8px 0;\">\u2b07\ufe0f<\/div>\n<div style=\"\n        padding:12px 16px;\n        background:#fff7ed;\n        border-left:5px solid #ea580c;\n        border-radius:6px;\n    \">        <strong>\u00dcretim (Generation)<\/strong><br \/>\nLLM, \u00f6n\u00fcne koyulan bu spesifik belgelere bakarak do\u011fru ve g\u00fcncel bir cevap yazar.\n    <\/div>\n<\/div>\n<h4>RAG, Ne Kadar Kritik Bir Davran\u0131\u015ft\u0131r?<\/h4>\n<blockquote><p><em>Kurumsal ve ciddi sistemlerde RAG yoksa, sistem yok diyebiliriz.<\/em><\/p><\/blockquote>\n<p>RAG, kurumsal yapay zeka projeleri i\u00e7in hayati <em>(mission-critical)<\/em> \u00f6neme sahiptir. Bir model ne kadar geli\u015fmi\u015f olursa olsun (GPT-4, Claude 3.5 vb.), e\u011fitildi\u011fi tarih itibar\u0131yla bilgi seti donacakt\u0131r. Haliyle RAG ile bu donmu\u015f bilgi setine canl\u0131l\u0131k kazand\u0131r\u0131labilmektedir.<\/p>\n<p>Bu a\u00e7\u0131dan bak\u0131ld\u0131\u011f\u0131nda; kurumsal chatbot&#8217;larda, i\u00e7 dok\u00fcman sorgulamalarda, mevzuat \/ hukuk \/ prosed\u00fcr i\u00e7eriklerinin analizinde, teknik destek botlar\u0131nda ve agent tabanl\u0131 geli\u015fmi\u015f sistemlerde RAG, opsiyonel bir eklentiden ziyade, bilgi a\u00e7\u0131s\u0131ndan g\u00fcvenilirlik i\u00e7in zorunlu bir reflekstir.<\/p>\n<blockquote><p><em>RAG&#8217;s\u0131z LLM, g\u00fczel konu\u015fan ama sorumluluk almayan biri gibi davran\u0131r.<\/em><\/p><\/blockquote>\n<p><strong>RAG olmasa ne olurdu?<\/strong><br \/>\nModel bilmedi\u011fi bir konuda <em>-bilmiyorum-<\/em> demek yerine, hal\u00fcsinasyona u\u011frayarak mant\u0131kl\u0131 g\u00f6r\u00fcnen ama tamamen yanl\u0131\u015f bilgiler uydurabilir. RAG bu tarz emin olunmayan yerlerdeki verilen cevaplarda, <em>-Bu bilgiyi nereden ald\u0131n?-<\/em> sorusuna g\u00f6sterebilece\u011fi referans\u0131 olaca\u011f\u0131 i\u00e7in tutarl\u0131l\u0131k sa\u011flanabilmektedir. <\/p>\n<p>Bunun d\u0131\u015f\u0131nda LLM, bilgi eskimesinden dolay\u0131 \u015firketinizin d\u00fcnk\u00fc sat\u0131\u015f verilerini veya yeni yay\u0131nlanan bir y\u00f6netmeli\u011fi asla bilemez. RAG ile kuruma \u00f6zel bilgi s\u00fcrece dahil edilip; LLM&#8217;e \u015firket haf\u0131zas\u0131 kazand\u0131r\u0131labilir, anl\u0131k ve g\u00fcncel bilgi ile konu\u015fmas\u0131 sa\u011flanabilir.<\/p>\n<p>T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda, t\u00fcm verilerinizi modele en ba\u015ftan \u00f6\u011fretmek (fine-tuning) hem \u00e7ok pahal\u0131 olacakt\u0131r hem de verinin g\u00fcncelli\u011fi de\u011fi\u015ftik\u00e7e kontrol\u00fc zorla\u015facak, verisel a\u00e7\u0131dan karanl\u0131k bir alan olu\u015facakt\u0131r. \u0130\u015fte bu tarz duruma kar\u015f\u0131nda RAG, g\u00fcvenlik riskini olabildi\u011fince minimize etmektedir.<\/p>\n<h4>RAG&#8217;\u0131n \u00c7\u00f6zd\u00fc\u011f\u00fc Ger\u00e7ek Sorunlar Nelerdir?<\/h4>\n<p>Bunu a\u015fa\u011f\u0131daki gibi bir ka\u00e7 ba\u015fl\u0131k alt\u0131nda, sahada kar\u015f\u0131la\u015f\u0131lan sorunlar e\u015fli\u011finde \u00f6rneklendirerek toparlayabiliriz;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>G\u00fcncellik<\/em><\/strong><br \/>\nMisal olarak RAG; <em>-Bug\u00fcn y\u00fcr\u00fcrl\u00fc\u011fe giren yeni vergi kanunu nedir?-<\/em> sorusuna yan\u0131t verebilmeyi sa\u011flar.\n<\/li>\n<li><strong><em>\u00d6zel Veri Eri\u015fimi<\/em><\/strong><br \/>\n\u015eirketinize \u00f6zel, gizli ve internette bulunmayan dok\u00fcmanlar \u00fczerinden soru-cevap yap\u0131lmas\u0131n\u0131 sa\u011flar.\n<\/li>\n<li><strong><em>Kaynak G\u00f6sterme<\/em><\/strong><br \/>\nRAG sistemleri, cevab\u0131 hangi dok\u00fcman\u0131n hangi sayfas\u0131ndan ald\u0131\u011f\u0131na kadar detayl\u0131 referans verebilmektedir. Bu da g\u00fcvenilirlik a\u00e7\u0131s\u0131ndan olduk\u00e7a \u00f6nemlidir.<\/p>\n<p>Ayr\u0131ca LLM&#8217;den her \u015feyi bilmesini beklemek gereksizdir. Nereden bakaca\u011f\u0131n\u0131 bilmesi bizler i\u00e7in daha tercih edilebilirdir.<\/li>\n<li><strong><em>D\u00fc\u015f\u00fck Maliyet<\/em><\/strong><br \/>\nModeli yeniden e\u011fitmek yerine, sadece bir veri taban\u0131n\u0131 g\u00fcncellemek binlerce kat daha ucuz ve az maliyetlidir.\n<\/li>\n<\/ul>\n<h4>\u00dcretilen Netice LLM B\u00fcnyesine Al\u0131n\u0131r m\u0131?<\/h4>\n<p>Hay\u0131r. RAG ile \u00fcretilen netice LLM&#8217;in b\u00fcnyesine (yani parametrelerine) al\u0131nmaz. Ancak bu sistemin asla \u00f6\u011frenemeyece\u011fi anlam\u0131na da gelmiyor. \u015e\u00f6yle ki, \u00f6ncelikle <em>-LLM b\u00fcnyesine al\u0131nmaktan-<\/em> kastedilen nedir bunu \u00f6ncelikle anlayal\u0131m, ard\u0131ndan <em>sistemin \u00f6\u011frenmesi<\/em> kavram\u0131yla aras\u0131ndaki ince ayr\u0131m\u0131 ortaya koymaya \u00e7al\u0131\u015fal\u0131m.<\/p>\n<p><strong>&#8220;LLM b\u00fcnyesine al\u0131nmak&#8221; ne demek?<\/strong><br \/>\nBir bilginin LLM b\u00fcnyesine al\u0131nmas\u0131 demek; modelin a\u011f\u0131rl\u0131klar\u0131n\u0131n (weights) de\u011fi\u015fmesi, yani fine-tuning \/ training yap\u0131lmas\u0131 demektir. B\u00f6ylece model kapat\u0131l\u0131p a\u00e7\u0131ld\u0131\u011f\u0131nda bile o bilginin kal\u0131c\u0131 olarak hat\u0131rlanmas\u0131 sa\u011flanm\u0131\u015f olacakt\u0131r. Evet, RAG&#8217;da bunlar\u0131n hi\u00e7biri s\u00f6z konusu de\u011fildir.<\/p>\n<p>RAG&#8217;de; model \u00f6\u011frenmez, a\u011f\u0131rl\u0131klar de\u011fi\u015fmez, kal\u0131c\u0131 haf\u0131za olu\u015fmaz ve sonraki konu\u015fmada \u00fcretilen neticeler otomatik olarak hat\u0131rlanmaz! Sadece o anki cevap, d\u0131\u015f kayna\u011fa dayan\u0131r ve ge\u00e7ici bir ba\u011flam \u00fczerinden model, sanki \u00f6nceden bu bilgiyi biliyormu\u015f gibi cevap \u00fcretir.<\/p>\n<blockquote><p><em>RAG, modele okuyarak cevap \u00fcretmeyi sa\u011flarken; Fine-tuning ise ezberleyerek cevap \u00fcretmeyi \u00f6\u011frenmesini sa\u011flar.<\/em><\/p><\/blockquote>\n<p><strong>Peki \u00fcretilen sonu\u00e7lar tamamen \u00e7\u00f6pe mi gidiyor?<\/strong><br \/>\nTabi ki de hay\u0131r! Sonu\u00e7ta \u00fcretilen veriler LLM&#8217;e olmasa da sisteme kazand\u0131r\u0131l\u0131yor. <em>Ne mi yap\u0131l\u0131yor?<\/em> \u00dcretilen ve do\u011frulanan veri dok\u00fcmana d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor, embedding al\u0131n\u0131yor ve vector store&#8217;a yaz\u0131l\u0131yor. Bir sonraki soruda ise e\u011fer ihtiya\u00e7 varsa tekrar \u00e7ekilebiliyor. Yani b\u00f6ylece model olmasa da <u>sistem \u00f6\u011freniyor<\/u>! Bu anlay\u0131\u015f, konu ba\u011flam\u0131nda olduk\u00e7a kritiktir!<\/p>\n<p>Ha <em>\u00fcretilen cevab\u0131 model g\u00f6r\u00fcyor mu?<\/em> diye sorarsan\u0131z&#8230; evet, g\u00f6r\u00fcyor! Ancak malumunuz; g\u00f6rmek, \u00f6\u011frenmek demek de\u011fildir! LLM, prompt i\u00e7erisindeki her \u015feyi ge\u00e7ici ba\u011flam olarak g\u00f6rd\u00fc\u011f\u00fc i\u00e7in context window kapan\u0131nca her \u015fey unutuluyor!<\/p>\n<p>Ayr\u0131ca \u015funa da dikkatinizi \u00e7ekmek isterim ki, RAG sonucu elde edilen veriler tam do\u011frulanmadan LLM&#8217;e yaz\u0131lmas\u0131 da pek do\u011fru olmayacakt\u0131r. Ne de olsa RAG \u00e7\u0131kt\u0131s\u0131; yanl\u0131\u015f olabilir, ba\u011flama \u00f6zel olabilir ya da zamana ba\u011fl\u0131 olabilir. Bu tarz olas\u0131 durumlara sahip verileri LLM&#8217;e g\u00f6mmek demek modeli kal\u0131c\u0131 olarak kirletmek demektir. E\u011fer ki eldeki veri sabit, evrensel ve de\u011fi\u015fmeyecek bilgiyse i\u015fte o taktirde LLM b\u00fcnyesine aktar\u0131lma kayg\u0131s\u0131 g\u00fcd\u00fclmelidir.<\/p>\n<p>Bu a\u00e7\u0131dan bak\u0131ld\u0131\u011f\u0131nda sistemlerimizi tasarlarken do\u011fru mimari bizlere g\u00f6z k\u0131rpmakta ve bilgiyi d\u0131\u015fardan alan LLM modellemesi kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r. Evet, sistemin akl\u0131 LLM&#8217;de de\u011fil AI Agent&#8217;ta olmal\u0131d\u0131r. LLM olduk\u00e7a saf kalmal\u0131 ve prompt&#8217;a kar\u015f\u0131l\u0131k veri \u00fcretimiyle ilgilenmelidir. AI Agent ise t\u00fcm s\u00fcrecin karar\u0131n\u0131 ve stratejisini y\u00fcr\u00fctmelidir. \u0130deal olan sistem b\u00f6yledir&#8230;<\/p>\n<h4>RAG&#8217;\u0131n MCP \u0130le Alakas\u0131 Var m\u0131?<\/h4>\n<p>RAG ile <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/mcp\/\" target=\"_blank\">MCP<\/a> ayn\u0131 \u015fey olmasa da akraba iki teknolojidir diyebiliriz. MCP, LLM&#8217;e d\u0131\u015f d\u00fcnyay\u0131 standart bir \u015fekilde a\u00e7an protokold\u00fcr. Yani MCP, LLM&#8217;in d\u0131\u015far\u0131dan nas\u0131l beslenece\u011finin protokolvari cevab\u0131d\u0131r.<\/p>\n<p>\u015e\u00f6yle d\u00fc\u015f\u00fcn\u00fclebilir&#8230; RAG&#8217;da, orkestrasyon katman\u0131 olan AI Agent; ne zaman, hangi bilgiyi alaca\u011f\u0131n\u0131 sorarken; MCP&#8217;de ise yine orkestrasyon katman\u0131 bu bilgiyi LLM&#8217;e nas\u0131l verece\u011fini sormaktad\u0131r. Yani RAG bir davran\u0131\u015f ve stratejiyken, MCP ise ta\u015f\u0131ma ve entegrasyon standard\u0131d\u0131r diyebiliriz.<\/p>\n<p><strong>MCP olmadan RAG olur mu?<\/strong><br \/>\nEvet, zaten bu g\u00fcne kadar yap\u0131lan RAG&#8217;lar\u0131n %90&#8217;\u0131 zaten MCP&#8217;sizdi. Ancak MCP ile yap\u0131lan RAG&#8217;larda bir standartla\u015fma s\u00f6z konusu olmakta ve her tool i\u00e7in ayr\u0131 prompt yazma derdi sona ermektedir. Ancak unutulmamas\u0131 gereken nokta \u015fudur ki, MCP RAG&#8217;\u0131 garanti etmemektedir.<\/p>\n<h4>Microsoft Agent Framework ile RAG Yap\u0131labilir mi?<\/h4>\n<p>Evet, hem de modelden ba\u011f\u0131ms\u0131z bir \u015fekilde&#8230; \u00c7\u00fcnk\u00fc RAG; model de\u011fil, bir orkestrasyon problemidir.<\/p>\n<blockquote><p><em>RAG, LLM&#8217;in de\u011fil, AI Agent&#8217;\u0131n sorumlulu\u011fun da bir davran\u0131\u015ft\u0131r.<\/em><\/p><\/blockquote>\n<p>\u0130ster Azure OpenAI \u00fczerinden GPT modellerini kullan\u0131n, ister lokalde \u00e7al\u0131\u015fan bir Llama modelini&#8230; fark etmeksizin herhangi bir LLM ile <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/microsoft-agent-framework\/\" target=\"_blank\">Microsoft Agent Framework<\/a> arac\u0131l\u0131\u011f\u0131yla bu modellere bir RAG Tool tan\u0131mlanabilmektedir.<\/p>\n<p>\u00c7al\u0131\u015fma mant\u0131\u011f\u0131 olduk\u00e7a basittir; AI Agent&#8217;a \u015fu yetene\u011fin verilmesi yeterlidir: <em>-E\u011fer cevab\u0131 bilmiyorsan, \u015fu veri taban\u0131na git ve ara-<\/em> Bu y\u00f6nlendirmeden sonra AI Agent, gerekti\u011fi taktirde belirlenen PDF veya SQL kayna\u011f\u0131ndan veriyi \u00e7ekecek ve yan\u0131t\u0131 ona g\u00f6re \u015fekillendirecektir.<\/p>\n<blockquote><p><em>RAG yapmak i\u00e7in modelin kendisini de\u011fi\u015ftirmenize gerek yoktur! Yaln\u0131zca modelin \u00f6n\u00fcne bir -veri getirme mekanizmas\u0131- eklenmesi yeterli olacakt\u0131r.<\/em><\/p><\/blockquote>\n<p><strong>\u00d6rnek \u00c7al\u0131\u015fma<\/strong><br \/>\nMicrosoft Agent Framework ile a\u015fa\u011f\u0131daki gibi bir <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/vector-search\/\" target=\"_blank\">Vector Search<\/a> \u00e7al\u0131\u015fmas\u0131n\u0131 ele alarak RAG davran\u0131\u015f\u0131n\u0131 \u00f6rneklendirebiliriz. <\/p>\n<div style=\"\n    margin: 36px 0;\n    padding: 18px 20px;\n    border: 1px solid #c7d2fe;\n    border-radius: 6px;\n    background: #eef2ff;\n    font-family: system-ui, sans-serif;\n\">    <\/p>\n<div style=\"\n        font-size: 13px;\n        font-weight: 600;\n        color: #3730a3;\n        margin-bottom: 8px;\n    \">        Projede kullan\u0131lan k\u00fct\u00fcphaneler\n    <\/div>\n<div style=\"\n        font-size: 14px;\n        line-height: 1.7;\n        color: #1e293b;\n    \"><\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Agents.AI\" target=\"_blank\">Microsoft.Agents.AI<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Agents.AI.OpenAI\" target=\"_blank\">Microsoft.Agents.AI.OpenAI<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Agents.AI.Hosting\/1.0.0-preview.260121.1\" target=\"_blank\">Microsoft.Agents.AI.Hosting<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Data.SqlClient\/7.0.0-preview3.25342.7\" target=\"_blank\">Microsoft.Data.SqlClient<\/a><\/li>\n<\/ul><\/div>\n<\/div>\n<p>\u0130lk olarak \u00e7al\u0131\u015fman\u0131n sade halini a\u015fa\u011f\u0131ya alal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmbeddingService\r\n    {\r\n        \/\/Embedding i\u015flemleri i\u00e7in standart bir aray\u00fczd\u00fcr. \r\n        \/\/string verilen input'u, Embedding&lt;float&gt; t\u00fcr\u00fcnden output etmektedir.\r\n        private readonly IEmbeddingGenerator&lt;string, Embedding&lt;float&gt;&gt; _embeddingGenerator;\r\n        public EmbeddingService(string key, string model = &quot;text-embedding-3-small&quot;, string endpoint = &quot;https:\/\/openrouter.ai\/api\/v1&quot;)\r\n        {\r\n            \/\/OpenAI i\u00e7in EmbeddingClient olu\u015fturuluyoruz.\r\n            var embeddingClient = new EmbeddingClient(\r\n                model: model,\r\n                credential: new System.ClientModel.ApiKeyCredential(key: key),\r\n                options: new OpenAIClientOptions\r\n                {\r\n                    Endpoint = new Uri(endpoint)\r\n                }\r\n                );\r\n\r\n            \/\/Ve bu EmbeddingClient'\u0131 IEmbeddingGenerator'a d\u00f6n\u00fc\u015ft\u00fcrerek provider'dan ba\u011f\u0131ms\u0131z kod yaz\u0131labilir hale geliyoruz.\r\n            _embeddingGenerator = embeddingClient.AsIEmbeddingGenerator();\r\n        }\r\n\r\n        \/\/ Tek bir metni embedding eden metottur.\r\n        public async Task&lt;float&#x5B;]&gt; GenerateEmbeddingAsync(string text)\r\n        {\r\n            var result = await _embeddingGenerator.GenerateAsync(text);\r\n\r\n            return result.Vector.ToArray();\r\n        }\r\n\r\n        \/\/Daha h\u0131zl\u0131 bir embedding i\u015flemi sa\u011flayan metottur.\r\n        public async Task&lt;ReadOnlyMemory&lt;float&gt;&gt; GenerateVectorAsync(string text)\r\n        {\r\n            return await _embeddingGenerator.GenerateVectorAsync(text);\r\n        }\r\n\r\n        public async Task&lt;List&lt;float&#x5B;]&gt;&gt; GenerateEmbeddingsAsync(IEnumerable&lt;string&gt; texts)\r\n        {\r\n            var results = await _embeddingGenerator.GenerateAsync(texts);\r\n            return results\r\n                .Select(embedding =&gt; embedding.Vector.ToArray())\r\n                .ToList();\r\n        }\r\n\r\n        \/\/\u0130ki vekt\u00f6r aras\u0131ndaki cosine similarity'i hesaplar.\r\n        \/\/De\u011fer -1 ile 1 aras\u0131nda olacakt\u0131r. 1 = tatamen benzer, 0 = ili\u015fkisiz, -1 = z\u0131t\r\n        public double CalculateCosineSimilarity(float&#x5B;] vectors1, float&#x5B;] vectors2)\r\n        {\r\n            \/\/Vekt\u00f6r boyutlar\u0131 e\u015fit olmal\u0131\r\n            if (vectors1.Length != vectors2.Length)\r\n                throw new ArgumentException(&quot;Vekt\u00f6r boyutlar\u0131 e\u015fle\u015fmiyor!&quot;);\r\n\r\n            \/\/Dot product : \u0130ki vekt\u00f6r\u00fcn nokta \u00e7arp\u0131m\u0131\r\n            \/\/\u03a3(a&#x5B;i] * b&#x5B;i])\r\n            double dotProduct = 0;\r\n\r\n            \/\/Magnitude (b\u00fcy\u00fckl\u00fck) hesaplamalar\u0131\r\n            \/\/ ||a|| = \u221a(\u03a3(a&#x5B;i]\u00b2))\r\n            double mag1 = 0, mag2 = 0;\r\n\r\n            \/\/T\u00fcm boyutlar i\u00e7in hesaplama\r\n            for (int i = 0; i &lt; vectors1.Length; i++)\r\n            {\r\n                dotProduct += vectors1&#x5B;i] * vectors2&#x5B;i]; \/\/ a&#x5B;i] * b&#x5B;i]\r\n                mag1 += vectors1&#x5B;i] * vectors1&#x5B;i];      \/\/ a&#x5B;i]\u00b2\r\n                mag2 += vectors2&#x5B;i] * vectors2&#x5B;i];      \/\/ b&#x5B;i]\u00b2\r\n            }\r\n\r\n            \/\/Magnitude'lar\u0131n karak\u00f6k\u00fcn\u00fc alma\r\n            mag1 = Math.Sqrt(mag1);\r\n            mag2 = Math.Sqrt(mag2);\r\n\r\n            \/\/S\u0131f\u0131r vekt\u00f6r kontrol\u00fc\r\n            if (mag1 == 0 || mag2 == 0)\r\n                return 0;\r\n\r\n            \/\/Cosine similarity form\u00fcl\u00fc: (a \u00b7 b) \/ (||a|| * ||b||)\r\n            return dotProduct \/ (mag1 * mag2);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada ilk olarak vector search s\u00fcrecinde embedding sorumlulu\u011funu \u00fcstlenen s\u0131n\u0131f\u0131m\u0131z\u0131 g\u00f6r\u00fcyoruz. Bu s\u0131n\u0131f i\u00e7erisindeki <code>IEmbeddingGenerator<\/code> aray\u00fcz\u00fc sayesinde OpenAI, Azure OpenAI, Ollama, HuggingFace vs. gibi provider&#8217;lardan ba\u011f\u0131ms\u0131z bir \u015fekilde embedding s\u00fcre\u00e7leri y\u00fcr\u00fct\u00fclebilmekte ve <code>EmbeddingClient<\/code> s\u0131n\u0131f\u0131 sayesinde de ilgili provider&#8217;\u0131n embedding endpoint&#8217;i ile ileti\u015fime ge\u00e7ilebilmektedir. S\u00fcre\u00e7te <code>text-embedding-3-small<\/code> modeli e\u015fli\u011finde embedding s\u00fcrecinin seyretti\u011fini, ayr\u0131ca dikkat ederseniz; <code>GenerateAsync<\/code> metodu ile embedding i\u015flemlerinin y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcn\u00fc, bir yandan da <code>GenerateVectorAsync<\/code> metoduyla daha az maliyetli embedding s\u00fcrecinin de desteklendi\u011fini g\u00f6receksiniz.<\/p>\n<p>\u015eimdi de embedding edilmi\u015f verilerin, veritaban\u0131 i\u015flemlerinin ve gerekli vector search \u00e7al\u0131\u015fmalar\u0131n\u0131n sorumlulu\u011funu \u00fcstlenecek veritaban\u0131 s\u0131n\u0131f\u0131n\u0131 ele alal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class SqlVectorStoreService\r\n    {\r\n        private readonly string _connectionString;\r\n\r\n        public SqlVectorStoreService(string connectionString = &quot;Server=localhost,1433;Database=ExampleDB;User Id=sa;Password=Test123!;TrustServerCertificate=True;&quot;)\r\n        {\r\n            _connectionString = connectionString;\r\n        }\r\n\r\n        public async Task InitializeDatabaseAsync()\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            var createTableSql = $@&quot;\r\n                IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Embeddings')\r\n                BEGIN\r\n                    CREATE TABLE Embeddings (\r\n                        Id INT IDENTITY(1,1) PRIMARY KEY,\r\n                        Text NVARCHAR(MAX) NOT NULL,\r\n                        EmbeddingVector VECTOR(1536) NOT NULL,\r\n                        Metadata NVARCHAR(MAX) NULL,\r\n                        CreatedAt DATETIME2 DEFAULT GETDATE()\r\n                    );\r\n                END&quot;;\r\n\r\n            using var command = new SqlCommand(createTableSql, connection);\r\n            await command.ExecuteNonQueryAsync();\r\n        }\r\n\r\n        public async Task SaveEmbeddingAsync(string text, double&#x5B;] embedding, string? metadata = null)\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            \/\/Double array'i byte array'e \u00e7eviriyoruz.\r\n            var embeddingBytes = new byte&#x5B;embedding.Length * sizeof(double)];\r\n\r\n            Buffer.BlockCopy(embedding, 0, embeddingBytes, 0, embeddingBytes.Length);\r\n\r\n            var insertSql = $@&quot;\r\n                INSERT INTO Embeddings (Text, EmbeddingVector, Metadata)\r\n                VALUES (@Text, @Embedding, @Metadata)&quot;;\r\n\r\n            using var command = new SqlCommand(insertSql, connection);\r\n\r\n            command.Parameters.AddWithValue(&quot;@Text&quot;, text);\r\n            command.Parameters.AddWithValue(&quot;@Embedding&quot;, embeddingBytes);\r\n            command.Parameters.AddWithValue(&quot;@Metadata&quot;, metadata ?? (object)DBNull.Value);\r\n\r\n            await command.ExecuteNonQueryAsync();\r\n        }\r\n\r\n        public async Task SaveEmbeddingsBatchAsync(List&lt;(string text, float&#x5B;] embedding, string metadata)&gt; items)\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            using var transaction = connection.BeginTransaction();\r\n\r\n            try\r\n            {\r\n                foreach (var (text, embedding, metadata) in items)\r\n                {\r\n                    var embeddingBytes = new byte&#x5B;embedding.Length * sizeof(float)];\r\n                    Buffer.BlockCopy(embedding, 0, embeddingBytes, 0, embeddingBytes.Length);\r\n\r\n                    var insertSql = $@&quot;\r\n                        INSERT INTO Embeddings (Text, EmbeddingVector, Metadata)\r\n                        VALUES (@Text, @Embedding, @Metadata)&quot;;\r\n\r\n                    using var command = new SqlCommand(insertSql, connection, transaction);\r\n\r\n                    command.Parameters.AddWithValue(&quot;@Text&quot;, text);\r\n                    command.Parameters.AddWithValue(&quot;@Metadata&quot;, metadata ?? (object)DBNull.Value);\r\n\r\n                    var sqlVector = new SqlVector&lt;float&gt;(embedding);\r\n                    command.Parameters.Add(new SqlParameter\r\n                    {\r\n                        ParameterName = &quot;@Embedding&quot;,\r\n                        Value = sqlVector,\r\n                        SqlDbType = System.Data.SqlDbType.Vector\r\n                    });\r\n\r\n                    await command.ExecuteNonQueryAsync();\r\n                }\r\n\r\n                await transaction.CommitAsync();\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                await transaction.RollbackAsync();\r\n                throw new Exception($&quot;Toplu kay\u0131t hatas\u0131 : {ex.Message}&quot;, ex);\r\n            }\r\n        }\r\n\r\n        public async Task&lt;List&lt;SearchResult&gt;&gt; SearchAsync(float&#x5B;] queryEmbedding, EmbeddingService embeddingService, int topK = 5, double minSimilarity = 0.0)\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            var selectSql = &quot;SELECT Id, Text, EmbeddingVector, Metadata, CreatedAt FROM Embeddings&quot;;\r\n\r\n            using var command = new SqlCommand(selectSql, connection);\r\n\r\n            using var reader = await command.ExecuteReaderAsync();\r\n            var results = new List&lt;SearchResult&gt;();\r\n\r\n            while (await reader.ReadAsync())\r\n            {\r\n                var id = reader.GetInt32(0);\r\n                var text = reader.GetString(1);\r\n                var embeddingBytes = (byte&#x5B;])reader.GetValue(2);\r\n\r\n                var metadata = reader.IsDBNull(3) ? null : reader.GetString(3);\r\n                var createdAt = reader.GetDateTime(4);\r\n\r\n                var embedding = new float&#x5B;embeddingBytes.Length \/ sizeof(float)];\r\n                Buffer.BlockCopy(embeddingBytes, 0, embedding, 0, embeddingBytes.Length);\r\n\r\n                var similarity = embeddingService.CalculateCosineSimilarity(queryEmbedding, embedding);\r\n                if (similarity &gt;= minSimilarity)\r\n                {\r\n                    results.Add(new()\r\n                    {\r\n                        Id = id,\r\n                        Text = text,\r\n                        CreatedAt = createdAt,\r\n                        Metadata = metadata,\r\n                        Similarity = similarity\r\n                    });\r\n                }\r\n            }\r\n\r\n            return results\r\n                .OrderByDescending(r =&gt; r.Similarity)\r\n                .Take(topK)\r\n                .ToList();\r\n        }\r\n\r\n        public async Task ClearAllAsync()\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            var deleteSql = &quot;TRUNCATE TABLE Embeddings&quot;;\r\n\r\n            using var command = new SqlCommand(deleteSql, connection);\r\n            await command.ExecuteNonQueryAsync();\r\n        }\r\n\r\n        public async Task&lt;int&gt; GetCountAsync()\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            var countSql = &quot;SELECT COUNT(*) FROM Embeddings&quot;;\r\n            using var command = new SqlCommand(countSql, connection);\r\n\r\n            return (int)(await command.ExecuteScalarAsync());\r\n        }\r\n\r\n        public async Task&lt;List&lt;SearchResult&gt;&gt; VectorSearchAsync(float&#x5B;] queryEmbedding, int topK = 5, double minSimilarity = 0.0)\r\n        {\r\n            using var connection = new SqlConnection(_connectionString);\r\n            await connection.OpenAsync();\r\n\r\n            var selectSql = @&quot;\r\n                SELECT TOP (@TopK)\r\n                    Id,\r\n                    Text,\r\n                    EmbeddingVector,\r\n                    Metadata,\r\n                    CreatedAt,\r\n                    -- Cosine similarity hesapla: 1 - cosine distance\r\n                    (1.0 - VECTOR_DISTANCE('cosine', EmbeddingVector, @QueryVector)) AS Similarity\r\n                FROM Embeddings\r\n                WHERE (1.0 - VECTOR_DISTANCE('cosine', EmbeddingVector, @QueryVector)) &gt;= @MinSimilarity\r\n                ORDER BY VECTOR_DISTANCE('cosine', EmbeddingVector, @QueryVector) ASC&quot;;\r\n\r\n            using var command = new SqlCommand(selectSql, connection);\r\n\r\n            command.Parameters.AddWithValue(&quot;@TopK&quot;, topK);\r\n            command.Parameters.AddWithValue(&quot;@MinSimilarity&quot;, minSimilarity);\r\n\r\n            var queryVector = new SqlVector&lt;float&gt;(queryEmbedding);\r\n            command.Parameters.Add(new SqlParameter\r\n            {\r\n                ParameterName = &quot;@QueryVector&quot;,\r\n                Value = queryVector,\r\n                SqlDbType = System.Data.SqlDbType.Vector\r\n            });\r\n\r\n            using var reader = await command.ExecuteReaderAsync();\r\n\r\n            var results = new List&lt;SearchResult&gt;();\r\n            while (await reader.ReadAsync())\r\n            {\r\n                var id = reader.GetInt32(0);\r\n                var text = reader.GetString(1);\r\n                \/\/ EmbeddingVector'u okumaya gerek yok (zaten similarity hesapland\u0131)\r\n                var metadata = reader.IsDBNull(3) ? null : reader.GetString(3);\r\n                var createdAt = reader.GetDateTime(4);\r\n                var similarity = reader.GetDouble(5); \/\/ SQL Server'da hesaplanan similarity\r\n\r\n                \/\/ Sonu\u00e7 listesine ekle\r\n                results.Add(new SearchResult\r\n                {\r\n                    Id = id,\r\n                    Text = text,\r\n                    Similarity = similarity,\r\n                    Metadata = metadata,\r\n                    CreatedAt = createdAt\r\n                });\r\n            }\r\n\r\n            return results;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada klasik veritaban\u0131 i\u015flemlerinin yan\u0131nda esas olarak <code>VectorSearchAsync<\/code> metodu i\u00e7erisinde vector search \u00e7al\u0131\u015fmas\u0131 ger\u00e7ekle\u015ftirilmekte ve SQL Server 2025 ile gelen <a href=\"https:\/\/www.gencayyildiz.com\/blog\/sql-server-2025-vector-search\/\" target=\"_blank\"><code>VECTOR_DISTANCE<\/code><\/a> fonksiyonu sayesinde cosine similarity hesaplanarak gerekli sorgulama ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>Ve son olarak da bu \u00e7al\u0131\u015fman\u0131n <em>precompute embeddings<\/em> ve <em>semantic search<\/em> i\u015flemlerinin y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fc ana endpoint&#8217;lerini inceleyelim:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/precompute&quot;, async () =&gt;\r\n{\r\n    EmbeddingService embeddingService = new();\r\n    var vectorStore = new SqlVectorStoreService();\r\n    await vectorStore.InitializeDatabaseAsync();\r\n\r\n    var documents = new List&lt;string&gt;\r\n            {\r\n                &quot;Yapay zeka, insan zekas\u0131n\u0131 taklit eden bilgisayar sistemleridir.&quot;,\r\n                &quot;Machine learning, yapay zekan\u0131n \u00f6nemli bir alt dal\u0131d\u0131r.&quot;,\r\n                &quot;Derin \u00f6\u011frenme, sinir a\u011flar\u0131 kullanarak \u00e7al\u0131\u015f\u0131r ve karma\u015f\u0131k desenleri \u00f6\u011frenir.&quot;,\r\n                &quot;Python, veri bilimi ve makine \u00f6\u011frenmesi i\u00e7in en pop\u00fcler programlama dilidir.&quot;,\r\n                &quot;SQL Server, Microsoft'un g\u00fc\u00e7l\u00fc ili\u015fkisel veritaban\u0131 y\u00f6netim sistemidir.&quot;,\r\n                &quot;C# ile .NET Framework kullanarak g\u00fcvenli ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirebilirsiniz.&quot;,\r\n                &quot;Hugging Face, do\u011fal dil i\u015fleme modelleri i\u00e7in en b\u00fcy\u00fck platformdur.&quot;,\r\n                &quot;Embedding vekt\u00f6rleri, metinlerin anlam\u0131n\u0131 say\u0131sal olarak temsil eder.&quot;,\r\n                &quot;Cosine similarity, iki vekt\u00f6r aras\u0131ndaki a\u00e7\u0131y\u0131 \u00f6l\u00e7erek benzerlik hesaplar.&quot;,\r\n                &quot;Semantic search, anlam bazl\u0131 arama yaparak daha ilgili sonu\u00e7lar bulur.&quot;,\r\n                &quot;ONNX, makine \u00f6\u011frenmesi modellerini farkl\u0131 platformlarda \u00e7al\u0131\u015ft\u0131rmak i\u00e7in a\u00e7\u0131k formatt\u0131r.&quot;,\r\n                &quot;all-MiniLM-L6-v2, 384 boyutlu embedding vekt\u00f6rleri \u00fcreten hafif bir modeldir.&quot;\r\n            };\r\n\r\n    var embeddings = await embeddingService.GenerateEmbeddingsAsync(documents);\r\n    var batch = documents\r\n               .Zip(embeddings, (text, emb) =&gt; (text, emb, metadata: (string)null))\r\n               .ToList();\r\n\r\n    await vectorStore.SaveEmbeddingsBatchAsync(batch!);\r\n});\r\n\r\napp.MapGet(&quot;\/semantic-search\/{text?}&quot;, async (string? text) =&gt;\r\n{\r\n    EmbeddingService embeddingService = new();\r\n    var vectorStore = new SqlVectorStoreService();\r\n    if (text is not null)\r\n    {\r\n        var embedded = await embeddingService.GenerateEmbeddingAsync(text!);\r\n        var results = await vectorStore.VectorSearchAsync(embedded);\r\n\r\n        return TypedResults.Json(results.ToList());\r\n    }\r\n    return null;\r\n});\r\n<\/pre>\n<\/div>\n<p>Evet&#8230; \u015eimdi bu en yal\u0131n haliyle ele ald\u0131\u011f\u0131m\u0131z \u00e7al\u0131\u015fma \u00fczerinden RAG davran\u0131\u015f\u0131n\u0131 sergilemeye ba\u015flayabiliriz.<\/p>\n<p>Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi iki adet endpoint geli\u015ftirmemiz yeterli olacakt\u0131r;<\/p>\n<p><em>Basit yan\u0131t \u00fcretimi i\u00e7in:<\/em><\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ RAG sorgu endpoint'i - Basit yan\u0131t \u00fcretimi i\u00e7in\r\napp.MapGet(&quot;\/ask\/{question?}&quot;, async (string? question, EmbeddingService embeddingService, SqlVectorStoreService sqlVectorStoreService, &#x5B;FromKeyedServices(&quot;ragAgent&quot;)] AIAgent ragAgent) =&gt;\r\n{\r\n    int topK = 3;\r\n    double minSimilarity = 0.3;\r\n    try\r\n    {\r\n        \/\/Kullan\u0131c\u0131n\u0131n sorusunu embedding'e \u00e7eviriyoruz.\r\n        var queryEmbedding = await embeddingService.GenerateVectorAsync(question!);\r\n        \/\/Vector store'dan en benzer i\u00e7erikleri getirtiyoruz.\r\n        var searchResults = await sqlVectorStoreService.VectorSearchAsync(queryEmbedding.ToArray(), topK, minSimilarity);\r\n\r\n        if (searchResults is &#x5B;])\r\n            return Results.Ok(new\r\n            {\r\n                question,\r\n                answer = &quot;\u00dczg\u00fcn\u00fcm, bu soruyla ilgili bilgi bulunamad\u0131.&quot;,\r\n                sources = new int&#x5B;] { }\r\n            });\r\n\r\n        StringBuilder context = new();\r\n        context.AppendLine(&quot;\u0130lgili dok\u00fcmanlar :&quot;);\r\n        context.AppendLine();\r\n\r\n        for (int i = 0; i &lt; searchResults.Count; i++)\r\n        {\r\n            context.AppendLine($&quot;&#x5B;Dok\u00fcman {i + 1}] (Benzerlik :{searchResults&#x5B;i].Similarity:F3})&quot;);\r\n            context.AppendLine(searchResults&#x5B;i].Text);\r\n            context.AppendLine();\r\n        }\r\n\r\n        var ragPrompt = $@&quot;\r\n                Context bilgileri   : {context}\r\n                Kullan\u0131c\u0131 sorusu    : {question} \r\n\r\n                L\u00fctfen yukar\u0131daki context bilgilerine dayanarak kullan\u0131c\u0131n\u0131n sorusunu yan\u0131tla.\r\n                Ayr\u0131ca cevab\u0131nda hangi dok\u00fcmanlar\u0131 kulland\u0131\u011f\u0131n\u0131 belirt.&quot;;\r\n\r\n        var response = await ragAgent.RunAsync(ragPrompt);\r\n        return Results.Ok(new\r\n        {\r\n            question,\r\n            answer = response.Text,\r\n            sources = searchResults.Select(r =&gt; new\r\n            {\r\n                r.Text,\r\n                similarity = Math.Round(r.Similarity, 3),\r\n                id = r.Id\r\n            }).ToList()\r\n        });\r\n\r\n    }\r\n    catch (Exception ex)\r\n    {\r\n        return Results.BadRequest(new { error = ex.Message });\r\n    }\r\n});\r\n<\/pre>\n<\/div>\n<p><em>Detayl\u0131 yan\u0131t \u00fcretimi i\u00e7in:<\/em><\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ RAG sorgu endpoint'i - Detayl\u0131 yan\u0131t \u00fcretimi i\u00e7in\r\napp.MapPost(&quot;\/ask&quot;, async (RagQueryRequest request, EmbeddingService embeddingService, SqlVectorStoreService sqlVectorStoreService, &#x5B;FromKeyedServices(&quot;ragAgent&quot;)] AIAgent ragAgent) =&gt;\r\n{\r\n    try\r\n    {\r\n        \/\/Kullan\u0131c\u0131n\u0131n sorusunu embedding'e \u00e7eviriyoruz.\r\n        var queryEmbedding = await embeddingService.GenerateVectorAsync(request.Question!);\r\n        \/\/Vector store'dan en benzer i\u00e7erikleri getirtiyoruz.\r\n        var searchResults = await sqlVectorStoreService.VectorSearchAsync(queryEmbedding.ToArray(), request.TopK ?? 3, request.MinSimilarity ?? 0.3d);\r\n\r\n        if (searchResults is &#x5B;])\r\n            return Results.Ok(new RagQueryResponse\r\n            {\r\n                Question = request.Question,\r\n                Answer = &quot;\u00dczg\u00fcn\u00fcm, bu soruyla ilgili bilgi bulunamad\u0131. L\u00fctfen sorunuzu farkl\u0131 \u015fekilde ifade etmeyi deneyiniz.&quot;,\r\n                Sources = &#x5B;],\r\n                SourceCount = 0\r\n            });\r\n\r\n        StringBuilder context = new();\r\n        context.AppendLine(&quot;\u0130lgili dok\u00fcmanlar :&quot;);\r\n        context.AppendLine();\r\n\r\n        for (int i = 0; i &lt; searchResults.Count; i++)\r\n        {\r\n            context.AppendLine($&quot;&#x5B;Dok\u00fcman {i + 1}] (Benzerlik :{searchResults&#x5B;i].Similarity:F3})&quot;);\r\n            context.AppendLine(searchResults&#x5B;i].Text);\r\n            context.AppendLine();\r\n        }\r\n\r\n        var systemPrompt = request.CustomSystemPrompt ?? $@&quot;\r\n                Sen bir RAG asistan\u0131s\u0131n. G\u00f6revin:\r\n                    1. Sa\u011flanan kaynak ve dok\u00fcmanlar\u0131 dikkatlice analiz et\r\n                    2. Kullan\u0131c\u0131n\u0131n sorusuna YALNIZCA bu kaynaklara dayanarak cevap ver\r\n                    3. Cevab\u0131nda hangi kayna\u011f\u0131 kulland\u0131\u011f\u0131n\u0131 &#x5B;Kaynak-X] ya da &#x5B;Dok\u00fcman-X] \u015feklinde belirt\r\n                    4. E\u011fer kaynaklarda cevap yoksa, bunu a\u00e7\u0131k\u00e7a s\u00f6yle\r\n                    5. Kendi bilgilerinle tahmin yapma, sadece verilen bilgileri kullan&quot;;\r\n\r\n        var userPrompt = $@&quot;\r\n                Context bilgileri   : {context}\r\n                Kullan\u0131c\u0131 sorusu    : {request.Question} \r\n\r\n                L\u00fctfen yukar\u0131daki kaynak ve dok\u00fcmanlara dayanarak kullan\u0131c\u0131n\u0131n sorusunu yan\u0131tla.\r\n                Ayr\u0131ca cevab\u0131nda hangi dok\u00fcmanlar\u0131 kulland\u0131\u011f\u0131n\u0131 belirt.&quot;;\r\n\r\n        var messages = new List&lt;OpenAI.Chat.ChatMessage&gt;\r\n        {\r\n            OpenAI.Chat.ChatMessage.CreateSystemMessage(systemPrompt),\r\n            OpenAI.Chat.ChatMessage.CreateUserMessage(userPrompt)\r\n        };\r\n\r\n        var chatResponse = await ragAgent.RunAsync(messages);\r\n        var contentList = chatResponse.Content.OfType&lt;ChatMessageContentPart&gt;();\r\n\r\n        var response = new RagQueryResponse\r\n        {\r\n            Question = request.Question,\r\n            Answer = string.Join(&quot;&quot;, contentList.Select(item =&gt; item.Text)) ?? &quot;Yan\u0131t olu\u015fturulmad\u0131!&quot;,\r\n            Sources = searchResults.Select((r, index) =&gt; new SourceInfo\r\n            {\r\n                Id = r.Id,\r\n                Text = r.Text,\r\n                Similarity = r.Similarity,\r\n                Rank = index + 1,\r\n                Metadata = r.Metadata\r\n            }).ToList(),\r\n            SourceCount = searchResults.Count\r\n        };\r\n\r\n        return Results.Ok(response);\r\n    }\r\n    catch (Exception ex)\r\n    {\r\n        return Results.BadRequest(new { error = ex.Message, stackTrace = ex.StackTrace });\r\n    }\r\n});\r\n<\/pre>\n<\/div>\n<p>Her iki endpoint&#8217;e de g\u00f6z atarsan\u0131z e\u011fer kullan\u0131c\u0131dan gelen soru LLM&#8217;e g\u00f6nderilmeden \u00f6nce semantic search ile konuyla ilgili dok\u00fcmanlar taranmakta ve similarity&#8217;si y\u00fcksek olan ilk veriler elde edilerek prompt&#8217;a aktar\u0131lmaktad\u0131r. B\u00f6ylece LLM&#8217;in kendi e\u011fitim verisi d\u0131\u015f\u0131nda kalan bilgiler, anlamsal arama yoluyla harici veri kaynaklar\u0131ndan elde edilerek modele verilmekte ve b\u00f6ylece belirli bir \u00e7er\u00e7evede cevap \u00fcretmesi gerekti\u011fi s\u00f6ylemektedir&#8230;<\/p>\n<p>Bu minvalde detayl\u0131 yan\u0131t \u00fcretimi ger\u00e7ekle\u015ftiren endpoint&#8217;in test neticesini a\u015fa\u011f\u0131daki g\u00f6rselden inceleyebilir ve LLM&#8217;i RAG davran\u0131\u015f\u0131 neticesinde nas\u0131l \u00f6zelle\u015ftirebildi\u011fimizi de\u011ferlendirebilirsiniz:<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim.png\" alt=\"RAG(Retrieval-Augmented Generation) Nedir? Nas\u0131l Uygulan\u0131r? Detayl\u0131ca \u0130nceleyelim...\" width=\"1577\" height=\"828\" class=\"aligncenter size-full wp-image-28331\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim.png 1577w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim-300x158.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim-1024x538.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim-768x403.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/01\/RAGRetrieval-Augmented-Generation-Nedir-Nasil-Uygulanir-Detaylica-Inceleyelim-1536x806.png 1536w\" sizes=\"auto, (max-width: 1577px) 100vw, 1577px\" \/><\/a><\/p>\n<p>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<p>Nihai olarak;<br \/>\nRAG davran\u0131\u015f\u0131n\u0131n, b\u00fcy\u00fck dil modellerini &#8220;her \u015feyi ezberlemi\u015f bilge&#8221; olmaktan \u00e7\u0131kar\u0131p, &#8220;g\u00fcvenilir kaynaklara h\u0131zl\u0131ca bakabilen, g\u00fcncel ve sorumlu bir dan\u0131\u015fman&#8221; haline getiren olduk\u00e7a etkili ve ekonomik bir yakla\u015f\u0131m oldu\u011funun ve modern kurumsal yapay zeka mimarilerinin omurgas\u0131n\u0131n art\u0131k RAG&#8217;s\u0131z d\u00fc\u015f\u00fcn\u00fclemeyece\u011finin fark\u0131na vard\u0131\u011f\u0131m\u0131z\u0131 s\u00f6yleyebilir ve i\u00e7eri\u011fimizi burada noktayabiliriz&#8230;<\/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\/Microsoft.Agent.Framework.RAG.Example\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/Microsoft.Agent.Framework.RAG.Example<\/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, Bu i\u00e7eri\u011fimizde, AI modellerini dura\u011fan e\u011fitim verilerinin \u00f6tesine ta\u015f\u0131yarak, g\u00fcncel verilere eri\u015fmesini sa\u011flayan RAG (Retrieval-Augmented Generation) davran\u0131\u015f\u0131n\u0131 mercek alt\u0131na alacak ve nedir, ne de\u011fildir tam teferruatl\u0131 bir de\u011ferlendirmede bulunuyor olaca\u011f\u0131z. RAG(Retrieval-Augmented Generation) Nedir?&#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":28332,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,5222,5220],"tags":[5601,5600,5291,5499,5305,5599,5304,5602,5394],"class_list":["post-28319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-llm","category-yapay-zeka-ai","tag-embeddingclient","tag-iembeddinggenerator","tag-mcp","tag-microsoft-agent-framework","tag-rag","tag-rag-nedir","tag-retrieval-augmented-generation","tag-text-embedding-3-small","tag-vector-search"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28319","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=28319"}],"version-history":[{"count":10,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28319\/revisions"}],"predecessor-version":[{"id":28333,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28319\/revisions\/28333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28332"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}