Amazon Bedrock ve Claude Haiku 4.5 ile uçtan uca uygulama
Geçtiğimiz hafta yayımladığım Elastic Stack laboratuvar çalışmasında, Azure üzerinde Docker tabanlı Elasticsearch ve Kibana ortamımızı kurmuş, SSH tüneliyle güvenli erişim sağlamış, örnek web loglarını ES|QL ile sorgulayıp etkileşimli dashboard’lara dönüştürmüştük. O gün veriyi konuşturmuştuk; bu çalışmada ise veriye doğal dilde soru soracağız. Claude Haiku 4.5’in kullanıcı talebini nasıl yorumladığını, Elastic AI Agent Builder’ın doğru aracı nasıl çalıştırdığını ve Elasticsearch üzerinde hesaplanan gerçek sonuçların nasıl anlaşılır bir cevaba dönüştürüldüğünü adım adım inceleyeceğiz. Kısacası bu kez Elasticsearch ile sohbet edeceğiz.
Mimaride Kim Ne Yapıyor?
Bu laboratuvarı anlamanın anahtarı, LLM, agent, Agent Builder, tool ve Elasticsearch rollerini birbirinden ayırmaktır.
| Bileşen | Görevi |
| Agent Chat | Kullanıcının doğal dilde sorusunu yazdığı arayüzdür. |
| Agent | Belirli bir iş amacı için model, talimatlar, izin verilen tool’lar ve cevaplama kurallarını bir araya getiren yapılandırmadır; ayrı bir LLM değildir. |
| Agent Builder | Kullanıcı sorusunu, agent talimatlarını ve izin verilen tool tanımlarını LLM’e iletir. LLM’in seçtiği tool’u çalıştırır ve sonucu yeniden modele aktarır. |
| LLM (Claude Haiku 4.5) | Sorunun niyetini yorumlar; Agent Builder’ın sunduğu tool’lar arasından uygun olanı seçer, gerekli parametreleri üretir ve Elasticsearch sonucunu doğal dille açıklar. |
| Tool | platform.core.search, Agent Builder tarafından çalıştırılan işlevdir. Elasticsearch üzerinde arama, filtreleme, gruplama ve ES|QL sorgusu yürütür. |
| Elasticsearch | Gerçek veriyi tutar; sorguyu çalıştırır, sayım ve hesaplamaları yapar ve sonucu geri döndürür. |
Uçtan uca akış
| 1 | Kullanıcı, sorusunu Agent Chat üzerinden iletir. | → | 2 | Agent Builder; soruyu, agent talimatlarını ve izin verilen tool listesini LLM’e gönderir. |
| 3 | LLM, kullanıcı niyetini yorumlar ve sunulan tool’lar arasından uygun olanı seçer. | → | 4 | Agent Builder, LLM’in seçtiği tool’u gerekli parametrelerle çalıştırır. |
| 5 | Elasticsearch sorguyu yürütür, gerçek sonucu hesaplar ve geri döndürür. | → | 6 | Agent Builder sonucu LLM’e iletir; LLM bunu anlaşılır bir yanıt veya yönetim özeti olarak açıklar. |
Kritik ayrım: Agent Builder, LLM’e hangi talimatların ve hangi tool’ların sunulacağını belirler; LLM ise bu seçenekler arasından hangisinin kullanılacağına karar verir. LLM hesabı yapmaz, Agent Builder veri kaynağı değildir, Elasticsearch de yönetim özeti yazmaz.
- Elastic Stack Ortamını Yeniden Başlatmak
Önce docker ps -a komutuyla daha önce oluşturulmuş Elasticsearch ve Kibana container’larını kontrol ettim ve servislerin kapalı olduğunu gördüm. Ardından docker compose ls -a ile elastic-start-local projesini doğruladım, ilgili dizine geçerek docker compose start komutuyla mevcut container’ları yeniden başlattım. Son olarak docker compose ps çıktısında Elasticsearch’ün healthy durumda çalıştığını, Kibana’nın da başlatıldığını doğruladım. Servisler güvenlik amacıyla yalnızca VM’nin yerel arayüzüne bağlanıyordu: Elasticsearch 127.0.0.1:9200, Kibana ise 127.0.0.1:5601.

2. Amazon Bedrock Üzerinde Modeli Doğrulamak


3. Amazon Bedrock Modelini Elastic’e Bağlamak






4. Örnek Destek Verisini Hazırlamak



Bu noktada laboratuvarın üç temel bileşeni hazırdı:
Veri kaynağı: Elasticsearch / support_tickets
LLM sağlayıcısı ve model: Amazon Bedrock / Claude Haiku 4.5
Elastic inference endpoint: bedrock-claude-haiku-45-chat
5.Agent Builder ile İlk Doğal Dil Sorgusu




Reasoning ekranında gerçek görev paylaşımı görünür hale geldi. Claude Haiku 4.5, sorunun support_tickets index’indeki toplam belge sayısını istediğini anladı ve platform.core.search tool’unun kullanılmasına karar verdi.
Ekrandaki adımların anlamı:
“I’ll search…”: LLM, kullanıcı niyetini yorumladı.
“I need to search this index…”: Cevap vermeden önce gerçek veriye bakılması gerektiğini belirledi.
“Calling tool platform.core.search”: Kullanılacak tool’u LLM seçti.
“Identifying the most relevant data source”: Tool çağrısı kapsamında support_tickets veri kaynağı belirlendi.
“Analyzing strategy…”: Arama ve hesaplama yaklaşımı planlandı.
“Generating an ES|QL query…”: platform.core.search, toplam kayıt sayısını hesaplayacak ES|QL sorgusunu hazırladı.
Sorgu Agent Builder tarafından Elasticsearch üzerinde çalıştırıldı ve sonuç 16 olarak modele geri gönderildi.
Claude Haiku 4.5, Elasticsearch’ten dönen sonucu Türkçe ve doğal bir cümleye dönüştürdü.
Kısacası LLM tool’u seçti, Agent Builder tool’u çalıştırdı, sonucu Elasticsearch hesapladı.
Claude index’in içine doğrudan girmedi ve 16 sayısını tahmin etmedi; doğruluk kaynağı Elasticsearch oldu.
LLM, toplam kayıt sayısını bulmak için platform.core.search tool’unu seçti. Tool aşağıdaki ES|QL sorgusunu oluşturdu:
FROM support_tickets
| STATS total_count = COUNT(*)
Agent Builder sorguyu Elasticsearch üzerinde çalıştırdı; total_count = 16 sonucu modele geri iletildi. Claude Haiku 4.5 de bu gerçek sonucu doğal dile çevirdi. Burada karar LLM’e, orkestrasyon Agent Builder’a, hesaplama ise Elasticsearch’e aitti.
Ekranın altındaki metrikler de önemli:
- Süre: 12 saniye
- Girdi: 34.760 token
- Çıktı: 400 token
34.760 input token yalnızca yazdığımız kısa sorudan oluşmuyor; Agent Builder’ın sistem talimatları, hazır tool açıklamaları, agent bağlamı ve işlem sırasında modele gönderilen diğer bilgiler de buna dâhil. Bu nedenle hazır Elastic AI Agent oldukça geniş bir başlangıç bağlamı kullanıyor. Laboratuvar için sorun değil ama üretim ortamında maliyet ve gecikme açısından agent’ın tool ve talimat kapsamının daraltılması önemlidir.
6.Daha Gelişmiş Analiz Senaryoları


platform.core.search tool’u doğal dildeki talebi aşağıdaki ES|QL sorgusuna dönüştürdü:
FROM support_tickets
| WHERE severity == “Critical”
| STATS count = COUNT(*) BY product
| SORT count DESC
| LIMIT 100
Sorguda support_tickets verisi seçildi, yalnızca Critical kayıtlar filtrelendi, kayıtlar ürün bazında sayıldı ve sonuçlar büyükten küçüğe sıralandı. Elasticsearch beş ürün grubu döndürdü; Claude Haiku 4.5 ise bu sonucu tabloya çevirerek 4 kritik kayıtla Elasticsearch’ü ilk sırada gösterdi.
Ekrandaki metrikler:
- Toplam süre: 14 saniye
- Girdi: 35.986 token
- Çıktı: 658 token
Girdi miktarının yüksek olması, sorumuzun uzunluğundan değil; hazır Elastic AI Agent tarafından modele gönderilen sistem talimatları, yerleşik tool tanımları, veri keşif bağlamı ve önceki konuşma geçmişinden kaynaklanıyor. Bu durum, daha sonra oluşturacağımız dar kapsamlı özel agent’ın neden önemli olduğunu da gösterecek.
Şimdi hazır agent ile son ve daha güçlü senaryomuzu deneyelim:
Son 30 gündeki kritik destek kayıtlarını analiz et. Ürün bazındaki dağılımı ve kayıtların açık, kapalı veya çözümlenmiş durumlarını karşılaştır. En fazla operasyonel risk taşıyan ürünü belirle ve yönetim için üç cümlelik kısa bir değerlendirme hazırla.
Bu soru; tarih filtresi, ürün gruplaması, durum karşılaştırması ve yönetici dilinde yorumlama yeteneklerini birlikte test edecek.

Üçüncü ve en kapsamlı senaryomuz da doğru sonuç verdi. Agent, son 30 güne ait kritik kayıtları ürün ve durum bazında karşılaştırarak toplam 8 kritik kayıt bulmuş:
- Elasticsearch: 3 kayıt — 2 açık, 1 çözümlenmiş
- Redis: 2 kayıt — 1 açık, 1 kapalı
- GitLab: 1 açık kayıt
- PostgreSQL: 1 kapalı kayıt
- OpenShift: 1 çözümlenmiş kayıt
Toplamda 4 açık, 2 kapalı ve 2 çözümlenmiş kritik kayıt bulunuyor. Agent’ın Elasticsearch’ü en yüksek operasyonel risk taşıyan ürün olarak belirlemesi de mantıklı; çünkü hem en fazla kritik kayıt bu üründe hem de bunların ikisi hâlâ açık durumda.
Tek bir doğal dil talebinden tarih filtresi, önem seviyesi filtresi, ürün ve durum bazında gruplama, risk değerlendirmesi ve yönetim dilinde özet üretildiğini gösteriyor. Yani Elasticsearch hesaplamayı yaptı; Claude Haiku 4.5 ise gerçek sonuçları operasyonel yoruma dönüştürdü.
Şimdi yalnızca Completed reasoning bölümünü açalım. Üretilen gerçek ES|QL sorgusunu ve bu sonuç için kaç tool çağrısı yapıldığını inceleyelim.

Bu ekran, üçüncü senaryonun nasıl çözüldüğünü açık biçimde gösteriyor. platform.core.search tool’u doğal dildeki isteği şu ES|QL sorgusuna dönüştürdü:
FROM support_tickets
| WHERE severity == “Critical” AND created_at >= NOW() – 30 days
| STATS count = COUNT(*) BY product, status
| SORT product, status
| LIMIT 100
Burada önce son 30 gündeki Critical kayıtlar filtrelenmiş, ardından kayıtlar hem ürün hem de durum alanına göre gruplanmış. Ekrandaki “Found 7 results”, yalnızca 7 destek kaydı bulunduğu anlamına gelmiyor; Elasticsearch’ün 7 farklı ürün–durum kombinasyonu döndürdüğünü gösteriyor. Bu gruplardaki count değerleri toplandığında toplam 8 kritik destek kaydı elde ediliyor:
- Elasticsearch–Open: 2
- Elasticsearch–Resolved: 1
- Redis–Open: 1
- Redis–Closed: 1
- GitLab–Open: 1
- PostgreSQL–Closed: 1
- OpenShift–Resolved: 1
Agent daha sonra bu yapılandırılmış sonucu yorumlayarak Elasticsearch’ü en fazla operasyonel risk taşıyan ürün olarak belirledi. Yani bu örnekte tek bir ES|QL sorgusu, hem ürün dağılımını hem durum karşılaştırmasını oluşturmak için yeterli oldu.
Ekrandaki performans değerleri de şöyle:
- Yanıt süresi: 16 saniye
- Modele gönderilen giriş: 38.018 token
- Model çıktısı: 1.404 token
Bu yüksek giriş miktarı veri setimizin büyüklüğünden kaynaklanmıyor. Hazır Elastic AI Agent; sistem talimatlarını, genel amaçlı tool tanımlarını, konuşma geçmişini ve arama bağlamını da modele gönderiyor. Bu nedenle sıradaki mantıklı adımımız, yalnızca support_tickets verisine odaklanan daha kontrollü bir BT Operasyon Analisti agent’ı oluşturmak olacak. Böylece agent kavramını uygulamalı olarak gösterecek ve genel amaçlı hazır agent ile özel agent arasındaki farkı inceleyeceğiz.
Bu noktada genel amaçlı Elastic AI Agent yerine yalnızca destek kayıtlarına odaklanan özel bir agent oluşturduk. Özel agent; belirli bir kullanım senaryosu için talimatları, araçları ve cevaplama davranışını sınırlandırarak daha kontrollü bir çalışma modeli sunar.
7. Özel Agent: BT Operasyon Analisti






8.Sonuç: Kararı Kim Verdi, Hesabı Kim Yaptı?
Bu laboratuvarda kullanıcı sorusunu Agent Chat üzerinden iletti. Claude Haiku 4.5 talebin anlamını belirledi ve uygun tool’u seçti. Agent Builder seçilen tool’u çalıştırıp sonucu modele geri taşıdı; Elasticsearch ise ES|QL sorgusunu gerçek veri üzerinde çalıştırarak sayım, filtreleme ve gruplamaları hesapladı. Model son aşamada bu sonucu anlaşılır bir yönetim özetine dönüştürdü






Yorumunuzu Bırakın