Depoda Başarıyı Kodlamak — Üretken Yapay Zekâ ve Analitiğin Harmanlanması

Şükrü İmre, PhD
9 min readOct 26, 2024

Son zamanlarda perakende, e-ticaret başta olmak çeşitli sektörlerde Üretken Yapay Zekadan (ÜYZ) yararlanılarak inşa edilen çözümler yaygınlaşıyor. Bu çözümler genellikle chat bot, doküman özetleme seviyesinde kalırken, analitik çalışmalarla harmanlanarak baştan uca çözümlerin sayısı az olsa da geliştiriliyor. Bu yazı tanımladığı use case ile bir probleme özgü çözümün oluşturulurken analitik yaklaşımın içerisinde ÜYZ’den yararlanmayı amaçlıyor. Bu use case, depo içi ürün toplama sürecindeki performans ölçülmesine yardımcı olacak analitik yaklaşımın geliştirilmesini ve ölçülen performansın haftalık olarak değerlendirilip ÜYZ ile tebrik mesajlarının üretilmesini odağına alıyor.

Use Case Tanımı

Bir perakende firmasının perakende ve e-ticaret alanlarında faaliyet gösterdiğini ve farklı lokasyonlarda depoları olduğu varsayalım. Depolar içerisinde ürün kabul, ürün yerleştirme, ürün toplama gibi pek çok süreç vardır. Depo içi ürün toplama sürecine odaklanarak sorumlu yöneticinin aşağıdaki problemini için çözüm oluşturmayı amaçlıyorum.

Günlük yapılan toplamalardan hareketle depo bazlı haftalık toplama performansını değerlendirip ve her hafta performansı yüksek olan ilk üç toplayıcıyı belirleyip otomatik olarak tebrik mesajı oluşturulabilir mi?

Bu araştırma sorusunu cevaplayabilmek için oluşturulan analitik çözüm yaklaşımı aşağıdaki adımları içermektedir:

1- Günlük verilerden hareketle toplayıcıların haftalık performansını belirleyecek toplamayı niteleyen metriklerin belirlenmesi ve verinin oluşturulması

2- Haftalık performans ölçüm yönteminin geliştirilmesi

3- Geliştirilen yönteme göre ilk üç toplayıcının tespit edilmesi

4- ÜYZ ile haftalık en iyi performans gösteren toplayıcılar için tebrik mesajlarının üretilmesi

Veri

Ürün toplama sürecindeki toplama işi, toplayıcıya atanan iş emri bazında olur. Bir iş emri, sırasıyla toplayıcıya hangi ürünü hangi lokasyondan kaç adet alacağını gösteren aksiyonlar zinciridir. Bir toplayıcı bir günde birden fazla iş emri gerçekleştirebilir. İş emrine sektörde tur da deniliyor. Bu yazı kapsamında tek depoda gerçekleştirilen toplama özelinde ilerlenmiştir.

Bir toplayıcının performansını ölçebilmek, toplamayı betimleyen ve diğer toplayıcılarla kıyaslayabilecek göstergelere ihtiyaç bulunur.

Bu göstergeler arasında toplanan ürün, toplanan ürün ağırlığı, yürüme mesafesi yer alır.

Bir günde birden fazla toplama yapılacağı için bu göstergelerin hepsi iş emri bazında çeşitlenir. Bir depoda gerçekleştirilen günlük ham toplamalara ait veri Tablo 1’de gösterilmiştir.

Tablo 1. Günlük Toplama Veri Deseni

Verideki sütunlar aşağıdaki gibi tanımlanmıştır.

  • Tarih: Toplama yapılan gün
  • Operator ID (toplayıcı): Toplama yapan personel
  • İş Emri ID (tur): Personelin toplama yapacağı ürün ve lokasyon bilgisini içeren sıralı aksiyon zinciri
  • Toplanan Ürün Miktarı: İş emri bazında toplanan ürün miktarı (adet)
  • Toplanan Ürün Ağırlığı: İş emri bazında toplam ürün ağırlığı (kg)
  • Yürüme Mesafesi: İş emrini gerçekleştirmek için kat edilen mesafe (m)
  • Toplama Süresi: İş emrinin başlangıcından tamamlanmasına kadar geçen süre

Bu veriler sentetik olarak aşağıdaki Python kodu ile üretilmiştir. Kod içerisindeki verinin nasıl oluşturulduğuna yönelik bilgilere (bir operator maks 7 saat toplama yapar vb.) yer verilmiştir.

import random
import pandas as pd
from datetime import datetime, timedelta

# Parametreler
num_operators = 10 # Operatör sayısı
num_days = 360 # Gün sayısı
max_daily_time = 420 # Maksimum toplama süresi (dakika)
orders_per_day_range = (10, 20) # Günlük tamamlanan iş emri aralığı

# Ürün ve ağırlık aralıkları
product_quantity_range = (5, 50) # Toplanan ürün miktarı aralığı
product_weight_per_unit_range = (0.5, 5) # Birim ürün ağırlık aralığı (kg)
walking_distance_range = (50, 500) # Yürüme mesafesi aralığı (metre)

# Veri
data = []
start_date = datetime.now() - timedelta(days=num_days)

for day in range(num_days):
current_date = start_date + timedelta(days=day)
for operator_id in range(1, num_operators + 1):
total_time_spent = 0
orders_today = random.randint(*orders_per_day_range)

for order_id in range(1, orders_today + 1):
product_quantity = random.randint(*product_quantity_range)
weight_per_product = random.uniform(*product_weight_per_unit_range)
total_weight = product_quantity * weight_per_product
walking_distance = random.uniform(*walking_distance_range)

# Toplama süresi: ürün ağırlığı, miktar ve yürüme mesafesi ile orantılı bir süre hesaplama
collection_time = (total_weight * 0.1) + (walking_distance * 0.05) + (product_quantity * 0.2)

# Toplama süresi günlük maksimum süreyi aşarsa döngüyü kır
if total_time_spent + collection_time > max_daily_time:
break

total_time_spent += collection_time

# Veriyi listeye ekle
data.append({
"Tarih": current_date.date(),
"Operator ID": operator_id,
"İş Emri ID": f"{current_date.strftime('%Y%m%d')}-{operator_id}-{order_id}",
"Toplanan Ürün Miktarı": product_quantity,
"Toplanan Ürün Ağırlığı (kg)": round(total_weight, 2),
"Yürüme Mesafesi (m)": round(walking_distance, 2),
"Toplama Süresi (dk)": round(collection_time, 2)
})

# DataFrame'e dönüştür ve CSV'ye kaydet
df = pd.DataFrame(data)

Performans Ölçüm Yaklaşımı

Depo yöneticinin problemini (araştırma sorusunu) çözebilmek için analitik bir yaklaşım geliştirmek mümkün. Yukarıdaki Python scripti ile sentetik veri oluştu. Günlük olarak elde var olan veriden belirlenecek yaklaşımla haftalık performans hesaplanması gerekmektedir. Daha sonra belirlenen yöntemle haftalık olarak ilk üç personelin belirlenmesi adımı gelecektir.

İş emrinin içeriğinde farklı özellikte ürünler olabilir. Toplama yapılacak ürünler farklı ağırlıklarda olabilir. Bir diğer deyişle, bir ürün kaban ve mont gibi ağır ürünlerden oluşabilirken toka, taç gibi çok hafif ürünlerden de oluşabilir. Buna ek olarak bir iş emri deponun belirli bir alanında toplanabilecek şekilde konumlanmışken çok farklı alanlarda da konumlandırılmış olabilir. Bu bilgiler ışığında basit bir performans ölçüm yaklaşımı için toplanan ürün ağırlığı ve kat edilen mesafe dikkate alınabilir. Başka göstergeler dahil edilerek de bu yöntem geliştirilebilir. Bu yazı kapsamında, basit ve yalın olması açısından bu iki göstergeyle dikkate alınacak.

Operatörün toplam topladığı ağırlık ne kadar fazlaysa performans skoru o kadar yüksek olabilir. Ancak operatörün yürüme mesafesi çok yüksekse, daha düşük bir verimle çalıştığını gösterebilir (verimsiz rota izlenmesi vs.). Bu yüzden yürüme mesafesi skoru dengeleyecek şekilde negatif etkili olabilir. Ürün ağırlığı için 0.7 ve toplam mesafe için 0,3 ağırlığı kullanılarak aşağıdaki denklem yardımıyla bir performasn skor hesaplaması yapılır.

Bu hesaplamaya göre oluşan skorlar 0 ile 100 arasında puanlama olacak şekilde aşağıdaki denklemle dönüştürülür.

100, toplayıcının çok iyi performans gösterdiğini ifade ederken, puanın düşmesi ile performansın düşmesi zuhur eder. Bunun hesabı için bir Python fonksiyonu aşağıdaki gibidir.

def haftalik_performans(df, start_date, end_date):
# Veriyi belirtilen tarih aralığına filtrele
df['Tarih'] = pd.to_datetime(df['Tarih'])
df_filtered = df[(df['Tarih'] >= start_date) & (df['Tarih'] <= end_date)]

# Operatör bazında toplam ağırlık ve toplam yürüme mesafesini hesapla
operator_performance = df_filtered.groupby('Operator ID').agg({
'Toplanan Ürün Ağırlığı (kg)': 'sum',
'Yürüme Mesafesi (m)': 'sum'
}).reset_index()

# Performans skoru hesapla (Ağırlık x 0.7, Mesafe x 0.3)
operator_performance['Performans Skoru'] = (
operator_performance['Toplanan Ürün Ağırlığı (kg)'] * 0.7 -
operator_performance['Yürüme Mesafesi (m)'] * 0.3
)

# Performans skorlarını 0-100 aralığına normalize et
min_score = operator_performance['Performans Skoru'].min()
max_score = operator_performance['Performans Skoru'].max()

operator_performance['Normalleştirilmiş Skor'] = 100 * (
(operator_performance['Performans Skoru'] - min_score) /
(max_score - min_score)
)

# Performans skoruna göre sıralama yap ve ilk 3 operatörü seç
top_3_operators = operator_performance.sort_values(by='Normalleştirilmiş Skor', ascending=False).head(3)

return top_3_operators

Şimdi oluşan bu puanlara göre belirtilen hafta bilgisine göre performansı en iyi olan ilk 3 operatoru belirlemek kalıyor. Bunu belirleyen Python kodu aşağıdaki gibidir.

def haftanin_ilk_uc_personeli(df, year, week):
start_date = pd.to_datetime(f'{year}-W{week - 1}-1', format="%Y-W%W-%w")
end_date = start_date + pd.Timedelta(days=6)

top_3_operators = haftalik_performans(df, start_date, end_date)

return top_3_operators

# Örnek: 2023 yılının 42. haftası için ilk 3 operatörü seç
top_3_operators=haftanin_ilk_uc_personeli(df, 2024, 42)
top_3_operators.head()

Python fonksiyonlarının çalıştırılması ile 2024'ün 42. haftası için oluşan performansa göre en iyi performans gösteren ilk üç personel Tablo 2'de gösterilmiştir.

Tablo 2. Performansı iyi olan üç operator

ÜYZ ile Tebrik Mesajının Üretilmesi

Günlük verilerden hareketle belirli bir hafta için en yüksek performans gösteren üç personele için LLM (Büyük Dil Modelleri) kullanılarak tebrik metinleri üretilir. LLM’ler arasında Llama 3.1, Gemma gibi birçok seçenek bulunsa da bu yazıda OpenAI’nın GPT-3.5 modelinden yararlanıldı. Tebrik mesajı üretiminde, bir standart yapı belirlenerek LLM’nin davranışını belirleyen bazı temel parametreler dikkate alınmıştır.

LLM modellerine genellikle girdi olan parametrelere değinecek olursak:

  • System ve user rolleri, modele verilen talimatların yapısını belirler. System rolü, modelin genel görev tanımını yapar, örneğin “depo yöneticisine yardımcı olan bir asistan” gibi.
  • User rolü ise hazırlanacak tebrik mesajların içeriği, formatı ve dili hakkında talimatları içerir.
  • Modele verilen bir diğer parametere Temperature’dur. Bu parametre üretilen metnin yaratıcılığının derece olarak adlandırılabilir. 0 ile 1 arasında değişen bu değere göre model yaratıcı (1’e yakın) ya da tutarlı (0’ a yakın) metinler üretir.
  • Max token parametresi ise üretilecek metnin uzunluğunu sınırlar.

Aşağıdaki Python scriptinde tebrik mesajını üreten kod bloğu paylaşılmıştır.

import openai

# OpenAI API anahtarını ayarla
openai.api_key = 'YOUR_API_KEY' # Buraya kendi OpenAI API anahtarınızı koyun


# GPT ile tebrik mesajları oluşturma fonksiyonu
def gpt_tebrik_mesajlari(top_3_operators):
tebrikler = []

# Her operatör için GPT-3.5-turbo modelinden cevap al
for idx, operator in top_3_operators.iterrows():
operator_id = int(operator['Operator ID'])

# Mesajı oluşturmak için talimatlar
talimatlar = f"""
Aşağıdaki verilerle her operatör için kısa bir tebrik mesajı oluşturacaksın:
- Operatör ID: {operator_id}
- Toplanan ürün ağırlığı: {operator['Toplanan Ürün Ağırlığı (kg)']} kg
- Yürüme mesafesi: {operator['Yürüme Mesafesi (m)']} m
- Performans skoru: {operator['Normalleştirilmiş Skor']:.2f}

Talimatlar:
1. Kibar ve profesyonel bir dille yaz.
2. Operatörün adı yerine Operatör ID kullan.
3. Mesajda yalnızca iki cümlede tebrik et.
4. Mesajlar örnek formattaki gibi kısa ve odaklı olsun.
5. Her cümle tek satırda yaz ve emoji kullan.
6. Tamamlayıcı veya açıklayıcı ekstra mesajlar ekleme.
7- "Operator ID", "Toplanan ürün ağırlığı", "Yürüme mesafesi" ve "Performans skoru" bilgisini alarak örnek tebrik mesajını dikkate alarak oluştur.

Örnek mesaj: "Merhaba Operatör ID 1, Senin performansından çok memnunum. Bu performans ile organizasyonumuza değer katıyorsun. Sevgilerimizle, Depo Yönetimi"
"""


try:
# GPT-3.5-turbo modeline istek gönder
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "Sen bir depo operasyon yöneticisine yardımcı olan bir asistansın."},
{"role": "user", "content": talimatlar}
],
n=1,
temperature=0.6
)

# Mesajı al
tebrik_operator = response['choices'][0]['message']['content'].strip()

# Cümleleri ayrı satırlara yerleştirerek formatla
formatlanmış_mesaj = f"Merhaba Operatör ID {operator_id},\n" + tebrik_operator + "\nSevgilerimizle,\nDepo Yönetimi"

tebrikler.append((operator_id, formatlanmış_mesaj))

except Exception as e:
print(f"Operatör ID {operator_id} için mesaj oluşturulurken bir hata oluştu: {e}")
tebrikler.append((operator_id, "Mesaj oluşturulamadı")) # Hata durumunda boş mesaj ekle

# DataFrame oluştur
tebrik_df = pd.DataFrame(tebrikler, columns=['Operatör ID', 'Tebrik Mesajı'])

return tebrik_df

# Örnek: 2024 yılının 42. haftası için tebrik mesajlarını oluşturma
top_3_operators = haftanin_ilk_uc_personeli(df, 2024, 42)
tebrik_df = gpt_tebrik_mesajlari(top_3_operators)

# Her bir operatör için tebrik mesajını yazdır
for index, row in tebrik_df.iterrows():
print(f"Operatör ID: {row['Operatör ID']}\n{row['Tebrik Mesajı']}\n")

Python scripti incelendiğinde modelin belirlenen parametrelere göre metin üretilmesine vesile olan openai.ChatCompletion.create() fonksiyonu ile karşılaşılır. Bu fonksiyonu kullanarak belirlenen üç operatör için kibar ve motive edici bir tebrik mesajı üretilecektir. Bu fonksiyon ilk aldığı parametre modeldir, hangi pre-trained model kullanılacağı bilgisini alır. Bu yazı kapsamında model=”gpt-3.5-turbo” kullanıldı.

Bir diğer parametre, messages olup modelin nasıl bir içerik üretmesinin belirlediği çerçevenin tanımlanmasına yardımcı olur. Bu yazı kapsamında iki rolde “system” ve “user” içerisinde yönlendirmeler yapılmıştır. Modelin davranışını “role”: “system” ile verilir. Yazı kapsamında, modele “Sen bir depo operasyon yöneticisine yardımcı olan bir asistansın.” girdisi veriliyor bu şekilde davranması isteniyor. Use case tasarlayanın domain bilgisiyle vereceği talimatlar “role”: “user” kısmında yer buluyor. Bu parametre aracılığı ile talimatların detaylı bir şekilde iletilir ve domain sahibinin yönlendirmelerini içerir. Örneğin, üretilen tebrik içerisinde operatör ID, toplanan ürün ağırlığı, yürüme mesafesi ve performans skoru gibi göstergeler kullanılarak metinlerin üretilmesi yönünde yönlendirme yapılmıştır. Yukarıdaki kod içerisinde diğer yönlendirmeler de açıkça gösterilmiştir. Uzman ihtiyacına veya uğraştığı problemin çözüme yönelik üslupla talimatları ince ince işleyerek oluşturmalıdır.

Üretilen sonuçlar aşağıdaki gibidir. Bu sonuçları depo yöneticisi doğrudan alıp toplayıcılara iletebilir veya arkasına bir sistem tanımlanarak otomatik bir şekilde onayına sunulur ve sonra operatörlerin ilgili iletişim araçlarına düşecek şekilde bir yapı kurulabilir.

Kod içerisinde verilen talimat ve parametrelerle, tebrik mesajlarının profesyonel, motive edici ve standart bir formatta üretilmesi sağlanmıştır.

Sonuç

Bu yazıda Üretken Yapay Zekâ’nın (ÜYZ), analitik çözümlerle nasıl uyum içinde çalışarak çözümler üretebileceğine dair basit ama etkili bir kullanım örneği sundum. ÜYZ’nin bu tür problem çözme süreçlerine dahil edilmesi, yalnızca günlük operasyonel yükleri hafifletmekle kalmaz; organizasyona maddi açıdan da büyük katkılar sağlayacak potansiyele sahiptir. Özellikle analitik düşünebilen, iş problemlerini iyi tanıyan, teknolojik araçları yerinde kullanabilen uzmanlar, ÜYZ’yi başarıyla yönlendirebilir — tıpkı bir orkestra şefinin her enstrümanı doğru anda devreye sokması gibi. Şef, hangi çalgının nerede çalacağını önceden bilir ve orkestranın bütününü bu bilgiyle yönetir. Bu becerilere sahip bir uzmanın geliştireceği her kullanım örneği, ÜYZ’nin geniş bir çözüm yelpazesinde etkili bir araç olarak kullanılmasına imkan tanıyacaktır. ÜYZ ve analitiğin birlikte iş süreçlerine yüksek düzeyde katkı sağlayacağına gönülden inanıyorum.

Bu alanda kendini geliştirmek okuyucularıma bazı eğitim önerilerim bulunuyor. Udacity’den Doğal Dil İşleme (NLP) ve Üretken Yapay Zekan (Gen AI) temellerini öğreten kurslar, ÜYZ’nin neler yapabileceğini teorik bilgi ve pratik uygulamalarla keşfetmek için iyi bir başlangıç olacağı kanısındayım. Alan çok geniş olduğu için düzenli okumalar ve işteki projelerle öğrenilen alana özgü bilgi birikiminizle de yaratıcı fikirlerle geliştirebilir ve tüm bildiklerinizi harmanlayabilirsiniz. En önemlisi, iyi bir problem tanımlayıcı olmak ve sonrasında bu probleme yönelik analitik çözümler inşa ederek, teknolojinin sunduğu imkanlardan nasıl faydalanabileceğinizi düşünmektir. Bu yolculukta sürekli öğrenme, sorgulama ve yaratıcı düşünme becerileri en değerli yol arkadaşlarınız olacaktır.

Dr. Şükrü İmre

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Şükrü İmre, PhD
Şükrü İmre, PhD

Written by Şükrü İmre, PhD

// Head of Data Science at Yapı Kredi Bank // Guest Lecturer at MEF University // Author at Harvard Business Review Türkiye // Author at Medium

Responses (1)

Write a response

Yazi icin tesekkurler.
Fakat bir sey eklemek isterim, Udacity kurslari cok pahali (ben us de yasamama ragmen oyle geliyor), free ortamlarda bulunmayacak muazzam bir kurs degil. Oradan yaklasik 2-3 kurs bitirdim. Kolayliklar.