Veri, Analitik ve LLM Üçgeninde İş Süreçlerine Çözümler — Optimizasyon Örneği

Şükrü İmre, PhD
7 min readNov 6, 2024

--

Büyük dil modelleri (LLM), sadece istenen bilgi veya içerikleri üretmenin ötesinde, verilen talimatlar doğrultusunda analitik çözümler üretmeye sahip güçlü bir teknolojik araç. Bu yazıda, daha önce optimizasyon modeliyle çözdüğüm bir problemi, LLM ve prompt engineering kullanarak yeniden ele aldım. Temel amacım, optimizasyon modelinin ulaştığı çözüme LLM’in yaklaşıp yaklaşmayacağını görmektir. Optimizasyon modelinin temelini oluşturan karar değişkenleri, kısıtları ve amaç fonksiyonunu uygun bir prompt tasarımına dönüştürerek, LLM’den istediğim formatta çıktı elde etmeyi hedefliyorum. Belirli bir örnek olay üzerinden derinlemesine incelediğim bu çalışmayla, LLM teknolojisinin iş dünyasındaki çeşitli problemlerin çözümüne nasıl katkı sunabileceğini keşfetmeye çalışıyorum. Bu yazı, organizasyonlara veri analizi, iş yükü dağıtımı veya tasarlanan algoritmanın uygulanması gibi süreçlerde LLM tabanlı çözümler geliştirmenin kapılarını aralıyor.

Problem Tanımı

Bu yazıda ele alınan problem ve veri seti, daha önce kaleme aldığım “Dengeli İş Atama — Optimizasyon Model Örneği” başlıklı çalışmadaki örnek olayla birebir aynıdır. Özetle yazıda belirtildiği üzere; depo operasyon yönetimi, toplayıcılara (operatörlere) iş emirlerini (turları), hakkaniyetli bir şekilde dağıtmak ister. Her tur, toplanacak ürünlerin adet ve hacim (desi) bilgilerini içerir. Operatörler, kendilerine atanan bu işleri, depo içinde belirlenen konumlara giderek ürünleri toplar ve her turun sonunda ürünleri paketleme alanına bırakır. Bu döngü, gün boyunca tüm turlar bitene kadar devam eder ve gün sonunda tüm operatörlerin benzer seviyede iş emri almış olması beklenir. Ancak, iş emirleri içerisindeki ürün-mağaza dağılımından, toplama hacimleri ve ürünlerin konumları farklılık gösterebilir. Bu nedenle, operatörler arasında eşit bir iş yükü dağılımı sağlamak her zaman kolay olmaz. Analitik departman, bu adil dağılımı sağlamak için operatör bazında dengeli miktar, hacim ve tur sayısını dikkate alan bir iş atama modeli geliştirmiştir; model sonuçları Tablo 1'de sunulmuştur.

Tablo 1. Optimizasyon Model Sonucu

Bu çalışmanın temel araştırma sorusu:

“Aynı veri setini kullanarak optimizasyon modeliyle elde edilen çözüm, LLM kullanılarak tasarlanan prompt ile benzer sonuçlar verebilir mi?”

Bu şekilde, LLM ile yapılan atamaları optimizasyon modeliyle elde edilen çözümlerle kıyaslayarak değerlendirme fırsatı doğacaktır.

Veri

Bu model çözümünde veriler; toplanacak 5.177 üründen oluşan atanacak 74 tur ve bu turları gerçekleştirecek 8 operatörden oluşuyor. Ayrıca, tur bazlı toplanacak hacim ve ürün miktarları da bulunuyor. Bu veri seti, her bir turun dengeli bir şekilde operatörlere atanması için gerekli olan tüm bilgileri içerir. Aşağıda, bu veri setinin LLM ile işlenebilir hale getirilmesi için gereken veri hazırlık sürecine ilişkin Python scripti paylaşılmıştır. Bu script, turların ve operatörlerin özelliklerini uygun bir formatta düzenleyerek, LLM’e doğru şekilde iletilmesini sağlar.

import pandas as pd

# Operator ve tur bilgileri - Ham veri
operator_list=list(range(1,9))
tur_list=list(range(1,75))
tur_desi=[188,199,164,199,199,188,188,188,210,188,188,155,144,199,210,210,188,199,199,199,210,177,188,199,199,199,210,210,210,199,199,188,210,210,199,199,188,199,199,210,188,166,210,210,210,210,210,210,199,199,210,210,210,199,210,210,166,188,199,177,199,177,210,199,188,188,188,188,210,199,199,210,177,164]
miktar=[18,23,17,33,52,39,37,29,38,48,15,6,6,7,6,13,28,17,91,128,99,79,63,31,40,29,41,52,57,28,74,134,156,160,132,142,154,161,133,152,77,71,59,62,63,81,76,68,60,96,68,24,56,89,51,104,57,118,67,82,91,72,109,66,82,120,45,120,39,63,81,120,69,103]

Aşağıdaki scriptte tur verilerine ait bilgiler oluşmaktadır. Tablo 2'de tur bilgilerine yönelik veri deseni gösterilmiştir.

# Tur bilgisi df olarak üretilir
tur_info = pd.DataFrame(zip(tur_list,tur_desi,miktar),columns=['tur','desi','miktar']
, index =list(range(len(operator_list),len(tur_list)+len(operator_list))))

tur_info
Tablo 2. Atanacak Tur Bilgileri

Aşağıdaki scriptte operatorlere ait bilgiler verilmiştir. Tablo 3'te operatör sayısı gösterilmiştir.

# Operatör bilgisi df yapılır
df_operator = pd.DataFrame(operator_list, columns=['operator'], index =list(range(len(operator_list))))
df_operator
Tablo 3. Tur Alacak Operatörler

LLM ile Optimizasyon Model Çözümü

Optimizasyon modelinin optimum sonucuna ulaşabilmek için, talimatlarla LLM’in atama kararları alacağı bir Python fonksiyonu tanımlanması gerekir. Bu fonksiyon içerisinde LLM’e özel tasarlanan bir prompt içerir ve “system” ile “user” olmak üzere iki kısımdan oluşur.

İlk kısım olan “system”, LLM’e bir rol vererek onu yönlendirir. Bu yazı kapsamında LLM, “Sen deneyimli bir operasyon yöneticisisin.” rolündedir.

Promptun ikinci girdisi “user” ise kullanıcının teori ve domain bilgisi doğrultusunda oluşturduğu talimatlardan oluşur. Burada, optimizasyon modelinde kullanılan amaç fonksiyonu, karar değişkenleri ve kısıtlar, LLM’in anlayabileceği sade bir dilde yeniden tanımlanır. Bu, LLM’in ilgili bilgileri kullanarak doğru atamaları yapmasını sağlar.

Örneğin, Şekil 1’de gösterilen optimizasyon modeline ait amaç fonksiyonu “turlardaki tüm ürünlerin toplanmasını garantiye almak” olarak formülize edilmişse, LLM promptunda bu “Amaç, sana verilen turlara ait ürünlerin hepsini toplamak.” ifadesiyle aktarılır.

Şekil 1. Amaç Fonksiyonu

Benzer şekilde, modeldeki “Bir tur sadece bir operatöre atansın” kısıtı (Şekil 2), prompt içerisinde “Her tur yalnızca bir operatöre atanmalı.” şeklinde ifade edilmiştir.

Şekil 2. Optimizasyon Model Kısıt 1

Bu tür tüm matematiksel ifadeler, fonksiyon içindeki talimatlarla LLM’e açık ve yalın bir üslup ile iletilir. Diğer kısıtlardan örnek olarak; dengeli atama için ortalama desi ve ortalama tur sayısı gibi kriterlerin dikkate alınması verilebilir.

Tanımlanan fonksiyon içerinde ayrıca, üretilen çıktının nasıl bir formatta olması gerektiği de tanımlanmıştır. Atamalar sonrasında operatör, tur, desi ve miktar bilgilerini içeren tablo formatında bir çıktı oluşturulur.

import openai

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

# Ortalama değerler
Tavg = len(tur_list) / len(operator_list)
Davg = sum(tur_desi) / len(operator_list)

# Prompt ile çalıştırma fonksiyonu
def atamalari_llm_ile_yap(tur_info, df_operator, Tavg, Davg):
# LLM prompt ayarları
prompt = f"""
Sen deneyimli bir operasyon yöneticisisin. Görevin sana verilen turları, belirli operatörlere aşağıdaki kurallar doğrultusunda atayacaksın:

### Atama Kuralları
1. Amaç, sana verilen turlara ait ürünlerin hepsini toplamak.
2. Tüm turlar var olan operatorlere atanacak.
3. Her tur yalnızca bir operatöre atanmalı.
4. Operatörlerin desi yükleri ve tur sayıları arasında fark düşük tutulmalı, tüm operatörlere dengeli sayıda tur atanmalıdır.
5. Her operatöre atanan turların desi değeri, ortalama olarak {Davg:.2f} civarında olmalı.
6. Her operatöre atanan tur sayısı, {Tavg:.2f} civarında olmalı.
7. Atanmamış tur kalmamalı.
8. Operatörlere dengeli bir tanımlamalı.
9. Aşağıda, tüm turların desi ve miktar bilgileri ile operatör listesi verilmiştir.

### Çıktı Formatı
Model çıktısını bir tablo formatında sun. Bu tablo, aşağıdaki sütunlara sahip olmalı:
- Operator: Atamayı yapan operatör numarası
- Tur: Atanan turun numarası
- Desi: Atanan turun desi bilgisi
- Miktar: Atanan turun miktar bilgisi

Bu tabloyu oluştur. Örneğin:

```
Operator Tur Desi Miktar
1 1 188 18
1 4 199 23
...
```

### Tur Bilgileri
{tur_info.to_string(index=False)}

### Operatör Listesi
{df_operator.to_string(index=False)}
"""


# Model çağrısı gpt-4 ile yapılıyor
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Sen deneyimli bir operasyon yöneticisisin."},
{"role": "user", "content": prompt}
],
temperature=0.4
)

return response.choices[0].message['content'].strip()

# LLM fonksiyonunu çalıştırarak atama sonucu alalım
atama_sonucu = atamalari_llm_ile_yap(tur_info, df_operator, Tavg, Davg)

# Atama sonuçlarını ekrana yazdırın
print("Operatör Atamaları:\n", atama_sonucu)


Yukarıdaki Python scriptinin son kısmında, OpenAI kütüphanesi kullanılarak, önceden hazırlanmış prompt, LLM modeliyle (“GPT-4o”) iletişime geçer ve modelin tutarlılığı için temperature değeri 0,4 olarak belirlenir. Bu değer, modelin daha belirgin ve istikrarlı yanıtlar vermesini sağlar.

LLM, kendisini “operasyon yöneticisi” olarak görür, bu perspektiften atama kararlarını değerlendirir ve çözüm önerileri üretir.

İlk olarak, prompt içinde belirtilen kuralları analiz ederek hangi kriterlerin dikkate alınması gerektiğini belirler. Ardından, operatörler arasında tur ve desi dengesini sağlamak için mantıksal çıkarımlarda bulunur. Son aşamada, çözümü operatör ve tur bilgilerini içeren tablo formatında sunarak atamaları yapar. Bu şekilde model, kendini bir operasyon yöneticisi gibi konumlandırarak kararlarını bu rolün bakış açısından açıklar ve yönlendirici bir dil kullanır. Fonksiyonu çalıştırıldığında, model her turu en uygun operatöre atayarak Şekil 3’teki gibi bir çıktı üretir.

Şekil 3. LLM Çıktısı

Üretilen çıktı metindir ve içerisinde, bilgilendirme metinleri, atama yapılan operatörler ve atanan tur bilgileri tablo formatında ve sonuç cümlelerini içeren metinler yer alır. Bunların içinden operasyon yöneticisinin ihtiyacı olan atama bilgilerinin ayıklanarak dataframe olarak alınması gerekir. Aşağıdaki script yardımıyla, fonksiyondan alınan çıktı metin olarak tablo formatında döner. Ardından bu tablo pandas kullanılarak bir DataFrame’e dönüştürülür (df_sonuc). Son olarak, df_sonuc gruplandırılarak her bir operatör için toplam desi, toplam miktar ve tur sayısı özet olarak df_ozet tablosunda gösterilir (Şekil 4). Bu özet, her operatörün toplam yük ve atama miktarını kolayca görmeyi sağlar.

# Tabloyu metin içerisinden çıkarma
table_text = atama_sonucu.split("```")[1]

# Tabloyu pandas DataFrame'e dönüştürme
df_sonuc = pd.read_csv(StringIO(table_text), delim_whitespace=True)

df_ozet = df_sonuc.groupby('Operator').agg(
Total_Desi=('Desi', 'sum'), # Desi toplamı
Total_Miktar=('Miktar', 'sum'), # Miktar toplamı
Count_Tur=('Tur', 'count') # Tur sayısı
).reset_index()

df_ozet
Şekil 4. LLM Sonrası Atama Özet

Optimizasyon ve LLM Sonuçlarının Karşılaştırılması

Optimizasyon çözümü (Şekil 1) ve LLM çözümü (Şekil 4) kıyaslandığında, optimizasyon modelinin daha dengeli bir dağıtım sağladığı görülse de LLM’in gerçekleştirdiği atamalar da genel olarak başarılı bir dağılım sunmaktadır. LLM’in yaptığı atamalar incelendiğinde, tüm turların eksiksiz (74 tur) olarak operatörlere atandığı ve toplanacak ürün miktarının tamamının (5177) toplanacak şekilde atama yapıldığı doğrulanmıştır.

LLM de 15–20 saniye arasında çalışarak operasyonel gereksinimleri karşılayacak düzeyde etkin bir atama gerçekleştirdiği söylenebilir. Prompt tasarımının kişiden kişiye göre değişkenlik gösterdiği durumda, verilebilecek farklı yönlendirmeler, dil ve talimatlarla optimum çözüme bile ulaşabileceği unutulmamalıdır. Buradan hareketle, operasyon yöneticisinin elinde optimizasyon modelini geliştirecek bir imkan bulunmuyorsa, LLM’den yararlanarak en azından olabildiğince dengeli atamayı sağlayabilir. Bu da rassal bir iş emri atamasındansa olabildiğince hakkaniyetli bir atamaya vesile olur.

Sonuç

Özetle, optimizasyon problemlerinin LLM ile çözülebilmesi için çözüm sürecinin nasıl yapılandırılması gerektiğini detaylandırdım. LLM çözümünün doğruluğu, problemi tanımlayan kişinin, çözümden beklentilerini net bir şekilde ifade edebilmesiyle mümkündür. Ancak, büyük dil modelleriyle çalışırken göz önünde bulundurulması gereken önemli bir konu da modelin işleyebileceği veri miktarındaki sınırlılıktır. LLM modelleri, 8k ile 32k (GPT 4) token arasında bir veri sınırı bulunuyor. Sınırı aşan verilerde model çözüm sunamayabilir veya sonuçların doğruluğu düşebilir. Bu çalışmada ele alınan veri, token sınırının altında (1k altında) kaldığı için LLM çözümü sorunsuz gerçekleştirdi. Ancak daha kapsamlı veri setlerinde veya daha yüksek token gerektiren problemlerde, verinin özetlenmesi veya parçalı bir şekilde dikkatle seçilmesi gerekebilir.

Ayrıca, bu problem kapsamında optimizasyon teorisi ve çözüm yöntemleri konusunda uzman olmayan kişilerin LLM’e gerekli talimatları eksiksiz verememesi, sonuçların doğruluğunu ve etkinliğini olumsuz etkileyebilir. Domain bilgisi ve teknolojik yetkinliği yüksek kişiler LLM’i en etkin kullanabilecek adaylardır. Bunların başında analitikçiler ve veri bilimciler gelmektedir. Bu nedenle, LLM’lerin karmaşık problemlerde başarılı çözümler üretebilmesi yalnızca verilen verinin doğruluğuna değil, aynı zamanda bu verinin model tarafından nasıl yorumlanacağına dair doğru yönlendirmelere de bağlıdır.

Bu örnekten genele doğru çıkacak olursam, LLM’i doğru yönlendirmelerle kullanılabilen kişi veya organizasyonlar, belirledikleri iş problemlerini etkin kaynak kullanımıyla çözebilirler. Böylelikle, sektör fark etmeksizin, iyi yapılandırılmış bir prompt ve akış tasarımıyla LLM, işletmelere yenilikçi ve pratik çözüm alternatifleri sunabilir.

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

No responses yet

Write a response