Kurumsal yazılımlar nadiren sıfırdan başlar. Çoğu büyük kuruluş, hâlâ kritik iş mantığını mainframe'lerde çalıştırır ve batch işleri ile SOAP web servisleri üzerinden iletişim kurar. Büyük Dil Modelleri (LLM'ler) modern uygulamalar için tercih edilen arayüz haline geldikçe, zorluk artık sadece sohbet botları oluşturmak değil, olasılıksal yapay zekâ ile deterministik eski sistemler arasındaki boşluğu kapatmaktır. LangChain, bu karmaşıklığı soyutlamak için güçlü bir çerçeve sağlar ve geliştiricilerin altyapının tam ölçekli modernizasyonu gerektirmeden eski veri yapıları üzerinde akıl yürütebilen ajanlar oluşturmasına olanak tanır.
Entegrasyon Zorluğunu Anlama
Bir LLM'i eski bir sistemle entegre etmek iki ayrı sorunu ortaya çıkarır: veri biçimlendirme ve durum yönetimi. CICS veya Db2 gibi mainframe sistemleri, genellikle sabit uzunluklu kayıtlara ve karmaşık hiyerarşik verilere (XML veya EDI) dayanır. Standart tabanlı olmalarına rağmen, SOAP API'leri genellikle ayrıntılı ve senkroniktir; bu da yapılandırılmış istemler olmadan LLM'lerin onları güvenilir bir şekilde çağırmasını zorlaştırır. "ID 123 olan kullanıcının detaylarını getir" gibi doğrudan bir istem başarısız olur, çünkü LLM belirli şemayı veya uç nokta URL'sini bilmez. LangChain, bu eski çağrıları saran "Araçlar" tanımlamamıza izin vererek bu sorunu çözer; bu da LLM'e eski yığınla etkileşime girmek için net, tipli bir arayüz sağlar.
SOAP Köprüsünü Oluşturma
İlk adım, eski SOAP hizmetini bir LangChain aracına kapsayıcı hale getirmektir. Bu, giriş şemasını ve SOAP zarfını ayrıştırmak için mantığı tanımlamayı içerir. LLM'in çağırabileceği bir işlev oluşturmak için @tool süsleyicisini kullanırız. Buradaki anahtar nokta hata yönetimidir; eski sistemler genellikle şeffaf olmayan hata kodları döndürür. Araç, bu kodları LLM'in yeniden denemek veya stratejisini ayarlamak için kullanabileceği insan okunabilir mesajlara dönüştürmelidir.
from langchain_core.tools import tool
import requests
from pydantic import BaseModel, Field
class LegacyUserRequest(BaseModel):
"""Eski SOAP API'sinden kullanıcı detaylarını getirir."""
user_id: str = Field(..., description="Kullanıcının benzersiz tanımlayıcısı")
@tool
def get_user_from_mainframe(user_id: str) -> str:
"""
Kullanıcı verilerini almak için eski SOAP uç noktasına bağlanır.
Args:
user_id: Getirilecek kullanıcının ID'si.
"""
soap_envelope = f"""
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:GetUser>
<ns:UserID>{user_id}</ns:UserID>
</ns:GetUser>
</soapenv:Body>
</soapenv:Envelope>
"""
headers = {
"Content-Type": "application/soap+xml",
"SOAPAction": "http://example.com/getUser"
}
try:
response = requests.post("https://legacy.enterprise.com/api", data=soap_envelope, headers=headers)
# Gerçek bir senaryoda, XML yanıtını düzgünce ayrıştırmalısınız
# Burada kısalık için bir başarıyı simüle ediyoruz
if response.status_code == 200:
return f"Kullanıcı {user_id} bulundu: John Doe, Kıdemli Mühendis"
else:
return f"Hata: Eski API {response.status_code} döndürdü"
except Exception as e:
return f"Bağlantı başarısız oldu: {str(e)}"
Mainframe Batch İşlerini İşleme
SOAP API'lerinin aksine, mainframe batch işleri genellikle asenkroniktir. LLM, bir işin tamamlanmasını gerçek zamanlı olarak bekleyemez. Sağlam bir ajan mimarisi, bir "yoklama" (polling) deseni veya webhook mekanizması uygulamasımalıdır. LangChain'de iki aşamalı bir araç kurulumu oluşturabilirsiniz: biri işi göndermek için, diğeri durumu kontrol etmek için. Ajanın mantığı (genellikle bir ReAct veya Plan-and-Execute zinciri tarafından yönlendirilen) iş hâlâ "Çalışıyor" durumundaysa beklemesi veya yeniden denemesi talimatı almalıdır. Bu, LLM'in henüz döndürülmemiş verileri hayal etmesini (halüsinasyon) önlemek için dikkatli istem mühendisliği gerektirir.
from langchain.agents import AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
llm = ChatOpenAI(model="gpt-4", temperature=0)
tools = [get_user_from_mainframe]
prompt = PromptTemplate.from_template("""
Aşağıdaki soruları mümkün olduğunca iyi yanıtlayın.
Erişiminiz olan şu araçlar var:
{tools}
Şu biçimi kullanın:
Soru: Yanıt vermeniz gereken girdi sorusu
Düşünce: Ne yapacağınızı her zaman düşünmelisiniz
Eylem: Alınacak eylem, [{tool_names}] içinden biri olmalıdır
Eylem Girdisi: Eylemin girdisi
Gözlem: Eylemin sonucu
... (bu Düşünce/Eylem/Eylem Girdisi/Gözlem N kez tekrarlanabilir)
Düşünce: Artık nihai cevabı biliyorum
Nihai Cevap: Orijinal girdi sorusuna nihai cevap
Başlayın!
Soru: {input}
Düşünce:{agent_scratchpad}
""")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
response = agent_executor.invoke({
"input": "ID 123 olan kullanıcı kim?"
})
Eski Ajan Tasarımı İçin En İyi Uygulamalar
Bu ajanları dağıtırken, güvenlik ve gecikmeyi (latency) göz önünde bulundurun. Eski sistemler genellikle sıkı güvenlik duvarlarının arkasındadır; ajanınızın bu uç noktalara erişim iznine sahip bir ağ bölgesinde çalıştığından emin olun. Ayrıca, SOAP yanıtları büyük olabilir. XML/JSON yanıtını, LLM'e string döndürmeden önce ilgili alanları çıkarmak için araç işlevi içinde son işlemeye tabi tutmak tavsiye edilir. Bu, token kullanımını azaltır ve modelin nihai cevabının doğruluğunu artırır.
Sonuç
Modern yapay zekâ ile eski altyapı arasındaki boşluğu kapatmak, eski sistemleri değiştirmek değil, onları güçlendirmekle ilgilidir. LangChain'i Mainframe ve SOAP hizmetleri için yapılandırılmış, araç tabanlı arayüzler oluşturmak için kullanarak, geliştiriciler LLM'leri akıllı bir ara yazılım (middleware) olarak hareket etmeye yetkilendirebilir. Bu yaklaşım, kurumsal kuruluşların, mevcut iş akışlarını geliştirmek için üretken yapay zekânın gücünden yararlanmasını ve tam bir sistem migrasyonu getireceği devasa yük olmadan kritik tarihsel verilere doğal dil erişimi sağlamasını mümkün kılar. Ajan çerçeveleri evrildikçe, eski sistemleri anlamsal katmanlarla "sarma" deseni, kurumsal entegrasyonda standart bir uygulama haline gelecektir.