# Ali Eren Ekinci — Yapay Zeka ve Veri Bilimi Araştırmacısı > Ali Eren Ekinci'nin kişisel teknik blogu. Yazar, Karadeniz Teknik Üniversitesi İstatistik yüksek lisans öğrencisi olmakla birlikte bilgisayar bilimleri ve yapay zeka alanına odaklanmaktadır; tez konusu LDA ile Türkçe ürün yorumlarının kümelenmesidir. Blog; Türkçe NLP, topic modeling (LDA, BERTopic), RAG sistemleri, vektör veritabanları (Qdrant, ChromaDB, FAISS), LangChain, LLM tabanlı uygulama geliştirme ve BIST veri analitiği üzerine Türkçe teknik içerikler sunmaktadır. İçerikler gerçek dünya NLP problemleri, pipeline geliştirme deneyimleri, hiperparametre optimizasyonu ve tokenizasyon stratejilerini kapsamaktadır. Hedef kitle: yapay zeka geliştiricileri, veri bilimciler ve merakla öğrenen herkes. > İçerikler Türkçe dilindedir. Hedef kitle: yapay zeka geliştiricileri, veri bilimciler ve bu alana ilgi gösteren tüm mühendisler. ## Sayfalar - [Hakkımda](https://www.alierenekinci.com/hakkimda/): Hikayem [vc_column_text css=”. vc_custom_1766931105864{padding-right:... - [Son Yazılar](https://www.alierenekinci.com/son-yazilar/) - [Anasayfa](https://www.alierenekinci.com/): [nectar_responsive_text inherited_font_style=”default” font_size_min=”20″ font_size_max=”44px” font_size_desktop=”2. 2vw”... ## Yazılar - [Qdrant Nedir ve Nasıl Kullanılır?](https://www.alierenekinci.com/qdrant-nedir-ve-nasil-kullanilir/): Büyük dil modelleri (LLM) tek başına güçlü araçlar olsa da gerçek uygulamalarda yalnızca eğitim verileriyle sınırlı kalırlar. “Şirketinizin belgelerinden doğru... - [NLP'de Data Preprocessing: Gelenekselden Moderne Kapsamlı Rehber](https://www.alierenekinci.com/nlpde-data-preprocessing-gelenekselden-moderne-kapsamli-rehber/): Doğal dil işleme projelerinde başarının anahtarı, metinlerin modellerin anlayabileceği bir forma dönüştürülmesinde yatar. Ham metin, yapılandırılmamış ve gürültülü bir veri... - [ChromaDB Nedir ve Nasıl Kullanılır?](https://www.alierenekinci.com/chromadb-nedir-ve-nasil-kullanilir/): Yapay zeka ve makine öğrenmesi uygulamalarının hızla yaygınlaştığı günümüzde, vektör veritabanları kritik bir altyapı bileşeni haline geldi. Bu yazıda, açık... - [LangChain Nedir? LLM Tabanlı Uygulamalar Nasıl Oluşturulur?](https://www.alierenekinci.com/langchain-nedir-llm-tabanli-uygulamalar-nasil-olusturulur/): ChatGPT’ye bir soru sorduğunuzda etkileyici cevaplar alırsınız. Peki ya şirketinizin iç dokümanlarından cevap vermesini, bir API çağırıp sonucu yorumlamasını veya... - [Merhaba dünya! - alierenekinci.com](https://www.alierenekinci.com/merhaba-dunya/): Merhaba,Ben Ali Eren. Bu blog (alierenekinci. com), Data Science, Natural Language Processing (NLP) ve metin odaklı makine öğrenmesi çalışmalarımı paylaştığım... # # Detailed Content ## Sayfalar - Published: 2025-12-28 - Modified: 2026-03-26 - URL: https://www.alierenekinci.com/hakkimda/ Hikayem Merhaba, ben Ali Eren Ekinci. Doğal Dil İşleme (NLP), veri bilimi ve makine öğrenmesi alanlarında çalışan bir bilgisayar bilimleri yüksek lisans öğrencisiyim. Akademik ve profesyonel yolculuğum boyunca özellikle metin verisi, topic modeling ve LLM tabanlı sistemler üzerine yoğunlaştım. LDA ve BERTopic başta olmak üzere, büyük ölçekli metin kümeleri üzerinde çalışarak Türkçe odaklı NLP pipeline’ları geliştirdim. Ürün yorumları, kullanıcı geri bildirimleri ve serbest metinlerden anlamlı içgörüler üretmeyi seviyorum. Şu anda yüksek lisans tez çalışmamı “Latent Dirichlet Allocation ile Ürün Yorumlarının Kümelenmesi” konusu üzerine yürütüyorum. Aynı zamanda üniversite–sanayi iş birliği kapsamında, gerçek dünya verileri üzerinde konu tutarlılığı artırımı, hiperparametre optimizasyonu ve tokenizasyon stratejileri üzerine çalışıyorum. Bu blogu; NLP ve veri bilimi üzerine öğrendiklerimi paylaşmak, Denediğim yöntemleri ve aldığım notları kalıcı hale getirmek, Teknik konuları daha sade ve anlaşılır şekilde anlatmakamacıyla oluşturdum. Burada bazen derin teknik yazılar, bazen kısa deney notları, bazen de “ben bunu denerken şurada takıldım” tarzı içerikler bulacaksın. Daha çok öğrenme sürecine odaklanan, gerçek problemlerden beslenen bir blog olmasını istiyorum. Eğer sen de NLP, makine öğrenmesi ya da veriyle uğraşıyorsan — ya da sadece merak ediyorsan — doğru yerdesin. Okuduğun için teşekkürler, keyifli keşifler Deneyimim Benimle İletişime Geç Bir proje, fikir ya da sadece merak ettiğin bir konu varsa yazabilirsin. Bu formu bitirebilmek için tarayıcınızda JavaScript'i etkinleştirin. Bu formu bitirebilmek için tarayıcınızda JavaScript'i etkinleştirin. Adı Soyadı * Adı Mesaj Yorum E-posta *Yorum veya Mesaj * Gönder - Published: 2023-06-24 - Modified: 2026-06-14 - URL: https://www.alierenekinci.com/ Gözden kaçırmış olabileceğiniz yazılar Stay up to date and never miss out. Featured Headlines Technology Business MasteryOnly the educated are freeFrom expert tips to step-by-step guides, our magazine serves as a trusted companion on your journey toward personal and professional growth. Updated Daily All Categories ## Yazılar - Published: 2026-06-14 - Modified: 2026-06-14 - URL: https://www.alierenekinci.com/qdrant-nedir-ve-nasil-kullanilir/ - Kategoriler: Büyük Dil Modelleri(LLM), Yapay Zeka Büyük dil modelleri (LLM) tek başına güçlü araçlar olsa da gerçek uygulamalarda yalnızca eğitim verileriyle sınırlı kalırlar. "Şirketinizin belgelerinden doğru cevap vermesini, milyonlarca ürün arasından semantik arama yapmasını veya kullanıcıya kişiselleştirilmiş öneri sunmasını" istediğinizde devreye giren şey bir vektör veritabanıdır. Bu yazıda, yüksek performansı ve zengin filtreleme yetenekleriyle öne çıkan Qdrant'ı baştan sona inceleyeceğiz. Vektör Veritabanı Nedir? Geleneksel veritabanları verileri tablo satırları veya JSON dokümanları olarak depolar ve tam eşleşme sorgularıyla iyi çalışır. Ancak "Bu cümleye anlamca en yakın 10 dokümanı getir" gibi bir sorguyu çözmeleri mümkün değildir. Vektör veritabanları ise verileri Embedding adı verilen yüksek boyutlu sayısal diziler olarak depolar. Bir embedding modeli (OpenAI, Sentence Transformers, vb. ) metni, görseli veya sesi sayısal bir vektöre dönüştürür. Anlamca benzer içerikler uzayda birbirine yakın vektörler üretir. Vektör veritabanları bu vektörler üzerinde Approximate Nearest Neighbor (ANN) algoritmaları kullanarak milisaniyeler içinde en yakın komşuları bulur. Qdrant Nedir? Qdrant (okunuşu: "quadrant"), Rust diliyle yazılmış açık kaynaklı bir vektör veritabanıdır. Özellikle şu alanlarda öne çıkar: Yüksek performans: Rust'ın bellek güvenliği ve düşük gecikme süresi. Zengin filtreleme: Vektör aramasını JSON payload filtreleriyle birleştirebilme. Hybrid search: Dense (yoğun) ve sparse (seyrek) vektörleri aynı anda kullanabilme. Discovery API: Pozitif ve negatif örneklere dayalı "keşif" aramaları yapabilme. Ölçeklenebilirlik: Dağıtık mimari (distributed deployment) desteği. Kurulum Python İstemcisi pip install qdrant-client Embedding üretmek için Qdrant ekibi tarafından geliştirilen ve daha hızlı/hafif olan FastEmbed kütüphanesini veya klasik Sentence Transformers'ı kurabilirsiniz: # Hızlı ve hafif alternatif (Önerilen) pip install fastembed # Klasik alternatif pip install sentence-transformers Docker ile Qdrant Sunucusu docker run -d --name qdrant -p 6333:6333 -p 6334:6334 \ -v $(pwd)/qdrant_storage:/qdrant/storage \ qdrant/qdrant Kurulum sonrası http://localhost:6333/dashboard adresinden görsel arayüze erişebilirsiniz. Temel Kullanım Koleksiyon Oluşturma Boyut Uyuşmazlığı: size parametresi, kullandığınız embedding modelinin çıktı boyutuyla tam olarak eşleşmelidir (örn. OpenAI text-embedding-3-small için 1536, all-MiniLM-L6-v2 için 384). from qdrant_client import QdrantClient from qdrant_client. models import Distance, VectorParams client = QdrantClient(host="localhost", port=6333) client. create_collection( collection_name="makaleler", vectors_config=VectorParams( size=384, # Modele göre değişir distance=Distance. COSINE # Benzerlik metriği ), ) Veri Ekleme (Upsert) from qdrant_client. models import PointStruct from fastembed import TextEmbedding # Model otomatik olarak 384 boyutlu vektör üretir model = TextEmbedding makaleler = embeddings = list(model. embed( for m in makaleler])) client. upsert( collection_name="makaleler", points=, vector=vector. tolist, payload={"baslik": m, "kategori": m} ) for m, vector in zip(makaleler, embeddings) ] ) Gelişmiş Özellikler 1. Payload Filtreleme Vektör aramasını meta veri filtreleriyle kısıtlayabilirsiniz: from qdrant_client. models import Filter, FieldCondition, MatchValue sonuclar = client. search( collection_name="makaleler", query_vector=embeddings. tolist, query_filter=Filter( must= ), limit=5 ) 2. Discovery API (Keşif Modu) "Buna benzesin ama şuna benzemesin" dediğiniz senaryolar için kullanılır: from qdrant_client. models import ContextExamplePair sonuclar = client. discover( collection_name="makaleler", target=embeddings. tolist, # Hedef vektör context=, limit=5 ) Pratik Örnek: RAG Sistemi RAG (Retrieval-Augmented Generation) süreci şu şekilde işler: graph TD A --> B B --> C D --> E E --> F C -. -> F F --> G G --> H D --> H H --> I RAG Pipeline Kodu from typing import List, Dict from qdrant_client import QdrantClient from fastembed import TextEmbedding from openai import OpenAI qdrant = QdrantClient(host="localhost", port=6333) embed_model = TextEmbedding openai_client = OpenAI def rag_query(soru: str) -> str: # 1. Soruyu vektöre çevir sorgu_vektor = list(embed_model. embed). tolist # 2. Qdrant'tan ilgili bağlamı getir search_results = qdrant. search( collection_name="bilgi_tabani", query_vector=sorgu_vektor, limit=3 ) baglam = "\n". join( for res in search_results]) # 3. LLM ile cevap üret response = openai_client. chat. completions. create( model="gpt-4o-mini", messages= ) return response. choices. message. content Qdrant vs Diğerleri ÖzellikQdrantChromaDBPineconeWeaviateDilRustPythonKapalı KaynakGoHızÇok YüksekOrtaYüksekYüksekHybrid SearchVar (Native)KısıtlıVarVarDiscovery APIVarYokYokYokDeploymentSelf-hosted/CloudSelf-hosted/CloudYalnızca CloudSelf-hosted/Cloud Sonuç Qdrant, özellikle performans ve esnek filtreleme ihtiyacı olan production sistemleri için idealdir. Rust tabanlı mimarisi sayesinde düşük gecikme süreleri sunarken, Discovery API gibi yenilikçi özellikleriyle arama deneyimini bir üst seviyeye taşır. Başlangıç için FastEmbed ile in-memory modda denemeler yapabilir, ardından Docker ile yerel sunucunuza geçiş yapabilirsiniz. - Published: 2026-01-10 - Modified: 2026-04-24 - URL: https://www.alierenekinci.com/nlpde-data-preprocessing-gelenekselden-moderne-kapsamli-rehber/ - Kategoriler: Data preprocessing Doğal dil işleme projelerinde başarının anahtarı, metinlerin modellerin anlayabileceği bir forma dönüştürülmesinde yatar. Ham metin, yapılandırılmamış ve gürültülü bir veri türüdür — noktalama işaretleri, yazım hataları, emojiler, kısaltmalar ve dile özgü karmaşıklıklar içerir. NLP preprocessing, bu kaotik metin verisini anlamlı ve işlenebilir bir formata dönüştürme sürecidir. Bu yazıda, klasik NLP preprocessing tekniklerinden modern transformer tabanlı yaklaşımlara kadar geniş bir yelpazede metin ön işleme adımlarını inceleyeceğiz. Preprocessing Neden Bu Kadar Kritik? NLP'de preprocessing'in önemi, seçilen model mimarisine göre değişir. Geleneksel makine öğrenimi modelleri (Naive Bayes, SVM, LDA) için kapsamlı preprocessing hayati önem taşırken, transformer tabanlı modeller minimal preprocessing ile çalışabilir. Ancak her iki durumda da veri kalitesi doğrudan model performansını etkiler. Preprocessing'in temel amaçları şunlardır: gürültü azaltma yoluyla modelin gerçek sinyallere odaklanmasını sağlamak, vokabüler boyutunu kontrol altına alarak hesaplama maliyetini düşürmek, tutarlılık sağlayarak aynı kavramların farklı yazımlarını birleştirmek ve son olarak domain'e özgü adaptasyon ile modeli spesifik kullanım senaryolarına uyarlamak. Klasik NLP Preprocessing Pipeline 1. Metin Temizleme (Text Cleaning) Her NLP projesinin ilk adımı, metinden gürültüyü temizlemektir. Bu adım veri kaynağına göre özelleştirilmelidir. HTML ve URL Temizliği: Web scraping ile elde edilen veriler genellikle HTML tagları ve URL'ler içerir. Bu yapılar metin analizinde anlamsız gürültü oluşturur. import re from bs4 import BeautifulSoup def clean_html_and_urls(text): # HTML tag'lerini temizle text = BeautifulSoup(text, "html. parser"). get_text # URL'leri kaldır text = re. sub(r'https? ://\S+|www\. \S+', '', text) # Email adreslerini kaldır text = re. sub(r'\S+@\S+', '', text) return text. strip Özel Karakter ve Noktalama İşaretleri: Noktalama işaretlerinin tamamen kaldırılması her zaman doğru değildir. Sentiment analysis'de "! ! ! " veya "? ? ? " gibi tekrarlar duygu yoğunluğunu gösterebilir. Karar, görev tipine göre verilmelidir. import string def normalize_punctuation(text, remove_all=False): if remove_all: return text. translate(str. maketrans('', '', string. punctuation)) # Tekrarlayan noktalama işaretlerini normalize et text = re. sub(r'{2,}', r'\1', text) # Fazla boşlukları temizle text = re. sub(r'\s+', ' ', text) return text. strip Emoji ve Emoticon İşleme: Sosyal medya verilerinde emojiler önemli semantik bilgi taşır. Bu nedenle silmek yerine metne dönüştürmek daha iyi bir strateji olabilir. import emoji def process_emojis(text, strategy='demojize'): if strategy == 'demojize': # Emojiyi açıklamasına dönüştür: -> :smiling_face: return emoji. demojize(text, language='tr') elif strategy == 'remove': return emoji. replace_emoji(text, replace='') return text # Örnek kullanım text = "Bu ürün harika! " print(process_emojis(text)) # "Bu ürün harika! :gülümseyen_yüz::yukarı_bakan_başparmak:" 2. Metin Normalizasyonu Küçük Harfe Dönüştürme (Lowercasing) Büyük/küçük harf tutarsızlıklarını gidermek için standart bir adımdır. Ancak bazı durumlarda (NER, kısaltmalar) bilgi kaybına yol açabilir. def smart_lowercase(text, preserve_acronyms=True): if preserve_acronyms: # Kısaltmaları koru (2+ büyük harf yan yana) words = text. split processed = for word in words: if not (len(word) >= 2 and word. isupper): word = word. lower processed. append(word) return ' '. join(processed) return text. lower # Örnek text = "NLP ve AI teknolojileri hızla gelişiyor" print(smart_lowercase(text)) # "NLP ve AI teknolojileri hızla gelişiyor" Türkçe Karakter Normalizasyonu Türkçe metinlerde sıkça karşılaşılan bir sorun, Türkçe karakterlerin ASCII eşdeğerleriyle karıştırılmasıdır. def normalize_turkish_chars(text, to_ascii=False): turkish_map = { 'ı': 'i', 'İ': 'I', 'ğ': 'g', 'Ğ': 'G', 'ü': 'u', 'Ü': 'U', 'ş': 's', 'Ş': 'S', 'ö': 'o', 'Ö': 'O', 'ç': 'c', 'Ç': 'C' } if to_ascii: for tr_char, ascii_char in turkish_map. items: text = text. replace(tr_char, ascii_char) return text Sayı İşleme Sayıların nasıl işleneceği göreve bağlıdır. Topic modeling için genellikle kaldırılırken, NER veya bilgi çıkarımında korunabilir. def process_numbers(text, strategy='remove'): if strategy == 'remove': return re. sub(r'\d+', '', text) elif strategy == 'normalize': return re. sub(r'\d+', '', text) elif strategy == 'keep': return text return text 3. Tokenization Tokenization, metni daha küçük birimlere (token) ayırma işlemidir. Bu adım, preprocessing pipeline'ının en kritik kararlarından birini içerir. Kelime Tabanlı Tokenization: En basit yaklaşım boşluklardan ayırmaktır, ancak noktalama ve özel durumlar için yetersiz kalır. import nltk from nltk. tokenize import word_tokenize, sent_tokenize # NLTK tokenizer (dil desteği sınırlı) tokens = word_tokenize("Bu bir örnek cümledir. ", language='turkish') # Regex tabanlı tokenizer def regex_tokenize(text): # Kelime ve noktalama işaretlerini ayır pattern = r"\w+|" return re. findall(pattern, text, re. UNICODE) Türkçe İçin Gelişmiş Tokenization: Türkçe gibi eklemeli (agglutinative) diller için özel tokenizer'lar gerekir. Zemberek ve TurkishNLP bu alanda... - Published: 2026-01-09 - Modified: 2026-06-14 - URL: https://www.alierenekinci.com/chromadb-nedir-ve-nasil-kullanilir/ - Kategoriler: Büyük Dil Modelleri(LLM) Yapay zeka ve makine öğrenmesi uygulamalarının hızla yaygınlaştığı günümüzde, vektör veritabanları kritik bir altyapı bileşeni haline geldi. Bu yazıda, açık kaynaklı ve kullanımı kolay bir vektör veritabanı olan ChromaDB'yi detaylı şekilde inceleyeceğiz. Vektör Veritabanı Nedir? Geleneksel veritabanları, yapılandırılmış verileri tablolar ve satırlar halinde depolar. Ancak metin, görsel veya ses gibi yapılandırılmamış verileri anlamlandırmak için bu yaklaşım yetersiz kalır. İşte bu noktada vektör veritabanları devreye girer. Vektör veritabanları, verileri yüksek boyutlu sayısal diziler (embedding) olarak depolar. Bu embeddingler, verilerin anlamsal temsillerini içerir ve benzerlik aramalarını son derece hızlı hale getirir. Örneğin "kedi" ve "köpek" kelimeleri vektör uzayında birbirine yakın konumlanırken, "araba" kelimesi bunlardan uzakta yer alır. ChromaDB'ye Giriş ChromaDB, özellikle LLM (Large Language Model) uygulamaları için tasarlanmış açık kaynaklı bir vektör veritabanıdır. 2022 yılında piyasaya sürülen ChromaDB, basitliği ve hızlı entegrasyonu sayesinde kısa sürede popülerlik kazandı. Temel Özellikler ChromaDB'nin öne çıkan özellikleri şunlardır: hafif ve hızlı kurulum, yerleşik embedding desteği, kalıcı ve geçici depolama seçenekleri, Python ve JavaScript SDK'ları, LangChain ve LlamaIndex ile kolay entegrasyon, ve Apache 2. 0 lisansı altında tamamen ücretsiz kullanım. Kurulum Python ile Kurulum ChromaDB'yi pip ile kolayca kurabilirsiniz: pip install chromadb Docker ile Kurulum Docker kullanarak ChromaDB'yi sunucu modunda çalıştırabilirsiniz. Bu yaklaşım, özellikle production ortamları ve birden fazla istemciden erişim için önerilir. Benim bilgisayarımda 8000 portunda farklı bir servis çalıştığı için ben hostu 6330 olarak güncelledim. Temel Kurulum: docker pull chromadb/chroma docker run -d -p 6330:8000 \ -e CHROMA_SERVER_AUTHN_PROVIDER="" \ chromadb/chroma Kalıcı Depolama ile Kurulum (Önerilen): Verilerinizin container yeniden başlatıldığında kaybolmaması için volume kullanın: docker run -d -p 6330:8000 \ -e CHROMA_SERVER_AUTHN_PROVIDER="" \ -v $(pwd)/chroma-data:/chroma/chroma \ chromadb/chroma Windows için: docker run -d -p 6330:8000 ^ -e CHROMA_SERVER_AUTHN_PROVIDER="" ^ -v %cd%/chroma-data:/chroma/chroma ^ chromadb/chroma Docker Compose ile Kurulum: Daha yönetilebilir bir yapı için docker-compose. yml oluşturun: version: '3. 8' services: chromadb: image: chromadb/chroma container_name: chromadb ports: - "6330:8000" environment: - CHROMA_SERVER_AUTHN_PROVIDER= volumes: - . /chroma-data:/chroma/chroma restart: unless-stopped Başlatmak için: docker-compose up -d Önemli Notlar: CHROMA_SERVER_AUTHN_PROVIDER="" parametresi, authentication olmadan bağlanmayı sağlar ChromaDB container içinde 8000 portunda çalışır, bunu dışarıya 6330 olarak publish ediyoruz Temel Kullanım İstemci Oluşturma ChromaDB'yi kullanmaya başlamak için önce bir istemci oluşturmanız gerekir: import chromadb # Geçici (in-memory) istemci client = chromadb. Client # Kalıcı istemci (veriler diske kaydedilir) client = chromadb. PersistentClient(path="/path/to/persist") # HTTP istemci (Docker üzerinden sunucu modunda çalışırken) client = chromadb. HttpClient(host="localhost", port=6330) Koleksiyon Oluşturma Koleksiyonlar, ChromaDB'de verilerin organize edildiği temel birimlerdir: # Yeni koleksiyon oluştur collection = client. create_collection(name="makaleler") # Varolan koleksiyonu al veya yoksa oluştur collection = client. get_or_create_collection(name="makaleler") # Koleksiyonu sil client. delete_collection(name="makaleler") Veri Ekleme Koleksiyona veri eklemek oldukça basittir: collection. add( documents=, metadatas=, ids= ) ChromaDB, varsayılan olarak Sentence Transformers modelini kullanarak metinleri otomatik olarak embedding'e dönüştürür. İsterseniz kendi embedding'lerinizi de sağlayabilirsiniz: collection. add( embeddings=, ], metadatas=, ids= ) Sorgulama ChromaDB'nin en güçlü yanı semantik arama yapabilmesidir: # Metin tabanlı sorgu results = collection. query( query_texts=, n_results=2 ) print(results) # Çıktı: En benzer 2 doküman ve meta verileri Metadata filtreleme ile sorguları daraltabilirsiniz: results = collection. query( query_texts=, n_results=5, where={"yil": {"$gte": 2023}}, # 2023 ve sonrası where_document={"$contains": "öğrenme"} # "öğrenme" içeren ) Veri Güncelleme ve Silme # Güncelleme collection. update( ids=, documents=, metadatas= ) # Silme collection. delete(ids=) # Koşullu silme collection. delete(where={"yil": {"$lt": 2020}}) Özel Embedding Modelleri Kullanma ChromaDB, farklı embedding modelleriyle çalışabilir: from chromadb. utils import embedding_functions # OpenAI embeddings openai_ef = embedding_functions. OpenAIEmbeddingFunction( api_key="your-api-key", model_name="text-embedding-ada-002" ) # HuggingFace modelleri huggingface_ef = embedding_functions. HuggingFaceEmbeddingFunction( api_key="your-api-key", model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" ) # Koleksiyonu özel embedding fonksiyonu ile oluştur collection = client. create_collection( name="turkce_makaleler", embedding_function=huggingface_ef ) Docker ile Tam Uygulama Örneği Docker üzerinde ChromaDB çalıştırıp Python'dan bağlanmanın tam bir örneği: 1. Docker Container'ı Başlatın: docker run -d -p 6330:8000 \ -e CHROMA_SERVER_AUTHN_PROVIDER="" \ -v $(pwd)/chroma-data:/chroma/chroma \ --name chromadb \ chromadb/chroma 2. Container'ın Çalıştığını Kontrol Edin: docker ps # CONTAINER ID IMAGE PORTS NAMES # e1b107c41199 chromadb/chroma 0. 0. 0. 0:6330->8000/tcp chromadb 3. Python'dan Bağlanın ve Kullanın: import chromadb # Docker üzerindeki ChromaDB'ye bağlan client = chromadb. HttpClient(host="localhost", port=6330) # Koleksiyon oluştur collection = client. get_or_create_collection(name="makaleler") # Veri ekle collection. add( documents=, metadatas=, ids= ) print(f"Collection'a {collection. count} belge... - Published: 2025-12-29 - Modified: 2026-04-24 - URL: https://www.alierenekinci.com/langchain-nedir-llm-tabanli-uygulamalar-nasil-olusturulur/ - Kategoriler: Büyük Dil Modelleri(LLM) ChatGPT'ye bir soru sorduğunuzda etkileyici cevaplar alırsınız. Peki ya şirketinizin iç dokümanlarından cevap vermesini, bir API çağırıp sonucu yorumlamasını veya geçmiş konuşmalarınızı hatırlamasını isterseniz? İşte tam bu noktada LangChain devreye giriyor. Büyük Dil Modelleri (LLM) tek başına oldukça güçlü. Ancak gerçek dünya uygulamalarında genellikle şunlara ihtiyaç duyuyoruz: Dış veri entegrasyonu: Dokümanlar, veritabanları, API'ler Çok adımlı iş akışları: Soru → arama → özet → doğrulama → cevap Bellek ve durum yönetimi: Sohbet geçmişi, kullanıcı profili Araç kullanımı: Tool calling, function calling LangChain, bu ihtiyaçları "lego parçaları" gibi birleştirerek LLM tabanlı uygulamalar geliştirmeyi kolaylaştıran bir Python (ve JavaScript) çerçevesidir. Not: LangChain ekosistemi hızla gelişiyor. Aşağıdaki örnekler temel mantığı öğretmeyi hedefliyor. Kullandığınız sürüme göre bazı import yolları veya sınıf isimleri farklılık gösterebilir. LangChain Neyi Çözer? LangChain'i anlamanın en iyi yolu şu perspektiften bakmak: LLM'i bir ürünün parçası haline getirmek. Tek başına bir LLM'e "Türkiye'nin başkenti neresi? " diye sorduğunuzda doğru cevap alırsınız. Peki ya şunu sorsanız: "Şirketimizin 2024 Q3 satış raporundaki en düşük performanslı ürün hangisi? " İşte burada LLM tek başına yetersiz kalır çünkü bu veriye erişimi yok. Tipik Kullanım Senaryoları SenaryoAçıklamaKullanılan BileşenlerRAG AsistanıŞirket dokümanlarından cevap veren chatbotLoader, Splitter, Embedding, Retriever, ChainTool Agent"Siparişi iptal et, mail gönder" gibi aksiyonlarTools, Agent, MemoryPipeline İşleri"Veriyi çek, analiz et, raporla"Chain, Output ParserConversational AIBağlam hatırlayan sohbet botuMemory, Chain, Prompt Temel Kavramlar LangChain'in yapı taşlarını tek tek inceleyelim. Her kavramı önce açıklayacak, sonra kod örneğiyle pekiştireceğiz. 1. Prompt (İstem) LLM'e ne istediğinizi söylemenin en etkili yolu iyi tasarlanmış bir prompt'tur. LangChain'de prompt'lar şablon (template) olarak tutulur ve dinamik değişkenlerle zenginleştirilir. Neden Şablon Kullanmalı? Prompt'u doğrudan kod içine yazmak yerine şablon kullanmanın avantajları: Yeniden kullanılabilirlik: Aynı şablonu farklı değişkenlerle çağırabilirsiniz Bakım kolaylığı: Prompt'u değiştirmek için kodu değiştirmeniz gerekmez A/B testi: Farklı prompt versiyonlarını kolayca test edebilirsiniz Versiyon kontrolü: Prompt'ları ayrı dosyalarda tutup Git ile takip edebilirsiniz Prompt Bileşenleri Bir ChatPromptTemplate tipik olarak şu mesaj türlerinden oluşur: ┌─────────────────────────────────────────────────────────┐ │ SYSTEM: Modelin kişiliği, kuralları, sınırları │ │ "Sen yardımcı bir asistansın. Kısa ve öz cevap ver. " │ ├─────────────────────────────────────────────────────────┤ │ USER: Kullanıcının sorusu veya isteği │ │ "Python'da liste nasıl oluşturulur? " │ ├─────────────────────────────────────────────────────────┤ │ ASSISTANT: (Opsiyonel) Örnek cevap - few-shot için │ │ "numbers = " │ └─────────────────────────────────────────────────────────┘ Kod Örneği from langchain_core. prompts import ChatPromptTemplate, MessagesPlaceholder # Basit şablon simple_prompt = ChatPromptTemplate. from_template( "Şu konuyu 3 cümlede açıkla: {topic}" ) # Çok mesajlı şablon chat_prompt = ChatPromptTemplate. from_messages # Değişkenleri doldur messages = chat_prompt. format_messages( role="tecrübeli bir yazılım mühendisi", language="Türkçe", question="Microservices mimarisi nedir? " ) # Sonuç: LLM'e gönderilecek mesaj listesi print(messages) # Few-Shot Prompting Modele örnek vererek istediğiniz çıktı formatını gösterebilirsiniz: few_shot_prompt = ChatPromptTemplate. from_messages 2. Model (LLM / ChatModel) LangChain, farklı model sağlayıcılarını ortak bir arayüzle kullanmanızı sağlar. Bu soyutlama katmanı sayesinde: Model değiştirirken kodunuz kırılmaz Geliştirmede ucuz model, production'da güçlü model kullanabilirsiniz Farklı modelleri kolayca karşılaştırabilirsiniz Desteklenen Sağlayıcılar ┌────────────────┬──────────────────────┬─────────────────────┐ │ Sağlayıcı │ Kurulum │ Örnek Model │ ├────────────────┼──────────────────────┼─────────────────────┤ │ OpenAI │ langchain-openai │ gpt-4o, gpt-4o-mini │ │ Anthropic │ langchain-anthropic │ claude-sonnet │ │ Google │ langchain-google │ gemini-pro │ │ Ollama (Yerel) │ langchain-ollama │ llama3. 2, mistral │ │ Hugging Face │ langchain-huggingface│ Llama, Falcon │ └────────────────┴──────────────────────┴─────────────────────┘ Kod Örneği from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic from langchain_ollama import ChatOllama # OpenAI openai_llm = ChatOpenAI( model="gpt-4o-mini", temperature=0. 7, # Yaratıcılık seviyesi (0-1) max_tokens=1000, # Maksimum çıktı uzunluğu timeout=30 # Zaman aşımı (saniye) ) # Anthropic - aynı arayüz anthropic_llm = ChatAnthropic( model="claude-sonnet-4-20250514", temperature=0. 7 ) # Yerel model (Ollama) - API maliyeti yok local_llm = ChatOllama( model="llama3. 2", base_url="http://localhost:11434" ) # Hepsi aynı şekilde çağrılır response = openai_llm. invoke("Merhaba, nasılsın? ") print(response. content) Temperature Nedir? Temperature parametresi modelin "yaratıcılık" seviyesini kontrol eder: temperature=0: Deterministik, her seferinde aynı cevap. Kod üretimi, analiz için ideal. temperature=0. 7: Dengeli. Genel kullanım için uygun. temperature=1. 0: Yüksek çeşitlilik. Yaratıcı yazarlık, beyin fırtınası için. 3. Chain (Zincir) ve LCEL Zincir, birden fazla adımı sırayla çalıştıran bir iş akışıdır. Modern LangChain'de zincirler LCEL (LangChain Expression Language) ile oluşturulur. LCEL Nedir? LCEL, LangChain bileşenlerini | (pipe) operatörüyle birleştirmenizi sağlar. Unix pipe'larına benzer şekilde, bir adımın çıktısı sonraki... - Published: 2025-12-28 - Modified: 2026-04-24 - URL: https://www.alierenekinci.com/merhaba-dunya/ - Kategoriler: Genel Merhaba,Ben Ali Eren. Bu blog (alierenekinci. com), Data Science, Natural Language Processing (NLP) ve metin odaklı makine öğrenmesi çalışmalarımı paylaştığım kişisel bir alan olacak. Bu yazı, klasik bir “Hello World” gibi görünebilir; fakat benim için bundan biraz daha fazlası. Burada yalnızca sonuçları değil, nasıl düşündüğümü, neden belirli yöntemleri seçtiğimi ve hangi problemlerle boğuştuğumu de paylaşmayı hedefliyorum. Bu Blogda Neler Olacak? Bu blogu oluştururken amacım;teoriyi, pratiği ve gerçek dünya problemlerini aynı yerde buluşturmak. Planladığım başlıklardan bazıları: Topic Modeling LDA, BERTopic, coherence metrikleri Gerçek veri setleri üzerinde karşılaştırmalar Metin Ön İşleme Türkçe NLP’de karşılaşılan problemler Tokenization, stemming, lemmatization yaklaşımları Model Optimizasyonu Hiperparametre aramaları Optuna, swarm algoritmaları, deney tasarımı Deney Günlükleri “Bu neden çalışmadı? ” yazıları Beklenen ama gelmeyen performans artışları Modern NLP & LLM Ekosistemi Transformer tabanlı modeller LLM’lerin klasik NLP ile kesiştiği noktalar Neden Kişisel Bir Blog? Not defterleri kayboluyor, projeler bitiyor ama düşünme biçimi kalıyor. Bu blog: CV’de tek satıra sığmayan deneyimleri görünür kılmakiçin var. Kendi öğrenme sürecimi daha kalıcı hale getirmek, Benzer yollardan geçen insanlarla bilgi paylaşmak, > İletişim: alierenekinci.com | Mail: hello@alierenekinci.com | Tüm içerikler Ali Eren Ekinci'ye aittir.