{"id":32015,"date":"2025-10-16T19:02:42","date_gmt":"2025-10-16T16:02:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/"},"modified":"2025-10-16T19:02:42","modified_gmt":"2025-10-16T16:02:42","slug":"mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/","title":{"rendered":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun"},"content":{"rendered":"<style>\n    \/* Basit bir mobil uyumluluk \u00f6rne\u011fi *\/\n    body {\n        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        line-height: 1.6;\n        color: #333;\n        margin: 0 auto;\n        padding: 20px;\n        max-width: 960px;\n        background-color: #f9f9f9;\n    }\n    h2, h3 {\n        color: #2c3e50;\n        margin-top: 30px;\n        margin-bottom: 15px;\n    }\n    pre {\n        background-color: #eee;\n        padding: 15px;\n        border-radius: 5px;\n        overflow-x: auto;\n        font-family: 'Consolas', 'Monaco', monospace;\n        font-size: 0.9em;\n    }\n    code {\n        font-family: 'Consolas', 'Monaco', monospace;\n    }\n    ul, ol {\n        margin-left: 20px;\n        margin-bottom: 15px;\n    }\n    li {\n        margin-bottom: 8px;\n    }\n    table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-bottom: 20px;\n    }\n    th, td {\n        border: 1px solid #ddd;\n        padding: 10px;\n        text-align: left;\n    }\n    th {\n        background-color: #f2f2f2;\n    }\n    aside.expert-tip {\n        background-color: #eaf7ed;\n        border-left: 5px solid #4CAF50;\n        padding: 15px;\n        margin: 20px 0;\n        font-style: italic;\n        color: #2e8b57;\n    }<\/p>\n<p>    \/* Mobil uyumlu hale getirmek i\u00e7in medya sorgusu \u00f6rne\u011fi *\/\n    @media (max-width: 768px) {\n        body {\n            padding: 15px;\n        }\n        h2 {\n            font-size: 1.8em;\n        }\n        h3 {\n            font-size: 1.3em;\n        }\n        table, thead, tbody, th, td, tr {\n            display: block;\n        }\n        thead tr {\n            position: absolute;\n            top: -9999px;\n            left: -9999px;\n        }\n        tr {\n            border: 1px solid #ccc;\n            margin-bottom: 10px;\n        }\n        td {\n            border: none;\n            border-bottom: 1px solid #eee;\n            position: relative;\n            padding-left: 50%;\n            text-align: right;\n        }\n        td:before {\n            position: absolute;\n            top: 6px;\n            left: 6px;\n            width: 45%;\n            padding-right: 10px;\n            white-space: nowrap;\n            text-align: left;\n            font-weight: bold;\n        }\n        \/* Her s\u00fctun i\u00e7in \u00f6zel etiketler *\/\n        td:nth-of-type(1):before { content: \"\u00d6zellik\"; }\n        td:nth-of-type(2):before { content: \"A\u00e7\u0131klama\"; }\n        td:nth-of-type(3):before { content: \"Fayda\"; }\n    }\n<\/style>\n<p>Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen dijital d\u00fcnyas\u0131nda, i\u015fletmelerin ve bireylerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en b\u00fcy\u00fck zorluklardan biri, b\u00fcy\u00fck veri y\u0131\u011f\u0131nlar\u0131n\u0131 anlamland\u0131rmak ve bu verilerden de\u011ferli i\u00e7g\u00f6r\u00fcler elde etmektir. \u0130\u015fte tam da bu noktada yapay zeka ajanlar\u0131 devreye giriyor. Peki, nedir bu YZ ajanlar\u0131 ve neden bu kadar pop\u00fclerler? Temel olarak, bir YZ ajan\u0131, \u00e7evresini alg\u0131layabilen, bilgi i\u015fleyebilen, hedefler belirleyebilen ve bu hedeflere ula\u015fmak i\u00e7in ba\u011f\u0131ms\u0131z eylemlerde bulunabilen yaz\u0131l\u0131m tabanl\u0131 bir varl\u0131kt\u0131r. \u00d6rne\u011fin, bir m\u00fc\u015fteri hizmetleri ajan\u0131, m\u00fc\u015fteri sorular\u0131n\u0131 anlayabilir, ge\u00e7mi\u015f konu\u015fmalar\u0131 hat\u0131rlayabilir ve hatta bir veritaban\u0131ndan bilgi \u00e7ekerek do\u011fru yan\u0131tlar verebilir.<\/p>\n<p>Bu ajanlar, otomatikle\u015ftirilmi\u015f i\u015f s\u00fcre\u00e7lerinden ki\u015fiselle\u015ftirilmi\u015f kullan\u0131c\u0131 deneyimlerine kadar bir\u00e7ok alanda devrim yaratma potansiyeli ta\u015f\u0131yor. Ancak bu t\u00fcr ak\u0131ll\u0131 sistemleri in\u015fa etmek, karma\u015f\u0131k entegrasyonlar, veri y\u00f6netimi ve b\u00fcy\u00fck dil modellerinin (LLM) etkin kullan\u0131m\u0131 gibi \u00e7e\u015fitli teknik zorluklar\u0131 beraberinde getirir. Neyse ki, LangChain4j gibi k\u00fct\u00fcphaneler ve MongoDB gibi esnek veritaban\u0131 \u00e7\u00f6z\u00fcmleri sayesinde bu s\u00fcre\u00e7 art\u0131k \u00e7ok daha eri\u015filebilir hale geldi. Bu makalede, bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 bir araya getirerek kendi YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l geli\u015ftirece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, sadece teorik bilgi vermekle kalmay\u0131p, ayn\u0131 zamanda ger\u00e7ek d\u00fcnya senaryolar\u0131na uygulanabilecek pratik \u00f6rnekler sunarak konuyu derinlemesine kavraman\u0131za yard\u0131mc\u0131 olmakt\u0131r. Hadi gelin, bu heyecan verici yolculu\u011fa birlikte \u00e7\u0131kal\u0131m ve gelece\u011fin ak\u0131ll\u0131 uygulamalar\u0131n\u0131 in\u015fa etmeye ba\u015flayal\u0131m!<\/p>\n<h2>Temel Ta\u015flar: LangChain4j ve MongoDB Neden Birle\u015fmeli?<\/h2>\n<p>Bir yapay zeka ajan\u0131 in\u015fa ederken do\u011fru ara\u00e7lar\u0131 se\u00e7mek, projenizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Bu ba\u011flamda, LangChain4j ve MongoDB&#8217;nin birle\u015fimi, geli\u015ftiricilere benzersiz bir g\u00fc\u00e7 ve esneklik sunar. Her iki teknoloji de kendi alan\u0131nda lider olup, birlikte kullan\u0131ld\u0131klar\u0131nda ak\u0131ll\u0131 uygulamalar i\u00e7in sa\u011flam bir temel olu\u015ftururlar. \u015eimdi bu temel ta\u015flar\u0131 daha yak\u0131ndan inceleyelim.<\/p>\n<h3>LangChain4j Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>LangChain, b\u00fcy\u00fck dil modelleri (LLM&#8217;ler) ile \u00e7al\u0131\u015fan uygulamalar geli\u015ftirmeyi kolayla\u015ft\u0131ran pop\u00fcler bir framework&#8217;t\u00fcr. LangChain4j ise bu framework&#8217;\u00fcn Java dilindeki kar\u015f\u0131l\u0131\u011f\u0131d\u0131r. Peki, LangChain4j neden bu kadar \u00f6nemli? LLM&#8217;ler tek ba\u015f\u0131na g\u00fc\u00e7l\u00fcd\u00fcr, ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131nda genellikle bir LLM&#8217;den \u00e7ok daha fazlas\u0131na ihtiya\u00e7 duyar\u0131z. \u00d6rne\u011fin, bir LLM&#8217;nin sadece genel bilgileri de\u011fil, ayn\u0131 zamanda belirli bir \u015firketin i\u00e7 belgelerini de anlamas\u0131 gerekebilir. Ya da bir e-posta g\u00f6nderme veya bir veritaban\u0131nda arama yapma gibi d\u0131\u015f ara\u00e7larla etkile\u015fim kurabilmesi gerekebilir.<\/p>\n<p>LangChain4j, bu t\u00fcr gereksinimleri kar\u015f\u0131lamak i\u00e7in bir dizi soyutlama ve ara\u00e7 sunar. Bunlar aras\u0131nda:<\/p>\n<ul>\n<li><strong>Zincirler (Chains):<\/strong> Birden fazla LLM \u00e7a\u011fr\u0131s\u0131n\u0131 veya LLM ile di\u011fer bile\u015fenleri (veri \u00f6n i\u015fleme, \u00e7\u0131kt\u0131 formatlama vb.) bir araya getirmek i\u00e7in kullan\u0131l\u0131r. Bu, karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 basitle\u015ftirir.<\/li>\n<li><strong>Ajanlar (Agents):<\/strong> LLM&#8217;lerin hangi eylemleri ger\u00e7ekle\u015ftirece\u011fine karar vermesini ve bu eylemleri s\u0131ral\u0131 bir \u015fekilde y\u00fcr\u00fctmesini sa\u011flar. Ajanlar, t\u0131pk\u0131 insanlar gibi ara\u00e7lar\u0131 kullanabilir (\u00f6rne\u011fin, bir arama motoru, bir hesap makinesi, bir veritaban\u0131 sorgu arac\u0131).<\/li>\n<li><strong>Haf\u0131za (Memory):<\/strong> Ajan\u0131n ge\u00e7mi\u015f konu\u015fmalar\u0131 veya etkile\u015fimleri hat\u0131rlamas\u0131n\u0131 sa\u011flar. Bu, daha do\u011fal ve ba\u011flamsal sohbetlerin olu\u015fturulmas\u0131 i\u00e7in hayati \u00f6neme sahiptir.<\/li>\n<li><strong>Belge Y\u00fckleyiciler ve B\u00f6l\u00fcc\u00fcler (Document Loaders &#038; Splitters):<\/strong> PDF&#8217;ler, web sayfalar\u0131 veya di\u011fer veri kaynaklar\u0131ndan bilgileri y\u00fcklemeyi ve bunlar\u0131 LLM&#8217;lerin i\u015fleyebilece\u011fi par\u00e7alara b\u00f6lmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Vekt\u00f6r Depolar\u0131 (Vector Stores):<\/strong> Belgelerin vekt\u00f6r g\u00f6mme (embedding) temsillerini depolamak ve anlamsal aramalar yapmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, LangChain4j, LLM&#8217;lerin ger\u00e7ek d\u00fcnyadaki veri ve ara\u00e7larla sorunsuz bir \u015fekilde etkile\u015fim kurmas\u0131n\u0131 sa\u011flayan bir orkestrasyon katman\u0131 g\u00f6revi g\u00f6r\u00fcr. Bu sayede, geli\u015ftiriciler s\u0131f\u0131rdan her \u015feyi yazmak yerine, karma\u015f\u0131k YZ uygulamalar\u0131n\u0131 daha h\u0131zl\u0131 ve daha g\u00fcvenilir bir \u015fekilde olu\u015fturabilirler.<\/p>\n<h3>MongoDB&#8217;nin AI Uygulamalar\u0131ndaki Rol\u00fc ve Vekt\u00f6r Aramas\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Yapay zeka uygulamalar\u0131 genellikle b\u00fcy\u00fck miktarda veriyle \u00e7al\u0131\u015f\u0131r ve bu verinin esnek, \u00f6l\u00e7eklenebilir ve h\u0131zl\u0131 bir \u015fekilde depolanmas\u0131 ve sorgulanmas\u0131 gerekir. \u0130\u015fte burada MongoDB devreye giriyor. MongoDB, NoSQL bir veritaban\u0131 olup, dok\u00fcman tabanl\u0131 yap\u0131s\u0131 sayesinde \u015fema esnekli\u011fi sunar. Bu, \u00f6zellikle s\u00fcrekli de\u011fi\u015fen veya farkl\u0131 formatlardaki verilerle \u00e7al\u0131\u015fan YZ projeleri i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r. \u00d6rne\u011fin, bir YZ ajan\u0131, kullan\u0131c\u0131 etkile\u015fimlerini, \u00f6zel ara\u00e7 tan\u0131mlar\u0131n\u0131, ba\u011flamsal bilgileri veya hatta LLM \u00e7\u0131kt\u0131lar\u0131n\u0131 tek bir esnek koleksiyonda depolayabilir.<\/p>\n<p>Ancak MongoDB&#8217;nin YZ d\u00fcnyas\u0131ndaki ger\u00e7ek g\u00fcc\u00fc, \u00f6zellikle <a href=\"https:\/\/www.mongodb.com\/products\/platform\/atlas\/vector-search\" target=\"_blank\">MongoDB Atlas Vector Search<\/a> \u00f6zelli\u011fiyle ortaya \u00e7\u0131kar. Geleneksel veritaban\u0131 aramalar\u0131 genellikle anahtar kelime e\u015fle\u015ftirmesine dayan\u0131rken, vekt\u00f6r aramas\u0131, verinin anlamsal anlam\u0131n\u0131 dikkate al\u0131r. Nas\u0131l m\u0131 \u00e7al\u0131\u015f\u0131yor?<\/p>\n<ol>\n<li><strong>G\u00f6mme (Embedding) Olu\u015fturma:<\/strong> Metin, resim veya di\u011fer veri t\u00fcrleri, \u00f6zel YZ modelleri (g\u00f6mme modelleri) kullan\u0131larak y\u00fcksek boyutlu say\u0131sal vekt\u00f6rlere d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Bu vekt\u00f6rler, verinin anlamsal anlam\u0131n\u0131 yakalar. Birbirine anlamsal olarak yak\u0131n verilerin vekt\u00f6rleri, y\u00fcksek boyutlu uzayda birbirine daha yak\u0131n konumlan\u0131r.<\/li>\n<li><strong>Vekt\u00f6r Depolama:<\/strong> Bu vekt\u00f6rler, ili\u015fkili verileriyle birlikte MongoDB koleksiyonlar\u0131nda depolan\u0131r.<\/li>\n<li><strong>Vekt\u00f6r \u0130ndeksi:<\/strong> MongoDB Atlas, bu vekt\u00f6rler \u00fczerinde \u00f6zel bir vekt\u00f6r indeksi (\u00f6rne\u011fin, HNSW &#8211; Hierarchical Navigable Small Worlds) olu\u015fturur. Bu indeks, y\u00fcksek boyutlu uzayda kom\u015fu vekt\u00f6rleri h\u0131zl\u0131ca bulmay\u0131 sa\u011flar.<\/li>\n<li><strong>Anlamsal Arama:<\/strong> Bir sorgu geldi\u011finde, bu sorgu da ayn\u0131 g\u00f6mme modeli kullan\u0131larak bir vekt\u00f6re d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr. Ard\u0131ndan, MongoDB Atlas Vector Search, bu sorgu vekt\u00f6r\u00fcne en yak\u0131n depolanm\u0131\u015f vekt\u00f6rleri (yani, anlamsal olarak en alakal\u0131 verileri) h\u0131zl\u0131ca bulur ve sonu\u00e7lar\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ol>\n<p>Bu \u00f6zellik, \u00f6zellikle LangChain&#8217;in RAG (Retrieval-Augmented Generation) deseninde kritik bir rol oynar. RAG, bir LLM&#8217;nin sadece kendi \u00f6\u011frendi\u011fi bilgilere dayanmak yerine, d\u0131\u015f kaynaklardan (bizim durumumuzda MongoDB&#8217;den) ilgili bilgileri al\u0131p, bu bilgilerle desteklenerek yan\u0131t \u00fcretmesini sa\u011flar. Bu sayede, LLM&#8217;ler g\u00fcncel, do\u011fru ve alan \u00f6zelinde bilgilere eri\u015febilir, hal\u00fcsinasyon riskini azalt\u0131r ve \u00e7ok daha g\u00fcvenilir yan\u0131tlar verebilir.<\/p>\n<aside class=\"expert-tip\">\n    Uzman \u0130pucu: MongoDB Atlas Vector Search, sadece metin de\u011fil, g\u00f6rsel ve ses gibi farkl\u0131 veri t\u00fcrlerinin vekt\u00f6rlerini depolayarak karma\u015f\u0131k multimedya aramalar\u0131 yapman\u0131za olanak tan\u0131r. Bu, YZ ajanlar\u0131n\u0131z\u0131n \u00e7ok daha geni\u015f bir veri yelpazesiyle \u00e7al\u0131\u015fabilmesini sa\u011flar.<br \/>\n<\/aside>\n<p>Dolay\u0131s\u0131yla, LangChain4j ile bir YZ ajan\u0131 in\u015fa ederken, MongoDB, hem ajan\u0131n durumunu, haf\u0131zas\u0131n\u0131 ve ara\u00e7 tan\u0131mlar\u0131n\u0131 esnek bir \u015fekilde depolamak i\u00e7in m\u00fckemmel bir se\u00e7imdir, hem de Atlas Vector Search sayesinde ajana \u00f6zel bir bilgi taban\u0131 sa\u011flayarak RAG deseniyle LLM&#8217;in yeteneklerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde geni\u015fletir. Bu sinerji, ger\u00e7ekten ak\u0131ll\u0131 ve ba\u011flamsal fark\u0131ndal\u0131\u011fa sahip YZ uygulamalar\u0131 geli\u015ftirmenin kap\u0131lar\u0131n\u0131 aralar.<\/p>\n<h2>Ad\u0131m Ad\u0131m \u0130lk AI Ajan\u0131m\u0131z\u0131 Geli\u015ftirme: \u00d6n Haz\u0131rl\u0131klar ve Kurulum<\/h2>\n<p>Art\u0131k teorik temelleri anlad\u0131\u011f\u0131m\u0131za g\u00f6re, ilk yapay zeka ajan\u0131m\u0131z\u0131 in\u015fa etmeye ba\u015flayabiliriz. Bu b\u00f6l\u00fcmde, geli\u015ftirme ortam\u0131m\u0131z\u0131 kuracak, MongoDB Atlas&#8217;\u0131 yap\u0131land\u0131racak ve projemizin temel ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ekleyece\u011fiz. Bu ad\u0131mlar, projenizin sa\u011flam bir temele oturmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h3>\n<p>LangChain4j, Java tabanl\u0131 bir k\u00fct\u00fcphane oldu\u011fu i\u00e7in, bir Java geli\u015ftirme ortam\u0131na ihtiyac\u0131m\u0131z olacak. \u0130\u015fte ba\u015flang\u0131\u00e7 i\u00e7in gerekenler:<\/p>\n<ol>\n<li><strong>Java Development Kit (JDK):<\/strong> En az JDK 17 veya \u00fczeri bir s\u00fcr\u00fcm y\u00fckl\u00fc olmal\u0131d\u0131r. OpenJDK veya Oracle JDK kullanabilirsiniz.<\/li>\n<li><strong>Maven veya Gradle:<\/strong> Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek ve derlemek i\u00e7in bir build arac\u0131. Bu \u00f6rnekte Maven kullanaca\u011f\u0131z.<\/li>\n<li><strong>Entegre Geli\u015ftirme Ortam\u0131 (IDE):<\/strong> IntelliJ IDEA, Eclipse veya VS Code gibi bir IDE, kod yazma ve hata ay\u0131klama s\u00fcrecini kolayla\u015ft\u0131racakt\u0131r.<\/li>\n<\/ol>\n<p>Kurulumlar\u0131 tamamlad\u0131ktan sonra, yeni bir Maven projesi olu\u015fturarak ba\u015flayabiliriz. Terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak basit bir Maven projesi olu\u015fturabilirsiniz:<\/p>\n<pre><code>\n  mvn archetype:generate -DgroupId=com.example -DartifactId=ai-agent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>ai-agent<\/code> ad\u0131nda yeni bir dizin olu\u015fturacak ve i\u00e7erisinde temel bir Maven proje yap\u0131s\u0131 bar\u0131nd\u0131racakt\u0131r.<\/p>\n<h3>MongoDB Atlas Kurulumu ve Vekt\u00f6r \u0130ndeksi Olu\u015fturma<\/h3>\n<p>Veritaban\u0131 taraf\u0131nda, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir \u00e7\u00f6z\u00fcm i\u00e7in MongoDB Atlas'\u0131 kullanaca\u011f\u0131z. E\u011fer hen\u00fcz bir hesab\u0131n\u0131z yoksa, <a href=\"https:\/\/www.mongodb.com\/cloud\/atlas\/register\" target=\"_blank\">MongoDB Atlas<\/a> web sitesinden \u00fccretsiz bir hesap olu\u015fturabilirsiniz. Free Tier (\u00fccretsiz katman) \u00e7o\u011fu ba\u015flang\u0131\u00e7 projesi i\u00e7in yeterlidir.<\/p>\n<ol>\n<li><strong>Yeni Bir K\u00fcme Olu\u015fturun:<\/strong> Atlas aray\u00fcz\u00fcnde \"Build a Database\" se\u00e7ene\u011fini kullanarak yeni bir k\u00fcme (cluster) olu\u015fturun. Free Tier se\u00e7ene\u011fini (M0 Sandbox) tercih edebilirsiniz. Bulut sa\u011flay\u0131c\u0131s\u0131n\u0131 (AWS, GCP, Azure) ve b\u00f6lgeyi size en yak\u0131n olan\u0131 se\u00e7in.<\/li>\n<li><strong>Veritaban\u0131 Kullan\u0131c\u0131s\u0131 ve A\u011f Eri\u015fimi:<\/strong> G\u00fcvenlik sekmesinden bir veritaban\u0131 kullan\u0131c\u0131s\u0131 olu\u015fturun ve g\u00fc\u00e7l\u00fc bir parola belirleyin. Ayr\u0131ca, \"Network Access\" sekmesinden IP adresinizi beyaz listeye ekleyin veya t\u00fcm IP adreslerinden eri\u015fime izin verin (geli\u015ftirme ortam\u0131 i\u00e7in).<\/li>\n<li><strong>Ba\u011flant\u0131 Dizisi (Connection String):<\/strong> K\u00fcmeniz haz\u0131r oldu\u011funda, \"Connect\" d\u00fc\u011fmesine t\u0131klay\u0131n ve \"Connect your application\" se\u00e7ene\u011fini se\u00e7in. Burada Java i\u00e7in gerekli ba\u011flant\u0131 dizisini bulacaks\u0131n\u0131z. Bu dizeyi kopyalay\u0131n, <code><username><\/code> ve <code><password><\/code> k\u0131s\u0131mlar\u0131n\u0131 kendi bilgilerinizle de\u011fi\u015ftirin. \u015euna benzer g\u00f6r\u00fcnecektir:<\/li>\n<\/ol>\n<pre><code>\n  mongodb+srv:\/\/<username>:<password>@cluster0.abcde.mongodb.net\/?retryWrites=true&w=majority\n<\/pre>\n<p><\/code><\/p>\n<aside class=\"expert-tip\">\n    Uzman \u0130pucu: Ba\u011flant\u0131 dizinizi do\u011frudan kodunuza g\u00f6mmek yerine, ortam de\u011fi\u015fkenleri (environment variables) veya bir yap\u0131land\u0131rma dosyas\u0131 kullanarak y\u00f6netmek her zaman daha iyi bir g\u00fcvenlik uygulamas\u0131d\u0131r. \u00d6rne\u011fin, <code>.env<\/code> dosyalar\u0131 veya Spring Boot'un <code>application.properties<\/code> dosyas\u0131 kullan\u0131labilir.<br \/>\n<\/aside>\n<p>\u015eimdi en \u00f6nemli ad\u0131mlardan birine ge\u00e7elim: vekt\u00f6r indeksi olu\u015fturma. Bu indeks, YZ ajan\u0131m\u0131z\u0131n anlamsal aramalar yapmas\u0131n\u0131 sa\u011flayacak. MongoDB Atlas aray\u00fcz\u00fcnde, \"Collections\" sekmesine gidin. <code>your_database_name.your_collection_name<\/code> \u015feklinde yeni bir koleksiyon olu\u015fturun (\u00f6rne\u011fin, <code>ai_agent_db.documents<\/code>). Daha sonra, bu koleksiyon \u00fczerinde \"Create Search Index\" d\u00fc\u011fmesine t\u0131klay\u0131n ve a\u015fa\u011f\u0131daki gibi bir JSON tan\u0131m\u0131 ile bir vekt\u00f6r indeksi olu\u015fturun. Bu tan\u0131m, <code>embedding<\/code> alan\u0131n\u0131n bir vekt\u00f6r alan\u0131 oldu\u011funu ve <code>cosine<\/code> benzerlik \u00f6l\u00e7\u00fct\u00fcn\u00fcn kullan\u0131laca\u011f\u0131n\u0131 belirtir.<\/p>\n<pre><code>\n  {\n    \"mappings\": {\n      \"dynamic\": true,\n      \"fields\": {\n        \"embedding\": {\n          \"type\": \"knnVector\",\n          \"dimensions\": 1536, \/\/ Kulland\u0131\u011f\u0131n\u0131z embedding modeline g\u00f6re boyut de\u011fi\u015febilir (\u00f6rn: OpenAI text-embedding-ada-002 i\u00e7in 1536)\n          \"similarity\": \"cosine\"\n        }\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Vekt\u00f6r indeksinin olu\u015fturulmas\u0131 biraz zaman alabilir. Haz\u0131r oldu\u011funda, YZ ajan\u0131m\u0131z anlamsal aramalar yapmaya haz\u0131r olacakt\u0131r.<\/p>\n<h3>Proje Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n Eklenmesi<\/h3>\n<p>Maven projemizin <code>pom.xml<\/code> dosyas\u0131na gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklememiz gerekiyor. Temel olarak LangChain4j, OpenAI entegrasyonu (veya se\u00e7ti\u011finiz ba\u015fka bir LLM sa\u011flay\u0131c\u0131s\u0131) ve MongoDB s\u00fcr\u00fcc\u00fcs\u00fc ile Atlas Vector Search ba\u011f\u0131ml\u0131l\u0131klar\u0131na ihtiyac\u0131m\u0131z olacak.<\/p>\n<pre><code>\n  <dependencies>\n      <!-- LangChain4j Core -->\n      <dependency>\n          <groupId>dev.langchain4j<\/groupId>\n          <artifactId>langchain4j<\/artifactId>\n          <version>0.32.0<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n      <\/dependency>\n\n      <!-- LangChain4j OpenAI entegrasyonu (veya ba\u015fka bir model) -->\n      <dependency>\n          <groupId>dev.langchain4j<\/groupId>\n          <artifactId>langchain4j-openai<\/artifactId>\n          <version>0.32.0<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n      <\/dependency>\n\n      <!-- LangChain4j MongoDB entegrasyonu (haf\u0131za ve vekt\u00f6r deposu i\u00e7in) -->\n      <dependency>\n          <groupId>dev.langchain4j<\/groupId>\n          <artifactId>langchain4j-mongodb<\/artifactId>\n          <version>0.32.0<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n      <\/dependency>\n\n      <!-- MongoDB Java Driver (e\u011fer do\u011frudan MongoDB i\u015flemleri yapacaksan\u0131z) -->\n      <dependency>\n          <groupId>org.mongodb<\/groupId>\n          <artifactId>mongodb-driver-sync<\/artifactId>\n          <version>4.11.1<\/version> <!-- G\u00fcncel s\u00fcr\u00fcm\u00fc kontrol edin -->\n      <\/dependency>\n\n      <!-- Di\u011fer yard\u0131mc\u0131 k\u00fct\u00fcphaneler (\u00f6rne\u011fin logging) -->\n      <dependency>\n          <groupId>org.slf4j<\/groupId>\n          <artifactId>slf4j-simple<\/artifactId>\n          <version>2.0.7<\/version>\n          <scope>runtime<\/scope>\n      <\/dependency>\n\n      <!-- JUnit testi i\u00e7in (iste\u011fe ba\u011fl\u0131) -->\n      <dependency>\n          <groupId>org.junit.jupiter<\/groupId>\n          <artifactId>junit-jupiter-api<\/artifactId>\n          <version>5.10.0<\/version>\n          <scope>test<\/scope>\n      <\/dependency>\n  <\/dependencies>\n<\/pre>\n<p><\/code><\/p>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra Maven projenizi g\u00fcncellemeyi unutmay\u0131n (IDE'nizde sa\u011f t\u0131klay\u0131p \"Maven -> Reload Project\" veya <code>mvn clean install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak). Bu ad\u0131mlarla, ilk YZ ajan\u0131 projenizin temelini sa\u011flam bir \u015fekilde atm\u0131\u015f oldunuz. Art\u0131k LLM entegrasyonu ve haf\u0131za y\u00f6netimi gibi daha ileri konulara ge\u00e7ebiliriz.<\/p>\n<h2>AI Ajan\u0131 \u00c7ekirde\u011fi: LLM Entegrasyonu ve Haf\u0131za Y\u00f6netimi<\/h2>\n<p>Bir yapay zeka ajan\u0131n\u0131n kalbi, b\u00fcy\u00fck dil modeli (LLM) ve onunla etkile\u015fim kurma yetene\u011fidir. Ancak bir LLM'yi sadece bir kez sorgulamak, ger\u00e7ek bir ajan\u0131 yeterince ak\u0131ll\u0131 k\u0131lmaz. Ajan\u0131n ge\u00e7mi\u015f etkile\u015fimleri hat\u0131rlamas\u0131 ve ba\u011flam\u0131 korumas\u0131 gerekir. Bu b\u00f6l\u00fcmde, LLM'yi LangChain4j ile nas\u0131l entegre edece\u011fimizi ve ajana kal\u0131c\u0131 bir haf\u0131za eklemek i\u00e7in MongoDB'yi nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenece\u011fiz.<\/p>\n<h3>B\u00fcy\u00fck Dil Modelini (LLM) LangChain4j ile Tan\u0131\u015ft\u0131rmak<\/h3>\n<p>LangChain4j, farkl\u0131 LLM sa\u011flay\u0131c\u0131lar\u0131yla kolayca entegre olman\u0131z\u0131 sa\u011flar. Bu \u00f6rnekte OpenAI'\u0131 kullanaca\u011f\u0131z, ancak Hugging Face, Google Gemini gibi ba\u015fka modelleri de benzer \u015fekilde entegre edebilirsiniz. OpenAI API anahtar\u0131n\u0131za ihtiyac\u0131n\u0131z olacak.<\/p>\n<p>\u00d6ncelikle, OpenAI API anahtar\u0131n\u0131z\u0131 ortam de\u011fi\u015fkeni olarak ayarlaman\u0131z \u015fiddetle tavsiye edilir. \u00d6rne\u011fin, Linux\/macOS \u00fczerinde:<\/p>\n<pre><code>\n  export OPENAI_API_KEY=\"sk-YOUR_OPENAI_API_KEY\"\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, Java kodunuzda bir OpenAI LLM \u00f6rne\u011fi olu\u015fturabilirsiniz:<\/p>\n<pre><code>\n  import dev.langchain4j.model.openai.OpenAiChatModel;\n\n  public class AgentCore {\n\n      public static void main(String[] args) {\n          \/\/ OpenAI API anahtar\u0131n\u0131 ortam de\u011fi\u015fkeninden al\u0131r\n          String openaiApiKey = System.getenv(\"OPENAI_API_KEY\");\n\n          if (openaiApiKey == null || openaiApiKey.isEmpty()) {\n              System.err.println(\"Hata: OPENAI_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\");\n              return;\n          }\n\n          OpenAiChatModel model = OpenAiChatModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"gpt-4\") \/\/ veya \"gpt-3.5-turbo\"\n                  .temperature(0.7) \/\/ Yarat\u0131c\u0131l\u0131k seviyesi (0.0-1.0 aras\u0131)\n                  .build();\n\n          String userMessage = \"Merhaba, nas\u0131ls\u0131n?\";\n          String aiResponse = model.generate(userMessage);\n\n          System.out.println(\"Kullan\u0131c\u0131: \" + userMessage);\n          System.out.println(\"AI: \" + aiResponse);\n\n          \/\/ \u0130kinci bir mesaj g\u00f6nderelim\n          String userMessage2 = \"Bana \u0130stanbul hakk\u0131nda ilgin\u00e7 bir bilgi verir misin?\";\n          String aiResponse2 = model.generate(userMessage2); \/\/ Dikkat: Bu model haf\u0131zas\u0131zd\u0131r.\n          System.out.println(\"Kullan\u0131c\u0131: \" + userMessage2);\n          System.out.println(\"AI: \" + aiResponse2);\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>model.generate()<\/code> \u00e7a\u011fr\u0131s\u0131 her seferinde yeni bir ba\u011flamla yap\u0131l\u0131r. Yani LLM, \u00f6nceki konu\u015fmay\u0131 hat\u0131rlamaz. Bu noktada ajana haf\u0131za ekleme ihtiyac\u0131 ortaya \u00e7\u0131kar.<\/p>\n<h3>Ajan\u0131n Ge\u00e7mi\u015fi Unutmamas\u0131 \u0130\u00e7in Haf\u0131za Ekleme: MongoDB ChatMessageHistory<\/h3>\n<p>Bir sohbet robotunun veya ak\u0131ll\u0131 ajan\u0131n en \u00f6nemli \u00f6zelliklerinden biri, kullan\u0131c\u0131yla yapt\u0131\u011f\u0131 \u00f6nceki konu\u015fmalar\u0131 hat\u0131rlayabilmesidir. LangChain4j, bu haf\u0131za y\u00f6netimini kolayla\u015ft\u0131rmak i\u00e7in <code>ChatMessageHistory<\/code> aray\u00fcz\u00fcn\u00fc sunar. MongoDB entegrasyonu sayesinde, bu sohbet ge\u00e7mi\u015fini kal\u0131c\u0131 olarak MongoDB'de saklayabiliriz. Bu sayede, uygulama yeniden ba\u015flat\u0131lsa bile ajan ge\u00e7mi\u015fi hat\u0131rlamaya devam eder.<\/p>\n<p>MongoDB ba\u011flant\u0131 dizemizi kullanarak bir <code>MongoClient<\/code> ve ard\u0131ndan <code>MongoDBChatMessageHistory<\/code> \u00f6rne\u011fi olu\u015fturmam\u0131z gerekecek:<\/p>\n<pre><code>\n  import com.mongodb.client.MongoClient;\n  import com.mongodb.client.MongoClients;\n  import dev.langchain4j.data.message.AiMessage;\n  import dev.langchain4j.data.message.SystemMessage;\n  import dev.langchain4j.data.message.UserMessage;\n  import dev.langchain4j.memory.ChatMemory;\n  import dev.langchain4j.memory.chat.MessageWindowChatMemory;\n  import dev.langchain4j.model.openai.OpenAiChatModel;\n  import dev.langchain4j.store.memory.chat.MongoDBChatMessageHistory;\n\n  import static dev.langchain4j.data.message.SystemMessage.systemMessage;\n\n  public class AgentWithMemory {\n\n      private static final String MONGO_CONNECTION_STRING = \"mongodb+srv:\/\/<username>:<password>@cluster0.abcde.mongodb.net\/?retryWrites=true&w=majority\";\n      private static final String DATABASE_NAME = \"ai_agent_db\";\n      private static final String COLLECTION_NAME = \"chat_history\"; \/\/ Sohbet ge\u00e7mi\u015fi i\u00e7in yeni bir koleksiyon\n\n      public static void main(String[] args) {\n          String openaiApiKey = System.getenv(\"OPENAI_API_KEY\");\n          if (openaiApiKey == null || openaiApiKey.isEmpty()) {\n              System.err.println(\"Hata: OPENAI_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\");\n              return;\n          }\n\n          \/\/ 1. OpenAI Chat Modeli olu\u015ftur\n          OpenAiChatModel model = OpenAiChatModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"gpt-3.5-turbo\")\n                  .temperature(0.7)\n                  .build();\n\n          \/\/ 2. MongoDB MongoClient olu\u015ftur\n          MongoClient mongoClient = MongoClients.create(MONGO_CONNECTION_STRING);\n\n          \/\/ 3. MongoDBChatMessageHistory ile kal\u0131c\u0131 haf\u0131za olu\u015ftur\n          \/\/ 'user123' bir kullan\u0131c\u0131\/session ID'si olabilir. Her kullan\u0131c\u0131 i\u00e7in ayr\u0131 haf\u0131za.\n          MongoDBChatMessageHistory chatMessageHistory = new MongoDBChatMessageHistory(\n                  mongoClient,\n                  DATABASE_NAME,\n                  COLLECTION_NAME,\n                  \"user123\" \/\/ Kullan\u0131c\u0131 kimli\u011fi\n          );\n\n          \/\/ 4. ChatMemory'yi bu tarih\u00e7e ile sarmala\n          \/\/ MessageWindowChatMemory, ge\u00e7mi\u015f mesajlar\u0131 belli bir pencerede tutar.\n          ChatMemory chatMemory = MessageWindowChatMemory.builder()\n                  .maxMessages(10) \/\/ Son 10 mesaj\u0131 hat\u0131rla\n                  .chatMessageHistory(chatMessageHistory)\n                  .build();\n\n          \/\/ 5. \u0130lk etkile\u015fim\n          System.out.println(\"Kullan\u0131c\u0131: Nas\u0131ls\u0131n?\");\n          chatMemory.add(UserMessage.from(\"Nas\u0131ls\u0131n?\")); \/\/ Kullan\u0131c\u0131 mesaj\u0131n\u0131 haf\u0131zaya ekle\n          AiMessage aiResponse1 = model.generate(chatMemory.messages()).content();\n          chatMemory.add(AiMessage.from(aiResponse1)); \/\/ AI cevab\u0131n\u0131 haf\u0131zaya ekle\n          System.out.println(\"AI: \" + aiResponse1);\n\n          \/\/ 6. \u0130kinci etkile\u015fim - Ajan \u015fimdi \u00f6nceki konu\u015fmay\u0131 hat\u0131rl\u0131yor olmal\u0131\n          System.out.println(\"\\nKullan\u0131c\u0131: Ad\u0131n neydi?\");\n          chatMemory.add(UserMessage.from(\"Ad\u0131n neydi?\"));\n          AiMessage aiResponse2 = model.generate(chatMemory.messages()).content();\n          chatMemory.add(AiMessage.from(aiResponse2));\n          System.out.println(\"AI: \" + aiResponse2);\n\n          \/\/ MongoClient'\u0131 kapatmay\u0131 unutmay\u0131n\n          mongoClient.close();\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011funda, <code>MongoDBChatMessageHistory<\/code> kullanarak bir <code>chat_history<\/code> koleksiyonunda <code>user123<\/code> kimli\u011fine sahip kullan\u0131c\u0131n\u0131n t\u00fcm konu\u015fma ge\u00e7mi\u015fini kal\u0131c\u0131 olarak sakl\u0131yoruz. <code>MessageWindowChatMemory<\/code> ise, bu ge\u00e7mi\u015fin sadece son N mesaj\u0131n\u0131 LLM'e g\u00f6ndermek i\u00e7in bir pencere g\u00f6revi g\u00f6r\u00fcr. Bu, token maliyetini d\u00fc\u015f\u00fcrmek ve LLM'in ba\u011flam limitlerini a\u015fmamak i\u00e7in \u00f6nemlidir.<\/p>\n<p>Bu yap\u0131land\u0131rma ile yapay zeka ajan\u0131n\u0131z art\u0131k yaln\u0131zca anl\u0131k sorgulara yan\u0131t vermekle kalmayacak, ayn\u0131 zamanda kullan\u0131c\u0131yla devam eden bir diyalo\u011fu s\u00fcrd\u00fcrebilecek, ge\u00e7mi\u015f etkile\u015fimlerini hat\u0131rlayabilecek ve daha ki\u015fiselle\u015ftirilmi\u015f ve tutarl\u0131 bir deneyim sunabilecektir. B\u00f6ylece, ajan\u0131n ger\u00e7ek bir \"haf\u0131zaya\" sahip olmas\u0131n\u0131 sa\u011flam\u0131\u015f oluyoruz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Verileriyle Etkile\u015fim: RAG ve MongoDB Atlas<\/h2>\n<p>Yapay zeka ajanlar\u0131m\u0131z\u0131n sadece genel bilgilerle s\u0131n\u0131rl\u0131 kalmas\u0131n\u0131 istemeyiz. Onlar\u0131n, i\u015fletmemizin \u00f6zel verileriyle veya belirli bir alan\u0131n derinlemesine bilgileriyle etkile\u015fim kurabilmesi gerekir. \u0130\u015fte burada Retrieval-Augmented Generation (RAG) deseni ve MongoDB Atlas Vector Search'\u00fcn g\u00fcc\u00fc devreye giriyor. RAG, LLM'in harici bir bilgi kayna\u011f\u0131ndan (bizim durumumuzda MongoDB) ilgili bilgileri alarak yan\u0131tlar\u0131n\u0131 zenginle\u015ftirmesini sa\u011flar. B\u00f6ylece LLM, hal\u00fcsinasyon riskini azalt\u0131r ve daha do\u011fru, g\u00fcncel ve ba\u011flamsal yan\u0131tlar \u00fcretir.<\/p>\n<h3>Bilgi Taban\u0131 Olu\u015fturma ve Vekt\u00f6rle\u015ftirme<\/h3>\n<p>Bir RAG sisteminde ilk ad\u0131m, ajan\u0131m\u0131z\u0131n sorgulayaca\u011f\u0131 bir bilgi taban\u0131 olu\u015fturmakt\u0131r. Bu bilgi taban\u0131, \u015firket i\u00e7i dok\u00fcmanlar, web sayfalar\u0131, \u00fcr\u00fcn kataloglar\u0131 veya herhangi bir metinsel veri olabilir. Bu verileri LLM'in anlayabilece\u011fi bir formata d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir: vekt\u00f6r g\u00f6mmeler (embeddings).<\/p>\n<p>LangChain4j, bu s\u00fcreci kolayla\u015ft\u0131rmak i\u00e7in bir dizi ara\u00e7 sunar:<\/p>\n<ol>\n<li><strong>Belge Y\u00fckleyiciler (Document Loaders):<\/strong> PDF'ler, TXT dosyalar\u0131, web sayfalar\u0131 gibi \u00e7e\u015fitli kaynaklardan veriyi y\u00fckler.<\/li>\n<li><strong>Metin B\u00f6l\u00fcc\u00fcler (Text Splitters):<\/strong> Y\u00fcklenen b\u00fcy\u00fck belgeleri, LLM'in ba\u011flam penceresine s\u0131\u011fabilecek ve anlamsal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruyacak \u015fekilde daha k\u00fc\u00e7\u00fck par\u00e7alara (chunks) ay\u0131r\u0131r.<\/li>\n<li><strong>G\u00f6mme Modelleri (Embedding Models):<\/strong> Bu k\u00fc\u00e7\u00fck metin par\u00e7alar\u0131n\u0131 say\u0131sal vekt\u00f6rlere d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/li>\n<\/ol>\n<p>\u015eimdi \u00f6rnek bir kod blo\u011fu ile bu s\u00fcreci nas\u0131l ger\u00e7ekle\u015ftirece\u011fimize bakal\u0131m. Bu \u00f6rnekte basit bir metin listesinden bir bilgi taban\u0131 olu\u015fturaca\u011f\u0131z ve bunlar\u0131 MongoDB Atlas'a y\u00fckleyece\u011fiz.<\/p>\n<pre><code>\n  import com.mongodb.client.MongoClient;\n  import com.mongodb.client.MongoClients;\n  import dev.langchain4j.data.document.Document;\n  import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;\n  import dev.langchain4j.data.document.parser.TextDocumentParser;\n  import dev.langchain4j.data.document.splitter.DocumentSplitters;\n  import dev.langchain4j.data.segment.TextSegment;\n  import dev.langchain4j.model.embedding.EmbeddingModel;\n  import dev.langchain4j.model.openai.OpenAiEmbeddingModel;\n  import dev.langchain4j.store.embedding.mongodb.MongoDBAtlasVectorStore;\n  import org.slf4j.Logger;\n  import org.slf4j.LoggerFactory;\n\n  import java.io.IOException;\n  import java.nio.file.Files;\n  import java.nio.file.Path;\n  import java.nio.file.Paths;\n  import java.util.List;\n\n  import static java.util.Arrays.asList;\n  import static dev.langchain4j.data.document.loader.FileSystemDocumentLoader.loadDocument;\n\n  public class KnowledgeBaseCreator {\n\n      private static final Logger logger = LoggerFactory.getLogger(KnowledgeBaseCreator.class);\n      private static final String MONGO_CONNECTION_STRING = \"mongodb+srv:\/\/<username>:<password>@cluster0.abcde.mongodb.net\/?retryWrites=true&w=majority\";\n      private static final String DATABASE_NAME = \"ai_agent_db\";\n      private static final String COLLECTION_NAME = \"documents\"; \/\/ Bilgi taban\u0131 i\u00e7in koleksiyon\n      private static final String VECTOR_INDEX_NAME = \"vector_index\"; \/\/ MongoDB Atlas'ta olu\u015fturdu\u011funuz indeks ad\u0131\n\n      public static void main(String[] args) throws IOException {\n          String openaiApiKey = System.getenv(\"OPENAI_API_KEY\");\n          if (openaiApiKey == null || openaiApiKey.isEmpty()) {\n              logger.error(\"Hata: OPENAI_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\");\n              return;\n          }\n\n          \/\/ 1. G\u00f6mme modelini olu\u015ftur (OpenAI Embedding modeli)\n          EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"text-embedding-ada-002\") \/\/ Genellikle bu model kullan\u0131l\u0131r\n                  .build();\n\n          \/\/ 2. MongoDB Client ve Vector Store olu\u015ftur\n          MongoClient mongoClient = MongoClients.create(MONGO_CONNECTION_STRING);\n          MongoDBAtlasVectorStore vectorStore = MongoDBAtlasVectorStore.builder()\n                  .mongoClient(mongoClient)\n                  .databaseName(DATABASE_NAME)\n                  .collectionName(COLLECTION_NAME)\n                  .indexName(VECTOR_INDEX_NAME)\n                  .embeddingModel(embeddingModel) \/\/ Vector store olu\u015fturulurken embedding modeli belirtilir\n                  .build();\n\n          \/\/ 3. Bilgi kayna\u011f\u0131m\u0131z\u0131 olu\u015ftur (Basit metin dosyas\u0131)\n          \/\/ Ge\u00e7ici bir dosya olu\u015ftural\u0131m\n          Path tempFile = Paths.get(\"temp_knowledge_base.txt\");\n          Files.writeString(tempFile, \"\u0130stanbul, T\u00fcrkiye'nin en kalabal\u0131k \u015fehridir ve k\u00fclt\u00fcrel bir merkezdir. Bo\u011faz, \u015fehri Asya ve Avrupa olarak ikiye ay\u0131r\u0131r. Tarihi yar\u0131mada, Ayasofya ve Sultanahmet Camii gibi bir\u00e7ok \u00f6nemli esere ev sahipli\u011fi yapar. T\u00fcrkiye'nin ba\u015fkenti Ankara'd\u0131r, \u0130stanbul de\u011fil.\");\n\n          \/\/ 4. Dok\u00fcman\u0131 y\u00fckle ve b\u00f6l\n          \/\/ FileSystemDocumentLoader.loadDocument(tempFile, new TextDocumentParser()); yerine Files.readString() ile direk metni al\u0131p i\u015fleyebiliriz.\n          \/\/ Ancak standart LangChain4j y\u00fckleyicilerini kullanmak daha esnektir.\n          Document document = loadDocument(tempFile, new TextDocumentParser());\n\n          List<TextSegment> segments = DocumentSplitters.recursive(\n                          100,  \/\/ Maksimum 100 karakterlik par\u00e7alar\n                          0     \/\/ \u00c7ak\u0131\u015fma yok\n                  ).split(document);\n\n          \/\/ 5. Her metin par\u00e7as\u0131n\u0131 vekt\u00f6rlere d\u00f6n\u00fc\u015ft\u00fcr ve MongoDB'ye kaydet\n          \/\/ MongoDBAtlasVectorStore, bu i\u015flemi otomatik olarak yapar.\n          logger.info(\"Metin par\u00e7alar\u0131n\u0131 vekt\u00f6rle\u015ftirip MongoDB'ye kaydediyor...\");\n          vectorStore.add(segments);\n          logger.info(\"Bilgi taban\u0131 MongoDB'ye ba\u015far\u0131yla eklendi.\");\n\n          \/\/ Ge\u00e7ici dosyay\u0131 sil\n          Files.delete(tempFile);\n          mongoClient.close();\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod par\u00e7as\u0131, \u00f6rnek bir metin belgesini y\u00fckler, onu k\u00fc\u00e7\u00fck <code>TextSegment<\/code>'lere b\u00f6ler, <code>OpenAiEmbeddingModel<\/code> kullanarak her segmentin vekt\u00f6r g\u00f6mmesini olu\u015fturur ve son olarak bu segmentleri ve ili\u015fkili vekt\u00f6rlerini <code>MongoDBAtlasVectorStore<\/code> arac\u0131l\u0131\u011f\u0131yla MongoDB Atlas'a kaydeder. MongoDB Atlas taraf\u0131nda, <code>embedding<\/code> alan\u0131n\u0131n <code>knnVector<\/code> olarak tan\u0131mland\u0131\u011f\u0131 bir indeksin (\u00f6nceki ad\u0131mda olu\u015fturdu\u011fumuz gibi) zaten var oldu\u011fundan emin olun.<\/p>\n<h3>MongoDB Atlas Vector Search ile Ak\u0131ll\u0131 Veri Al\u0131m\u0131<\/h3>\n<p>Bilgi taban\u0131m\u0131z MongoDB'de vekt\u00f6rler olarak depoland\u0131\u011f\u0131na g\u00f6re, art\u0131k ajan\u0131m\u0131z\u0131n sorgular\u0131na yan\u0131t verirken bu bilgi taban\u0131n\u0131 nas\u0131l kullanaca\u011f\u0131n\u0131 yap\u0131land\u0131rabiliriz. Bu, <code>RetrievalAugmentor<\/code> veya do\u011frudan <code>EmbeddingStoreRetriever<\/code> kullan\u0131m\u0131yla ger\u00e7ekle\u015fir.<\/p>\n<pre><code>\n  import com.mongodb.client.MongoClient;\n  import com.mongodb.client.MongoClients;\n  import dev.langchain4j.chain.ConversationalChain;\n  import dev.langchain4j.data.message.AiMessage;\n  import dev.langchain4j.data.message.UserMessage;\n  import dev.langchain4j.memory.ChatMemory;\n  import dev.langchain4j.memory.chat.MessageWindowChatMemory;\n  import dev.langchain4j.model.chat.ChatLanguageModel;\n  import dev.langchain4j.model.embedding.EmbeddingModel;\n  import dev.langchain4j.model.openai.OpenAiChatModel;\n  import dev.langchain4j.model.openai.OpenAiEmbeddingModel;\n  import dev.langchain4j.retriever.EmbeddingStoreRetriever;\n  import dev.langchain4j.retriever.Retriever;\n  import dev.langchain4j.store.embedding.mongodb.MongoDBAtlasVectorStore;\n  import org.slf4j.Logger;\n  import org.slf4j.LoggerFactory;\n\n  public class AgentWithRAG {\n\n      private static final Logger logger = LoggerFactory.getLogger(AgentWithRAG.class);\n      private static final String MONGO_CONNECTION_STRING = \"mongodb+srv:\/\/<username>:<password>@cluster0.abcde.mongodb.net\/?retryWrites=true&w=majority\";\n      private static final String DATABASE_NAME = \"ai_agent_db\";\n      private static final String DOCS_COLLECTION_NAME = \"documents\"; \/\/ Bilgi taban\u0131 koleksiyonu\n      private static final String CHAT_HISTORY_COLLECTION_NAME = \"chat_history\"; \/\/ Sohbet ge\u00e7mi\u015fi koleksiyonu\n      private static final String VECTOR_INDEX_NAME = \"vector_index\"; \/\/ MongoDB Atlas'taki vekt\u00f6r indeks ad\u0131\n\n      public static void main(String[] args) {\n          String openaiApiKey = System.getenv(\"OPENAI_API_KEY\");\n          if (openaiApiKey == null || openaiApiKey.isEmpty()) {\n              logger.error(\"Hata: OPENAI_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\");\n              return;\n          }\n\n          MongoClient mongoClient = MongoClients.create(MONGO_CONNECTION_STRING);\n\n          \/\/ Chat Modeli\n          ChatLanguageModel chatModel = OpenAiChatModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"gpt-3.5-turbo\")\n                  .temperature(0.5)\n                  .build();\n\n          \/\/ Embedding Modeli\n          EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"text-embedding-ada-002\")\n                  .build();\n\n          \/\/ Vekt\u00f6r Deposu (MongoDB Atlas)\n          MongoDBAtlasVectorStore vectorStore = MongoDBAtlasVectorStore.builder()\n                  .mongoClient(mongoClient)\n                  .databaseName(DATABASE_Name)\n                  .collectionName(DOCS_COLLECTION_NAME)\n                  .indexName(VECTOR_INDEX_NAME)\n                  .embeddingModel(embeddingModel)\n                  .build();\n\n          \/\/ Retriever olu\u015fturma - En alakal\u0131 3 dok\u00fcman\u0131 getirir\n          Retriever<dev.langchain4j.data.segment.TextSegment> retriever = EmbeddingStoreRetriever.from(\n                  vectorStore,\n                  embeddingModel,\n                  3 \/\/ En alakal\u0131 ilk 3 segmenti getir\n          );\n\n          \/\/ Sohbet Haf\u0131zas\u0131 (MongoDB destekli)\n          dev.langchain4j.store.memory.chat.ChatMessageHistory mongoChatMessageHistory = new dev.langchain4j.store.memory.chat.MongoDBChatMessageHistory(\n                  mongoClient,\n                  DATABASE_NAME,\n                  CHAT_HISTORY_COLLECTION_NAME,\n                  \"user456\"\n          );\n\n          ChatMemory chatMemory = MessageWindowChatMemory.builder()\n                  .maxMessages(10)\n                  .chatMessageHistory(mongoChatMessageHistory)\n                  .build();\n\n          \/\/ ConversationalChain olu\u015fturma - RAG'\u0131 ve haf\u0131zay\u0131 birle\u015ftirir\n          ConversationalChain chain = ConversationalChain.builder()\n                  .chatLanguageModel(chatModel)\n                  .chatMemory(chatMemory)\n                  .retriever(retriever)\n                  \/\/ .promptTemplate(\"Context:\\n{{context}}\\n\\nQuestion: {{question}}\\nAnswer:\") \/\/ \u0130ste\u011fe ba\u011fl\u0131, varsay\u0131lan \u015fablonu kullanabiliriz\n                  .build();\n\n          \/\/ Etkile\u015fimler\n          System.out.println(\"Kullan\u0131c\u0131: \u0130stanbul hakk\u0131nda bilgi verir misin?\");\n          String aiResponse1 = chain.execute(\"\u0130stanbul hakk\u0131nda bilgi verir misin?\");\n          System.out.println(\"AI: \" + aiResponse1);\n\n          System.out.println(\"\\nKullan\u0131c\u0131: Peki T\u00fcrkiye'nin ba\u015fkenti neresidir?\");\n          String aiResponse2 = chain.execute(\"Peki T\u00fcrkiye'nin ba\u015fkenti neresidir?\");\n          System.out.println(\"AI: \" + aiResponse2);\n\n          mongoClient.close();\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>EmbeddingStoreRetriever<\/code>'\u0131 kullanarak kullan\u0131c\u0131n\u0131n sorgusuna anlamsal olarak en yak\u0131n belgeleri <code>MongoDBAtlasVectorStore<\/code>'dan al\u0131yoruz. <code>ConversationalChain<\/code> ise bu al\u0131nan ba\u011flam\u0131, sohbet ge\u00e7mi\u015fini ve LLM'i bir araya getirerek nihai yan\u0131t\u0131 \u00fcretir. Ajan\u0131m\u0131z art\u0131k sadece genel bilgiye de\u011fil, ayn\u0131 zamanda sizin sa\u011flad\u0131\u011f\u0131n\u0131z \u00f6zel bilgi taban\u0131na da eri\u015febiliyor!<\/p>\n<aside class=\"expert-tip\">\n    Uzman \u0130pucu: RAG performans\u0131n\u0131 art\u0131rmak i\u00e7in metin b\u00f6lme stratejilerinizi optimize edin. \u00c7ok k\u00fc\u00e7\u00fck par\u00e7alar ba\u011flam\u0131 kaybettirirken, \u00e7ok b\u00fcy\u00fck par\u00e7alar maliyeti ve g\u00fcr\u00fclt\u00fcy\u00fc art\u0131rabilir. RecursiveCharacterTextSplitter genellikle iyi bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Ayr\u0131ca, sorgu ba\u015f\u0131na getirilen dok\u00fcman say\u0131s\u0131n\u0131 (<code>3<\/code> yerine <code>5<\/code> veya <code>1<\/code> gibi) ayarlayarak performans ve do\u011fruluk aras\u0131nda denge kurabilirsiniz.<br \/>\n<\/aside>\n<p>Bu entegrasyonla, YZ ajan\u0131n\u0131z art\u0131k \u00e7ok daha yetenekli ve \"bilgili\" hale geliyor. Ger\u00e7ek d\u00fcnya verilerinden \u00f6\u011frenme ve onlara uygun yan\u0131tlar \u00fcretme yetene\u011fi, onu s\u0131radan bir sohbet robotundan ak\u0131ll\u0131 bir ajana d\u00f6n\u00fc\u015ft\u00fcr\u00fcyor.<\/p>\n<h2>Ajan\u0131 Eyleme Ge\u00e7irmek: Ara\u00e7lar ve \u0130\u015f Ak\u0131\u015f\u0131<\/h2>\n<p>Bir YZ ajan\u0131 sadece soru yan\u0131tlamaktan veya bilgi almaktan \u00f6tesine ge\u00e7melidir; ayn\u0131 zamanda d\u0131\u015f d\u00fcnyayla etkile\u015fim kurabilmeli, belirli g\u00f6revleri yerine getirebilmelidir. Bu, LangChain4j'deki \"Ara\u00e7lar\" (Tools) konseptiyle sa\u011flan\u0131r. Ara\u00e7lar, bir ajan\u0131n belirli bir g\u00f6revi yerine getirmek i\u00e7in kullanabilece\u011fi fonksiyonlar\u0131 veya API'leri temsil eder.<\/p>\n<h3>Ajan\u0131n Karar Verme Mekanizmas\u0131: Prompt M\u00fchendisli\u011fi<\/h3>\n<p>Bir ajan, hangi arac\u0131 ne zaman kullanaca\u011f\u0131na karar vermek i\u00e7in bir LLM kullan\u0131r. Bu karar verme s\u00fcreci, LLM'e verilen talimatlar\u0131n (prompt'lar\u0131n) kalitesine ba\u011fl\u0131d\u0131r. Etkili bir prompt m\u00fchendisli\u011fi, ajan\u0131n do\u011fru arac\u0131 do\u011fru ba\u011flamda kullanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Ajan\u0131n \u00e7al\u0131\u015fma prensibi genellikle \u015f\u00f6yledir:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131 bir sorgu veya talimat g\u00f6nderir.<\/li>\n<li>Ajan, LLM'e (i\u00e7 haf\u0131zas\u0131, mevcut ara\u00e7lar\u0131 ve kullan\u0131c\u0131n\u0131n sorgusuyla birlikte) \"Bu g\u00f6revi tamamlamak i\u00e7in hangi arac\u0131 kullanmal\u0131y\u0131m?\" diye sorar.<\/li>\n<li>LLM, en uygun arac\u0131 ve parametrelerini belirler.<\/li>\n<li>Ajan, bu arac\u0131 \u00e7a\u011f\u0131r\u0131r ve sonucunu al\u0131r.<\/li>\n<li>Ajan, aradan gelen sonucu ve orijinal sorguyu tekrar LLM'e g\u00f6nderir ve bir nihai yan\u0131t \u00fcretmesini ister.<\/li>\n<\/ol>\n<aside class=\"expert-tip\">\n    Uzman \u0130pucu: Prompt m\u00fchendisli\u011finde Chain of Thought (D\u00fc\u015f\u00fcnce Zinciri) prensibini kullanmak ajan\u0131n muhakeme yetene\u011fini art\u0131r\u0131r. LLM'den sadece bir cevap vermek yerine, cevaba nas\u0131l ula\u015ft\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamas\u0131n\u0131 isteyin. \u00d6rne\u011fin, \"D\u00fc\u015f\u00fcn: Bu sorguyu yan\u0131tlamak i\u00e7in hangi ad\u0131mlar\u0131 izlemeliyim? Hangi arac\u0131 kullanmal\u0131y\u0131m? Ard\u0131ndan cevab\u0131 ver.\" gibi bir y\u00f6nlendirme yapabilirsiniz.<br \/>\n<\/aside>\n<h3>D\u0131\u015f D\u00fcnyayla \u0130leti\u015fim: Ara\u00e7 Tan\u0131mlama ve Kullan\u0131m\u0131<\/h3>\n<p>LangChain4j, ajanlara d\u0131\u015f fonksiyonlar\u0131 entegre etmek i\u00e7in <code>Tool<\/code> aray\u00fcz\u00fcn\u00fc sunar. Bir ara\u00e7, herhangi bir Java metodunu temsil edebilir. \u00d6rne\u011fin, bir hava durumu API'sini sorgulayan, bir veritaban\u0131ndan veri \u00e7eken veya bir e-posta g\u00f6nderen bir metod bir ara\u00e7 olabilir.<\/p>\n<p>\u00d6rnek olarak, basit bir hesap makinesi arac\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n  import dev.langchain4j.agent.tool.Tool;\n\n  public class Calculator {\n\n      @Tool(\"iki say\u0131y\u0131 toplar\") \/\/ Araca bir a\u00e7\u0131klama ekliyoruz, LLM bunu kullanarak arac\u0131 ne zaman \u00e7a\u011f\u0131raca\u011f\u0131n\u0131 anlar\n      public double add(double a, double b) {\n          return a + b;\n      }\n\n      @Tool(\"iki say\u0131y\u0131 \u00e7arpar\")\n      public double multiply(double a, double b) {\n          return a * b;\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu arac\u0131 ve daha \u00f6nce olu\u015fturdu\u011fumuz LLM'i, haf\u0131zay\u0131 ve retriever'\u0131 bir araya getirerek bir <code>AiServices<\/code> ajan\u0131 olu\u015ftural\u0131m. <code>AiServices<\/code> declarative bir yakla\u015f\u0131m sunarak ajan olu\u015fturmay\u0131 basitle\u015ftirir.<\/p>\n<pre><code>\n  import com.mongodb.client.MongoClient;\n  import com.mongodb.client.MongoClients;\n  import dev.langchain4j.agent.tool.Tool;\n  import dev.langchain4j.data.segment.TextSegment;\n  import dev.langchain4j.memory.ChatMemory;\n  import dev.langchain4j.memory.chat.MessageWindowChatMemory;\n  import dev.langchain4j.model.chat.ChatLanguageModel;\n  import dev.langchain4j.model.embedding.EmbeddingModel;\n  import dev.langchain4j.model.openai.OpenAiChatModel;\n  import dev.langchain4j.model.openai.OpenAiEmbeddingModel;\n  import dev.langchain4j.rag.content.retriever.ContentRetriever;\n  import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;\n  import dev.langchain4j.service.AiServices;\n  import dev.langchain4j.store.embedding.mongodb.MongoDBAtlasVectorStore;\n  import dev.langchain4j.store.memory.chat.MongoDBChatMessageHistory;\n  import org.slf4j.Logger;\n  import org.slf4j.LoggerFactory;\n\n  import java.util.List;\n\n  public class AdvancedAgent {\n\n      private static final Logger logger = LoggerFactory.getLogger(AdvancedAgent.class);\n      private static final String MONGO_CONNECTION_STRING = \"mongodb+srv:\/\/<username>:<password>@cluster0.abcde.mongodb.net\/?retryWrites=true&w=majority\";\n      private static final String DATABASE_NAME = \"ai_agent_db\";\n      private static final String DOCS_COLLECTION_NAME = \"documents\";\n      private static final String CHAT_HISTORY_COLLECTION_NAME = \"chat_history\";\n      private static final String VECTOR_INDEX_NAME = \"vector_index\";\n\n      \/\/ Ajan\u0131m\u0131z\u0131n yeteneklerini tan\u0131mlayan aray\u00fcz\n      interface Assistant {\n          String chat(String message);\n      }\n\n      public static void main(String[] args) {\n          String openaiApiKey = System.getenv(\"OPENAI_API_KEY\");\n          if (openaiApiKey == null || openaiApiKey.isEmpty()) {\n              logger.error(\"Hata: OPENAI_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.\");\n              return;\n          }\n\n          MongoClient mongoClient = MongoClients.create(MONGO_CONNECTION_STRING);\n\n          ChatLanguageModel chatModel = OpenAiChatModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"gpt-4o\") \/\/ Daha geli\u015fmi\u015f ajanlar i\u00e7in gpt-4o veya gpt-4 kullanmak daha iyidir\n                  .temperature(0.7)\n                  .build();\n\n          EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()\n                  .apiKey(openaiApiKey)\n                  .modelName(\"text-embedding-ada-002\")\n                  .build();\n\n          MongoDBAtlasVectorStore vectorStore = MongoDBAtlasVectorStore.builder()\n                  .mongoClient(mongoClient)\n                  .databaseName(DATABASE_NAME)\n                  .collectionName(DOCS_COLLECTION_NAME)\n                  .indexName(VECTOR_INDEX_NAME)\n                  .embeddingModel(embeddingModel)\n                  .build();\n\n          ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()\n                  .embeddingStore(vectorStore)\n                  .embeddingModel(embeddingModel)\n                  .maxResults(3) \/\/ En alakal\u0131 3 belgeyi getir\n                  .build();\n\n          MongoDBChatMessageHistory mongoChatMessageHistory = new MongoDBChatMessageHistory(\n                  mongoClient,\n                  DATABASE_NAME,\n                  CHAT_HISTORY_COLLECTION_NAME,\n                  \"user789\" \/\/ Ajan\u0131n konu\u015fma ge\u00e7mi\u015fini bu ID ile sakla\n          );\n\n          ChatMemory chatMemory = MessageWindowChatMemory.builder()\n                  .maxMessages(10)\n                  .chatMessageHistory(mongoChatMessageHistory)\n                  .build();\n\n          \/\/ Ajan\u0131 olu\u015ftur\n          Assistant assistant = AiServices.builder(Assistant.class)\n                  .chatLanguageModel(chatModel)\n                  .chatMemory(chatMemory)\n                  .contentRetriever(contentRetriever) \/\/ RAG i\u00e7in\n                  .tools(new Calculator()) \/\/ Hesap makinesi arac\u0131n\u0131 ekle\n                  .build();\n\n          \/\/ Ajan ile etkile\u015fimler\n          System.out.println(\"AI: \" + assistant.chat(\"Merhaba, benim ad\u0131m Mert. Nas\u0131ls\u0131n?\"));\n          System.out.println(\"AI: \" + assistant.chat(\"Bug\u00fcn \u0130stanbul hakk\u0131nda ilgin\u00e7 bir bilgi verir misin?\"));\n          System.out.println(\"AI: \" + assistant.chat(\"25 ile 13'\u00fc \u00e7arpar m\u0131s\u0131n?\"));\n          System.out.println(\"AI: \" + assistant.chat(\"Daha \u00f6nce sana ad\u0131m\u0131 s\u00f6ylemi\u015f miydim?\"));\n\n          mongoClient.close();\n      }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011funda, <code>AiServices<\/code> kullanarak, bir <code>Assistant<\/code> aray\u00fcz\u00fcn\u00fc uygulayan bir ajan olu\u015fturuyoruz. Bu ajan, sohbet modelini, haf\u0131zay\u0131, RAG i\u00e7in <code>ContentRetriever<\/code>'\u0131 ve <code>Calculator<\/code> arac\u0131n\u0131 kullan\u0131r. LLM, kullan\u0131c\u0131n\u0131n sorgusuna g\u00f6re, ya konu\u015fma ge\u00e7mi\u015finden veya bilgi taban\u0131ndan bilgi al\u0131r, ya da <code>Calculator<\/code> arac\u0131n\u0131 \u00e7a\u011f\u0131rarak bir i\u015flem yapar. \u00d6rne\u011fin, \"25 ile 13'\u00fc \u00e7arpar m\u0131s\u0131n?\" dedi\u011finizde, ajan otomatik olarak <code>Calculator.multiply<\/code> metodunu \u00e7a\u011f\u0131racak ve sonucu kullan\u0131c\u0131ya bildirecektir.<\/p>\n<p>Bu yap\u0131, ajanlar\u0131m\u0131z\u0131n \u00e7ok daha dinamik ve i\u015flevsel olmas\u0131n\u0131 sa\u011flar. Sadece yan\u0131t vermekle kalmay\u0131p, belirli g\u00f6revleri yerine getirmek i\u00e7in d\u0131\u015f servisleri ve fonksiyonlar\u0131 kullanabilirler. Bu, ak\u0131ll\u0131 otomasyon ve etkile\u015fimli YZ uygulamalar\u0131n\u0131n temelini olu\u015fturur.<\/p>\n<h2>Mobil Dostu Tasar\u0131m: AI Uygulaman\u0131z\u0131 Her Cihazda Eri\u015filebilir K\u0131l\u0131n<\/h2>\n<p>Yapay zeka ajan\u0131n\u0131z\u0131 geli\u015ftirmek harika, ancak bu ajana kullan\u0131c\u0131lar\u0131n kolayca eri\u015febilmesi de \u00e7ok \u00f6nemli. G\u00fcn\u00fcm\u00fczde mobil cihazlar \u00fczerinden internete eri\u015fim, masa\u00fcst\u00fcnden \u00e7ok daha yayg\u0131n hale geldi. Bu nedenle, YZ uygulaman\u0131z\u0131n web aray\u00fcz\u00fcn\u00fcn veya mobil uygulamas\u0131n\u0131n mobil dostu olmas\u0131 hayati \u00f6nem ta\u015f\u0131r. HTML ve CSS kullanarak mobil uyumlu bir aray\u00fcz olu\u015ftururken dikkat etmeniz gereken baz\u0131 temel prensipler ve pratik \u00f6rnekler sunaca\u011f\u0131m.<\/p>\n<h3>Neden Mobil Dostu Tasar\u0131m \u00d6nemlidir?<\/h3>\n<ul>\n<li><strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Mobil cihazlardan eri\u015fen kullan\u0131c\u0131lar, k\u00f6t\u00fc optimize edilmi\u015f sitelerde h\u0131zl\u0131ca hayal k\u0131r\u0131kl\u0131\u011f\u0131na u\u011frar ve sitenizi terk ederler. Ak\u0131c\u0131 bir deneyim, uygulaman\u0131z\u0131n benimsenmesini art\u0131r\u0131r.<\/li>\n<li><strong>SEO Performans\u0131:<\/strong> Google gibi arama motorlar\u0131, mobil uyumlu sitelere arama sonu\u00e7lar\u0131nda \u00f6ncelik verir. Bu, YZ uygulaman\u0131z\u0131n ke\u015ffedilebilirli\u011fi i\u00e7in \u00f6nemlidir.<\/li>\n<li><strong>Eri\u015filebilirlik:<\/strong> Farkl\u0131 ekran boyutlar\u0131na ve giri\u015f y\u00f6ntemlerine (dokunma, klavye) uyum sa\u011flamak, daha geni\u015f bir kullan\u0131c\u0131 kitlesine ula\u015fman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Mobil Uyumlu HTML ve CSS \u0130\u00e7in Temel Prensipler<\/h3>\n<ol>\n<li><strong>Duyarl\u0131 Tasar\u0131m (Responsive Design):<\/strong> Bu, uygulaman\u0131z\u0131n farkl\u0131 ekran boyutlar\u0131na ve \u00e7\u00f6z\u00fcn\u00fcrl\u00fcklerine otomatik olarak uyum sa\u011flamas\u0131 anlam\u0131na gelir. Temel olarak, ak\u0131\u015fkan \u0131zgaralar, esnek resimler ve medya sorgular\u0131 (media queries) kullan\u0131l\u0131r.<\/li>\n<li><strong>Meta Viewport Etiketi:<\/strong> Her duyarl\u0131 web sayfas\u0131, <code><head><\/code> b\u00f6l\u00fcm\u00fcnde bu etiketi i\u00e7ermelidir. Bu, taray\u0131c\u0131ya sayfan\u0131n cihaz geni\u015fli\u011fine g\u00f6re \u00f6l\u00e7eklenmesini s\u00f6yler.<\/li>\n<li><strong>Ak\u0131\u015fkan Birimler:<\/strong> <code>px<\/code> gibi sabit birimler yerine <code>%<\/code> (y\u00fczde), <code>vh<\/code> (viewport height), <code>vw<\/code> (viewport width), <code>em<\/code>, <code>rem<\/code> gibi ak\u0131\u015fkan birimler kullan\u0131n.<\/li>\n<li><strong>Medya Sorgular\u0131 (Media Queries):<\/strong> CSS kurallar\u0131n\u0131 belirli ekran boyutlar\u0131na, y\u00f6nelimlere veya di\u011fer cihaz \u00f6zelliklerine g\u00f6re uygulamak i\u00e7in kullan\u0131l\u0131rlar.<\/li>\n<\/ol>\n<h3>Mobil Uyumlu HTML \u00dcretimi ve Medya Sorgusu \u00d6rnekleri<\/h3>\n<p>Bu makalenin ba\u015f\u0131ndaki <code><\/p>\n<style><\/code> blo\u011funda, HTML i\u00e7eri\u011fimizin mobil uyumlu olmas\u0131 i\u00e7in gerekli temel CSS kurallar\u0131n\u0131 ve bir medya sorgusu \u00f6rne\u011fini zaten payla\u015ft\u0131m. Ancak burada, \u00f6zellikle bir tabloyu mobil cihazlarda daha okunabilir hale getirmek i\u00e7in nas\u0131l bir medya sorgusu kullanabilece\u011fimize dair daha detayl\u0131 bir \u00f6rne\u011fi tekrar vurgulayaca\u011f\u0131m:<\/p>\n<pre><code>\n  <style>\n      \/* Genel stil kurallar\u0131 *\/\n      body {\n          font-family: Arial, sans-serif;\n          margin: 0;\n          padding: 20px;\n          line-height: 1.6;\n      }\n      .container {\n          max-width: 960px;\n          margin: 0 auto;\n      }\n      table {\n          width: 100%;\n          border-collapse: collapse;\n          margin-top: 20px;\n      }\n      th, td {\n          border: 1px solid #ddd;\n          padding: 8px;\n          text-align: left;\n      }\n      th {\n          background-color: #f2f2f2;\n      }\n\n      \/* Mobil cihazlar i\u00e7in medya sorgusu *\/\n      @media (max-width: 768px) {\n          .container {\n              padding: 10px;\n          }\n          \/* Tablonun mobil cihazlarda nas\u0131l g\u00f6r\u00fcnece\u011fini ayarlay\u0131n *\/\n          table, thead, tbody, th, td, tr {\n              display: block; \/* T\u00fcm tablo elemanlar\u0131n\u0131 blok d\u00fczeyinde g\u00f6ster *\/\n          }\n          thead tr {\n              position: absolute; \/* Ba\u015fl\u0131k sat\u0131r\u0131n\u0131 gizle *\/\n              top: -9999px;\n              left: -9999px;\n          }\n          tr {\n              border: 1px solid #ccc;\n              margin-bottom: 10px;\n          }\n          td {\n              border: none;\n              border-bottom: 1px solid #eee;\n              position: relative;\n              padding-left: 50%; \/* Etiket i\u00e7in yer a\u00e7 *\/\n              text-align: right;\n          }\n          td:before {\n              position: absolute;\n              top: 6px;\n              left: 6px;\n              width: 45%;\n              padding-right: 10px;\n              white-space: nowrap;\n              text-align: left;\n              font-weight: bold;\n          }\n          \/* Her s\u00fctun i\u00e7in \u00f6zel etiketler *\/\n          td:nth-of-type(1):before { content: \"Ba\u015fl\u0131k 1\"; }\n          td:nth-of-type(2):before { content: \"Ba\u015fl\u0131k 2\"; }\n          td:nth-of-type(3):before { content: \"Ba\u015fl\u0131k 3\"; }\n      }\n  <\/style>\n\n  <div class=\"container\">\n      <h3>\u00d6rnek Duyarl\u0131 Tablo<\/h3>\n      <table>\n          <thead>\n              <tr>\n                  <th>\u00d6zellik<\/th>\n                  <th>A\u00e7\u0131klama<\/th>\n                  <th>Fayda<\/th>\n              <\/tr>\n          <\/thead>\n          <tbody>\n              <tr>\n                  <td>MongoDB Atlas<\/td>\n                  <td>Bulut tabanl\u0131, \u00f6l\u00e7eklenebilir veritaban\u0131.<\/td>\n                  <td>Kolay y\u00f6netim, y\u00fcksek performans.<\/td>\n              <\/tr>\n              <tr>\n                  <td>LangChain4j<\/td>\n                  <td>YZ ajan geli\u015ftirme framework'\u00fc.<\/td>\n                  <td>H\u0131zl\u0131 YZ uygulama geli\u015ftirme.<\/td>\n              <\/tr>\n          <\/tbody>\n      <\/table>\n  <\/div>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, bir tablonun b\u00fcy\u00fck ekranlarda standart bir tablo olarak g\u00f6r\u00fcnmesini, ancak 768px veya daha k\u00fc\u00e7\u00fck ekranlarda her sat\u0131r\u0131n dikey olarak istiflenmi\u015f kartlar gibi g\u00f6r\u00fcnmesini sa\u011flar. Her h\u00fccrenin i\u00e7eri\u011fi, <code>::before<\/code> s\u00f6zde eleman\u0131 kullan\u0131larak orijinal s\u00fctun ba\u015fl\u0131\u011f\u0131 ile etiketlenir, b\u00f6ylece mobil g\u00f6r\u00fcn\u00fcmde bile verinin ne anlama geldi\u011fi netle\u015fir.<\/p>\n<p>Mobil dostu tasar\u0131m sadece YZ uygulaman\u0131z\u0131n eri\u015filebilirli\u011fini art\u0131rmakla kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n uygulaman\u0131zla daha etkili bir \u015fekilde etkile\u015fim kurmas\u0131n\u0131 sa\u011flar. Bir YZ ajan\u0131 ne kadar ak\u0131ll\u0131 olursa olsun, kullan\u0131c\u0131 aray\u00fcz\u00fc k\u00f6t\u00fcyse de\u011feri anla\u015f\u0131lamaz. Bu nedenle, YZ ajan\u0131n\u0131z\u0131n arka plan teknolojileri kadar, \u00f6n y\u00fcz\u00fcn\u00fcn de modern standartlara uygun olmas\u0131 \u00f6nemlidir.<\/p>\n<h2>Vaka Analizi: Ak\u0131ll\u0131 Envanter Y\u00f6netim Ajan\u0131<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi ger\u00e7ek bir senaryoda nas\u0131l uygulayabilece\u011fimizi g\u00f6steren bir vaka analizine dalal\u0131m: bir Ak\u0131ll\u0131 Envanter Y\u00f6netim Ajan\u0131. Bu ajan, bir depodaki \u00fcr\u00fcnleri izlemek, stok seviyelerini g\u00fcncellemek, sipari\u015f durumlar\u0131n\u0131 sorgulamak ve hatta tedarik zinciri y\u00f6neticilerine proaktif \u00f6nerilerde bulunmak i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>Problem Senaryosu<\/h3>\n<p>B\u00fcy\u00fck bir e-ticaret \u015firketi, depolar\u0131ndaki envanter y\u00f6netimini manuel s\u00fcre\u00e7ler nedeniyle etkin bir \u015fekilde yapam\u0131yor. Stok fazlas\u0131 veya stok t\u00fckenmesi gibi durumlar s\u0131k\u00e7a ya\u015fan\u0131yor, bu da gelir kayb\u0131na ve m\u00fc\u015fteri memnuniyetsizli\u011fine yol a\u00e7\u0131yor. Ayr\u0131ca, tedarik zinciri y\u00f6neticileri, karma\u015f\u0131k veritaban\u0131 sorgular\u0131 ve raporlar arac\u0131l\u0131\u011f\u0131yla g\u00fcncel bilgilere eri\u015fmekte zorlan\u0131yorlar.<\/p>\n<h3>LangChain4j ve MongoDB \u00c7\u00f6z\u00fcm\u00fc<\/h3>\n<p>Bu problemi \u00e7\u00f6zmek i\u00e7in LangChain4j ve MongoDB kullanarak ak\u0131ll\u0131 bir envanter y\u00f6netim ajan\u0131 geli\u015ftirilebilir. \u0130\u015fte ajan\u0131n mimarisi ve bile\u015fenleri:<\/p>\n<ol>\n<li><strong>MongoDB Envanter Veritaban\u0131:<\/strong>\n<ul>\n<li>\u015eirketin t\u00fcm \u00fcr\u00fcn envanteri, tedarik\u00e7i bilgileri, sipari\u015f ge\u00e7mi\u015fi ve depo lokasyonlar\u0131 MongoDB koleksiyonlar\u0131nda depolan\u0131r. Dok\u00fcman tabanl\u0131 yap\u0131, farkl\u0131 \u00fcr\u00fcn t\u00fcrleri i\u00e7in esnek \u015femalar sa\u011flar.<\/li>\n<li>Her \u00fcr\u00fcn a\u00e7\u0131klamas\u0131, anahtar \u00f6zellikler ve tedarik\u00e7i notlar\u0131 gibi metinsel veriler, vekt\u00f6r g\u00f6mmeleri olu\u015fturularak <code>inventory_documents<\/code> koleksiyonuna MongoDB Atlas Vector Search i\u00e7in kaydedilir.<\/li>\n<li>Ge\u00e7mi\u015f sipari\u015f trendleri ve sat\u0131\u015f verileri de analitik i\u00e7in MongoDB'de tutulur.<\/li>\n<\/ul>\n<\/li>\n<li><strong>LangChain4j Tabanl\u0131 YZ Ajan\u0131:<\/strong>\n<ul>\n<li><strong>LLM (gpt-4o):<\/strong> Ajan\u0131n karar verme ve do\u011fal dil anlama yetene\u011fini sa\u011flar.<\/li>\n<li><strong>Haf\u0131za Y\u00f6netimi (<code>MongoDBChatMessageHistory<\/code>):<\/strong> Tedarik zinciri y\u00f6neticilerinin ajanla yapt\u0131\u011f\u0131 ge\u00e7mi\u015f t\u00fcm konu\u015fmalar\u0131 <code>chat_sessions<\/code> koleksiyonunda kal\u0131c\u0131 olarak saklar. Bu, ajan\u0131n ba\u011flam\u0131 hat\u0131rlamas\u0131n\u0131 ve ki\u015fiselle\u015ftirilmi\u015f bir deneyim sunmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir y\u00f6netici \"D\u00fcn sordu\u011fum \u00fcr\u00fcn\u00fcn stok durumu ne oldu?\" diye sordu\u011funda, ajan d\u00fcn hangi \u00fcr\u00fcn\u00fc sordu\u011funu hat\u0131rlayabilir.<\/li>\n<li><strong>RAG (Retrieval-Augmented Generation) i\u00e7in <code>MongoDBAtlasVectorStore<\/code>:<\/strong> Y\u00f6neticilerin do\u011fal dil sorgular\u0131n\u0131 (\u00f6rne\u011fin, \"XYZ modelinin \u00f6zelliklerini a\u00e7\u0131klar m\u0131s\u0131n?\" veya \"Bu \u00fcr\u00fcn\u00fcn benzerleri var m\u0131?\") i\u015flemek i\u00e7in kullan\u0131l\u0131r. Ajan, bu sorgular\u0131n vekt\u00f6r g\u00f6mmelerini olu\u015fturur ve <code>inventory_documents<\/code> koleksiyonunda anlamsal olarak en alakal\u0131 \u00fcr\u00fcn bilgilerini \u00e7eker. Bu sayede, LLM, \u015firketin kendi envanter verilerine dayanarak do\u011fru ve detayl\u0131 yan\u0131tlar verir.<\/li>\n<li><strong>Ara\u00e7lar (Tools):<\/strong> Ajan\u0131n d\u0131\u015f sistemlerle etkile\u015fime girmesini sa\u011flar.\n<ul>\n<li><strong><code>StockUpdateTool<\/code>:<\/strong> Bir \u00fcr\u00fcn\u00fcn stok seviyesini veritaban\u0131nda g\u00fcncelleyebilir. (<code>@Tool(\"Belirli bir \u00fcr\u00fcn\u00fcn stok miktar\u0131n\u0131 g\u00fcnceller\")<\/code>)<\/li>\n<li><strong><code>OrderQueryTool<\/code>:<\/strong> Belirli bir sipari\u015fin durumunu veya belirli bir tedarik\u00e7iden gelen sipari\u015fleri sorgulayabilir. (<code>@Tool(\"Sipari\u015fin durumunu veya tedarik\u00e7i baz\u0131nda sipari\u015fleri sorgular\")<\/code>)<\/li>\n<li><strong><code>DemandPredictionTool<\/code>:<\/strong> Ge\u00e7mi\u015f sat\u0131\u015f verilerine dayanarak bir \u00fcr\u00fcn\u00fcn gelecekteki talebini tahmin eden harici bir makine \u00f6\u011frenimi modelini \u00e7a\u011f\u0131rabilir. (<code>@Tool(\"Bir \u00fcr\u00fcn\u00fcn gelecekteki talebini tahmin eder\")<\/code>)<\/li>\n<li><strong><code>AlertTool<\/code>:<\/strong> D\u00fc\u015f\u00fck stok durumunda veya kritik bir sipari\u015f gecikmesinde sorumlu personele otomatik uyar\u0131 (e-posta\/SMS) g\u00f6nderebilir. (<code>@Tool(\"Belirli bir personele uyar\u0131 g\u00f6nderir\")<\/code>)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u00d6rnek Kullan\u0131m Ak\u0131\u015f\u0131<\/h3>\n<p>Bir tedarik zinciri y\u00f6neticisi, ajanla a\u015fa\u011f\u0131daki gibi etkile\u015fim kurabilir:<\/p>\n<ol>\n<li><strong>Y\u00f6netici:<\/strong> \"Merhaba ajan, ge\u00e7en ay en \u00e7ok satan \u00fcr\u00fcnlerimiz hangileriydi?\"<br \/>\n        *   <em>Ajan:<\/em> MongoDB'deki sat\u0131\u015f ge\u00e7mi\u015fini sorgular (belki <code>OrderQueryTool<\/code> benzeri bir arac\u0131 kullanarak) ve en \u00e7ok satan \u00fcr\u00fcnlerin listesini d\u00f6nd\u00fcr\u00fcr.\n    <\/li>\n<li><strong>Y\u00f6netici:<\/strong> \"Harika! 'Ak\u0131ll\u0131 Saat X' \u00fcr\u00fcn\u00fcn\u00fcn stok seviyesi d\u00fc\u015fmeye ba\u015flad\u0131 m\u0131? Ge\u00e7en haftaki talebine g\u00f6re ne kadar s\u00fcremiz var?\"<br \/>\n        *   <em>Ajan:<\/em> <code>StockQueryTool<\/code> ile <code>Ak\u0131ll\u0131 Saat X<\/code>'in mevcut stokunu kontrol eder. Ard\u0131ndan <code>DemandPredictionTool<\/code>'u \u00e7a\u011f\u0131rarak ge\u00e7mi\u015f talep verilerine g\u00f6re kalan s\u00fcreyi hesaplar ve \"Stok kritik seviyeye yakla\u015f\u0131yor. Ge\u00e7en haftaki talep e\u011filimiyle 3 g\u00fcn i\u00e7inde t\u00fckenebilir.\" gibi bir yan\u0131t verir.\n    <\/li>\n<li><strong>Y\u00f6netici:<\/strong> \"Tamam, l\u00fctfen 'Ak\u0131ll\u0131 Saat X' i\u00e7in 500 adet yeni sipari\u015f olu\u015ftur ve mevcut sto\u011fu 1000 adete \u00e7\u0131kar. Tedarik\u00e7iyi de bilgilendir.\"<br \/>\n        *   <em>Ajan:<\/em> <code>StockUpdateTool<\/code>'u kullanarak MongoDB'deki stok miktar\u0131n\u0131 g\u00fcnceller. <code>AlertTool<\/code>'u kullanarak ilgili tedarik\u00e7iye ve sat\u0131n alma departman\u0131na otomatik e-posta g\u00f6nderir. Y\u00f6neticinin onay\u0131n\u0131 ald\u0131ktan sonra i\u015flemi tamamlad\u0131\u011f\u0131n\u0131 bildirir.\n    <\/li>\n<li><strong>Y\u00f6netici:<\/strong> \"Bu \u00fcr\u00fcn\u00fcn teknik \u00f6zelliklerini bana \u00f6zetler misin?\"<br \/>\n        *   <em>Ajan:<\/em> Sorguyu vekt\u00f6r g\u00f6mmesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, <code>MongoDBAtlasVectorStore<\/code>'dan ilgili \u00fcr\u00fcn a\u00e7\u0131klamas\u0131n\u0131 RAG deseniyle \u00e7eker ve bu bilgilere dayanarak \u00f6zet bir yan\u0131t sunar.\n    <\/li>\n<\/ol>\n<h3>Elde Edilen Faydalar<\/h3>\n<ul>\n<li><strong>Artan Verimlilik:<\/strong> Manuel veri sorgulama ve raporlama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/li>\n<li><strong>Daha \u0130yi Karar Verme:<\/strong> G\u00fcncel ve do\u011fru bilgilere an\u0131nda eri\u015fim sa\u011flayarak daha bilin\u00e7li tedarik zinciri kararlar\u0131 al\u0131nmas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Azalan Stok Hatalar\u0131:<\/strong> Stok fazlas\u0131 veya t\u00fckenmesi riskini azalt\u0131r.<\/li>\n<li><strong>Proaktif Y\u00f6netim:<\/strong> Tahmin ara\u00e7lar\u0131 sayesinde olas\u0131 sorunlar \u00f6nceden belirlenir ve \u00f6nlem al\u0131n\u0131r.<\/li>\n<li><strong>Ki\u015fiselle\u015ftirilmi\u015f Deneyim:<\/strong> MongoDB'de tutulan ge\u00e7mi\u015f konu\u015fmalar sayesinde ajan, her y\u00f6neticiye \u00f6zel ve ba\u011flamsal yan\u0131tlar sunar.<\/li>\n<\/ul>\n<p>Bu vaka analizi, MongoDB ve LangChain4j'nin bir araya gelerek nas\u0131l g\u00fc\u00e7l\u00fc ve ak\u0131ll\u0131 bir i\u015f \u00e7\u00f6z\u00fcm\u00fc olu\u015fturabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Ajanlar, i\u015f s\u00fcre\u00e7lerini otomatikle\u015ftirme ve insan karar verme yeteneklerini g\u00fc\u00e7lendirme konusunda muazzam bir potansiyele sahiptir.<\/p>\n<h2>Sonu\u00e7: Gelece\u011fe Y\u00f6nelik Ad\u0131mlar ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, MongoDB ve LangChain4j kullanarak ilk yapay zeka ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l geli\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frendik. YZ ajanlar\u0131n\u0131n neden \u00f6nemli oldu\u011fundan ba\u015flayarak, LangChain4j'nin LLM orkestrasyon yeteneklerini, MongoDB'nin esnek veri y\u00f6netimini ve \u00f6zellikle MongoDB Atlas Vector Search'\u00fcn RAG deseniyle nas\u0131l g\u00fc\u00e7l\u00fc bir bilgi taban\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 detayl\u0131ca inceledik. Geli\u015ftirme ortam\u0131 kurulumundan LLM entegrasyonuna, kal\u0131c\u0131 haf\u0131za eklemekten ger\u00e7ek d\u00fcnya verileriyle etkile\u015fim kurmaya ve hatta ajana d\u0131\u015f ara\u00e7lar ekleyerek onu daha i\u015flevsel hale getirmeye kadar t\u00fcm temel ad\u0131mlar\u0131 ele ald\u0131k.<\/p>\n<p>Ayr\u0131ca, bir Ak\u0131ll\u0131 Envanter Y\u00f6netim Ajan\u0131 vaka analizi ile \u00f6\u011frendiklerimizi ger\u00e7ek bir i\u015f senaryosuna nas\u0131l uygulayabilece\u011fimizi g\u00f6sterdik. Mobil uyumlu tasar\u0131m\u0131n \u00f6nemine de de\u011finerek, uygulaman\u0131z\u0131n kullan\u0131c\u0131lar taraf\u0131ndan her cihazda eri\u015filebilir olmas\u0131n\u0131n ne kadar kritik oldu\u011funu vurgulad\u0131k. Yapay zeka ajanlar\u0131, i\u015f s\u00fcre\u00e7lerini otomatikle\u015ftirme, karar alma s\u00fcre\u00e7lerini destekleme ve m\u00fc\u015fteri deneyimlerini ki\u015fiselle\u015ftirme konusunda s\u0131n\u0131rs\u0131z potansiyel sunmaktad\u0131r. Bu makaledeki bilgiler ve \u00f6rnekler, kendi YZ ajanlar\u0131n\u0131z\u0131 in\u015fa etmek i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 olacakt\u0131r.<\/p>\n<p>Gelecekte, ajanlar\u0131n yetenekleri daha da geli\u015fecek, \u00e7ok modlu (multimodal) yetenekler (metin, g\u00f6r\u00fcnt\u00fc, ses) kazanacak ve daha karma\u015f\u0131k g\u00f6revleri daha otonom bir \u015fekilde yerine getirebileceklerdir. Bu alandaki s\u00fcrekli \u00f6\u011frenme ve deneyimleme, sizi bu heyecan verici gelece\u011fin \u00f6nc\u00fclerinden biri yapacakt\u0131r. Kendi projelerinizde bu teknolojileri deneyerek s\u0131n\u0131rlar\u0131 zorlamaktan \u00e7ekinmeyin!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. LangChain4j ve MongoDB kullanmak i\u00e7in Java bilmek \u015fart m\u0131?<\/strong><\/p>\n<p>Evet, LangChain4j Java tabanl\u0131 bir k\u00fct\u00fcphanedir, bu nedenle Java programlama diline hakim olmak gereklidir. Ancak, temel Java bilgisiyle bile bu rehberdeki \u00f6rnekleri anlayabilir ve uygulayabilirsiniz.<\/p>\n<p><strong>2. MongoDB Atlas Vector Search, t\u00fcm embedding modelleriyle uyumlu mu?<\/strong><\/p>\n<p>MongoDB Atlas Vector Search, genel olarak herhangi bir embedding modeli taraf\u0131ndan \u00fcretilen vekt\u00f6rlerle \u00e7al\u0131\u015fabilir. \u00d6nemli olan, vekt\u00f6r indeksini olu\u015ftururken do\u011fru <code>dimensions<\/code> (boyut) de\u011ferini belirtmenizdir. \u00d6rne\u011fin, OpenAI'\u0131n <code>text-embedding-ada-002<\/code> modeli 1536 boyutlu vekt\u00f6rler \u00fcretirken, ba\u015fka bir model farkl\u0131 bir boyut \u00fcretebilir.<\/p>\n<p><strong>3. Kendi \u00f6zel verilerimi LangChain4j ve MongoDB ile nas\u0131l g\u00fcvence alt\u0131na alabilirim?<\/strong><\/p>\n<p>Veri g\u00fcvenli\u011fi i\u00e7in birden fazla katmanl\u0131 yakla\u015f\u0131m benimsemelisiniz:<\/p>\n<ul>\n<li><strong>MongoDB Atlas G\u00fcvenli\u011fi:<\/strong> IP beyaz listesi, a\u011f izolasyonu (VPC Peering), g\u00fc\u00e7l\u00fc veritaban\u0131 kullan\u0131c\u0131 parolalar\u0131 ve rol tabanl\u0131 eri\u015fim kontrol\u00fc kullan\u0131n.<\/li>\n<li><strong>API Anahtarlar\u0131:<\/strong> OpenAI gibi servislerin API anahtarlar\u0131n\u0131 ortam de\u011fi\u015fkenleri veya g\u00fcvenli anahtar y\u00f6netim sistemleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netin, asla do\u011frudan kodunuza g\u00f6mmeyin.<\/li>\n<li><strong>Veri \u015eifreleme:<\/strong> Hassas verileri depolarken alan d\u00fczeyinde \u015fifreleme veya disk \u015fifreleme se\u00e7eneklerini de\u011ferlendirin.<\/li>\n<li><strong>Eri\u015fim Kontrol\u00fc:<\/strong> Uygulaman\u0131zda kullan\u0131c\u0131 bazl\u0131 eri\u015fim kontrol\u00fc uygulayarak, her kullan\u0131c\u0131n\u0131n sadece g\u00f6rmesi gereken verilere eri\u015fmesini sa\u011flay\u0131n.<\/li>\n<\/ul>\n<p><strong>4. LangChain4j ile sadece OpenAI LLM'lerini mi kullanabilirim?<\/strong><\/p>\n<p>Hay\u0131r, LangChain4j \u00e7e\u015fitli LLM sa\u011flay\u0131c\u0131lar\u0131n\u0131 destekler. OpenAI'a ek olarak, Hugging Face modelleri, Google Gemini, Anthropic Claude gibi bir\u00e7ok farkl\u0131 modelle entegrasyon i\u00e7in mod\u00fclleri bulunmaktad\u0131r. <code>langchain4j-openai<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131, kullanmak istedi\u011finiz sa\u011flay\u0131c\u0131n\u0131n ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ile de\u011fi\u015ftirmeniz yeterlidir.<\/p>\n<p><strong>5. Ajan\u0131m\u0131n performans\u0131n\u0131 nas\u0131l optimize edebilirim?<\/strong><\/p>\n<p>Performans\u0131 optimize etmek i\u00e7in birka\u00e7 yol vard\u0131r:<\/p>\n<ul>\n<li><strong>LLM Se\u00e7imi:<\/strong> Daha k\u00fc\u00e7\u00fck ve daha h\u0131zl\u0131 modelleri (\u00f6rne\u011fin <code>gpt-3.5-turbo<\/code>) gereksinimlerinize uygunsa tercih edin.<\/li>\n<li><strong>Token Y\u00f6netimi:<\/strong> <code>MessageWindowChatMemory<\/code>'deki <code>maxMessages<\/code> say\u0131s\u0131n\u0131 optimize edin. Daha az mesaj, daha az token ve daha h\u0131zl\u0131 yan\u0131t demektir.<\/li>\n<li><strong>RAG Retriever Optimizasyonu:<\/strong> <code>maxResults<\/code> de\u011ferini ayarlayarak getirilen belge say\u0131s\u0131n\u0131 optimize edin. Gereksiz fazla belge getirmek LLM'e y\u00fck bindirebilir.<\/li>\n<li><strong>MongoDB Atlas \u0130ndeksleri:<\/strong> Vekt\u00f6r indeksinizin do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan ve di\u011fer sorgular\u0131n\u0131z i\u00e7in gerekli di\u011fer indekslerin de mevcut oldu\u011fundan emin olun.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> Uzun s\u00fcreli LLM \u00e7a\u011fr\u0131lar\u0131n\u0131 veya veri i\u015flemlerini asenkron olarak y\u00fcr\u00fcterek genel yan\u0131t s\u00fcresini iyile\u015ftirebilirsiniz.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[676],"tags":[],"class_list":{"0":"post-32015","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mongodb","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun<\/title>\n<meta name=\"description\" content=\"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun\" \/>\n<meta property=\"og:description\" content=\"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T16:02:42+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"38 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun\",\"datePublished\":\"2025-10-16T16:02:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\"},\"wordCount\":5651,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"MongoDB\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\",\"name\":\"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-16T16:02:42+00:00\",\"description\":\"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun","description":"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/","og_locale":"tr_TR","og_type":"article","og_title":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun","og_description":"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.","og_url":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-16T16:02:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"38 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun","datePublished":"2025-10-16T16:02:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/"},"wordCount":5651,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["MongoDB"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/","url":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/","name":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-16T16:02:42+00:00","description":"Yapay zeka (YZ) ajanlar\u0131 geli\u015ftirmek art\u0131k hayal de\u011fil! Bu kapsaml\u0131 rehber ile MongoDB ve LangChain4j kullanarak ilk ak\u0131ll\u0131 YZ ajan\u0131 uygulaman\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. LangChain4j ve MongoDB Atlas Vector Search ile g\u00fc\u00e7l\u00fc, ak\u0131ll\u0131 ve \u00f6l\u00e7eklenebilir bir YZ ajan\u0131 in\u015fa etmenin pratik yollar\u0131n\u0131 \u00f6\u011frenin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-ve-langchain4j-ile-ilk-yapay-zeka-ajaninizi-olusturun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MongoDB ve LangChain4j ile \u0130lk Yapay Zeka Ajan\u0131n\u0131z\u0131 Olu\u015fturun"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32015"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32015\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}