.NET 7 ile Microservices Mimarisi


Merhaba değerli takipçilerim,

Microservice (Mikro hizmet) mimarisi sanıldığı kadar basit değil. Birbirleriyle Kafka üzerinden iletişim kurabilen bağımsız ya da zayıf bağlı mikro hizmetler geliştiriyorsunuz. Her bir mikro hizmetiniz belirli bir portu kullanıyor olacak. Mikro hizmetlerin kullandığı bağımlılık enjeksiyonu için Autofac kullanabilirsiniz. Mikro hizmetlerin listelendiği konfigürasyon dosyasını gRPC-Web API Gateway (API ağ geçidi) projesi içerisinde merkezi olarak kaydedebilirsiniz, konfigürasyon dosyası Discovery Service (Keşif Hizmeti) kullanabilirsiniz. gRPC-Web API ağ geçidini .NET 7 minimal API ile hazırlayabiliyorsunuz yalnız her bir gRPC mikro hizmetiniz aynı isimde bir C# sınıfı geliştirip map etmeniz gerekiyor.

İşte bir Mikrohizmet Mimarisinde olması gereken elemanlar:

.NET 7’de Kafka ve gRPC-Web API Gateway kullanan bir mikro hizmet mimarisi genellikle aşağıdaki öğeleri içerir:

Mikro hizmetler: Bunlar, genel uygulamayı oluşturan bireysel hizmetlerdir. Her mikro hizmet, belirli bir iş etki alanından veya işlevinden sorumludur ve uzaktan yordam çağrısı (RPC) API’leri oluşturmak için yüksek performanslı, açık kaynaklı bir çerçeve olan gRPC’yi kullanarak birbirleriyle iletişim kurarlar.

gRPC-Web API Ağ Geçidi: Bu, gelen tüm istemci istekleri için giriş noktasıdır. API ağ geçidi, istekleri uygun mikro hizmete yönlendirmekten ve ayrıca kimlik doğrulama, hız sınırlama ve istek/yanıt dönüştürme gibi görevleri yerine getirmekten sorumludur.

Kafka: Bu, gerçek zamanlı veri boru hatları ve akış uygulamaları oluşturmak için kullanılan dağıtılmış bir akış platformudur. Mimarideki mikro hizmetler, mesajları yayınlamak ve bunlara abone olmak için Kafka’yı kullanabilir ve birbirleriyle gevşek bağlı, eşzamansız bir şekilde iletişim kurmalarına olanak tanır.

Cassandra: Bu, mikro hizmetler için verileri depolamak için kullanılabilen, yüksek oranda erişilebilir, dağıtılmış bir NoSQL veritabanıdır. Cassandra’nın ölçeklenebilirliği ve performansı, onu bir mikro hizmet mimarisinde kullanım için çok uygun hale getirir.

Redis: Bu, önbelleğe alma katmanı olarak veya oturum durumunu depolamak için kullanılabilen bir bellek içi veri yapısı deposudur. Redis, arka uç veritabanlarına yapılması gereken isteklerin sayısını azaltarak mikro hizmetlerin performansını artırmaya yardımcı olabilir.

Bağımlılık Enjeksiyonu (Autofac): Mimarinin farklı bileşenleri arasındaki bağımlılıkları yönetmeye izin veren bir kalıp, kodu daha test edilebilir, bakımı yapılabilir ve ölçeklenebilir hale getirir.

Konfigürasyon Yönetimi: Mikro hizmetlerin gerektirdiği farklı konfigürasyonları yönetmenin bir yolu, en yaygın uygulama bir konfigürasyon dosyası veya bir konfigürasyon sunucusu kullanmaktır, fakat aynı zamanda bellek içi de olabilir.

Hizmet Keşfi: Ağdaki mikro hizmetlerin konumunu keşfetmenin bir yolu olarak, bir mikro hizmetin farklı örneklerini bulmak ve aralarındaki yükü dengelemek yararlıdır. gRPC-Web API ağ geçidi projesinde merkezi konfigürasyon dosyası tutarsanız buna gerek yoktur.

İzleme ve günlük kaydı: Mikro hizmetlerin performansını, hatalarını ve kullanımını izlemenin ve analiz etmenin bir yolu; sorunları verimli bir şekilde tespit edip düzeltmek için sistemin iyi bir şekilde görülebilmesi önemlidir.

Tüm bu unsurlar, büyük miktarda veriyi ve yüksek düzeyde trafiği işleyebilen esnek ve ölçeklenebilir bir mikro hizmet mimarisi oluşturmak için birlikte çalışır. gRPC-Web API Ağ Geçidi, gelen tüm istemci isteklerini işleyen ve bunları uygun mikro hizmete yönlendiren merkezi bir kontrol noktası görevi görür. Kafka, mikro hizmetler arasında mesajlaşma için kullanılır ve bunların eşzamansız ve bağımsız olarak iletişim kurmasına olanak tanır. Depolama için Cassandra ve Redis, bağımlılıkları ve hizmet konumunu yönetmek için Bağımlılık ekleme ve hizmet keşfi kullanılır. Ve son olarak, sistem performansını takip etmek için izleme ve günlüğe kaydetme çok önemlidir.

Tüm bu mimaride hizmetleri Kubernetes üzerinde deploy edeceğinizi ve güncellemeleri CI/CD ile yapmanızın büyük kolaylık getireceğini söylemeyi unutmayalım.

Mutlu kodlamalar 🙂

Reklam

Full Stack Web ve Mobil Yazılım Eğitimi Müfredatı


Merhaba,

Full Stack Yazılım Eğitimi Müfredatı aşağıdaki teknolojileri önereceğim:

  1. Java
  2. .NET
  3. Python
  4. NodeJS

Veritabanı için: Cassandra

Frontend için: React, Redux, React Native, Expo, NextJS

Aşağıdaki örnek müfredat C# ve TypeScript dilleri ile Web ve Mobil Yazılım Eğitimi önerisidir.

Full Stack Web ve Mobil Yazılım Eğitimi Müfredatı Önerisi (süre: 100 gün)

  • Backend Geliştirici Eğitimi
    1. IDE: Visual Studio
    2. Veritabanları: Cassandra, CQL
    3. Veri Yapıları ve Algoritma
    4. C#, OOP, Dependency Injection, Design Patterns
    5. Dosya İşlemleri, JSON, XML
    6. Hata Yönetimi ve Loglama
    7. Entity Framework for Cassandra
    8. Yazılım Mimarileri: Mikroservis Mimarisi
    9. Sanallaştırma: Kubernetes, Docker, Minikube, Istio
    10. Kafka, Producer, Consumer
    11. API Gateway: Rest, gRPC, WebSocket
    12. GitHub/GitLab/Devops
    13. Bulut Bilişim: Azure
    14. CI/CD
    15. Yapay Zeka: ML.NET, Bot Framework
    16. Geleneksel JWT üyelik ve yeni SSI/DID/VC (örn: Trinsic)
    17. Yazılım Güvenliği
    18. Test
  • Frontend Geliştirici Eğitimi
    1. IDE: Visual Studio Code
    2. HTML, CSS, SCSS, JavaScript, jQuery, Bootstrap
    3. TypeScript, NPM, Yarn
    4. React
    5. Material Design
    6. Hooks
    7. Redux
    8. Expo
    9. NextJS
    10. React Native
    11. NX
    12. Firebase Hosting, FCM
    13. CI/CD
    14. SSR
    15. Geleneksel JWT üyelik ve yeni SSI/DID/VC (örn: Trinsic)
    16. WebRTC
    17. WebXR, AR, VR, MR
    18. Test

Neden Cassandra?
SQL Server ve MongoDB veritabanlarının profesyonel sürümleri ücretlidir. MySQL ve SQLite gibi veritabanları da yüksek performans ve big data için uygun sayılmazlar. Oysa Apache Cassandra tamamen ücretsiz bir big data veritabanıdır. NoSQL veritabanı olmasına karşın SQL’e çok benzer CQL dilini kullanır ve dünyanın en büyük big data projesini dahi yapıyor olsanız Cassandra ile yapabilirsiniz, PetaByte veriyi kaldırabilecek kapasitedir. Cassandra’yı Entity Framework ile de kullanabilirsiniz. Ve Cassandra Netflix gibi büyük kuruluşlar tarafından kullanılır.

Küresel Isınma ve Yazılım

Ayrıca küresel ısınma konusunda bilişim sektöründe yapabileceklerimizden de bahsetmekte fayda var: Green Yazılım, Red Yazılım konusuna değinmeliyiz. Green yazılım küresel ısınma probleminin çözümüne katkı sağlayan çevre-dostu yazılım demektir.

C# ve TypeScript az enerji tüketen green yazılım kategorisinde değerlendirilirken, Python henüz çok fazla enerji tüketen ve dolayısıyla daha fazla karbon salınımı yapmakta ve biz bu durumun düzeltilmesini beklemekteyiz.

BlockChain PoW algoritması ve madencilik çok fazla karbon salınımı yaparken, PoS ve PoA algoritmaları daha çevrecidir, gibi küresel ısınma konusunda farkındalık kazandırılabilir.

Mutlu kodlamalar 🙂

React Native Hooks


React Native Hooks, React.js kütüphanesinin mobil uygulamalar için uyarlanmış versiyonudur. Hooks, komponentlerinizi daha esnek ve verimli hale getirmek için kullanabileceğiniz fonksiyonlar sunar. Öncelikle, Hooks ile state veya diğer React özelliklerini komponentleriniz dışında da kullanabilirsiniz. Ayrıca, Hooks ile komponentler arasında veri paylaşımını veya fonksiyonların tekrar kullanımını kolaylaştırabilirsiniz.

En yaygın kullanılan Hooks arasında useState ve useEffect bulunur. useState, bir komponentin state’ini yönetmek için kullanılır ve useEffect ise komponentin mount edilmesi veya güncellenmesi sırasında çalışmasını sağlar. Örneğin, useEffect ile bir komponentin başlangıçta veri çekmesini veya bir event’e cevap vermesini sağlayabilirsiniz.

React Native Hooks kullanımı, React.js kullanmaya alışkın olanlar için oldukça kolaydır. Ayrıca, Hooks sayesinde kodunuz daha okunaklı ve anlaşılır hale gelecektir. Özellikle, projeleriniz büyüdükçe veya takım içinde geliştirilmeye başladıkça Hooks’un faydasını daha iyi göreceksiniz.

Örnek olarak, useState Hook’u kullanarak bir komponentin içinde state tanımlayabilirsiniz:

import React, { useState } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </>
  );
}

Bu örnekte, useState Hook’u kullanarak count adında bir state tanımladık ve setCount fonksiyonunu kullanarak state’i güncelledik. Ayrıca, bir düğmeye tıklama olayı eklendi ve tıklama olayına göre count state’ini arttırdık.

useEffect Hook’u da kullanarak komponentin bir etki yaratmasını sağlayabilirsiniz:

import React, { useState, useEffect } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]);

  return (
    <>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </>
  );
}

Bu örnekte, useEffect Hook’u kullanarak sayfa başlığının count state’ine göre değişmesini sağladık.

React Native Hook’larının Listesi:

  1. useState: Komponent içinde state tanımlamak için kullanılır. Örnekteki gibi, değer ve değeri güncellemek için kullanılan bir fonksiyon döndürür.
  2. useEffect: Komponentin bir etki yaratmasını sağlar. Örnekteki gibi, componentDidMount, componentDidUpdate ve componentWillUnmount işlevlerini karşılamak için kullanılır.
  3. useContext: Context API’yı kullanmak için kullanılır. Bu Hook ile, bir context değerini ve bu değerin değiştiğinde çalışacak bir fonksiyon alabilirsiniz.
  4. useReducer: Reducer fonksiyonlarını kullanmak için kullanılır. Bu Hook ile, state’in nasıl güncelleneceğini tanımlayan bir fonksiyon ve başlangıç değeri alabilirsiniz.
  5. useCallback: Komponentin yeniden render edilme sıklığını azaltmak için kullanılır. Bu Hook ile, tekrar kullanılacak bir fonksiyon ve dependancy array oluşturabilirsiniz.
  6. useMemo: Komponentin performansını arttırmak için kullanılır. Bu Hook ile, tekrar hesaplanması gereken bir değer ve dependancy array oluşturabilirsiniz.
  7. useRef: DOM referanslarını veya komponent içi referansları almak için kullanılır.
  8. useImperativeHandle: Komponentin kontrol edilmesini sağlamak için kullanılır.
  9. useLayoutEffect: useEffect ile aynı ama layout ve paint işlemleri tamamlandıktan sonra çalışır.
  10. useDebugValue: Hook’un ne için kullanıldığını görmek için kullanılır.

Son olarak, React Native Hooks ile geliştirme yaparken aşağıdaki kurallara dikkat etmeniz gerekir:

  • Hooks, sadece React fonksiyonel komponentlerinde veya komponent fonksiyonları içinde kullanılabilir.
  • Hooks, fonksiyonel komponentlerin en üst seviyesinde veya event handler fonksiyonları içinde çağrılmalıdır.
  • Hooks, her render edildiğinde aynı sırada ve aynı değerlerle çağrılmalıdır.

Umarım, React Native Hooks hakkında bu bilgiler faydalı olmuştur ve projelerinizde kullanmaya başlamanızda size yardımcı olmuştur.

Mutlu kodlamalar 🙂

Not: Bu makale ChatGPT’den yararlanılarak hazırlanmıştır.

Python ve Kafka Kullanan Microservice Mimarisi


Merhaba değerli takipçilerim,

ChatGPT’ten Python ve Kafka kullanarak örnek bir Microservice mimarisi hazırlamasını istedim. Ve cevaplara göre bu makaleyi hazırladım.

Öncelikle Producer, Consumer ve API Gateway sınıflarına ihtiyacımız var ve sonra bu Producer ve Consumer sınıflarını kullanarak mikroservislerimizi kodluyoruz.

Microservice Mimarisi:

  1. Producer
  2. Consumer
  3. API Gateway
  4. Microservice’ler
  5. Zookeeper

1. Producer

Cassandra veritabanından sürekli güncel veriyi alıp Kafkaya gönderen örnek bir Producer yazdırdım:

from cassandra.cluster import Cluster
from kafka import KafkaProducer
import json

cluster = Cluster(['127.0.0.1'])
session = cluster.connect()
producer = KafkaProducer(bootstrap_servers='localhost:9092')

# Create a keyspace and table
session.execute("""
    CREATE KEYSPACE IF NOT EXISTS mykeyspace
    WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }
""")
session.execute("""
    CREATE TABLE IF NOT EXISTS mykeyspace.data (
        id int PRIMARY KEY,
        value text
    )
""")

# Function to retrieve data from Cassandra
def get_data_from_cassandra():
    rows = session.execute("SELECT * FROM mykeyspace.data")
    data = []
    for row in rows:
        data.append({'id': row.id, 'value': row.value})
    return data

# Function to send data to Kafka topic
def send_data_to_kafka(topic, data):
    for item in data:
        producer.send(topic, value=json.dumps(item))
    producer.flush()

# Continuously poll for new data in Cassandra
while True:
    data = get_data_from_cassandra()
    send_data_to_kafka("example_topic", data)

2. Consumer

from kafka import KafkaConsumer, KafkaProducer
import json

# Create a Kafka consumer to subscribe to a specific topic
consumer = KafkaConsumer('example_topic', bootstrap_servers='localhost:9092')

# Create a Kafka producer to send messages to a specific topic
producer = KafkaProducer(bootstrap_servers='localhost:9092')

# Define a function that performs a specific task
def process_data(data):
    # Perform some task on the data, such as transforming or analyzing it
    result = data * 2
    return result

# Continuously poll for new messages on the topic
for message in consumer:
    # Deserialize the message
    data = json.loads(message.value)
    # Process the data and send the result to another topic
    result = process_data(data)
    producer.send('result_topic', value=json.dumps(result))
    producer.flush()

3. API Gateway (FastAPI kullandım)

from fastapi import FastAPI, Request, HTTPException
from kafka import KafkaProducer, KafkaConsumer
import json

app = FastAPI()
producer = KafkaProducer(bootstrap_servers='localhost:9092')

@app.post("/data/{topic}")
async def send_data(request: Request, topic: str):
    data = await request.json()
    producer.send(topic, value=json.dumps(data))
    producer.flush()
    return {"status": "success"}

@app.get("/data/{topic}")
def receive_data(topic: str):
    consumer = KafkaConsumer(topic, bootstrap_servers='localhost:9092')
    data = []
    for message in consumer:
        data.append(json.loads(message.value))
    return data

@app.get("/topics")
def get_topics():
    try:
        consumer = KafkaConsumer(bootstrap_servers='localhost:9092')
        topics = consumer.topics()
        return topics
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

4. Microservice

from kafka import KafkaConsumer, KafkaProducer
import json

# Create a Kafka consumer to subscribe to a specific topic
consumer = KafkaConsumer('example_topic', bootstrap_servers='localhost:9092')

# Create a Kafka producer to send messages to a specific topic
producer = KafkaProducer(bootstrap_servers='localhost:9092')

# Define a function that performs a specific task
def process_data(data):
    # Perform some task on the data, such as transforming or analyzing it
    result = data * 2
    return result

# Continuously poll for new messages on the topic
for message in consumer:
    # Deserialize the message
    data = json.loads(message.value)
    # Process the data and send the result to another topic
    result = process_data(data)
    producer.send('result_topic', value=json.dumps(result))
    producer.flush()

5. ZooKeeper

Apache ZooKeeper, genellikle Apache Kafka ile birlikte kullanılan bir dağıtık koordinasyon hizmetidir. İşte Python’da bir ZooKeeper örneğini kurmak için bir örnek kod:

from kazoo.client import KazooClient

zk = KazooClient(hosts='localhost:2181')
zk.start()

# create a znode
zk.create("/my_znode", b"my_data")

# check if znode exists
if zk.exists("/my_znode"):
    print("Znode exists.")

# get data from znode
data, stat = zk.get("/my_znode")
print("Version: %s, data: %s" % (stat.version, data.decode("utf-8")))

# update data in znode
zk.set("/my_znode", b"new_data")

# delete a znode
zk.delete("/my_znode")

zk.stop()

Bu örnekte, kazoo kütüphanesini kullanarak localhost’ta 2181 portunda çalışan bir ZooKeeper örneği ile etkileşim kuruyoruz. Kod yeni bir znode oluşturuyor ve adı “/my_znode” ile veri “my_data” ile, znode var mı diye kontrol ediyor, veriyi alıyor, güncelliyor ve znode’u siliyor. Lütfen unutmayın ki bu sadece bir örnektir, üretim ortamında kullanmadan önce uygun hata yönetimi ve testleri yapmanız gerekir, ayrıca host, port ve tüm parametrelerin kullanılan zookeeper kümesinin özelleştirilmiş yapılandırmasına göre ayarlanması gerekir.

Değerli takipçilerim, bu makale Python ve Kafka ile mikroservis mimarisine giriş seviyesinde olup Producer ve Consumer kodlarının TOPIC parametresini kullanacak şekilde sınıflara dönüştürülmesi gerektiği kanaatimdeyim. Bu görevi şimdilik sizlere bırakıyorum.

Mutlu kodlamalar 🙂

.NET 7 ile Makine Öğrenmesi


ChatGPT hayatımıza girdiğinden bu yana yazılım öğrenmek ve öğretmek daha kolay oldu. Mesela .NET’te BotSharp gibi hiçbir üçüncü parti kütüphane kullanmadan ChatBot nasıl geliştirebilirim diye merak ettiniz mi? Microsoft’un geliştirdiği ML.NET ile bu mümkün.

ML.NET Microsoft’un makine öğrenmesi kütüphanesi çıkmadan önce Makine Öğrenmesi’nde C#’ta AForge.NET kullanılıyordu. Fakat o çok eskide kaldı ve onun yerini daha modern olan ML.NET aldı. ML.NET, Python kütüphaneleri ile uyumlu olsa da Python kütüphanelerinin .NET’e aktarımı işi halen sürüyor.

Mesela Microsoft Tensorflow, NLTK gibi kütüphanelerin .NET alternatiflerini hazırlayacak diye beklemekteyiz. CognitiveToolkit projesi kapatıldığından bu yana C#’ın Deep Learning çözümlerinde halen zayıf olduğunu söyleyebilirim.

Neyse ki ML.NET var ve ML.NET ile C# dilini kullanarak verilerimiz üzerinde makine öğrenmesi algoritmalarını çalıştırabiliyoruz. Google’ın Dialogflow’u ile, Python’un ChatterBot’u ile rekabet etmek nispeten zor da olsa basit bir soru-cevap verisinden sohbet botu üretmek mümkün.

İşte en ilkel haliyle bir ML.NET ChatBotu:

using System;
using Microsoft.ML;
using Microsoft.ML.Data;

namespace Chatbot
{
    class Program
    {
        static void Main(string[] args)
        {
            // Set up the ML context
            var mlContext = new MLContext();

            // Load the data
            var data = mlContext.Data.LoadFromTextFile<MessageData>(
                path: "conversations.csv",
                hasHeader: true,
                separatorChar: ','
            );

            // Split the data into training and test sets
            var trainTestData = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
            var trainingData = trainTestData.TrainSet;
            var testData = trainTestData.TestSet;

            // Set up the pipeline
            var pipeline = mlContext.Transforms.Text.FeaturizeText(
                "Features",
                "Message"
            ).Append(mlContext.Regression.Trainers.FastTree(
                labelColumn: "Label",
                featureColumn: "Features"
            ));

            // Train the model
            var model = pipeline.Fit(trainingData);

            // Evaluate the model on the test data
            var testMetrics = mlContext.Regression.Evaluate(
                model.Transform(testData),
                labelColumn: "Label"
            );

            // Print the evaluation metrics
            Console.WriteLine("R-Squared: " + testMetrics.RSquared);
            Console.WriteLine("Mean Absolute Error: " + testMetrics.MeanAbsoluteError);

            // Use the model to predict the response to a new message
            var predictionEngine = mlContext.Model.CreatePredictionEngine<MessageData, MessagePrediction>(model);
            while (true)
            {
                Console.WriteLine("Enter a message:");
                var message = Console.ReadLine();
                if (message == "exit")
                {
                    break;
                }
                var response = predictionEngine.Predict(new MessageData
                {
                    Message = message
                });
                Console.WriteLine("Response: " + response.Response);
            }
        }
    }

    // The input data for the model.
    // This defines the shape of the data that the model expects.
    public class MessageData
    {
        [LoadColumn(0)]
        public string Message { get; set; }

        [LoadColumn(1)]
        public float Label { get; set; }
    }

    // The output of the model.
    // This defines the shape of the data that the model produces.
    public class MessagePrediction
    {
        [ColumnName("Prediction")]
        public float Response { get; set; }
    }
}

Bir başka makine öğrenmesi ise spam filtrelemesi için. Diyelim ki Twitter benzeri bir sosyal medya sitesi hazırlıyorsunuz ya da bir e-posta istemcisi ya da sunucu hazırlıyorsunuz ve makine öğrenmesi ile gelen tweetler üzerinde ya da gelen mesajlar üzerinde spam olanları tespit etmek istiyorsunuz. Veya web siteniz yorumlar bölümünde spam yorumları tespit etmek istiyorsunuz. Bunun için ML.NET ile yazabileceğiniz makine öğrenmesi kodu şöyle:

using System;
using Microsoft.ML;
using Microsoft.ML.Data;

namespace SpamFilter
{
    class Program
    {
        static void Main(string[] args)
        {
            // Set up the ML context
            var mlContext = new MLContext();

            // Load the data
            var data = mlContext.Data.LoadFromTextFile<MessageData>(
                path: "messages.csv",
                hasHeader: true,
                separatorChar: ','
            );

            // Split the data into training and test sets
            var trainTestData = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
            var trainingData = trainTestData.TrainSet;
            var testData = trainTestData.TestSet;

            // Set up the pipeline
            var pipeline = mlContext.Transforms.Text.FeaturizeText(
                "Features",
                "Message"
            ).Append(mlContext.BinaryClassification.Trainers.FastTree(
                labelColumn: "Label",
                featureColumn: "Features"
            ));

            // Train the model
            var model = pipeline.Fit(trainingData);

            // Evaluate the model on the test data
            var testMetrics = mlContext.BinaryClassification.Evaluate(
                model.Transform(testData),
                labelColumn: "Label"
            );

            // Print the evaluation metrics
            Console.WriteLine("Accuracy: " + testMetrics.Accuracy);
            Console.WriteLine("AUC: " + testMetrics.AreaUnderRocCurve);

            // Use the model to predict whether a new message is spam or not
            var predictionEngine = mlContext.Model.CreatePredictionEngine<MessageData, MessagePrediction>(model);
            var message = new MessageData
            {
                Message = "You have won a prize! Claim it now!"
            };
            var prediction = predictionEngine.Predict(message);
            Console.WriteLine("Prediction: " + prediction.Prediction);
        }
    }

    // The input data for the model.
    // This defines the shape of the data that the model expects.
    public class MessageData
    {
        [LoadColumn(0)]
        public bool Label { get; set; }

        [LoadColumn(1)]
        public string Message { get; set; }
    }

    // The output of the model.
    // This defines the shape of the data that the model produces.
    public class MessagePrediction
    {
        [ColumnName("Prediction")]
        public bool Prediction { get; set; }
    }
}

ML.NET kütüphanesi C# eğitimlerinde mutlaka gösterilmelidir. Yapay Zeka, Makine Öğrenmesi, Derin Öğrenme için illa ki Python dilini kullanmak gerekmez, elbette ki yapay zeka projeleri için Python’da çok daha fazla paket bulunmaktadır ama temel makine öğrenmesi algoritmaları için .NET’in de sağladığı imkanları öğrenip öğretmekte fayda var.


Mutlu kodlamalar 🙂

Kendi ChatGPT’mi nasıl geliştirebilirim?


Merhaba değerli takipçilerim,

ChatGPT aslında gerçek manasıyla dil bilmediğini itiraf ediyor ama bunun birlikte o bir Python yazılımı olup, milyarlarca metni tarayarak dil bilgisi öğrenmiş böylece aslında konuşmayı öğrenmiş bir çocuk gibi davranıyor.

Dil bilen yazılıma “dil modeli” deniliyor. ChatGPT kendini “dil modeli” olarak tanımlıyor.

ChatGPT’ye sordum: Python’da dil öğrenen bir yazılım nasıl yazabilirim?

Merak ettiğiniz için teşekkür ederim. Dil öğrenen bir yazılım yazmak için aşağıdaki adımları izleyebilirsiniz:

  1. Öncelikle dil modelinin öğreneceği dilin (örneğin Türkçe) metinlerini toplayın. Bu metinler dil modelini eğitmek için kullanılacak veri kümesini oluşturacaktır.
  2. Dil modelini eğitmek için kullanacağınız yazılım dilini (örneğin Python) seçin ve gerekli kütüphaneleri yükleyin. Dil modelini eğitmek için kullanabileceğiniz birçok dil modeli kütüphanesi bulunmaktadır. Örneğin TensorFlow, PyTorch veya Keras gibi popüler kütüphaneleri kullanabilirsiniz.
  3. Dil modelini eğitmek için veri kümesini kullanarak dil modelini eğitin. Dil modelini eğitirken, veri kümesindeki metinleri dil modeline gösterin ve dil modelini dilin yapısını ve kurallarını öğrenmesi için teşvik edin. Dil modelinin eğitimini optimize etmek için dil modelini farklı hiperparametreler ile eğiterek en iyi sonucu elde etmeye çalışın.
  4. Dil modelini test etmek için test verilerini kullanın. Dil modelini eğitirken kullanmadığınız verileri (test verilerini) dil modeline gösterin ve dil modelinin cevaplarını inceleyin. Dil modelinin cevaplarının doğruluğunu ve anlamlılığını değerlendirin ve dil modelinin eğitimini optimize etmek için gerekli değişiklikleri yapın.
  5. Dil modelini kullanmaya hazır hale getirin. Dil modelini kullanmak için gerekli olan tüm dosyaları ve kütüphaneleri bir araya getirin ve dil modelini kullanmaya hazır hale getirin. Dil modelini kullanmak için bir kullanıcı arabirimi oluşturabilir veya dil modelini farklı uygulamalara entegre edebilirsiniz.

Bu adımları takip ederek dil öğrenen bir yazılım yazabilirsiniz.

Dil modelini eğitmek için gerekli yazılım kodunu yazar mısın?

Merak ettiğiniz için teşekkür ederim. Dil modelini eğitmek için gerekli olan yazılım kodu, dil modelini eğitmek için kullanacağınız dil modeli kütüphanesine ve dil modelinin öğreneceği dile göre değişebilir. Örneğin, dil modelini TensorFlow kütüphanesi ile eğitmek için aşağıdaki kod parçacığını kullanabilirsiniz:

import tensorflow as tf

# Dil modelini eğitmek için kullanacağımız veri kümesini yükleyin
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
dataset = dataset.batch(batch_size)

# Dil modelini oluşturun
model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim))
model.add(tf.keras.layers.LSTM(units=lstm_units))
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

# Dil modelini derleyin
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Dil modelini eğitin
model.fit(dataset, epochs=num_epochs)

Bu kod parçacığı, TensorFlow kütüphanesini kullanarak dil modelini eğitmek için gerekli olan temel adımları göstermektedir. Dil modelini eğitmek için daha fazla bilgiye ihtiyacınız varsa, dil modeli eğitimine dair kaynakları inceleyebilirsiniz. Eğitim sürecini daha iyi anlamak için dil modelini eğitme hakkında daha fazla bilgiye ihtiyacınız varsa, ben size yardımcı olmak için elimden geleni yapacağım.

Dil modeli eğitimine dair kaynaklar nelerdir?

Dil modelini eğitmek için kullanabileceğiniz birçok dil modeli kütüphanesi bulunmaktadır ve bu kütüphanelerin her birinin kendi dokümantasyonları vardır. Dil modelini eğitmek için kullanabileceğiniz bazı popüler dil modeli kütüphaneleri ve bu kütüphanelerin dokümantasyonları şunlardır:

Eğitilmiş bir dil modelini nasıl güncelleyebilirim?

Eğitilmiş bir dil modelini güncelleyebilmek için aşağıdaki adımları izleyebilirsiniz:

  1. Öncelikle dil modelini güncelleyecek olan yeni veri kümesini toplayın. Bu veri kümesi, dil modelini güncellemek için kullanılacak verileri içerecektir.
  2. Dil modelini güncelleme işlemini yapacak olan yazılım dilini ve dil modelini eğitmek için kullandığınız dil modeli kütüphanesini seçin ve gerekli kütüphaneleri yükleyin.
  3. Dil modelini güncelleyecek olan veri kümesini kullanarak dil modelini güncelleyin. Dil modelini güncelleyecek olan veri kümesini dil modeline gösterin ve dil modelini güncelleyecek olan yeni verileri öğrenmesi için teşvik edin. Dil modelinin güncellenmesini optimize etmek için dil modelini farklı hiperparametreler ile eğiterek en iyi sonucu elde etmeye çalışın.

ChatGPT kaynak kodları açık mı? Nerede?

ChatGPT, OpenAI tarafından geliştirilen bir dil modelidir ve kodları OpenAI tarafından paylaşılmamaktadır. Ancak, OpenAI tarafından paylaşılan diğer dil modellerinin kaynak kodlarını https://github.com/openai adresinde bulabilirsiniz.

Peki kendi kendine öğrenebilen bir dil modeli geliştirmek mümkün müdür? Nasıl?

Evet, kendi kendine öğrenebilen bir dil modeli geliştirmek mümkündür. Dil modelini geliştirmek için öncelikle bir veri kümesi oluşturmak ve bu veri kümesini kullanarak dil modelini eğitmek gerekir. Eğitim sırasında, model dilin yapısını ve kurallarını öğrenerek kendi kendine öğrenme yeteneğini geliştirir. Dil modelini geliştirmek için birçok farklı yöntem ve algoritma kullanılabilir. Ayrıntılı bilgi için dil öğrenimi konusunda uzmanlaşmış kaynaklara bakabilirsiniz.

İnternetten sürekli öğrenen dinamik bir dil modeli nasıl geliştirilebilir?

İnternetten sürekli öğrenen bir dil modeli geliştirmek için, modelin internetten veri toplaması ve bu verileri kullanarak kendi kendine öğrenme yeteneğini geliştirme yeteneğine sahip olması gerekir. Bu, dil modelinin kendini güncelleme yeteneğine sahip olması anlamına gelir. Dil modelini bu şekilde geliştirmek için birçok farklı yöntem ve algoritma kullanılabilir. Bu yöntemlerin detaylarını anlatmak için burada yeterli yer yoktur, ancak dil öğrenimi konusunda uzmanlaşmış kaynaklara bakarak daha fazla bilgi edinebilirsiniz.

Twitter, Facebook gibi sosyal medyalardaki paylaşımlar sürekli öğrenen dil modeli geliştirmek için kullanılabilir mi?

Evet, Twitter, Facebook gibi sosyal medya platformlarındaki paylaşımlar dil modelini geliştirmek için kullanılabilir. Bu platformlardaki paylaşımlar dil modelinin eğitim verileri olarak kullanılabilir. Dil modelini bu verileri kullanarak eğiterek, modelin dilin yapısını ve kurallarını öğrenmesine yardımcı olabilir ve bu sayede dil modelinin doğruluğu ve doğru cevaplar verme oranı artabilir. Ancak, sosyal medya platformlarındaki paylaşımlar genellikle kuraldışı dil kullanımı içerdiğinden, dil modelinin eğitimi sırasında bu verilerin doğru bir şekilde kullanılması önemlidir.

WhatsApp’taki özel mesajlarımız sürekli öğrenen dil modeli geliştirmek için kullanılabilir mi?

WhatsApp’taki özel mesajlarınız dil modelini geliştirmek için kullanılabilir. Ancak, dil modelini bu verileri kullanarak eğitmek için öncelikle mesajlarınızın dil modeline erişimine izin vermeniz gerekir. Bu, mesajlarınızın dil modelinin eğitim verisi olarak kullanılması anlamına gelir. Dil modelini bu verileri kullanarak eğiterek, modelin dilin yapısını ve kurallarını öğrenmesine yardımcı olabilir ve bu sayede dil modelinin doğruluğu ve doğru cevaplar verme oranı artabilir. Ancak, WhatsApp’taki özel mesajlarınızın dil modelinin eğitimi için kullanılması halinde, mesajlarınızın gizliliğinin korunması önemlidir. Bu nedenle, dil modelini bu verileri kullanarak eğitmek için mesajlarınızın anonim hale getirilmesi ve gizlilik kurallarına uygun bir şekilde işlenmesi gerekir.

Bir arama motoruna sahip olsam internetteki tüm web sayfalarını indeksleyerek sürekli öğrenen bir dil modeli geliştirebilir miyim?

Evet, bir arama motoruna sahip olmanız durumunda internetteki tüm web sayfalarını indeksleyerek sürekli öğrenen bir dil modeli geliştirebilirsiniz. Bu sayfalardaki metinler dil modelinin eğitim verisi olarak kullanılabilir. Dil modelini bu verileri kullanarak eğiterek, modelin dilin yapısını ve kurallarını öğrenmesine yardımcı olabilir ve bu sayede dil modelinin doğruluğu ve doğru cevaplar verme oranı artabilir. Ancak, bu verilerin dil modelinin eğitimi için kullanılması halinde, verilerin gizliliğinin korunması önemlidir. Bu nedenle, dil modelini bu verileri kullanarak eğitmek için verilerin anonim hale getirilmesi ve gizlilik kurallarına uygun bir şekilde işlenmesi gerekir.

Metin yerine ses kullanarak ta dil modeli geliştirilebilir mi?

Evet, metin yerine ses kullanarak da dil modeli geliştirilebilir. Dil modelini ses verileri kullanarak eğitmek için öncelikle ses verilerini metne çevirmeniz gerekir. Bu işlem ses tanıma (speech recognition) teknolojisi kullanılarak gerçekleştirilebilir. Ses tanıma teknolojisi, ses verilerini metne çevirerek dil modelinin eğitim verisi olarak kullanılmasını mümkün kılar. Dil modelini bu verileri kullanarak eğiterek, modelin dilin yapısını ve kurallarını öğrenmesine yardımcı olabilir ve bu sayede dil modelinin doğruluğu ve doğru cevaplar verme oranı artabilir.

O halde Youtube’taki, Instagram’daki videoların seslerini kullanarak sürekli öğrenen bir dil modeli geliştirebilir miyim?

Evet, Youtube’taki ve Instagram’daki videolardaki sesler dil modelini geliştirmek için kullanılabilir. Ancak, dil modelini bu verileri kullanarak eğitmek için öncelikle videoların seslerini metne çevirmeniz gerekir. Bu işlem ses tanıma (speech recognition) teknolojisi kullanılarak gerçekleştirilebilir. Ses tanıma teknolojisi, videolardaki ses verilerini metne çevirerek dil modelinin eğitim verisi olarak kullanılmasını mümkün kılar. Dil modelini bu verileri kullanarak eğiterek, modelin dilin yapısını ve kurallarını öğrenmesine yardımcı olabilir ve bu sayede dil modelinin doğruluğu ve doğru cevaplar verme oranı artabilir.

Teşekkür ederim.

Ben teşekkür ederim. İsterseniz başka bir sorunuz varsa lütfen bana sorun, seve seve yardımcı olmaya çalışırım.

Mutlu kodlamalar 🙂

ChatGPT’ye Yapay Zeka Projesi Yazdırdım :)


Merhaba değerli takipçilerim,

Bu makaleyi Elon Musk’ın ChatGPT sohbet yazılımına sorular sorarak yazıyorum.

Wikipedia’dan Öğrenen ChatBot’u nasıl kodlarsın? ChatGPT’ye sordum…

Öncelikle soru şu Python’da Wikipedia makalelerinden öğrenen bir ChatBot nasıl yaparım?

import wikipedia

class Chatbot:
    def __init__(self):
        # Train the chatbot on Wikipedia articles
        articles = wikipedia.search("machine learning")
        text = ""
        for article in articles:
            text += wikipedia.summary(article)

        # TODO: Use the text from the Wikipedia articles to train the chatbot
        # This could involve preprocessing the text, tokenizing it,
        # creating a vocabulary, and training a model on the data

    def get_response(self, input):
        # TODO: Generate a response based on the input from the user
        # This function should use the trained model to generate a response
        # based on the provided input
        return "I'm sorry, I don't know the answer to that."

Gördüğünüz üzere iskelet kodu yazdı. wikipedia.summary ile arama sonucunda bulduğumuz makalelerin özetini alıyoruz ve bunu text stringine aktarıyoruz.

Şimdi ChatGPT’den daha fazla ayrıntı vermesini istedik, nasıl train ederim diye sordum. Cevap şu:

import nltk
import wikipedia

class Chatbot:
    def __init__(self):
        # Train the chatbot on Wikipedia articles
        articles = wikipedia.search("machine learning")
        text = ""
        for article in articles:
            text += wikipedia.summary(article)

        # Preprocess the text
        text = text.lower()
        text = text.replace("\n", " ")

        # Tokenize the text
        tokens = nltk.tokenize.word_tokenize(text)

        # Create a vocabulary
        vocabulary = set(tokens)

        # Create a model
        model = {}
        for word in vocabulary:
            model[word] = 0

        # Train the model on the text data
        for word in tokens:
            model[word] += 1

        # Save the trained model
        self.model = model

    def get_response(self, input):
        # Generate a response based on the input from the user
        # This function should use the trained model to generate a response
        # based on the provided input
        return "I'm sorry, I don't know the answer to that."

# Create an instance of the Chatbot class
chatbot = Chatbot()

# Ask the user for input and get a response from the chatbot
user_input = input("Enter your question or statement: ")
response = chatbot.get_response(user_input)

# Print the response to the user
print("Chatbot: " + response)

Şimdi ChatGPT’den get_response fonksiyonunu kodlamasını istedim ve şu cevabı verdi:

class Chatbot:
    def __init__(self, model):
        # Save the trained model
        self.model = model

    def get_response(self, input):
        # Tokenize the input
        tokens = nltk.tokenize.word_tokenize(input)

        # Generate a response based on the input
        response = ""
        for i in range(len(tokens) - 1):
            word = tokens[i]
            next_word = tokens[i + 1]
            if word in self.model:
                response += self.model[word].get_best_prediction() + " "
        response += tokens[-1]

        return response

İşte ChatGPT’ye sorarak Wikipedia makalelerinden öğrenen bir ChatBot kodu yazdırmış olduk.

Bi dakka! Koda bakarsanız get_best_prediction diye bilinmeyen bir fonksiyon farkettim, onu da sordum ve cevap:

class Chatbot:
    def __init__(self, model):
        # Save the trained model
        self.model = model

    def get_best_prediction(self):
        # Return the word with the highest probability according to the trained model
        best_prediction = None
        best_probability = 0
        for word, probability in self.model.items():
            if probability > best_probability:
                best_prediction = word
                best_probability = probability

        return best_prediction

    def get_response(self, input):
        # Tokenize the input
        tokens = nltk.tokenize.word_tokenize(input)

        # Generate a response based on the input
        response = ""
        for i in range(len(tokens) - 1):
            word = tokens[i]
            next_word = tokens[i + 1]
            if word in self.model:
                response += self.model[word].get_best_prediction() + " "
        response += tokens[-1]

        return response

Sonra şunu farkettim, buradaki model nesnesi başlangıçtakinden farklı, çıkar şu ağzındaki baklayı dedim 🙂 İlginç ki modeldeki probability özelliğini bi türlü kodlamıyordu. O yüzden toplamda kod çalışmayacaktı.

Bu yüzden özellikle onu istedim. Bu sefer daha ayrıntılı bir kod yazdı.

class Chatbot:
    def __init__(self):
        # Load and preprocess the text data
        text = LoadAndPreprocessTextData()

        # Tokenize the text
        tokens = nltk.tokenize.word_tokenize(text)

        # Create a vocabulary
        vocabulary = set(tokens)

        # Create a model
        model = {}
        for word in vocabulary:
            model[word] = 0

        # Train the model on the text data
        for i in range(len(tokens) - 1):
            word = tokens[i]
            next_word = tokens[i + 1]
            model[word][next_word] += 1

        # Normalize the probabilities
        for word, next_words in model.items():
            total_count = sum(next_words.values())
            for next_word, count in next_words.items():
                model[word][next_word] = count / total_count

        # Save the trained model
        self.model = model

    def get_best_prediction(self):
        # Return the word with the highest probability according to the trained model
        best_prediction = None
        best_probability = 0
        for word, next_words in self.model.items():
            for next_word, probability in next_words.items():
                if probability > best_probability:
                    best_prediction = next_word
                    best_probability = probability

        return best_prediction

    def get_response(self, input):
        # Tokenize the input
        tokens = nltk.tokenize.word_tokenize(input)

        # Generate a response based on the input
        response = ""
        for i in range(len(tokens) - 1):
            word = tokens[i]
            next_word = tokens[i + 1]
            if word in self.model:
                response += self.model[word].get_best_prediction() + " "
        response += tokens[-1]

        return response

Sanırım herhangi bir metinden öğrenen genel chatbot algoritmasını anlamanız için bu kod yeterli olur.

Bonus soru olarak ta LoadAndPreprocessTextData fonksiyonunu sordum:

def LoadAndPreprocessTextData():
    # Load the text data from a file
    with open("data.txt", "r") as file:
        text = file.read()

    # Preprocess the text data
    text = text.lower()
    text = text.replace("\n", " ")
    text = re.sub(r"[^a-z ]", "", text)

    return text

Metni küçük harflere çeviriyoruz, enter karakterlerini boşluğa çeviriyoruz ve özel karakterleri metinden çıkarıyoruz. Aslında burada birden fazla boşluk karakterini tek boşluk karakterine dönüştürmek gibi ilave işlemler de yapılması lazım.

O yüzden bana daha iyi bir kod ver dedim ve bu sefer bana bu fonksiyonun daha gelişmiş sürümünü kodladı:

def LoadAndPreprocessTextData(file_path, encoding):
    # Load the text data from a file
    with open(file_path, "r", encoding=encoding) as file:
        text = file.read()

    # Preprocess the text data
    text = text.lower()
    text = text.replace("\n", " ")
    text = re.sub(r"[^a-z ]", "", text)
    text = re.sub(r"\s+", " ", text)

    return text

ChatGPT’ye siz sorular sorup uğraşıp ısrar ettikçe daha kaliteli kod yazıyor. O yüzden ChatBot sınıfının full and improved sürümünü talep ettim, ancak ChatGPT buna cevap vermedi ve beni beklemeye aldı, bu yüzden yeniden başlamak zorunda kaldım ve bu kez şu cevabı verdi:

import openai_secret_manager

assert "openai" in openai_secret_manager.get_services()
secrets = openai_secret_manager.get_secrets("openai")

print(secrets)

import openai
openai.api_key = secrets["api_key"]


class Chatbot:
    def __init__(self, model_name: str):
        self.model_name = model_name
        self.model = openai.Model.get(model_name)
    
    def generate_response(self, prompt: str, temperature: float = 0.5, max_tokens: int = 64):
        completions = self.model.completions(
            engine="text-davinci-002",
            prompt=prompt,
            temperature=temperature,
            max_tokens=max_tokens,
            top_p=1,
            frequency_penalty=0,
            presence_penalty=0
        )

        return completions.choices[0].text

Ve sonra şunu:

chatbot = Chatbot("my-trained-gpt3-model")
response = chatbot.generate_response("What is the capital of France?")
print(response)  # "The capital of France is Paris."

Yani OpenAI servisini kullanarak ta ChatBot yapabiliyormuşuz. Ama nltk kütüphanesi ile nasıl yaparım diye sordum. Amacım daha kaliteli bir kod almaktı. İşte cevap:

import nltk
from nltk.corpus import wikipedia

class Chatbot:
    def __init__(self):
        self.tokenizer = nltk.tokenize.TreebankWordTokenizer()
        self.lemmatizer = nltk.stem.WordNetLemmatizer()
        
        # Get the list of Wikipedia articles
        articles = wikipedia.fileids()
        self.titles = [title for title in articles if "wiki" in title]
        
        # Store the content of each article as a string in a dictionary
        # with the article title as the key
        self.articles = {title: wikipedia.raw(title) for title in self.titles}
        
    def generate_response(self, prompt: str):
        # Tokenize the prompt and lemmatize each token
        tokens = self.tokenizer.tokenize(prompt)
        tokens = [self.lemmatizer.lemmatize(token) for token in tokens]
        
        # Search for articles that match the prompt
        matching_articles = []
        for title, content in self.articles.items():
            # Check if all tokens in the prompt are present in the article title
            if all(token in title.lower() for token in tokens):
                matching_articles.append((title, content))
        
        # If there are no matching articles, return a default response
        if not matching_articles:
            return "I'm sorry, I could not find any information on that topic."
        
        # If there is only one matching article, return the content of that article
        if len(matching_articles) == 1:
            return matching_articles[0][1]
        
        # If there are multiple matching articles, return a list of their titles
        else:
            response = "I found multiple articles on that topic. Here is a list of their titles:\n"
            for article in matching_articles:
                response += f"- {article[0]}\n"
            return response

Ve ek cevap:

chatbot = Chatbot()
response = chatbot.generate_response("What is the capital of France?")
print(response)  # "The capital of France is Paris."

Görüldüğü üzere aynı soruya farklı kodlarla cevap verip durmaya başladı. Tekrar sordum yine OpenAI servisi ile nasıl yapılacağını yazdı:

import openai_secret_manager
import openai
import re

assert "openai" in openai_secret_manager.get_services()
secrets = openai_secret_manager.get_secrets("openai")

print(secrets)
openai.api_key = secrets["api_key"]

# Load the Wikipedia articles dataset using the OpenAI API
articles_dataset = openai.Dataset.from_files(["https://d4mucfpksywv.cloudfront.net/wiki-pages/wiki-001.jsonl"])

# Create a new GPT-3 model and train it on the Wikipedia articles dataset
model = openai.Model.create(
    model="text-davinci-002",
    dataset=articles_dataset,
    name="my-trained-gpt3-model"
)


class Chatbot:
    def __init__(self, model_name: str):
        self.model_name = model_name
        self.model = openai.Model.get(model_name)
        self.tokenizer = openai.Tokenizer.create(self.model_name)
        
    def generate_response(self, prompt: str, temperature: float = 0.5, max_tokens: int = 64):
        # Tokenize the prompt and encode it for input to the GPT-3 model
        tokens = self.tokenizer.encode(prompt)
        input = openai.Completion.create(
            engine=self.model_name,
            prompt=tokens,
            temperature=temperature,
            max_tokens=max_tokens,
            top_p=1,
            frequency_penalty=0,
            presence_penalty=0
        )

        # Generate the response using the GPT-3 model
        response = self.model.completions(input)[0]
        
        # Decode the response and remove any leading or trailing whitespace
        response_text = self.tokenizer.decode(response.tokens, skip_special_tokens=True)
        response_text = response_text.strip()
        
        # Remove any additional sentence-ending punctuation
        response_text = re.sub(r"[.!?]+$", "", response_text)
        
        return response_text

chatbot = Chatbot("my-trained-gpt3-model")
response = chatbot.generate_response("What is the capital of France?")
print(response)  # "The capital of France is Paris."

Ama pes etmedim ve doğru cevabı alıncaya kadar tekrar tekrar sordum, işinize yarayabilir diye chatbot varyasyonlarını sizinle paylaşıyorum:

import nltk
from nltk.corpus import wikipedia
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet

# Download the NLTK data and the Wikipedia corpus
nltk.download("popular")

# Get the list of Wikipedia articles
articles = wikipedia.fileids()
titles = [title for title in articles if "wiki" in title]

# Store the content of each article as a string in a dictionary
# with the article title as the key
articles = {title: wikipedia.raw(title) for title in titles}

# Define a function to get the part of speech of a word
def get_pos(word: str):
    pos = wordnet.synsets(word)[0].pos()
    if pos == "n":
        return "noun"
    elif pos == "v":
        return "verb"
    elif pos == "a":
        return "adjective"
    elif pos == "r":
        return "adverb"
    else:
        return "unknown"


class Chatbot:
    def __init__(self):
        self.tokenizer = nltk.tokenize.TreebankWordTokenizer()
        self.lemmatizer = nltk.stem.WordNetLemmatizer()
        self.articles = articles
    
    def generate_response(self, prompt: str):
        # Tokenize the prompt and lemmatize each token
        tokens = self.tokenizer.tokenize(prompt)
        lemmas = [self.lemmatizer.lemmatize(token, get_pos(token)) for token in tokens]
        
        # Search for articles that match the prompt
        matching_articles = []
        for title, content in self.articles.items():
            # Check if all tokens in the prompt are present in the article title
            if all(lemma in title.lower() for lemma in lemmas):
                matching_articles.append((title, content))
        
        # If there are no matching articles, return a default response
        if not matching_articles:
            return "I'm sorry, I could not find any information on that topic."
        
        # If there is only one matching article, return the content of that article
        if len(matching_articles) == 1:
            return matching_articles[0][1]
        
        # If there are multiple matching articles, return a list of their titles
        else:
            response = "I found multiple articles on that topic. Here is a list of their titles:\n"
            for article in matching_articles:
                response += f"- {article[0]}\n"
            return response

chatbot = Chatbot()
response = chatbot.generate_response("What is the capital of France?")
print(response)  # "The capital of France is Paris."

Açıkçası ilk iskelet koduna bir türlü ulaşamadım. Ve sonra iskelet kodu kopyalayıp ChatGPT’ye bu kodu gelişmiş bir şekilde tamamlamasını istedim ve sonunda İŞTE ÇALIŞAN KOD:

import wikipedia
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

class Chatbot:
    def __init__(self):
        # Train the chatbot on Wikipedia articles
        articles = wikipedia.search("machine learning")
        text = ""
        for article in articles:
            text += wikipedia.summary(article)

        # Preprocess the text by lowercasing it, tokenizing it,
        # and creating a vocabulary of unique words
        self.text = text.lower()
        self.sentences = sent_tokenize(text)
        self.words = word_tokenize(text)
        self.vocab = set(self.words)

        # Create a bag-of-words representation of the text
        vectorizer = CountVectorizer()
        X = vectorizer.fit_transform(self.sentences)

        # Train a similarity model on the bag-of-words representation
        self.similarity_model = cosine_similarity(X)

    def get_response(self, input):
        # Preprocess the input by lowercasing it and tokenizing it
        input = input.lower()
        input_words = word_tokenize(input)

        # Compute the similarity scores between the input and all sentences
        # in the text using the trained model
        similarity_scores = self.similarity_model.dot(input_words)

        # Find the sentence with the highest similarity score
        best_match = self.sentences[similarity_scores.argmax()]

        # Return the response generated from the best matching sentence
        return best_match

chatbot = Chatbot()
response = chatbot.get_response("What is machine learning?")
print(response)  # "Machine learning is the scientific study of algorithms and statistical models that computer systems use to effectively perform a specific task without using explicit instructions, relying on patterns and inference instead. It is seen as a subset of artificial intelligence."

Wikipedia.Summary’i kullanmadan doğrudan articles’taki metinleri kullanmayı deneyin 😉

Mutlu kodlamalar 🙂

enGrehber: Web 3.0 Projesi


Merhaba sevgili takipçilerim,

Bir önceki makalemizde enGrehberin bir Big Data, Machine Learning ve Deep Learning projesi olduğundan bahsetmiştim.

Geçen zamanda enGrehberin 3. sürümü için aşağıdaki Web 3.0 teknolojilerini kullanacağımız kesinleşti:

  1. Mobil için React Native
  2. Web için React
  3. Üyelik sistemi olarak SSI (Trinsic) kullanacağız, ve geleneksel kullanıcı adı ve şifre üyeliğini Smart Contract’larla implemente edeceğiz. Ama kişisel verileri Cassandra’da depolamamız gerekiyor.
  4. Backend’in %90’ını Ethereum Smart Contract’ları ile hazırlayacağız. Geliştirim için NodeJS, Solidity ve Truffle kullanacağız.
  5. Verileri decentralized Cassandra veritabanında depolayacağız. Tabi Smart Contract’lar ile Cassandra’yı konuşturmayı başarmamız lazım.
  6. Video ve resimleri IPFS ile depolayacağız. Yani Storage çözümümüz de Blockchain üzerinde olacak.
  7. Yapay Zeka için merkezi Python backend, Bot Framework, Azure Bot Service ve Google Dialogflow kullanacağız.

Böyle yaptığımızda Frontend %90 oranında Trinsic ve DApp ile konuşacak. Böylece tüm uygulamanın %90’ı merkeziyetsiz Web 3.0 olarak çalışacak. Ama merkezi Python backend tarafı eski tekniklerle çalışmaya devam edecek.

Mutlu kodlamalar 🙂

enGrehber: Big Data, Machine Learning ve Deep Learning Projesi


Merhaba değerli takipçilerim,

İçişleri Bakanlığı sponsorluğunda devam eden enGrehber projesi için hangi teknolojileri kullanmam gerektiği konusunda nihai kararı verdiğime inanıyorum.

Öncelikle öğrenme güdüsüyle, çözüme en kısa yoldan ulaşma hedefi arasında sağlıklı karar vermek gerekiyor. Öğrenme amacıyla bulaştığımız teknolojiler böylesine bir projeyi bitmek bilmez ve yıldırıcı bir engele dönüştürme ihtimali vardır.

  1. Big Data, Machine Learning ve Deep Learning projelerinde Python tercih edilir. Ben de o yüzden Backend katmanını tamamen Python’la hazırlamaya karar verdim. Daha önce .NET Core ile hazırladığım backendi Python’a dönüştüreceğim. Böylece on-premise yapay zeka çözümü geliştirmek mümkün olacak. IoT projelerinde de big data söz konusudur. Milyonlarca küçük cihazdan akan verilerin depolanması ve bunlar üzerinde yapılan madencilik ve analiz çalışmalarında Python’un güçlü olduğunu ve yaygın olarak kullanıldığını biliyoruz.
  2. Big Data projelerinde HBase, Cassandra ve MongoDB veritabanları tercih edilir. HBase’de yüksek performanslı sorgulama yapmak isterseniz yabancı olduğum değişik bir protokol kullanmanız gerekiyor. MongoDB ise çok büyük projeler için uygun değil çünkü hem yüksek transaction desteklemiyor hem de satır başına veri büyüklüğü en fazla 16 MB olduğu için veritabanında resim ve video depolamanız neredeyse olanaksız. Ama Cassandra hem SQL’e çok benzeyen CQL sayesinde kolayca kullanılabilir hem de küçük dosyaları Cassandra’da depolayabiliyoruz.
  3. BlockChain projelerinde NodeJS ve Solidity kullanılmaktadır. Ethereum blockchain PoW, PoS ve PoA algoritmalarının tümünü desteklemektedir. Biz yüksek performans için PoA tercih edeceğiz. HyperLedger Besu, Truffle, NodeJS ve Solidity ile DApp uygulamamızı hazırlayabiliyoruz.
  4. Hybrid mi Native mi? Kesinlikle Native ama bir sorun var. Tasarım yapamıyorum ve React Native’in gerçekten çok inatçı bugları var. O yüzden React/Ionic‘teki mevcut tasarımla devam edersem hem web hem de mobilin ikisini birden çıkarmak bana acayip zaman kazandırıyor. Tek çalışma yapıyorum web ve mobil hazır oluyor. Dezavantajı nedir peki? Ionic projeleri telefonlarda biraz yavaş çalışıyor, aslında proje büyük olursa bu yavaşlığı belirgin derecede hissedebiliyorsunuz. Ancak Facebook ve Twitter dahi hybrid uygulamayla piyasada bulunuyor. Native’e geçmeyi gelecekte tekrar düşüneceğiz, öncelikli hedefim toplamdaki çalışmayı hızlandırmak.

    Burada bir sorunumuz daha var: Her ne kadar Twitter ve Facebook uygulamaları hybrid te olsa Jitsi toplantı uygulaması mobilde React Native ile yapılmış. Video ve animasyon içeren uygulamaların native olması önemli bir performans getirisi sağlıyor. Ancak daha önceki testlerimde hybrid mobil uygulamaların 4 adet canlı videoyu aynı anda görüntüleyebildiğini tespit ettim, ısınma sorunları oluyor ama Ionic ile canlı toplantıyı başarabiliriz.

    Buradaki bir diğer sorun Ionic ile toplantı yapılırken arama geldiğinde veya görüşme arka plana alındığında problemler oluşuyor olması. Ancak bu problemler React Native’de de var.

    Ionic ile ilgili bir diğer problem: bildirimler. Web push bildirimleri iOS’ta çalışmıyor ve Firebase kütüphaneleri gerçekten sıkıntılı, sanırım bu konuyu profesyonel bir firmadan bildirim hizmeti alarak çözeceğiz.

    Ayrıca Ionic’te güvenlik te önemli bir sorun, bu konuda öncelikle şuraya bakılması gerekiyor: https://cordova.apache.org/docs/en/4.0.0/guide/appdev/security/index.html
  5. Dosya Storage’ı için BlockChain tabanlı IPFS‘e bakacağım. IPFS en iyi GoLang’le çalışıyor ama NodeJS de destekliyor.
  6. Mimari nasıl olmalı? Kesinlikle mikro servis mimarisi olmalı. Çünkü mikro servis mimarisi yüksek yük kaldırabiliyor. Sanallaştırma için Kubernetes ve Docker tercih ediyorum. Yerelde Minikube ile çalışma yapmak mümkün. Ayrıca kod mimarisi için NX kullanacağım, buna kesin karar verdim. NX’in Python’la sıkıntısı var, ama bunu aşmayı başardım.

Stratejimiz Ne?

Neden bu teknolojileri tercih ettik?

Bu tercihlerimle projemizi ister yurtdışı bulutunda, istersem Ethereum MainNet’inde istersem de yurtiçi bulutunda deploy edebiliyorum. Ki nihayi hedefimiz yurtiçi bulutuna taşınmak olduğu için tercihlerimi böyle yaptım.

Media Server kullanacak mıyız?

Güvenlik için media server çok gerekli. Fakat muazzam bir bant-genişliği maliyetine neden oluyor. O yüzden başlangıçta Media Server kullanmayacağız. Böylece bu projeyi TV reklamlarında görseniz dahi gelen trafiği kolay müdahelelerle kaldırabilecek şekilde tasarlayacağım.

gRPC kullanmayacağız, Rest ve WebSockets kullanacağız, ama neden?

Anlık mesajlaşma bölümünde ve Mikro servis mimarisinde iletişim için gRPC kullanmayacağız Rest ve WebSockets kullanacağız. gRPC yerine WebSocket’i tercih ediyorum çünkü gRPC realtime değil.

ÖZET:

enGrehber’in yeni sürümünde kullanacağımız teknolojiler özetle şöyle:

  1. Python
  2. React/Ionic
  3. NodeJS ve Solidity
  4. Cassandra

Mutlu kodlamalar 🙂

Nitelikli Bilişim Uzmanı Yetiştirme Eğitimleri


Merhaba değerli takipçilerim;

Bildiğiniz üzere ben eskiden İş-Kur Nitelikli Bilişim Uzmanı Eğitimcisiydim. Ancak o sektörü bıraktım, şu an yazılımcıyım.

Fakat geçen zamanda yazılım dünyası öyle hızlı gelişti ki, bizler all-in-one developerlar olmaya zorlandık. Ancak bu akşam bunun pek te mümkün olmadığını anladım.

Genç öğrencilere tavsiyelerde bulunacağım. Bilişimde ya tasarımcısınızdır, ya donanımcısınızdır, ya yazılımcısınızdır, ya içerikçisinizdir ya da yöneticisinizdir.

Hemen yöneticiliğe kalkışmayın, yöneticilik olgunluk ve saygınlık ister, ileri yaşlarda tercih edilmesi daha doğru olur.

Tasarım ve İçerik alanlarıyla pek ilgilenmiyorum. Tasarımda Photoshop gibi Adobe yazılımları daha çok tercih edilirken, içerikte Metin Yazarlığı, Sosyal Medya Yönetimi gibi alanlar var.

Donanımla da pek ilgilenmiyorum. Burada Sistem, Ağ ve Siber Güvenlik alanları var. Ayrıca Devops Mühendisleri ile de yakınlığı var. Bir de SEO alanı var, bu da Satış ve Pazarlama ile ilgili bir alan, İçerik alanını da ilgilendiriyor çünkü Google içeriğe de bakıyor.

Eğer Proje Yöneticisiyseniz PMP ve Agile Scrum bilmeniz gerekir.

Benim asıl ilgilendiğim kısım YAZILIM. İş-Kur eğitimlerinde Yazılım eğitimi all-in-one bir eğitimdi. Hala da öyle. Ancak sonradan o kadar çok teknoloji gelişti ki bu yazılım alanının birden fazla mesleğe ve eğitime ayrıştırılması zorunluluk hale geldi.

Ne Gibi?

Öncelikle Yazılım Mimarı diye bir meslek var. Ne yapar? Büyük bir projeyi ayrıntılarıyla teknik olarak tasarlar. Bu proje hangi teknolojilerle yapılmalıdır, hangi mimarisel tasarım kalıpları kullanılmalıdır bunlara karar verir.

Yazılımla İlgili Meslekler ve Eğitimleri:

  1. Proje Yöneticisi/Scrum Master:
    Proje planlama ve yönetimini bilir, metodolojilerini bilir, projeyi Agile Scrum gibi metodolojilerle yürütür ve zamanında teslim eder.
  2. Yazılım Mimarı:
    Büyük projelerin teknolojilerini ve teknik bileşenlerini entegrasyonlarıyla birlikte planlar ve tasarlar. Mimarisel Tasarım Kalıplarına hakimdir.
  3. Ağ ve Siber Güvenlik Uzmanı:
    Bir firmanın tüm networkü istemci ve sunucu bilgisayarlarını kurabilir, bakım ve tamirini yapabilir, network kurulumunu, kablolu ve kablosuz ağ kurumlarını, yazıcıları, telefonları, switch’leri ve diğer gerekli tüm donanımları kurup ayarlayabilir ve tüm sistemin siber saldırılara, yapay zeka saldırılarına karşı güvenliğini ve yedeklemesini sağlar. En azından Azure bilir.
  4. Devops Uzmanı:
    Yazılım ekibinin çalışma ortamını hazırlar ve bakımını yapar, CI/CD altyapısını kurar, sanallaştırma teknolojilerine çok hakimdir, Docker, Kubernetes ve OpenShift bilir, bunların bakım ve güvenliğinden sorumludur. Production’daki sanallaştırma ve güncellemeleri yönetir.
  5. Frontend Geliştirici:
    HTML, CSS, JavaScript, Bootstrap, jQuery, TypeScript, Angular, React, Vue teknolojilerini bilir, ayrıca erişilebilirlik standartlarından anlar, tasarımı parçalayıp frontend uygulamanın bileşenlerine çevirir. WebRTC, WebXR, WebSocket, Rest, gRPC gibi teknolojilerin frontend taraflarını bilir.
  6. Backend Geliştirici:
    Java Spring uzmanıdır. Veritabanı olarak MongoDB, Cassandra gibi Big Data veritabanları tercih edilir. Design Patternleri, Unit Test’i bilir ve IoT bilir.
  7. Full Stack Geliştirici:
    MongoDB, Express, NodeJS, React uzmanıdır. Mobil de eklenecekse React Native öğretilir.
  8. Mobil Uygulama Geliştiricisi:
    Hybrid ve Native uygulama konseptlerini bilir, React Native (TypeScript) uzmanıdır, Flutter da öğretilebilir. React Native expo ile birlikte kullanıldığında Mac gerektirmeden doğrudan iPhone’da test edilebilir.
  9. Yapay Zeka Geliştiricisi:
    Python FastAPI ile yapay zeka, makine öğrenmesi, derin öğrenme alanlarında uzmandır. NLP ve Tensorflow da bilir. Robotlar ve Yapay Zeka çipleri ve donanımlarıyla da çalışabilir.
  10. BlockChain Geliştiricisi:
    Decentralized ID’ler, Decentralized Uygulamalar, DeFi ve NFT hakkında uzmandır. NodeJS, Truffle, HyperLedger Fabric, HyperLedger Besu ve Solidity bilir.
  11. Oyun Geliştiricisi:
    Unreal Engine, AR/VR ve Metaverse uzmanıdır. Swift ve Java/Kotlin ile native mobil oyun yazabilir.
  12. Veri Bilimi ve İş Zekası Uzmanı:
    Veri bilimi denildiğinde akla Python gelir. Python ve ilgili kütüphaneleri ile Big Data (MongoDB) ve SQL Server gibi veritabanlarında veri analizi ve iş zekası (Power BI) çalışmalarında uzmandır.
  13. Yazılım Test Uzmanı:
    End2End test otomasyonu yazabilir. Selenium bilir, BrowserStack bilir, test senaryolarını yazar, test datası vardır, mobil uygulama testlerinin nasıl yapıldığını bilir.
  14. ERP Uzmanı:
    Microsoft, Logo, SAP’nin ERP yazılımlarını bilir; ve bunlar için yazılım geliştirebilir.

Sanırım bu kadar. C# neden yok? C# yapay zeka, veri bilimi ve blockchain’de henüz başarılı olamadı. Java, Python ve NodeJS daha popüler. Gençlerin buna ayak uydurması lazım. Ancak C#’tan vazgeçmeyeceksek onu nasıl konumlandırabiliriz? Backend Geliştirici (C#) diye bir eğitim olabilir.

Git, GitHub ve Firebase gibi teknolojileri tüm yazılımcıların bilmesi gerekir. Yani en azından frontendin Firebase’de bedava host edilebileceği ve Firebase’in ücretsiz mesajlaşma servisi anlatılmalıdır.

Mutlu kodlamalar 🙂