
Merhaba! Bu blog yazısında, LangChain ve Qdrant kullanarak nasıl bir vektör veritabanı oluşturabileceğinizi ve bu sistemi soru-cevap uygulamaları gibi senaryolarda nasıl kullanabileceğinizi adım adım açıklayacağım. docker-compose.yaml dosyası ile bir qdrant konteyner ayağa kaldıracağız ve langchain ile vektör veri tabanı oluşturup, içine soru cevap dokümanı indeksleyip sorgulayacağız.
Neden LangChain ve Qdrant?
LangChain, doğal dil işleme (NLP) projelerinde dil modellerini ve verileri bir araya getirmek için güçlü bir çerçeve sunar. En popüler LLM orkestrasyon kütüphanesindendir. Qdrant ise yüksek performanslı bir vektör veritabanıdır ve özellikle büyük veri kümeleriyle yapılan benzerlik aramaları için optimize edilmiştir. Bu ikiliyi birleştirerek, belgelerimizi vektörlere dönüştürüp hızlı ve etkili bir şekilde sorgulayabiliriz.
Bu yazıda, bir “Data Engineering Bootcamp” ile ilgili soru-cevap verilerini Qdrant’a yükleyip, LangChain ile sorgular yapacağız. Örneğin: “Data Engineering Bootcamp’te Apache Airflow kaç hafta öğretiliyor?” gibi bir soruya yanıt arayacağız.
Adım 1: Qdrant’ı Docker ile Kurma
İlk olarak, Qdrant’ı yerel makinemizde çalıştırabilmek için bir Docker konteyneri oluşturmamız gerekiyor. Aşağıdaki docker-compose.yaml dosyasını kullanabilirsiniz:
services: qdrant: image: qdrant/qdrant ports: - 6334:6334 - 6333:6333 volumes: - "./qdrant_storage:/qdrant/storage:z"
- image: Qdrant’ın resmi Docker imajını kullanıyoruz.
- ports: Qdrant, REST API için 6333 numaralı portu ve gRPC için 6334 numaralı portu kullanıyor. Bu portları yerel makinemize açıyoruz.
- volumes: Veritabanındaki veriler kalıcı olsun diye qdrant_storage klasörünü konteynerle eşleştiriyoruz.
Bu dosyayı bir dizine kaydedin (örneğin qdrant-docker klasörüne) ve terminalde şu komutu çalıştırın:
docker-compose up -d
Qdrant şimdi http://localhost:6333 adresinde çalışıyor!
Adım 2: Gerekli Kütüphaneleri ve API Anahtarını Ayarlama
Şimdi Python ortamımızda çalışmaya başlayabiliriz. Aşağıdaki kod, gerekli kütüphaneleri kurmamızı ve OpenAI API anahtarını ortam değişkeni olarak ayarlamamızı sağlıyor:
import os import getpass def _set_env(var: str): if not os.environ.get(var): os.environ[var] = getpass.getpass(f"{var}: ") _set_env("OPENAI_API_KEY")
Bu kod, eğer OPENAI_API_KEY ortamda tanımlı değilse, sizden güvenli bir şekilde anahtarı girmenizi ister. OpenAI’nin text-embedding-3-large modelini kullanarak metinlerimizi vektörlere çevireceğiz.
Adım 3: Belgeleri Hazırlama ve Vektörlere Dönüştürme
Elimde bir de_soru-cevap.txt dosyası var ve bu dosyada “—” ile ayrılmış soru-cevap çiftleri bulunuyor. Bu dosyayı okuyup Document nesnelerine çevirelim:
from langchain_core.documents import Document from langchain_openai import OpenAIEmbeddings # OpenAI embeddings modelini tanımla embeddings = OpenAIEmbeddings(model="text-embedding-3-large") # Dosyayı oku ve "---" ile ayır def read_and_split_file(file_path): with open(file_path, 'r') as file: content = file.read() split_content = [line.strip() for line in content.split('---') if line.strip()] return split_content file_path = '/home/train/fovi-longa-chat-be/ingest/de_soru-cevap.txt' result_list = read_and_split_file(file_path) # Her bir parçayı Document nesnesine çevir de_soru_cevap_docs = [Document(page_content=soru, metadata={"type": "soru-cevap"}) for soru in result_list]
Bu adımda, metin dosyamızı okuyup her bir soru-cevap çiftini LangChain’in Document formatına dönüştürüyoruz. metadata ile belgelerimize ek bilgi ekleyebiliriz; burada sadece “soru-cevap” tipini belirttik.
Adım 4: Qdrant ile Vektör Veritabanı Oluşturma
Şimdi belgelerimizi Qdrant’a yükleyelim ve bir vektör veritabanı oluşturarak sorgulanabilir hale getirelim:
from langchain_qdrant import QdrantVectorStore # Qdrant URL'si qdrant_url = "http://localhost:6333" # Belgeleri Qdrant'a yükle qdrant = QdrantVectorStore.from_documents( de_soru_cevap_docs, embeddings, url=qdrant_url, prefer_grpc=True, collection_name="de-soru-cevap", )
from_documents: Belgeleri vektörlere çevirip Qdrant’a yükler.
embeddings: OpenAI’nin embedding modelini kullanıyoruz.
prefer_grpc: Daha hızlı iletişim için gRPC protokolünü tercih ediyoruz.
collection_name: Veritabanında bu isimle bir koleksiyon oluşturulacak.
Adım 5: Sorgulama ve Sonuç Alma
Vektör veritabanımız hazır olduğuna göre, artık sorgular yapabiliriz. Bunun için bir retriever tanımlayıp bir soru soralım:
retriever = qdrant.as_retriever(search_type="mmr", search_kwargs={"k": 3}) result = retriever.invoke("Data engineering bootcamp airflow kaç hafta?")
[ Document(metadata={'type': 'soru-cevap', '_id': '13328540-e04e-43f7-81ea-c1ce48c51f12', '_collection_name': 'de-soru-cevap'}, page_content='**Soru:** Data Engineering Bootcamp programı ne kadar sürer? \n**Cevap:** Data Engineering Bootcamp programı 18 hafta sürer ve 3 ana safhadan oluşur: Ön Hazırlık, Canlı Dersler ve Bitirme Projesi.'), Document(metadata={'type': 'soru-cevap', '_id': '785e788a-3231-4048-b874-01da20afbabb', '_collection_name': 'de-soru-cevap'}, page_content='**Soru:** Bootcamp programında hangi proje yönetimi araçları kullanılır? \n**Cevap:** Programda Apache Airflow gibi proje yönetimi ve iş akışı otomasyon araçları kullanılır.'), ... ]
Burada “Airflow kaç hafta?” sorusu tam olarak yanıtlanmasa da, programın 18 hafta sürdüğünü ve Apache Airflow’un kullanıldığını öğreniyoruz. Daha kesin bir cevap için veri setimizi genişletebiliriz.
Sonuç
LangChain ve Qdrant ile vektör tabanlı bir soru-cevap sistemi kurmak oldukça kolay ve etkili. Bu rehberde, Docker ile Qdrant’ı kurmayı, belgeleri vektörlere çevirmeyi ve sorgular yapmayı öğrendik. İleride bu sistemi daha karmaşık veri setleriyle zenginleştirebilir veya bir sohbet botuna entegre edebilirsiniz.
Siz de bu teknolojileri uygulamalı olarak öğrenmek isterseniz VBO MLOps Bootcamp‘e katılmanızı öneririm. Bir sonraki yazıda görüşmek üzere. Hoşça kalın…
Kapak Resmi: Photo by Patrick Tomasso on Unsplash