Yapay Zeka Sohbetlerini Kaydetmek İçin Bir MCP Sunucusu Kurdum: İşte Öğrendiklerim
Yapay zeka modelleriyle olan etkileşimlerimiz, günlük hayatımızın giderek daha ayrılmaz bir parçası haline geliyor. Sanal asistanlardan müşteri hizmetleri botlarına, karmaşık veri analiz araçlarından yaratıcı içerik üretim sistemlerine kadar, AI sohbetleri her yerde karşımıza çıkıyor. Ancak bu etkileşimlerin büyük bir kısmı, anlık ve geçici kalıyor; değerli bilgiler, kullanıcı deneyimleri ve model performansına dair kritik veriler genellikle kaybolup gidiyor. İşte tam da bu noktada, yapay zeka sohbetlerini kapsamlı bir şekilde kaydetmek ve analiz etmek için bir arayışa girdim. Bu makalede, bu ihtiyacı karşılamak üzere bir MCP (Minecraft Proxy) sunucusu kurma deneyimimi, karşılaştığım zorlukları ve bu süreçten edindiğim paha biçilmez dersleri sizinle paylaşacağım. Bu proje, hem teknik becerilerimi geliştirmemi sağladı hem de yapay zeka etkileşimlerinin derinliklerine inmem için yeni kapılar açtı.
Neden Yapay Zeka Sohbetlerini Kaydetmeliyiz? Problemin Tanımı
Günümüzde yapay zeka (AI) sistemleriyle kurduğumuz iletişim, birçok alanda devrim niteliğinde değişimlere yol açıyor. Müşteri destek botlarından kişisel asistanlara, eğitim platformlarından sağlık danışmanlığına kadar geniş bir yelpazede AI ile etkileşim halindeyiz. Ancak bu etkileşimlerin büyük bir çoğunluğu, tıpkı bir rüya gibi, uyandığımızda hatırlayamadığımız veya detaylarını kaçırdığımız anlık deneyimler olarak kalıyor. Bu durum, hem kullanıcılar hem de AI geliştiricileri için önemli bir veri kaybı ve öğrenme fırsatı eksikliği anlamına geliyor. Yapay zeka modellerinin “hafızasızlığı” olarak adlandırabileceğimiz bu durum, her yeni etkileşimin sıfırdan başlamasına neden oluyor ve modelin geçmiş deneyimlerinden öğrenmesini zorlaştırıyor. Kullanıcılar, daha önce verdikleri bilgileri tekrar etmek zorunda kalabilirken, geliştiriciler de modelin hangi sorulara nasıl yanıt verdiğini, hangi noktalarda başarısız olduğunu veya hangi konuların daha fazla ilgi çektiğini anlamakta güçlük çekiyorlar.
Bu problem, özellikle AI modelinin performansını artırmak, kullanıcı deneyimini optimize etmek ve olası hataları tespit etmek isteyen geliştiriciler için hayati önem taşıyor. Örneğin, bir e-ticaret botu düşünün. Müşteriler, ürünler hakkında sorular soruyor, siparişlerini takip ediyor veya iade süreçleri hakkında bilgi alıyor. Bu sohbetler kaydedilmediğinde, botun en sık hangi sorulara yanlış yanıt verdiği, hangi ürün kategorilerinde bilgi eksikliği olduğu veya kullanıcıların genel olarak botla etkileşiminden memnun olup olmadığı gibi kritik veriler gözden kaçırılabiliyor. Bu durum, modelin sürekli iyileştirilmesini engelleyerek hem maliyetleri artırıyor hem de potansiyel müşteri kaybına yol açabiliyor. İşte bu boşluğu doldurmak ve kapsamlı bir etkileşim günlüğü oluşturarak yapay zeka sistemlerinden maksimum faydayı sağlamak amacıyla, bir proxy (vekil sunucu) tabanlı loglama sistemine yöneldim. Bu sistem, AI ile kullanıcı arasındaki tüm iletişimi yakalayarak, gelecekteki analizler ve model geliştirmeleri için değerli bir veri hazinesi oluşturmayı hedefliyor. Bu sayede, sadece anlık etkileşimleri değil, zaman içindeki eğilimleri, kullanıcı davranış kalıplarını ve modelin gelişimini de izleyebilme imkanına sahip oluyoruz.
MCP Sunucusu Nedir ve Neden Bu Amaçla Kullanılır?
MCP, genellikle Minecraft Proxy’nin kısaltması olarak bilinse de, bu projede “Middleman Communication Proxy” (Aracı İletişim Vekil Sunucusu) olarak kendi tanımımı oluşturdum. Temelde bir proxy sunucusu, bir istemci ile hedef sunucu arasına oturan ve tüm ağ trafiğini kendi üzerinden geçiren bir aracı görevi görür. Bu mimari, genellikle ağ güvenliği, performans iyileştirme veya trafik izleme gibi amaçlar için kullanılır. Benim senaryomda ise, yapay zeka sohbetlerini kaydetmek amacıyla bu temel proxy mantığını adaptasyon geçirdim. Bir proxy’nin temel avantajı, istemci ve hedef sunucu arasında gerçekleşen iletişime müdahale etme, bu iletişimi loglama (günlüğe kaydetme), değiştirme veya yönlendirme yeteneğidir. AI sohbetleri bağlamında bu, kullanıcıdan AI modeline giden her isteği (prompt) ve AI modelinden kullanıcıya dönen her yanıtı (response) yakalamak ve kalıcı olarak depolamak anlamına gelir.
Peki, neden doğrudan AI API’larından loglama yapmak yerine bir proxy sunucusu kullanmayı tercih ettim? Birincisi, esneklik. Farklı yapay zeka servisleri (örneğin, OpenAI, Google Gemini, kendi geliştirdiğimiz modeller) farklı API arayüzlerine sahip olabilir. Bir proxy, tüm bu farklı servisleri tek bir merkezden yönetmemizi ve standart bir formatta loglamamızı sağlar. Bu, gelecekte farklı AI modellerini entegre etmek istediğimizde büyük bir kolaylık sunar. İkincisi, veri işleme ve zenginleştirme yeteneği. Proxy üzerinden geçen veriyi kaydetmeden önce üzerinde çeşitli işlemler yapabiliriz. Örneğin, hassas kişisel bilgileri maskeleyebilir, belirli anahtar kelimeleri etiketleyebilir veya sohbetin bağlamını zenginleştirecek ek meta veriler ekleyebiliriz. Üçüncüsü, merkezi kontrol ve gözlemlenebilirlik. Tüm AI etkileşimleri tek bir noktadan geçtiği için, performans izleme, hata tespiti ve güvenlik denetimleri çok daha kolay hale gelir. Bu sayede, AI sistemimizin genel sağlığını ve davranışını tek bir gösterge panosundan izleyebiliriz.
Elbette, API entegrasyonları veya doğrudan veritabanı loglama gibi alternatif yaklaşımlar da mevcuttur. Ancak bu yöntemler genellikle daha az esneklik sunar ve her AI servisi için ayrı ayrı entegrasyon ve loglama mantığı geliştirme gereksinimi doğurur. Bir proxy, bu karmaşıklığı soyutlayarak, AI sohbet loglama altyapısını daha modüler ve ölçeklenebilir hale getirir. Bu yüzden, projem için bir “Middleman Communication Proxy” yaklaşımını benimsemek, hem mevcut ihtiyaçlarımı karşıladı hem de gelecekteki genişletmeler için sağlam bir temel oluşturdu. Bu yaklaşım, sadece veriyi kaydetmekle kalmıyor, aynı zamanda veriye anlam katma ve üzerinde kontrol sahibi olma imkanı da sunuyor.
Temel Mimari: MCP Sunucusu Nasıl Çalışır?
MCP sunucusu, temel olarak kullanıcı ile yapay zeka modeli arasındaki tüm iletişimi ele geçiren ve işleyen bir köprü görevi görür. Bu mimariyi anlamak için basit bir akış şeması düşünebiliriz:
1. Kullanıcı İsteği: Kullanıcı, AI sohbet arayüzü (bir web uygulaması, mobil uygulama veya başka bir arayüz) aracılığıyla yapay zeka modeline bir mesaj (prompt) gönderir.
2. Proxy’ye Yönlendirme: Normalde bu istek doğrudan AI modeline giderken, bizim senaryomuzda ilk olarak MCP sunucumuza yönlendirilir.
3. İstek Yakalama ve Kaydetme: MCP sunucusu, gelen bu isteği yakalar. Bu aşamada, isteğin içeriği (kullanıcı mesajı), kullanıcı kimliği, zaman damgası ve diğer ilgili meta veriler bir veritabanına kaydedilir.
4. AI Modeline İletme: İstek kaydedildikten sonra, MCP sunucusu bu isteği asıl hedef olan yapay zeka modeline (örneğin, OpenAI API’sine) iletir.
5. AI Yanıtı Alma: Yapay zeka modeli, isteği işler ve bir yanıt (response) oluşturur. Bu yanıt, tekrar MCP sunucusuna döner.
6. Yanıt Yakalama ve Kaydetme: MCP sunucusu, AI modelinden gelen yanıtı yakalar. Bu yanıtın içeriği, ilgili kullanıcı isteğiyle eşleştirilerek yine veritabanına kaydedilir. Bu kayıt, AI’ın verdiği mesajı, yanıt süresini ve diğer önemli bilgileri içerebilir.
7. Kullanıcıya İletme: Son olarak, MCP sunucusu, AI’dan aldığı yanıtı orijinal kullanıcıya geri iletir. Kullanıcı, AI ile doğrudan etkileşim kuruyormuş gibi görünür, ancak tüm iletişim bir proxy üzerinden geçmiştir.
Bu akış, tüm sohbet verilerinin merkezi bir noktada toplanmasını sağlar. Veri yakalama noktaları, hem kullanıcıdan AI’a giden istekler hem de AI’dan kullanıcıya dönen yanıtlar olmak üzere iki ana noktadır. Kaydedilen veri türleri genellikle şunları içerir:
* Zaman Damgası: Her mesajın gönderildiği ve alındığı kesin an.
* Kullanıcı Kimliği (User ID): Sohbeti başlatan kullanıcının benzersiz kimliği.
* Kullanıcı Mesajı (User Message): Kullanıcının AI’a gönderdiği metin.
* AI Yanıtı (AI Response): Yapay zeka modelinin kullanıcıya verdiği metin.
* Sohbet Oturumu Kimliği (Session ID): Aynı sohbetin parçası olan mesajları gruplamak için.
* Token Sayısı: Eğer kullanılıyorsa, istek ve yanıtta kullanılan token (jeton) sayısı, maliyet analizi için önemli olabilir.
* Model Bilgisi: Hangi AI modelinin kullanıldığı (örneğin, GPT-4, Llama 2).
Bu sistemi kurmak için genellikle Python, Node.js veya Go gibi bir backend (arka uç) dili kullanılır. Bu diller, HTTP isteklerini işlemek ve veritabanıyla etkileşim kurmak için güçlü kütüphanelere sahiptir. Veritabanı olarak ise, esneklik ve ölçeklenebilirlik sunan PostgreSQL gibi ilişkisel bir veritabanı veya yüksek performanslı veri depolama için Redis gibi bir NoSQL veritabanı tercih edilebilir. Bu temel mimari, yapay zeka sohbetlerinden elde edilen verinin yapılandırılmış ve analiz edilebilir bir formatta saklanmasını garanti eder.
Adım Adım Kurulum: Kendi AI Sohbet Kayıt Sunucunuzu Oluşturmak
Kendi AI sohbet kayıt sunucunuzu oluşturmak, düşündüğünüzden daha kolay olabilir, ancak doğru araçları ve adımları takip etmek önemlidir. Bu bölümde, bu süreci adım adım inceleyecek ve size kendi sisteminizi kurmanız için bir yol haritası sunacağım.
Gerekli Bileşenler ve Ortam Hazırlığı
Öncelikle, projemiz için gerekli olan temel bileşenleri ve geliştirme ortamını hazırlamamız gerekiyor:
1. Bulut Sunucusu: Proxy sunucumuzu barındırmak için bir bulut sunucusuna ihtiyacımız var. AWS EC2, DigitalOcean Droplet, Google Cloud Compute Engine veya Azure Virtual Machines gibi servisler bu iş için idealdir. Ben, maliyet etkinliği ve kullanım kolaylığı nedeniyle DigitalOcean Droplet’i tercih ettim. Sunucu olarak Ubuntu 22.04 LTS tabanlı bir işletim sistemi seçmek, kurulum ve yönetim açısından oldukça yaygın ve desteklidir.
2. Gerekli Yazılımlar:
* Python 3.x: Proxy sunucumuzun mantığını yazmak için Python’ı kullanacağız. Çoğu Linux dağıtımında Python 3 ön yüklü gelir, ancak güncel sürümünü (3.9 veya üzeri) kullanmanız önerilir.
* pip: Python paket yöneticisi. Python ile birlikte kurulur.
* Sanal Ortam (Virtual Environment): Proje bağımlılıklarını izole etmek için Python’ın sanal ortam özelliğini kullanmak en iyi uygulamadır. Bu, projenizin diğer Python projeleriyle çakışmasını engeller.
* Git: Kodunuzu versiyonlamak ve sunucuya dağıtmak için kullanışlıdır.
3. Veritabanı Seçimi ve Kurulumu: Topladığımız sohbet verilerini kalıcı olarak depolamak için bir veritabanına ihtiyacımız var.
* PostgreSQL: Güvenilirliği, esnekliği ve güçlü sorgulama yetenekleri nedeniyle popüler bir seçimdir.
* Kurulum için sunucunuzda aşağıdaki komutları çalıştırabilirsiniz:
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres psql -c "CREATE USER myuser WITH PASSWORD 'mypassword';"
sudo -u postgres psql -c "CREATE DATABASE aichat_logs OWNER myuser;"
* myuser ve mypassword kısımlarını kendi güvenli bilgilerinizle değiştirmeyi unutmayın.
* Veritabanı Şeması: Basit bir tablo yapısı tasarlamamız gerekecek. Örnek bir conversations tablosu şöyle olabilir:
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
session_id VARCHAR(255) NOT NULL,
user_id VARCHAR(255) NOT NULL,
timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
direction VARCHAR(10) NOT NULL, -- 'in' (request) or 'out' (response)
message_content TEXT NOT NULL,
ai_model VARCHAR(100),
response_time_ms INTEGER,
token_count INTEGER,
metadata JSONB -- Ek veriler için
);
Bu şema, her mesajı (hem kullanıcıdan hem AI'dan) ayrı bir kayıt olarak tutar ve session_id ile ilişkilendirir. direction alanı mesajın yönünü belirtir.
Proxy Sunucusunun Geliştirilmesi
Proxy sunucumuzun kalbi, gelen HTTP isteklerini yakalayan, işleyen ve hedef AI servisine ileten bir web uygulamasıdır. Python tabanlı Flask veya FastAPI gibi mikro web framework'ler bu iş için oldukça uygundur. Ben, basitliği ve hızlı geliştirme imkanı nedeniyle Flask'ı tercih ettim.
1. Proje Yapısı:
ai_proxy_logger/
├── app.py
├── requirements.txt
└── config.py (isteğe bağlı)
2. requirements.txt içeriği:
Flask
requests
psycopg2-binary # PostgreSQL bağlantısı için
Bu bağımlılıkları yüklemek için: pip install -r requirements.txt
3. app.py içeriği (Basit bir Flask proxy örneği):
from flask import Flask, request, jsonify
import requests
import datetime
import psycopg2
import os # Ortam değişkenleri için
app = Flask(__name__)
# Ortam değişkenlerinden AI servis URL'i ve DB bağlantı bilgileri alınır
AI_SERVICE_URL = os.getenv('AI_SERVICE_URL', "http://localhost:5001/ai-api")
DB_HOST = os.getenv('DB_HOST', 'localhost')
DB_NAME = os.getenv('DB_NAME', 'aichat_logs')
DB_USER = os.getenv('DB_USER', 'myuser')
DB_PASSWORD = os.getenv('DB_PASSWORD', 'mypassword')
def get_db_connection():
conn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASSWORD)
return conn
@app.route('/chat', methods=['POST'])
def chat_proxy():
start_time = datetime.datetime.now()
user_message = request.json.get('message')
user_id = request.json.get('user_id', 'anonymous')
session_id = request.json.get('session_id', 'default_session')
ai_model = request.json.get('ai_model', 'unknown')
# Kullanıcı mesajını kaydet
try:
conn = get_db_connection()
cur = conn.cursor()
cur.execute(
"INSERT INTO conversations (session_id, user_id, direction, message_content, ai_model) VALUES (%s, %s, %s, %s, %s);",
(session_id, user_id, 'in', user_message, ai_model)
)
conn.commit()
cur.close()
conn.close()
except Exception as e:
print(f"Kullanıcı mesajı DB'ye kaydedilirken hata oluştu: {e}")
ai_message = "Üzgünüm, şu an hizmet veremiyorum." # Varsayılan hata mesajı
# AI servisine isteği ilet
try:
ai_response_obj = requests.post(AI_SERVICE_URL, json={'message': user_message, 'user_id': user_id, 'session_id': session_id})
ai_response_obj.raise_for_status() # HTTP hata kodu durumunda istisna fırlat
ai_data = ai_response_obj.json()
ai_message = ai_data.get('response', 'Yanıt alınamadı.')
except requests.exceptions.RequestException as e:
print(f"AI servisine bağlanırken hata oluştu: {e}")
except Exception as e:
print(f"AI yanıtını işlerken hata oluştu: {e}")
end_time = datetime.datetime.now()
response_time_ms = int((end_time - start_time).total_seconds() * 1000)
# AI yanıtını kaydet
try:
conn = get_db_connection()
cur = conn.cursor()
cur.execute(
"INSERT INTO conversations (session_id, user_id, direction, message_content, ai_model, response_time_ms) VALUES (%s, %s, %s, %s, %s, %s);",
(session_id, user_id, '