{"id":33134,"date":"2025-10-30T03:31:19","date_gmt":"2025-10-30T00:31:19","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/"},"modified":"2025-10-30T03:31:19","modified_gmt":"2025-10-30T00:31:19","slug":"langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/","title":{"rendered":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme"},"content":{"rendered":"<p><body><\/p>\n<p>LangChain&#8217;in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API&#8217;ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \u00f6\u011frenin.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz i\u015f d\u00fcnyas\u0131nda yapay zeka, \u00f6zellikle b\u00fcy\u00fck dil modelleri (LLM&#8217;ler), potansiyellerini tam anlam\u0131yla ortaya koymak i\u00e7in sadece &#8220;konu\u015fmaktan&#8221; fazlas\u0131na ihtiya\u00e7 duyuyor. Geleneksel sohbet botlar\u0131, genellikle \u00f6nceden tan\u0131mlanm\u0131\u015f senaryolara veya geni\u015f bir bilgi havuzuna dayanarak kullan\u0131c\u0131 sorular\u0131n\u0131 yan\u0131tlar. Ancak bu yetenek, bir i\u015fletmenin karma\u015f\u0131k, dinamik ve ger\u00e7ek zamanl\u0131 ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamakta \u00e7o\u011fu zaman yetersiz kal\u0131r. \u00d6rne\u011fin, bir m\u00fc\u015fteri temsilcisi &#8220;Bu \u00fcr\u00fcn\u00fcn stok durumu nedir?&#8221; diye sordu\u011funda, botun sadece bir metin yan\u0131t\u0131 \u00fcretmesi de\u011fil, ayn\u0131 zamanda envanter veri taban\u0131na eri\u015fip g\u00fcncel bilgiyi \u00e7ekmesi gerekir. \u0130\u015fte tam bu noktada, LLM&#8217;lerin sadece bilgi \u00fcretmekle kalmay\u0131p, ayn\u0131 zamanda harici sistemlerle etkile\u015fime girmesini sa\u011flayan &#8220;fonksiyon \u00e7a\u011f\u0131rma&#8221; (function calling) mekanizmas\u0131 devreye giriyor.<\/p>\n<p>Fonksiyon \u00e7a\u011f\u0131rma, bir yapay zeka modelinin belirli bir g\u00f6revi yerine getirmek \u00fczere tasarlanm\u0131\u015f harici bir arac\u0131 veya kodu (bir fonksiyonu) tetikleyebilmesi anlam\u0131na gelir. Bu sayede, sohbet botlar\u0131 sadece metin tabanl\u0131 etkile\u015fimlerden s\u0131yr\u0131larak ger\u00e7ek d\u00fcnya aksiyonlar\u0131n\u0131 ger\u00e7ekle\u015ftirebilen, veri tabanlar\u0131n\u0131 sorgulayabilen, API&#8217;leri \u00e7a\u011f\u0131rabilen ve hatta e-posta g\u00f6nderebilen &#8220;kurumsal yard\u0131mc\u0131lar&#8221; (enterprise copilots) haline gelir. Bu d\u00f6n\u00fc\u015f\u00fcm, i\u015fletmeler i\u00e7in otomasyon, verimlilik ve karar verme s\u00fcre\u00e7lerinde devrim niteli\u011finde f\u0131rsatlar sunar. LangChain gibi g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7eve, bu yetene\u011fi geli\u015ftiricilere kolayca sunarak, karma\u015f\u0131k entegrasyonlar\u0131 basitle\u015ftirir ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r. Bu makale boyunca, LangChain&#8217;in fonksiyon \u00e7a\u011f\u0131rma mekanizmas\u0131n\u0131 temelden ileri seviyeye kadar ke\u015ffedecek, ger\u00e7ek d\u00fcnya senaryolar\u0131yla somutla\u015ft\u0131racak ve kendi kurumsal yard\u0131mc\u0131lar\u0131n\u0131z\u0131 nas\u0131l in\u015fa edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Art\u0131k yapay zeka, sadece &#8220;konu\u015fmak&#8221; yerine &#8220;yapabilir&#8221; bir varl\u0131k haline geliyor.<\/p>\n<h2>Fonksiyon \u00c7a\u011f\u0131rma Nedir ve B\u00fcy\u00fck Dil Modelleri (LLM) \u0130\u00e7in Neden Hayati?<\/h2>\n<p>Fonksiyon \u00e7a\u011f\u0131rma, en basit ifadeyle, bir b\u00fcy\u00fck dil modelinin (LLM) d\u0131\u015f d\u00fcnyadaki ara\u00e7lar\u0131 veya API&#8217;leri kullanabilme yetene\u011fidir. LLM&#8217;ler, muazzam miktarda metin verisi \u00fczerinde e\u011fitildikleri i\u00e7in insan dilini anlama ve \u00fcretme konusunda inan\u0131lmaz derecede yeteneklidirler. Ancak, varsay\u0131lan olarak, e\u011fitildikleri verilerle s\u0131n\u0131rl\u0131d\u0131rlar ve ger\u00e7ek zamanl\u0131 bilgilere eri\u015femezler ya da somut eylemler ger\u00e7ekle\u015ftiremezler. \u00d6rne\u011fin, bir LLM size &#8220;bug\u00fcn hava nas\u0131l olacak?&#8221; sorusuna genel bir yan\u0131t verebilir, ancak belirli bir \u015fehrin g\u00fcncel hava durumunu \u00f6\u011frenmek i\u00e7in bir hava durumu API&#8217;sini \u00e7a\u011f\u0131ramaz.<\/p>\n<p>\u0130\u015fte bu noktada fonksiyon \u00e7a\u011f\u0131rma hayati bir rol \u00fcstlenir. Geli\u015ftiriciler, LLM&#8217;e belirli g\u00f6revleri yerine getirecek &#8220;ara\u00e7lar&#8221; (tools) veya &#8220;fonksiyonlar&#8221; tan\u0131mlar. Bu ara\u00e7lar, asl\u0131nda LLM&#8217;in kendisinin do\u011frudan y\u00fcr\u00fctemedi\u011fi ancak dilsel olarak a\u00e7\u0131klanabilen i\u015flevlerdir. LLM, kullan\u0131c\u0131dan gelen bir komutu veya soruyu analiz eder ve bu komutun hangi arac\u0131 kullanarak \u00e7\u00f6z\u00fclebilece\u011fine karar verir. \u00d6rne\u011fin, &#8220;\u0130stanbul&#8217;da hava nas\u0131l?&#8221; sorusunu alan LLM, elindeki ara\u00e7lar aras\u0131nda &#8220;hava durumu sorgulama&#8221; arac\u0131 oldu\u011funu ve bu arac\u0131n &#8220;\u015fehir ad\u0131&#8221; parametresi ald\u0131\u011f\u0131n\u0131 anlar. Ard\u0131ndan, bu arac\u0131 \u00e7a\u011f\u0131rarak gerekli parametreleri doldurur ve arac\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 alarak kullan\u0131c\u0131ya do\u011fal dilde bir yan\u0131t olarak sunar.<\/p>\n<p>Bu mekanizma, LLM&#8217;lerin sadece birer metin \u00fcretici olmaktan \u00e7\u0131k\u0131p, dinamik, etkile\u015fimli ve ger\u00e7ek d\u00fcnyada faydal\u0131 &#8220;arac\u0131 sistemler&#8221; haline gelmelerini sa\u011flar. Bir LLM, bu ara\u00e7lar sayesinde:<\/p>\n<ul>\n<li>Ger\u00e7ek zamanl\u0131 verilere eri\u015febilir (borsa bilgileri, g\u00fcncel haberler, veri taban\u0131 kay\u0131tlar\u0131).<\/li>\n<li>Harici sistemlerde eylemler ger\u00e7ekle\u015ftirebilir (e-posta g\u00f6nderme, takvimde randevu olu\u015fturma, sipari\u015f verme).<\/li>\n<li>Karma\u015f\u0131k hesaplamalar yapabilir (matematiksel problemler, istatistiksel analizler).<\/li>\n<li>Kurumsal i\u015f ak\u0131\u015flar\u0131na entegre olabilir (ERP, CRM sistemleriyle etkile\u015fim).<\/li>\n<\/ul>\n<p>LangChain, bu fonksiyon \u00e7a\u011f\u0131rma s\u00fcrecini soyutlayarak geli\u015ftiriciler i\u00e7in \u00e7ok daha eri\u015filebilir hale getirir. LangChain&#8217;in sa\u011flad\u0131\u011f\u0131 soyutlamalar sayesinde, Python fonksiyonlar\u0131n\u0131 veya API \u00e7a\u011fr\u0131lar\u0131n\u0131 kolayca LLM&#8217;in anlayabilece\u011fi ara\u00e7lara d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz. Bu, LLM&#8217;in sadece bir beyin de\u011fil, ayn\u0131 zamanda bir orkestra \u015fefi gibi \u00e7e\u015fitli harici kaynaklar\u0131 y\u00f6netebilen, ger\u00e7ek bir kurumsal yard\u0131mc\u0131 olmas\u0131n\u0131n \u00f6n\u00fcn\u00fc a\u00e7ar. Dolay\u0131s\u0131yla, fonksiyon \u00e7a\u011f\u0131rma, LLM tabanl\u0131 uygulamalar\u0131n yeteneklerini katlayarak, onlar\u0131 s\u0131n\u0131rl\u0131 bir sohbet botundan \u00e7ok daha fazlas\u0131na d\u00f6n\u00fc\u015ft\u00fcren kritik bir k\u00f6pr\u00fcd\u00fcr.<\/p>\n<h2>LangChain Fonksiyon \u00c7a\u011f\u0131rma Mekanizmas\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>LangChain, b\u00fcy\u00fck dil modellerinin (LLM) harici ara\u00e7larla etkile\u015fime girmesini sa\u011flayan fonksiyon \u00e7a\u011f\u0131rma mekanizmas\u0131n\u0131 son derece esnek ve anla\u015f\u0131l\u0131r bir \u015fekilde sunar. Temel olarak, bu mekanizma \u00fc\u00e7 ana bile\u015fen etraf\u0131nda d\u00f6ner: Ara\u00e7lar (Tools), Modeller (Models) ve Ajanlar (Agents). Geli\u015ftirici olarak sizin g\u00f6reviniz, LLM&#8217;in kullanabilece\u011fi ara\u00e7lar\u0131 tan\u0131mlamak ve bu ara\u00e7lar\u0131 kullanacak bir ajan\u0131 yap\u0131land\u0131rmakt\u0131r.<\/p>\n<p><strong>1. Ara\u00e7lar\u0131 Tan\u0131mlama (Defining Tools):<\/strong><br \/>\n  Bir ara\u00e7, asl\u0131nda bir Python fonksiyonu veya bir API \u00e7a\u011fr\u0131s\u0131 gibi, belirli bir g\u00f6revi yerine getiren bir i\u015flevdir. LangChain, bu ara\u00e7lar\u0131 LLM&#8217;in anlayabilece\u011fi bir formata d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. En yayg\u0131n y\u00f6ntemlerden biri, Pydantic modelleri kullanarak arac\u0131n bekledi\u011fi girdileri (parametreleri) net bir \u015fekilde tan\u0131mlamakt\u0131r. Bu girdi \u015femas\u0131, LLM&#8217;in hangi arac\u0131 ne zaman ve hangi arg\u00fcmanlarla \u00e7a\u011f\u0131rmas\u0131 gerekti\u011fini anlamas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir hava durumu arac\u0131, &#8220;\u015fehir_ad\u0131&#8221; parametresi bekledi\u011fini bildirebilir.<\/p>\n<p>\u0130\u015fte basit bir hava durumu arac\u0131 tan\u0131mlama \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-python\">\nfrom langchain.tools import tool\nfrom pydantic import BaseModel, Field\n\n# Arac\u0131n bekledi\u011fi girdi \u015femas\u0131n\u0131 tan\u0131ml\u0131yoruz\nclass HavaDurumuGirdi(BaseModel):\n    sehir_adi: str = Field(description=\"Hava durumu sorgulanacak \u015fehrin ad\u0131\")\n\n@tool(\"hava_durumu_sorgula\", args_schema=HavaDurumuGirdi)\ndef hava_durumu_sorgula_araci(sehir_adi: str) -> str:\n    \"\"\"Belirtilen \u015fehrin anl\u0131k hava durumunu d\u00f6nd\u00fcr\u00fcr.\"\"\"\n    # Ger\u00e7ek d\u00fcnyada burada bir API \u00e7a\u011fr\u0131s\u0131 olurdu (\u00f6rne\u011fin OpenWeatherMap)\n    if sehir_adi.lower() == \"istanbul\":\n        return \"\u0130stanbul'da hava a\u00e7\u0131k ve 25 derece. R\u00fczgar hafif.\"\n    elif sehir_adi.lower() == \"ankara\":\n        return \"Ankara'da par\u00e7al\u0131 bulutlu ve 20 derece. Ya\u011fmur beklenmiyor.\"\n    else:\n        return f\"{sehir_adi} i\u00e7in hava durumu bilgisi bulunamad\u0131.\"\n\n# Bu 'tool' objesi art\u0131k bir LangChain arac\u0131d\u0131r.\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>@tool<\/code> dekorat\u00f6r\u00fc ve <code>HavaDurumuGirdi<\/code> Pydantic modeli sayesinde, LLM'e <code>hava_durumu_sorgula<\/code> ad\u0131nda bir ara\u00e7 oldu\u011funu ve bu arac\u0131n <code>sehir_adi<\/code> ad\u0131nda bir string parametre bekledi\u011fini a\u00e7\u0131k\u00e7a belirtmi\u015f oluyoruz. LLM, kullan\u0131c\u0131dan gelen \"Ankara'da hava nas\u0131l?\" gibi bir ifadeyi alg\u0131lad\u0131\u011f\u0131nda, bu arac\u0131 \u00e7a\u011f\u0131rabilece\u011fini ve \"Ankara\" de\u011ferini <code>sehir_adi<\/code> parametresine atayabilece\u011fini anlar.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Ara\u00e7lar\u0131n\u0131z\u0131 tan\u0131mlarken, <code>description<\/code> alanlar\u0131n\u0131 detayl\u0131 ve a\u00e7\u0131klay\u0131c\u0131 tutmaya \u00f6zen g\u00f6sterin. LLM, arac\u0131n ne i\u015fe yarad\u0131\u011f\u0131n\u0131 ve hangi parametreleri bekledi\u011fini bu a\u00e7\u0131klamalardan anlar. \u0130yi yaz\u0131lm\u0131\u015f a\u00e7\u0131klamalar, LLM'in do\u011fru arac\u0131 do\u011fru zamanda se\u00e7me olas\u0131l\u0131\u011f\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n  <\/div>\n<p><strong>2. Modeli ve Ajan\u0131 Yap\u0131land\u0131rma:<\/strong><br \/>\n  Ara\u00e7lar tan\u0131mland\u0131ktan sonra, bu ara\u00e7lar\u0131 kullanacak bir LLM'e (model) ve bu LLM'i y\u00f6netecek bir ajana (agent) ihtiyac\u0131m\u0131z var. LangChain, OpenAI'nin fonksiyon \u00e7a\u011f\u0131rma \u00f6zelli\u011fini do\u011fal olarak destekleyen modelleri (\u00f6rne\u011fin <code>ChatOpenAI<\/code>) ve bu modellerle uyumlu ajanlar\u0131 (\u00f6rne\u011fin <code>OpenAIFunctionsAgent<\/code>) sa\u011flar.<\/p>\n<pre><code class=\"language-python\">\nfrom langchain_openai import ChatOpenAI\nfrom langchain.agents import AgentExecutor, create_openai_tools_agent\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\n# OpenAI modelimizi y\u00fckl\u00fcyoruz\nllm = ChatOpenAI(model=\"gpt-4o\", temperature=0) # Model ismini ihtiyac\u0131n\u0131za g\u00f6re de\u011fi\u015ftirebilirsiniz\n\n# Tan\u0131mlad\u0131\u011f\u0131m\u0131z ara\u00e7lar\u0131 bir listeye ekliyoruz\ntools = [hava_durumu_sorgula_araci]\n\n# Ajan i\u00e7in bir prompt \u015fablonu olu\u015fturuyoruz\nprompt = ChatPromptTemplate.from_messages(\n    [\n        (\"system\", \"Sen kullan\u0131c\u0131n\u0131n sorular\u0131n\u0131 yan\u0131tlayan ve hava durumu bilgisi sa\u011flayabilen yard\u0131mc\u0131 bir asistans\u0131n.\"),\n        MessagesPlaceholder(\"chat_history\"),\n        (\"human\", \"{input}\"),\n        MessagesPlaceholder(\"agent_scratchpad\"),\n    ]\n)\n\n# OpenAI fonksiyon ara\u00e7lar\u0131 i\u00e7in ajan\u0131 olu\u015fturuyoruz\nagent = create_openai_tools_agent(llm, tools, prompt)\n\n# AgentExecutor'\u0131 olu\u015fturuyoruz. Bu, ajan\u0131n ad\u0131m ad\u0131m d\u00fc\u015f\u00fcnmesini ve ara\u00e7lar\u0131 kullanmas\u0131n\u0131 sa\u011flar.\nagent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)\n\n# Ajanla etkile\u015fime ge\u00e7elim\nresponse = agent_executor.invoke({\"input\": \"\u0130stanbul'da hava nas\u0131l?\"})\nprint(response[\"output\"])\n\nresponse = agent_executor.invoke({\"input\": \"Merhaba, nas\u0131ls\u0131n?\"})\nprint(response[\"output\"])\n\nresponse = agent_executor.invoke({\"input\": \"Bana Ankara'n\u0131n hava durumunu s\u00f6yleyebilir misin?\"})\nprint(response[\"output\"])\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda:<\/p>\n<ul>\n<li><code>ChatOpenAI<\/code>, se\u00e7ti\u011fimiz LLM'i temsil eder.<\/li>\n<li><code>tools<\/code> listesi, ajan\u0131n kullanabilece\u011fi t\u00fcm ara\u00e7lar\u0131 i\u00e7erir.<\/li>\n<li><code>ChatPromptTemplate<\/code>, LLM'e nas\u0131l davranmas\u0131 gerekti\u011fini ve kullan\u0131c\u0131 girdilerini nas\u0131l i\u015flemesi gerekti\u011fini belirten bir \u015fablondur. <code>MessagesPlaceholder(\"agent_scratchpad\")<\/code> k\u0131sm\u0131, ajan\u0131n d\u00fc\u015f\u00fcnme s\u00fcrecini (hangi arac\u0131 se\u00e7ece\u011fini, \u00e7\u0131kt\u0131s\u0131n\u0131 vb.) takip etmesi i\u00e7in \u00f6nemlidir.<\/li>\n<li><code>create_openai_tools_agent<\/code>, LLM'i ve ara\u00e7lar\u0131 kullanarak ak\u0131ll\u0131 bir ajan olu\u015fturur. Bu ajan, gelen sorular\u0131 anlar, uygun arac\u0131 se\u00e7er, parametreleri doldurur ve arac\u0131 \u00e7a\u011f\u0131r\u0131r.<\/li>\n<li><code>AgentExecutor<\/code> ise ajan\u0131 \u00e7al\u0131\u015ft\u0131ran yap\u0131d\u0131r. <code>verbose=True<\/code> parametresi, ajan\u0131n hangi ad\u0131mlar\u0131 att\u0131\u011f\u0131n\u0131 (d\u00fc\u015f\u00fcnme s\u00fcreci, ara\u00e7 \u00e7a\u011f\u0131rma, ara\u00e7 \u00e7\u0131kt\u0131s\u0131) konsola yazd\u0131rmas\u0131n\u0131 sa\u011flar, bu da hata ay\u0131klama i\u00e7in \u00e7ok de\u011ferlidir.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, LangChain'in fonksiyon \u00e7a\u011f\u0131rma mekanizmas\u0131, LLM'in bir arac\u0131 \u00e7a\u011f\u0131rmas\u0131 gerekti\u011finde, bu arac\u0131n tan\u0131m\u0131n\u0131 (ad\u0131n\u0131, a\u00e7\u0131klamas\u0131n\u0131, bekledi\u011fi parametreleri) kullanarak bir \"ara\u00e7 \u00e7a\u011f\u0131rma\" (tool call) mesaj\u0131 \u00fcretmesine dayan\u0131r. Bu mesaj, LangChain taraf\u0131ndan yakalan\u0131r ve ger\u00e7ek Python fonksiyonu veya API \u00e7a\u011fr\u0131s\u0131 bu mesajdaki bilgilere g\u00f6re y\u00fcr\u00fct\u00fcl\u00fcr. Elde edilen sonu\u00e7 daha sonra LLM'e geri beslenir ve LLM bu bilgiyi kullanarak kullan\u0131c\u0131ya nihai yan\u0131t\u0131n\u0131 olu\u015fturur. Bu d\u00f6ng\u00fc, LLM'in s\u0131n\u0131rl\u0131 bilgi setini a\u015farak d\u0131\u015f d\u00fcnyayla etkile\u015fime girmesini m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Kurumsal Kaynak Planlama (ERP) Asistan\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Bir i\u015fletmenin g\u00fcnl\u00fck operasyonlar\u0131nda en kritik sistemlerden biri Kurumsal Kaynak Planlama (ERP) yaz\u0131l\u0131mlar\u0131d\u0131r. Stok y\u00f6netimi, sipari\u015f olu\u015fturma, m\u00fc\u015fteri bilgileri sorgulama, finansal raporlama gibi bir\u00e7ok temel i\u015flevi bar\u0131nd\u0131r\u0131rlar. Ancak bu sistemler genellikle karma\u015f\u0131k aray\u00fczlere sahiptir ve \u00e7al\u0131\u015fanlar\u0131n verileri h\u0131zl\u0131ca \u00e7ekmesi veya i\u015flemler yapmas\u0131 zaman alabilir. \u0130\u015fte LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fi ile bu s\u00fcreci nas\u0131l basitle\u015ftirebilece\u011fimize dair bir \u00f6rnek: bir ERP asistan\u0131.<\/p>\n<p><strong>Problem:<\/strong> Sat\u0131\u015f temsilcileri veya depo \u00e7al\u0131\u015fanlar\u0131, bir \u00fcr\u00fcn\u00fcn stok durumunu \u00f6\u011frenmek, yeni bir m\u00fc\u015fteri sipari\u015fi olu\u015fturmak veya belirli bir m\u00fc\u015fterinin \u00f6nceki sipari\u015f ge\u00e7mi\u015fini g\u00f6rmek i\u00e7in ERP sistemine giri\u015f yapmak, men\u00fclerde gezinmek ve ilgili ekranlara ula\u015fmak zorunda kal\u0131yor. Bu, zaman kayb\u0131na ve operasyonel verimsizli\u011fe yol a\u00e7\u0131yor.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> LangChain tabanl\u0131 bir ERP asistan\u0131 olu\u015fturarak, \u00e7al\u0131\u015fanlar\u0131n do\u011fal dil komutlar\u0131yla bu i\u015flemleri do\u011frudan bir sohbet aray\u00fcz\u00fc \u00fczerinden ger\u00e7ekle\u015ftirmesini sa\u011flayabiliriz. Asistan, ERP sisteminin API'lerini (veya basit Python fonksiyonlar\u0131n\u0131) arka planda \u00e7a\u011f\u0131rarak istenen bilgiyi \u00e7ekecek veya i\u015flemi ger\u00e7ekle\u015ftirecektir.<\/p>\n<p><strong>Ad\u0131m Ad\u0131m Uygulama:<\/strong><\/p>\n<p><strong>1. ERP API Fonksiyonlar\u0131n\u0131 Tan\u0131mlama (Sim\u00fcle Edilmi\u015f):<\/strong><br \/>\n  Ger\u00e7ek bir senaryoda, bu fonksiyonlar \u015firketinizin ERP sisteminin REST API'lerine \u00e7a\u011fr\u0131 yapard\u0131. Ancak burada, konuyu basitle\u015ftirmek ad\u0131na Python fonksiyonlar\u0131yla bu API \u00e7a\u011fr\u0131lar\u0131n\u0131 sim\u00fcle edece\u011fiz.<\/p>\n<pre><code class=\"language-python\">\nfrom langchain.tools import tool\nfrom pydantic import BaseModel, Field\nfrom typing import List, Dict\n\n# Sim\u00fcle edilmi\u015f bir veritaban\u0131\nPRODUCTS_DB = {\n    \"Laptop X\": {\"stok\": 15, \"fiyat\": 1200},\n    \"Mouse Y\": {\"stok\": 50, \"fiyat\": 25},\n    \"Keyboard Z\": {\"stok\": 30, \"fiyat\": 75}\n}\nCUSTOMER_DB = {\n    \"ACME Corp\": {\"adres\": \"123 Main St\", \"siparisler\": [\"ORDER_001\", \"ORDER_002\"]},\n    \"Globex Inc\": {\"adres\": \"456 Side Ave\", \"siparisler\": [\"ORDER_003\"]}\n}\nORDERS_DB = {\n    \"ORDER_001\": {\"musteri\": \"ACME Corp\", \"urun\": \"Laptop X\", \"adet\": 2, \"durum\": \"Tamamland\u0131\"},\n    \"ORDER_002\": {\"musteri\": \"ACME Corp\", \"urun\": \"Mouse Y\", \"adet\": 10, \"durum\": \"Bekliyor\"},\n    \"ORDER_003\": {\"musteri\": \"Globex Inc\", \"urun\": \"Keyboard Z\", \"adet\": 5, \"durum\": \"Tamamland\u0131\"}\n}\n\n# Ara\u00e7 1: \u00dcr\u00fcn stok durumunu sorgulama\nclass UrunStokGirdi(BaseModel):\n    urun_adi: str = Field(description=\"Stok durumu sorgulanacak \u00fcr\u00fcn\u00fcn ad\u0131\")\n\n@tool(\"urun_stok_sorgula\", args_schema=UrunStokGirdi)\ndef urun_stok_sorgula_araci(urun_adi: str) -> str:\n    \"\"\"Belirtilen \u00fcr\u00fcn\u00fcn g\u00fcncel stok durumunu d\u00f6nd\u00fcr\u00fcr.\"\"\"\n    urun_adi_normal = urun_adi.strip()\n    if urun_adi_normal in PRODUCTS_DB:\n        stok = PRODUCTS_DB[urun_adi_normal][\"stok\"]\n        return f\"{urun_adi_normal} \u00fcr\u00fcn\u00fcnden stokta {stok} adet bulunmaktad\u0131r.\"\n    return f\"{urun_adi_normal} \u00fcr\u00fcn\u00fc bulunamad\u0131 veya stok bilgisi mevcut de\u011fil.\"\n\n# Ara\u00e7 2: Yeni bir m\u00fc\u015fteri sipari\u015fi olu\u015fturma\nclass SiparisOlusturGirdi(BaseModel):\n    musteri_adi: str = Field(description=\"Sipari\u015fin verilece\u011fi m\u00fc\u015fterinin ad\u0131\")\n    urun_adi: str = Field(description=\"Sipari\u015f verilecek \u00fcr\u00fcn\u00fcn ad\u0131\")\n    adet: int = Field(description=\"Sipari\u015f verilecek \u00fcr\u00fcn\u00fcn adedi\")\n\n@tool(\"siparis_olustur\", args_schema=SiparisOlusturGirdi)\ndef siparis_olustur_araci(musteri_adi: str, urun_adi: str, adet: int) -> str:\n    \"\"\"Yeni bir m\u00fc\u015fteri sipari\u015fi olu\u015fturur.\"\"\"\n    if urun_adi not in PRODUCTS_DB:\n        return f\"Hata: {urun_adi} adl\u0131 \u00fcr\u00fcn mevcut de\u011fil.\"\n    if musteri_adi not in CUSTOMER_DB:\n        return f\"Hata: {musteri_adi} adl\u0131 m\u00fc\u015fteri mevcut de\u011fil.\"\n    if PRODUCTS_DB[urun_adi][\"stok\"] < adet:\n        return f\"Hata: {urun_adi} i\u00e7in yeterli stok yok. Mevcut stok: {PRODUCTS_DB[urun_adi]['stok']}\"\n    \n    # Sipari\u015f olu\u015fturma sim\u00fclasyonu\n    order_id = f\"ORDER_{len(ORDERS_DB) + 1:03d}\"\n    ORDERS_DB[order_id] = {\"musteri\": musteri_adi, \"urun\": urun_adi, \"adet\": adet, \"durum\": \"Yeni\"}\n    PRODUCTS_DB[urun_adi][\"stok\"] -= adet # Sto\u011fu g\u00fcncelle\n    return f\"Yeni sipari\u015f ba\u015far\u0131yla olu\u015fturuldu! Sipari\u015f No: {order_id}. {musteri_adi} i\u00e7in {urun_adi} \u00fcr\u00fcn\u00fcnden {adet} adet sipari\u015f edildi.\"\n\n# Ara\u00e7 3: M\u00fc\u015fteri sipari\u015f ge\u00e7mi\u015fini sorgulama\nclass MusteriSiparisGecmisiGirdi(BaseModel):\n    musteri_adi: str = Field(description=\"Sipari\u015f ge\u00e7mi\u015fi sorgulanacak m\u00fc\u015fterinin ad\u0131\")\n\n@tool(\"musteri_siparis_gecmisi_sorgula\", args_schema=MusteriSiparisGecmisiGirdi)\ndef musteri_siparis_gecmisi_sorgula_araci(musteri_adi: str) -> str:\n    \"\"\"Belirtilen m\u00fc\u015fterinin sipari\u015f ge\u00e7mi\u015fini d\u00f6nd\u00fcr\u00fcr.\"\"\"\n    if musteri_adi not in CUSTOMER_DB:\n        return f\"Hata: {musteri_adi} adl\u0131 m\u00fc\u015fteri bulunamad\u0131.\"\n    \n    siparis_idler = CUSTOMER_DB[musteri_adi].get(\"siparisler\", [])\n    if not siparis_idler:\n        return f\"{musteri_adi} i\u00e7in herhangi bir sipari\u015f bulunamad\u0131.\"\n    \n    gecmis = []\n    for order_id in siparis_idler:\n        order_info = ORDERS_DB.get(order_id, {})\n        if order_info:\n            gecmis.append(f\"Sipari\u015f No: {order_id}, \u00dcr\u00fcn: {order_info.get('urun')}, Adet: {order_info.get('adet')}, Durum: {order_info.get('durum')}\")\n    return f\"{musteri_adi} sipari\u015f ge\u00e7mi\u015fi:\\n\" + \"\\n\".join(gecmis)\n<\/pre>\n<p><\/code><\/p>\n<p><strong>2. Ajan\u0131 Olu\u015fturma ve Yap\u0131land\u0131rma:<\/strong><br \/>\n  \u015eimdi, bu ara\u00e7lar\u0131 kullanacak bir LangChain ajan\u0131 olu\u015ftural\u0131m. OpenAI'nin fonksiyon \u00e7a\u011f\u0131rma \u00f6zelli\u011fiyle uyumlu olan <code>create_openai_tools_agent<\/code>'\u0131 kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">\nfrom langchain_openai import ChatOpenAI\nfrom langchain.agents import AgentExecutor, create_openai_tools_agent\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\n# OpenAI modelimizi y\u00fckl\u00fcyoruz\nllm = ChatOpenAI(model=\"gpt-4o\", temperature=0)\n\n# Tan\u0131mlad\u0131\u011f\u0131m\u0131z t\u00fcm ara\u00e7lar\u0131 bir listeye ekliyoruz\nerp_tools = [\n    urun_stok_sorgula_araci,\n    siparis_olustur_araci,\n    musteri_siparis_gecmisi_sorgula_araci\n]\n\n# Ajan i\u00e7in bir prompt \u015fablonu olu\u015fturuyoruz\nerp_prompt = ChatPromptTemplate.from_messages(\n    [\n        (\"system\", \"Sen bir ERP asistan\u0131s\u0131n. Stok, sipari\u015f ve m\u00fc\u015fteri bilgileri konular\u0131nda yard\u0131mc\u0131 olabilirsin. L\u00fctfen her zaman do\u011fru bilgiyi vermeye \u00e7al\u0131\u015f.\"),\n        MessagesPlaceholder(\"chat_history\"),\n        (\"human\", \"{input}\"),\n        MessagesPlaceholder(\"agent_scratchpad\"),\n    ]\n)\n\n# ERP ajan\u0131n\u0131 olu\u015fturuyoruz\nerp_agent = create_openai_tools_agent(llm, erp_tools, erp_prompt)\n\n# AgentExecutor'\u0131 olu\u015fturuyoruz\nerp_agent_executor = AgentExecutor(agent=erp_agent, tools=erp_tools, verbose=True)\n\n# Ajanla etkile\u015fim \u00f6rnekleri\nprint(\"-----------------------------------\")\nprint(\"ERP Asistan\u0131 ile Etkile\u015fimler:\")\nprint(\"-----------------------------------\")\n\n# \u00d6rnek 1: Stok sorgulama\nresponse1 = erp_agent_executor.invoke({\"input\": \"Laptop X \u00fcr\u00fcn\u00fcn\u00fcn stok durumu nedir?\"})\nprint(response1[\"output\"])\nprint(\"\\n\")\n\n# \u00d6rnek 2: Yeni sipari\u015f olu\u015fturma\nresponse2 = erp_agent_executor.invoke({\"input\": \"ACME Corp i\u00e7in Keyboard Z \u00fcr\u00fcn\u00fcnden 3 adet sipari\u015f olu\u015ftur.\"})\nprint(response2[\"output\"])\nprint(\"\\n\")\n\n# \u00d6rnek 3: M\u00fc\u015fteri sipari\u015f ge\u00e7mi\u015fi\nresponse3 = erp_agent_executor.invoke({\"input\": \"ACME Corp'un \u00f6nceki sipari\u015flerini g\u00f6ster.\"})\nprint(response3[\"output\"])\nprint(\"\\n\")\n\n# \u00d6rnek 4: Tan\u0131ms\u0131z istek\nresponse4 = erp_agent_executor.invoke({\"input\": \"Bana en son borsa haberlerini getir.\"})\nprint(response4[\"output\"])\nprint(\"\\n\")\n<\/pre>\n<p><\/code><\/p>\n<p><strong>\u00c7al\u0131\u015fma Mekanizmas\u0131n\u0131n G\u00f6rseli (Betimleme):<\/strong><\/p>\n<p>Bu senaryoyu g\u00f6rselle\u015ftirecek olursak:<\/p>\n<ol>\n<li><strong>Kullan\u0131c\u0131 Sorgusu:<\/strong> \u00c7al\u0131\u015fan, ERP asistan\u0131na do\u011fal dilde bir soru sorar: \"ACME Corp i\u00e7in Keyboard Z \u00fcr\u00fcn\u00fcnden 3 adet sipari\u015f olu\u015ftur.\"<\/li>\n<li><strong>LLM Analizi:<\/strong> LangChain ajan\u0131, bu sorguyu al\u0131r ve LLM'e iletir. LLM, elindeki ara\u00e7 tan\u0131mlar\u0131n\u0131 (<code>siparis_olustur_araci<\/code> gibi) inceleyerek bu sorgunun bir sipari\u015f olu\u015fturma i\u015flemi oldu\u011funu anlar.<\/li>\n<li><strong>Fonksiyon \u00c7a\u011f\u0131rma Karar\u0131:<\/strong> LLM, <code>siparis_olustur_araci<\/code>'n\u0131 \u00e7a\u011f\u0131rmaya karar verir ve gerekli parametreleri (<code>musteri_adi=\"ACME Corp\"<\/code>, <code>urun_adi=\"Keyboard Z\"<\/code>, <code>adet=3<\/code>) \u00e7\u0131kar\u0131r.<\/li>\n<li><strong>Ara\u00e7 Y\u00fcr\u00fctme:<\/strong> LangChain, bu karar\u0131 al\u0131r ve sim\u00fcle edilmi\u015f Python fonksiyonunu (<code>siparis_olustur_araci<\/code>) belirtilen parametrelerle \u00e7al\u0131\u015ft\u0131r\u0131r. Bu fonksiyon, ERP sisteminin API'sini \u00e7a\u011f\u0131rarak ger\u00e7ek bir sipari\u015f olu\u015fturur (veya \u00f6rne\u011fimizde veritaban\u0131m\u0131z\u0131 g\u00fcnceller).<\/li>\n<li><strong>Geri D\u00f6n\u00fc\u015f ve Yan\u0131t:<\/strong> Fonksiyon, \"Yeni sipari\u015f ba\u015far\u0131yla olu\u015fturuldu! Sipari\u015f No: ORDER_004. ACME Corp i\u00e7in Keyboard Z \u00fcr\u00fcn\u00fcnden 3 adet sipari\u015f edildi.\" gibi bir \u00e7\u0131kt\u0131 d\u00f6nd\u00fcr\u00fcr. Bu \u00e7\u0131kt\u0131 tekrar LLM'e iletilir.<\/li>\n<li><strong>Nihai Yan\u0131t:<\/strong> LLM, bu fonksiyon \u00e7\u0131kt\u0131s\u0131n\u0131 kullanarak kullan\u0131c\u0131ya do\u011fal dilde, anla\u015f\u0131l\u0131r bir yan\u0131t sunar.<\/li>\n<\/ol>\n<p>Bu \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, LangChain'in fonksiyon \u00e7a\u011f\u0131rma \u00f6zelli\u011fi, karma\u015f\u0131k kurumsal i\u015f ak\u0131\u015flar\u0131n\u0131 do\u011fal dil etkile\u015fimleriyle otomatikle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu sadece bir ba\u015flang\u0131\u00e7 olup, \u015firket i\u00e7i belgeleri sorgulamadan, takvim randevular\u0131 ayarlamaya kadar bir\u00e7ok farkl\u0131 senaryo i\u00e7in geni\u015fletilebilir.<\/p>\n<h2>\u0130leri D\u00fczey Fonksiyon \u00c7a\u011f\u0131rma Stratejileri: Zincirler ve Geri Bildirim Mekanizmalar\u0131<\/h2>\n<p>LangChain ile fonksiyon \u00e7a\u011f\u0131rman\u0131n temel mekanizmas\u0131n\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi daha karma\u015f\u0131k ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda kar\u015f\u0131la\u015fabilece\u011fimiz ileri d\u00fczey stratejilere odaklanabiliriz. Basit tek seferlik ara\u00e7 \u00e7a\u011fr\u0131lar\u0131n\u0131n \u00f6tesine ge\u00e7erek, \u00e7ok ad\u0131ml\u0131 g\u00f6revleri y\u00f6netmek, hatalar\u0131 ele almak ve daha sa\u011flam sistemler in\u015fa etmek i\u00e7in baz\u0131 geli\u015fmi\u015f tekniklere bakal\u0131m.<\/p>\n<h3>Karma\u015f\u0131k \u0130\u015f Ak\u0131\u015flar\u0131 \u0130\u00e7in Ara\u00e7 Zincirleri Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Bazen bir kullan\u0131c\u0131n\u0131n iste\u011fi, tek bir arac\u0131n \u00e7a\u011fr\u0131lmas\u0131yla tamamlanamaz. Birden fazla arac\u0131n s\u0131rayla veya ko\u015fullu olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekebilir. LangChain ajanlar\u0131, bu \"d\u00fc\u015f\u00fcnme\" yetene\u011fine sahiptir; yani bir arac\u0131 \u00e7a\u011f\u0131rd\u0131ktan sonra \u00e7\u0131kan sonucu de\u011ferlendirip ba\u015fka bir arac\u0131 \u00e7a\u011f\u0131rmaya karar verebilirler. Bu, bir \"ara\u00e7 zinciri\" olu\u015fturulmas\u0131na olanak tan\u0131r. \u00d6rne\u011fin:<\/p>\n<p>\"Bir m\u00fc\u015fterinin t\u00fcm sipari\u015flerini getir, sonra o sipari\u015flerdeki \u00fcr\u00fcnlerin stok durumunu kontrol et.\"<\/p>\n<p>Bu senaryo i\u00e7in ajan, \u00f6nce <code>musteri_siparis_gecmisi_sorgula_araci<\/code>'n\u0131 \u00e7a\u011f\u0131racak, ard\u0131ndan her bir sipari\u015fteki \u00fcr\u00fcn i\u00e7in <code>urun_stok_sorgula_araci<\/code>'n\u0131 \u00e7a\u011f\u0131rarak nihai yan\u0131t\u0131 olu\u015fturacakt\u0131r. Ajan\u0131n <code>AgentExecutor<\/code> yap\u0131s\u0131, bu ard\u0131\u015f\u0131k d\u00fc\u015f\u00fcnme ve eylem ad\u0131mlar\u0131n\u0131 otomatik olarak y\u00f6netir.<\/p>\n<pre><code class=\"language-python\">\n# Yukar\u0131daki ERP ara\u00e7lar\u0131n\u0131 ve ajan kurulumunu varsay\u0131yoruz.\n# Ajan, bu t\u00fcr \u00e7ok ad\u0131ml\u0131 g\u00f6revleri zaten 'verbose=True' ile g\u00f6zlemleyebilece\u011fimiz i\u00e7sel bir d\u00fc\u015f\u00fcnme s\u00fcreciyle y\u00f6netir.\n# \u00d6rnek: \"ACME Corp'un en son sipari\u015findeki \u00fcr\u00fcnlerin stok durumunu bana bildir.\"\n# Bu durumda ajan:\n# 1. ACME Corp'un sipari\u015f ge\u00e7mi\u015fini sorgular.\n# 2. En son sipari\u015fi belirler.\n# 3. Bu sipari\u015fteki her bir \u00fcr\u00fcn i\u00e7in stok sorgular.\n# 4. T\u00fcm bilgileri toplay\u0131p kullan\u0131c\u0131ya sunar.\n\nresponse_complex = erp_agent_executor.invoke({\"input\": \"ACME Corp'un en son sipari\u015findeki \u00fcr\u00fcnlerin stok durumunu bana bildir.\"})\nprint(response_complex[\"output\"])\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, ajan tek bir ara\u00e7 \u00e7a\u011fr\u0131s\u0131 yerine, birden fazla arac\u0131 ard\u0131\u015f\u0131k olarak kullanarak karma\u015f\u0131k bir iste\u011fi yerine getirebilir. LLM'in kendisi, ara\u00e7lar\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 yorumlama ve bir sonraki ad\u0131m\u0131 planlama zekas\u0131na sahiptir.<\/p>\n<h3>Hata Y\u00f6netimi ve Geri Bildirim Mekanizmalar\u0131 Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Ger\u00e7ek d\u00fcnya sistemleri m\u00fckemmel de\u011fildir. API \u00e7a\u011fr\u0131lar\u0131 ba\u015far\u0131s\u0131z olabilir, veri tabanlar\u0131 eri\u015filemez olabilir veya bir ara\u00e7 beklenmedik bir hata f\u0131rlatabilir. LangChain'de bu durumlar\u0131 ele almak i\u00e7in \u00e7e\u015fitli stratejiler mevcuttur:<\/p>\n<ul>\n<li><strong>Ara\u00e7 \u0130\u00e7i Hata Yakalama:<\/strong> Her bir arac\u0131n kendi i\u00e7erisinde <code>try-except<\/code> bloklar\u0131 kullanarak olas\u0131 hatalar\u0131 yakalamas\u0131 ve LLM'e anla\u015f\u0131l\u0131r bir hata mesaj\u0131 d\u00f6nd\u00fcrmesi en iyi yakla\u015f\u0131md\u0131r. Bu, LLM'in hatay\u0131 yorumlay\u0131p kullan\u0131c\u0131ya mant\u0131kl\u0131 bir geri bildirim sunmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>AgentExecutor Hata Y\u00f6netimi:<\/strong> <code>AgentExecutor<\/code>, \u00e7al\u0131\u015fma s\u0131ras\u0131nda bir ara\u00e7 \u00e7a\u011fr\u0131s\u0131 ba\u015far\u0131s\u0131z olursa veya beklenmeyen bir durumla kar\u015f\u0131la\u015f\u0131rsa bunu y\u00f6netir. Ancak, daha spesifik senaryolar i\u00e7in <code>max_iterations<\/code> veya <code>early_stopping_method<\/code> gibi parametrelerle ajan\u0131n davran\u0131\u015f\u0131n\u0131 kontrol edebilirsiniz.<\/li>\n<li><strong>Callback Fonksiyonlar\u0131:<\/strong> LangChain, ajan\u0131n her ad\u0131m\u0131n\u0131 (girdi, ara\u00e7 \u00e7a\u011f\u0131rma, ara\u00e7 \u00e7\u0131kt\u0131s\u0131, nihai yan\u0131t) izlemek i\u00e7in callback (geri \u00e7a\u011f\u0131rma) fonksiyonlar\u0131 sa\u011flar. Bu fonksiyonlar\u0131 kullanarak, loglama, hata izleme, performans \u00f6l\u00e7\u00fcm\u00fc veya hatta ara ad\u0131mlarda insan m\u00fcdahalesi gibi i\u015flemleri ger\u00e7ekle\u015ftirebilirsiniz.<\/li>\n<\/ul>\n<pre><code class=\"language-python\">\nfrom langchain.callbacks.base import BaseCallbackHandler\nfrom langchain_core.agents import AgentAction, AgentFinish\nfrom langchain_core.messages import BaseMessage\n\nclass MyCustomHandler(BaseCallbackHandler):\n    def on_agent_action(self, action: AgentAction, **kwargs):\n        print(f\"--- Ajan Aksiyonu: {action.log} ---\")\n\n    def on_tool_end(self, output: str, **kwargs):\n        print(f\"--- Ara\u00e7 \u00c7\u0131kt\u0131s\u0131: {output} ---\")\n\n    def on_agent_finish(self, finish: AgentFinish, **kwargs):\n        print(f\"--- Ajan Tamamland\u0131: {finish.log} ---\")\n\n# AgentExecutor'\u0131 callback'ler ile tekrar olu\u015fturuyoruz\nerp_agent_executor_with_callbacks = AgentExecutor(\n    agent=erp_agent,\n    tools=erp_tools,\n    verbose=True,\n    callbacks=[MyCustomHandler()] # Callback'i buraya ekliyoruz\n)\n\n# \u015eimdi bir hata senaryosunu test edelim (\u00f6rne\u011fin olmayan bir \u00fcr\u00fcn sorgulayal\u0131m)\nprint(\"\\n-----------------------------------\")\nprint(\"Callback'li Hata Senaryosu:\")\nprint(\"-----------------------------------\")\nresponse_error = erp_agent_executor_with_callbacks.invoke({\"input\": \"Olmayan_Urun diye bir \u00fcr\u00fcn\u00fcn stok durumu nedir?\"})\nprint(response_error[\"output\"])\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>MyCustomHandler<\/code> \u00f6rne\u011fi, ajan\u0131n her ad\u0131m\u0131nda konsola \u00f6zel mesajlar yazd\u0131rarak, ajan\u0131n ne d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fc ve hangi ara\u00e7lar\u0131 hangi \u00e7\u0131kt\u0131larla kulland\u0131\u011f\u0131n\u0131 takip etmenizi sa\u011flar. Ger\u00e7ek bir uygulamada, bu callback'leri veritaban\u0131na loglama, uyar\u0131 mekanizmalar\u0131n\u0131 tetikleme veya performans metriklerini toplama gibi ama\u00e7larla kullanabilirsiniz.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Hassas veya kritik operasyonlar (\u00f6rne\u011fin finansal i\u015flemler veya veri silme) i\u00e7in \"insan d\u00f6ng\u00fcs\u00fc i\u00e7inde\" (human-in-the-loop) stratejilerini uygulay\u0131n. Bir ajan kritik bir eylem yapmaya karar verdi\u011finde, do\u011frudan i\u015flemi y\u00fcr\u00fctmek yerine, kullan\u0131c\u0131dan veya bir y\u00f6neticiden onay isteyebilir. Bu, hatal\u0131 veya k\u00f6t\u00fc niyetli eylemleri \u00f6nlemek i\u00e7in ek bir g\u00fcvenlik katman\u0131 sa\u011flar. Bu, araca ek bir parametre ekleyerek (<code>onay_gerekiyor: bool = True<\/code>) ve ajan\u0131n bu parametreyi sorgulamas\u0131n\u0131 sa\u011flayarak yap\u0131labilir.\n  <\/div>\n<p>Bu ileri d\u00fczey stratejiler, LangChain ile olu\u015fturdu\u011funuz kurumsal yard\u0131mc\u0131lar\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda g\u00fcvenilir, sa\u011flam ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. \u0130\u015fletme ortamlar\u0131nda ba\u015far\u0131 i\u00e7in bu t\u00fcr detaylara dikkat etmek kritik \u00f6neme sahiptir.<\/p>\n<h2>Mobil Uyumlu Kurumsal Yard\u0131mc\u0131lar: HTML ve CSS ile Kullan\u0131c\u0131 Deneyimi<\/h2>\n<p>Bir kurumsal yard\u0131mc\u0131n\u0131n ba\u015far\u0131s\u0131 sadece arka plandaki ak\u0131ll\u0131 i\u015flevselli\u011fine de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n onunla ne kadar kolay ve sezgisel bir \u015fekilde etkile\u015fim kurabildi\u011fine de ba\u011fl\u0131d\u0131r. Modern i\u015fg\u00fcc\u00fc, mobil cihazlar\u0131 her an, her yerde kullanma e\u011filiminde oldu\u011fundan, geli\u015ftirdi\u011fimiz yard\u0131mc\u0131lar\u0131n mobil uyumlu bir kullan\u0131c\u0131 aray\u00fcz\u00fcne sahip olmas\u0131 olmazsa olmazd\u0131r. LangChain ajan\u0131 ne kadar zeki olursa olsun, k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimi (UX) benimsenmeyi engeller. Bu b\u00f6l\u00fcmde, bir LangChain tabanl\u0131 kurumsal yard\u0131mc\u0131n\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (UI) HTML ve CSS kullanarak nas\u0131l mobil uyumlu hale getirebilece\u011finizi ele alaca\u011f\u0131z.<\/p>\n<h3>Sohbet Aray\u00fcz\u00fc \u0130\u00e7in Temel HTML Yap\u0131s\u0131<\/h3>\n<p>Bir sohbet botu aray\u00fcz\u00fc, genellikle bir mesaj ge\u00e7mi\u015fi alan\u0131 ve bir girdi alan\u0131 i\u00e7erir. Basit bir HTML yap\u0131s\u0131 \u015f\u00f6yle olabilir:<\/p>\n<pre><code class=\"language-html\">\n<div class=\"chat-container\">\n    <div class=\"chat-header\">\n        <h3>Kurumsal Yard\u0131mc\u0131<\/h3>\n    <\/div>\n    <div class=\"chat-messages\" id=\"chatMessages\">\n        <!-- Mesajlar buraya dinamik olarak eklenecek -->\n        <div class=\"message user-message\">Merhaba, stok durumunu sorgulayabilir misin?<\/div>\n        <div class=\"message bot-message\">Elbette, hangi \u00fcr\u00fcn\u00fcn stok durumunu \u00f6\u011frenmek istersiniz?<\/div>\n    <\/div>\n    <div class=\"chat-input\">\n        <input type=\"text\" id=\"userInput\" placeholder=\"Mesaj\u0131n\u0131z\u0131 yaz\u0131n...\">\n        <button id=\"sendMessage\">G\u00f6nder<\/button>\n    <\/div>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131, bir sohbet kutusu i\u00e7in temel elementleri sa\u011flar: bir ba\u015fl\u0131k, mesajlar\u0131n g\u00f6r\u00fcnece\u011fi bir alan ve kullan\u0131c\u0131n\u0131n mesaj yaz\u0131p g\u00f6nderece\u011fi bir alan. JavaScript kullanarak (bu makalenin kapsam\u0131 d\u0131\u015f\u0131nda olsa da), <code>userInput<\/code>'tan gelen mesajlar\u0131 al\u0131p LangChain ajan\u0131na g\u00f6nderebilir ve d\u00f6nen yan\u0131tlar\u0131 <code>chatMessages<\/code> div'ine ekleyebilirsiniz.<\/p>\n<h3>CSS ile Duyarl\u0131 (Responsive) Tasar\u0131m Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Mobil uyumlulu\u011fun anahtar\u0131, CSS'in \"media query\" \u00f6zelli\u011fidir. Media query'ler, ekran geni\u015fli\u011fi, cihaz tipi veya y\u00f6nelim gibi belirli ko\u015fullara g\u00f6re farkl\u0131 stil kurallar\u0131 uygulaman\u0131za olanak tan\u0131r. Bu sayede, tasar\u0131m\u0131n\u0131z farkl\u0131 cihazlarda otomatik olarak kendini ayarlar.<\/p>\n<pre><code class=\"language-css\">\n\/* Genel stiller *\/\nbody {\n    font-family: Arial, sans-serif;\n    margin: 0;\n    padding: 0;\n    background-color: #f4f7f6;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    min-height: 100vh;\n}\n\n.chat-container {\n    width: 100%;\n    max-width: 450px; \/* B\u00fcy\u00fck ekranlarda maksimum geni\u015flik *\/\n    height: 80vh;\n    background-color: #fff;\n    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n    display: flex;\n    flex-direction: column;\n    border-radius: 8px;\n    overflow: hidden;\n}\n\n.chat-header {\n    background-color: #007bff;\n    color: white;\n    padding: 15px;\n    text-align: center;\n    font-size: 1.2em;\n}\n\n.chat-messages {\n    flex-grow: 1;\n    padding: 15px;\n    overflow-y: auto;\n    border-bottom: 1px solid #eee;\n}\n\n.message {\n    margin-bottom: 10px;\n    padding: 8px 12px;\n    border-radius: 15px;\n    max-width: 80%;\n    word-wrap: break-word;\n}\n\n.user-message {\n    background-color: #e0f7fa;\n    align-self: flex-end;\n    margin-left: auto;\n    color: #333;\n}\n\n.bot-message {\n    background-color: #f1f0f0;\n    align-self: flex-start;\n    margin-right: auto;\n    color: #555;\n}\n\n.chat-input {\n    display: flex;\n    padding: 15px;\n    border-top: 1px solid #eee;\n}\n\n.chat-input input {\n    flex-grow: 1;\n    padding: 10px;\n    border: 1px solid #ccc;\n    border-radius: 20px;\n    margin-right: 10px;\n    font-size: 1em;\n}\n\n.chat-input button {\n    background-color: #007bff;\n    color: white;\n    border: none;\n    padding: 10px 15px;\n    border-radius: 20px;\n    cursor: pointer;\n    font-size: 1em;\n    transition: background-color 0.3s ease;\n}\n\n.chat-input button:hover {\n    background-color: #0056b3;\n}\n\n\/* Mobil uyumluluk i\u00e7in medya sorgusu *\/\n@media (max-width: 768px) {\n    .chat-container {\n        width: 100vw; \/* Tam ekran geni\u015fli\u011fi *\/\n        height: 100vh; \/* Tam ekran y\u00fcksekli\u011fi *\/\n        max-width: none; \/* Maksimum geni\u015flik k\u0131s\u0131tlamas\u0131n\u0131 kald\u0131r *\/\n        border-radius: 0; \/* K\u00f6\u015fe yuvarlakl\u0131\u011f\u0131n\u0131 kald\u0131r *\/\n    }\n\n    body {\n        align-items: flex-start; \/* Sohbeti ekran\u0131n \u00fcst\u00fcne hizala *\/\n    }\n\n    .chat-input input {\n        padding: 12px;\n    }\n\n    .chat-input button {\n        padding: 12px 18px;\n    }\n}\n\n\/* Daha k\u00fc\u00e7\u00fck cihazlar i\u00e7in ek optimizasyonlar *\/\n@media (max-width: 480px) {\n    .chat-header h3 {\n        font-size: 1em;\n    }\n    .chat-messages {\n        padding: 10px;\n    }\n    .message {\n        max-width: 90%;\n        font-size: 0.9em;\n    }\n    .chat-input {\n        padding: 10px;\n    }\n    .chat-input input, .chat-input button {\n        padding: 8px;\n        font-size: 0.9em;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS kodu, <code>.chat-container<\/code> elementine genel stiller uygular. Ard\u0131ndan, <code>@media (max-width: 768px)<\/code> sorgusu ile ekran geni\u015fli\u011fi 768 piksel veya daha az oldu\u011funda devreye giren \u00f6zel kurallar tan\u0131mlar\u0131z. Bu kurallar:<\/p>\n<ul>\n<li>Sohbet kutusunun geni\u015fli\u011fini ve y\u00fcksekli\u011fini cihaz\u0131n tamam\u0131n\u0131 kaplayacak \u015fekilde ayarlar (<code>100vw<\/code> ve <code>100vh<\/code>).<\/li>\n<li><code>max-width<\/code> k\u0131s\u0131tlamas\u0131n\u0131 kald\u0131r\u0131r, b\u00f6ylece daha b\u00fcy\u00fck ekranlardaki sabitlemeyi mobil cihazlarda ge\u00e7ersiz k\u0131lar.<\/li>\n<li><code>border-radius<\/code>'u s\u0131f\u0131rlayarak tam ekran deneyimi sa\u011flar.<\/li>\n<li>Daha k\u00fc\u00e7\u00fck cihazlar (<code>max-width: 480px<\/code>) i\u00e7in font boyutlar\u0131 ve padding gibi daha ince ayarlar yapar.<\/li>\n<\/ul>\n<p>Bu yakla\u015f\u0131m, LangChain ile geli\u015ftirdi\u011finiz ak\u0131ll\u0131 kurumsal yard\u0131mc\u0131lar\u0131n sadece arka planda g\u00fc\u00e7l\u00fc olmakla kalmay\u0131p, ayn\u0131 zamanda son kullan\u0131c\u0131ya modern, eri\u015filebilir ve mobil uyumlu bir deneyim sunmas\u0131n\u0131 sa\u011flar. Kullan\u0131c\u0131 dostu bir aray\u00fcz, yeni teknolojilerin kurumsal ortamlarda benimsenmesinde kilit rol oynar ve \u00e7al\u0131\u015fan verimlili\u011fini do\u011frudan etkiler.<\/p>\n<h2>LangChain ile Kurumsal D\u00f6n\u00fc\u015f\u00fcm: Gelece\u011fin \u0130\u015f Modelleri<\/h2>\n<p>LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fi, b\u00fcy\u00fck dil modellerinin (LLM'ler) i\u015f d\u00fcnyas\u0131ndaki rol\u00fcn\u00fc k\u00f6kten de\u011fi\u015ftiriyor. Art\u0131k yapay zeka sadece i\u00e7erik \u00fcretmek veya sorular\u0131 yan\u0131tlamakla kalm\u0131yor; ger\u00e7ek d\u00fcnya sistemleriyle etkile\u015fim kurarak somut eylemler ger\u00e7ekle\u015ftirebilen, i\u015fletmelerin en karma\u015f\u0131k operasyonlar\u0131na bile entegre olabilen ak\u0131ll\u0131 yard\u0131mc\u0131lar haline geliyor. Bu, kurumsal d\u00f6n\u00fc\u015f\u00fcm i\u00e7in e\u015fsiz f\u0131rsatlar sunuyor ve gelece\u011fin i\u015f modellerini \u015fekillendiriyor.<\/p>\n<p>Bu makalede g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, LangChain, bir LLM'in bir ERP sistemiyle etkile\u015fim kurmas\u0131ndan, bir m\u00fc\u015fteri hizmetleri talebini i\u015flemesine veya bir finansal raporu otomatik olarak olu\u015fturmas\u0131na kadar geni\u015f bir yelpazedeki g\u00f6revleri \u00fcstlenebilen \"kurumsal yard\u0131mc\u0131lar\" in\u015fa etmenin yolunu a\u00e7\u0131yor. Bu yard\u0131mc\u0131lar, manuel i\u015f y\u00fck\u00fcn\u00fc azalt\u0131r, insan hatalar\u0131n\u0131 minimize eder ve i\u015f s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. En \u00f6nemlisi, \u00e7al\u0131\u015fanlar\u0131n rutin, tekrarlayan g\u00f6revler yerine daha stratejik ve yarat\u0131c\u0131 i\u015flere odaklanmas\u0131n\u0131 sa\u011flayarak genel verimlili\u011fi ve \u00e7al\u0131\u015fan memnuniyetini art\u0131r\u0131r.<\/p>\n<p><strong>Fonksiyon \u00e7a\u011f\u0131rman\u0131n kurumsal faydalar\u0131 \u00f6zetle \u015funlard\u0131r:<\/strong><\/p>\n<ul>\n<li><strong>Otomasyon ve Verimlilik:<\/strong> Elle yap\u0131lan bir\u00e7ok i\u015fin otomatikle\u015ftirilmesi sayesinde i\u015f s\u00fcre\u00e7leri h\u0131zlan\u0131r ve operasyonel maliyetler d\u00fc\u015fer.<\/li>\n<li><strong>Geli\u015fmi\u015f Veri Eri\u015fimi:<\/strong> LLM'ler, i\u015fletmelerin sahip oldu\u011fu derinlemesine veri tabanlar\u0131na ve harici API'lere eri\u015ferek daha do\u011fru ve g\u00fcncel bilgilerle karar verme s\u00fcre\u00e7lerini destekler.<\/li>\n<li><strong>Ki\u015fiselle\u015ftirilmi\u015f Deneyimler:<\/strong> M\u00fc\u015fteri hizmetlerinden i\u00e7 ileti\u015fime kadar her alanda, kullan\u0131c\u0131lara \u00f6zel, ba\u011flamsal ve etkile\u015fimli deneyimler sunulur.<\/li>\n<li><strong>\u0130\u015f Ak\u0131\u015f\u0131 Entegrasyonu:<\/strong> Mevcut yaz\u0131l\u0131m ve sistemlerle sorunsuz entegrasyon sayesinde, mevcut altyap\u0131dan en iyi \u015fekilde faydalan\u0131l\u0131r.<\/li>\n<li><strong>Geli\u015fmi\u015f Karar Verme:<\/strong> Anl\u0131k veri analizi ve \u00f6ng\u00f6r\u00fcler sunarak y\u00f6neticilerin daha bilin\u00e7li ve h\u0131zl\u0131 kararlar almas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p>Gelecekte, bu t\u00fcr kurumsal yard\u0131mc\u0131lar\u0131n daha da sofistike hale geldi\u011fini g\u00f6rece\u011fiz. Kendi ba\u015flar\u0131na sorunlar\u0131 tespit edip \u00e7\u00f6z\u00fcm \u00f6nerileri sunan, proaktif olarak aksiyon alan ve hatta di\u011fer yard\u0131mc\u0131larla i\u015fbirli\u011fi i\u00e7inde \u00e7al\u0131\u015fan otonom ajanlar ortaya \u00e7\u0131kacak. LangChain, bu yenilik\u00e7i d\u00f6nemin \u00f6nc\u00fclerinden biri olarak, geli\u015ftiricilere bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 sa\u011flama misyonunu \u00fcstleniyor. \u0130\u015fletmelerin bu potansiyeli erkenden ke\u015ffetmesi ve stratejik olarak kullanmas\u0131, rekabet avantaj\u0131 elde etmeleri i\u00e7in hayati \u00f6nem ta\u015f\u0131yor.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. LangChain'de fonksiyon \u00e7a\u011f\u0131rma i\u00e7in hangi LLM'leri kullanabilirim?<\/strong><\/p>\n<p>Genellikle OpenAI'nin GPT-4o, GPT-4 Turbo ve GPT-3.5 Turbo gibi modelleri, yerle\u015fik ve optimize edilmi\u015f fonksiyon \u00e7a\u011f\u0131rma \u00f6zelliklerine sahip olduklar\u0131 i\u00e7in tercih edilir. Ancak, di\u011fer LLM sa\u011flay\u0131c\u0131lar\u0131 veya a\u00e7\u0131k kaynakl\u0131 modeller de (e.g., Llama 3) LangChain'in ara\u00e7 entegrasyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla fonksiyon \u00e7a\u011f\u0131rma yetene\u011fine sahip olabilir, ancak kurulumlar\u0131 farkl\u0131l\u0131k g\u00f6sterebilir.<\/p>\n<p><strong>2. LangChain fonksiyon \u00e7a\u011f\u0131rman\u0131n g\u00fcvenlik a\u00e7\u0131s\u0131ndan potansiyel riskleri var m\u0131?<\/strong><\/p>\n<p>Evet, her g\u00fc\u00e7l\u00fc teknolojide oldu\u011fu gibi fonksiyon \u00e7a\u011f\u0131rman\u0131n da riskleri vard\u0131r. LLM'in yanl\u0131\u015f bir ara\u00e7 \u00e7a\u011f\u0131rmas\u0131 veya yanl\u0131\u015f parametrelerle bir eylem ger\u00e7ekle\u015ftirmesi durumunda istenmeyen sonu\u00e7lar do\u011fabilir (\u00f6rne\u011fin, yanl\u0131\u015f veri silme, hatal\u0131 sipari\u015f olu\u015fturma). Bu nedenle, ara\u00e7lara s\u0131k\u0131 eri\u015fim kontrolleri uygulamak, kritik i\u015flemler i\u00e7in insan onay\u0131 (human-in-the-loop) mekanizmalar\u0131 eklemek ve t\u00fcm etkile\u015fimleri loglamak \u00f6nemlidir. Ayr\u0131ca, kullan\u0131c\u0131 girdilerinin temizlenmesi (input sanitization) ve yetkilendirme (authorization) mekanizmalar\u0131 da kritik \u00f6neme sahiptir.<\/p>\n<p><strong>3. Fonksiyon \u00e7a\u011f\u0131rma performans\u0131n\u0131 nas\u0131l optimize edebilirim?<\/strong><\/p>\n<p>Performans\u0131 art\u0131rmak i\u00e7in ara\u00e7lar\u0131n\u0131z\u0131 m\u00fcmk\u00fcn oldu\u011funca verimli yaz\u0131n; gereksiz API \u00e7a\u011fr\u0131lar\u0131ndan veya veri taban\u0131 sorgular\u0131ndan ka\u00e7\u0131n\u0131n. LLM'in h\u0131zl\u0131 yan\u0131t vermesi i\u00e7in model se\u00e7imi \u00f6nemlidir (daha k\u00fc\u00e7\u00fck modeller genellikle daha h\u0131zl\u0131d\u0131r). Ayr\u0131ca, prompt m\u00fchendisli\u011fi ile ajana daha net talimatlar vererek gereksiz \"d\u00fc\u015f\u00fcnme\" ad\u0131mlar\u0131n\u0131 azaltabilirsiniz. LangChain'in caching mekanizmalar\u0131n\u0131 kullanarak tekrarlayan ara\u00e7 \u00e7a\u011fr\u0131lar\u0131n\u0131n sonu\u00e7lar\u0131n\u0131 \u00f6nbelle\u011fe almay\u0131 da d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<p><strong>4. LangChain fonksiyon \u00e7a\u011f\u0131rma ile sadece API'ler mi \u00e7a\u011fr\u0131labilir?<\/strong><\/p>\n<p>Hay\u0131r, fonksiyon \u00e7a\u011f\u0131rma sadece harici API'lerle s\u0131n\u0131rl\u0131 de\u011fildir. Python'da yaz\u0131lm\u0131\u015f herhangi bir fonksiyonu LangChain arac\u0131 olarak tan\u0131mlayabilirsiniz. Bu, veri taban\u0131 sorgular\u0131, dosya sistemi i\u015flemleri, yerel sistem komutlar\u0131 \u00e7al\u0131\u015ft\u0131rma, karma\u015f\u0131k hesaplamalar yapma veya hatta di\u011fer yapay zeka modellerini \u00e7a\u011f\u0131rma gibi \u00e7ok \u00e7e\u015fitli g\u00f6revleri kapsar. \u00d6nemli olan, arac\u0131n ne yapaca\u011f\u0131n\u0131 ve hangi girdilere ihtiya\u00e7 duydu\u011funu LLM'in anlayabilece\u011fi \u015fekilde tan\u0131mlamakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"LangChain&#8217;in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API&#8217;ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren 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":[1342],"tags":[],"class_list":{"0":"post-33134","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ai","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>LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme<\/title>\n<meta name=\"description\" content=\"LangChain&#039;in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API&#039;ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \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\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme\" \/>\n<meta property=\"og:description\" content=\"LangChain&#039;in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API&#039;ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T00:31:19+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme\",\"datePublished\":\"2025-10-30T00:31:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\"},\"wordCount\":3859,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AI\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\",\"name\":\"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T00:31:19+00:00\",\"description\":\"LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API'ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \u00f6\u011frenin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme\"}]},{\"@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":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme","description":"LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API'ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \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\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/","og_locale":"tr_TR","og_type":"article","og_title":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme","og_description":"LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API'ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \u00f6\u011frenin.","og_url":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T00:31:19+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme","datePublished":"2025-10-30T00:31:19+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/"},"wordCount":3859,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AI"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/","url":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/","name":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T00:31:19+00:00","description":"LangChain'in fonksiyon \u00e7a\u011f\u0131rma yetene\u011fiyle sohbet botlar\u0131n\u0131z\u0131 veri tabanlar\u0131, API'ler ve harici ara\u00e7larla entegre ederek kurumsal s\u00fcre\u00e7lerinizi otomatikle\u015ftiren ak\u0131ll\u0131 yard\u0131mc\u0131lar haline getirin. Bu makalede ad\u0131m ad\u0131m \u00f6\u011frenin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/langchain-ile-fonksiyon-cagirma-sohbet-botlarini-kurumsal-yardimcilara-donusturme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"LangChain ile Fonksiyon \u00c7a\u011f\u0131rma: Sohbet Botlar\u0131n\u0131 Kurumsal Yard\u0131mc\u0131lara D\u00f6n\u00fc\u015ft\u00fcrme"}]},{"@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\/33134","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=33134"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33134\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33134"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}