RAG ve veri · 2026-10-17
d1-ultra ile ürün kataloğu kategorilendirme ve inceleme
Ürün kataloğunuzu liquid/d1-ultra ile kategorilere ayırın: iki düzeyli kategori ağacı, örnek eşik, inceleme kuyruğu ve Python ile toplu işleme.
Kısa yanıt: her ürüne kategori sorusu sorun, emin olunmayanları incelemeye ayırın
LLMTR (llmtr.com), farklı sağlayıcıların dil modellerine tek bir OpenAI uyumlu API ile erişim veren bir gateway'dir. Ürün kataloğunuzu kategorilere ayırmak için Liquid AI'nin karar modeli d1-ultra'yı liquid/d1-ultra kimliğiyle, POST /v1/systemone uç noktası üzerinden çağırırsınız; temel adres https://llmtr.com/v1'dir. Model kartı modeli yönlendirme, sınıflandırma ve görsel kontrolü için tanımlar: her soru için metin değil, olasılıklı ve tiplenmiş bir yanıt döner.
Yöntem dört parçadan oluşur: seçenek açıklamalarıyla yazılmış bir kategori ağacı, ağacın her düzeyi için bir choice sorusu, kodunuzdaki eşikler ve bir inceleme kuyruğu. confidence değeri eşiğin üstünde kalan ürün kategorisini otomatik alır. Eşiğin altında kalan, other seçilen ya da isteği hata veren ürün bir kişinin incelemesine ayrılır. Böylece belirsiz ürünler yanlış kategoriye sessizce gitmez, bir kişinin önüne düşer.
Ürün kataloğu bir karar modeliyle nasıl kategorilere ayrılır?
Önce kategori ağacınızı yazın: üst düzeyde birkaç bölüm, her bölümün altında alt kategoriler. Her seçeneğe kısa bir açıklama verin ve hiçbirine uymayan ürünler için değeri null olan bir other seçeneği ekleyin. Ürünün adını ve açıklamasını state alanında JSON olarak gönderin. İlk istekte üst düzey bölümü bir choice sorusuyla, ürünün birden çok farklı üründen oluşan bir set olup olmadığını da bir noul sorusuyla sorun. Bölümün confidence değeri eşiği geçerse ikinci istekte o bölümün alt kategorilerini yeni bir choice sorusuyla sorun.
Alt kategori ayrı bir istekte sorulur, çünkü aynı istekteki sorular birbirinden bağımsız değerlendirilir: ikinci soru birincinin cevabını göremez ve hangi alt listeyi soracağınız birinci cevaba bağlıdır. İki düzeyin her birinin kendi eşiği vardır. Düzeylerden biri eşiğin altında kalırsa, other seçilirse ya da set olasılığı yüksekse ürün inceleme kuyruğuna gider.
Kategori ağacı: tek liste mi, iki düzey mi?
Kategori sayınız azsa bütün yaprak kategorileri tek bir choice sorusunda seçenek olarak verebilirsiniz; o zaman her ürün tek soru alır. d1-ultra her soruyu durumla birlikte ayrı bir istem olarak okuyup faturaladığı için tek liste en az token'ı tutar. Liste uzadıkça birbirine yakın seçenekler artar, olasılık aralarında bölünür ve confidence düşer. O noktada iki düzeyli ağaç her düzeyde daha kısa bir liste sunar ve eşiği düzey başına ayarlamanızı sağlar.
Seçenek açıklamaları kategorinin sınırını çizmelidir: bölüm açıklamasına hangi alt kategorileri kapsadığını, alt kategori açıklamasına hangi ürünlerin girdiğini kısa ve birbirinden ayrışacak şekilde yazın. İki seçenek aynı ürünü kapsıyorsa model ikisi arasında kalır; bu ağacın kendi belirsizliğidir ve inceleme kuyruğunda görünür. Ağacı değiştirdiğinizde eşikleri yeniden kontrol edin.
Toplu işleme: kataloğun tamamını bir betikle geçirmek
Aşağıdaki Python betiği products.csv dosyasındaki her ürünü (sku, title ve description sütunları) sırayla işler. Her ürün için önce bölüm ve set sorusunu, eşik geçilirse alt kategori sorusunu gönderir. Kategorisi kesinleşen ürünler bölüm/alt kategori yoluyla categorized.csv dosyasına, diğerleri review.csv dosyasına yazılır.
Ağ hatası, HTTP hatası ya da beklenmeyen biçimde bir yanıt ürünü inceleme kuyruğuna gönderir; hiçbir ürün kaybolmaz. Anahtarın istek sınırı aşılırsa 429 rate_limit_error döner; betik Retry-After başlığı varsa o kadar, yoksa beş saniye bekler ve aynı isteği en fazla üç kez dener. Kredi bakiyesi isteğe yetmezse 402 insufficient_credits döner ve betik durur, çünkü aksi halde kalan bütün ürünler incelemeye düşerdi. Model geçici olarak yanıt veremezse 503 model_unavailable döner ve ürün incelemeye gider. Büyük kataloglarda betiği sonuçları ürün ürün yazacak şekilde genişletin ve her sonucu kullandığınız soru metni ve eşikle birlikte saklayın.
products.csv'deki ürünleri iki düzeyli ağaçla kategorilere ayıran ve emin olunmayanları review.csv'ye yazan Python requests betiği.
import csv
import os
import time
import requests
API_KEY = os.environ["LLMTR_API_KEY"]
TOP_THRESHOLD = 0.8 # example value: tune it on products your team has already categorized
SUB_THRESHOLD = 0.7 # example value
BUNDLE_THRESHOLD = 0.5 # example value
DEPARTMENTS = {
"home": "Cookware, storage and lighting for the home",
"outdoor": "Garden tools, camping gear and grills",
"sports": "Fitness, cycling and team sports equipment",
"other": None,
}
CATEGORIES = {
"home": {"cookware": "Pots, pans, baking trays", "storage": "Boxes, jars, shelves", "lighting": "Lamps and bulbs", "other": None},
"outdoor": {"garden_tools": "Shovels, pruners, hoses", "camping": "Tents, sleeping bags, camp cookware", "grills": "Barbecues and grill accessories", "other": None},
"sports": {"fitness": "Weights, mats, bands", "cycling": "Bikes, helmets, bike parts", "team_sports": "Balls, nets, goals", "other": None},
}
def ask(state, questions):
for _ in range(3):
response = requests.post(
"https://llmtr.com/v1/systemone",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"model": "liquid/d1-ultra", "state": state, "questions": questions},
timeout=60,
)
if response.status_code == 402:
raise SystemExit("Not enough credit: top up your balance and run again.")
if response.status_code == 429:
time.sleep(int(response.headers.get("Retry-After", "5")))
continue
response.raise_for_status()
return response.json()["answers"]
raise RuntimeError("still rate limited")
def categorize(product):
state = {"title": product["title"], "description": product["description"]}
first = ask(state, {
"department": {"type": "choice", "instructions": "Which department does this product belong to?", "criteria": DEPARTMENTS},
"bundle": {"type": "noul", "instructions": "Does the listing sell several different products as one set?"},
})
department = first["department"]
if (department["choice"] == "other" or department["confidence"] < TOP_THRESHOLD
or first["bundle"]["noul"] >= BUNDLE_THRESHOLD):
return None
second = ask(state, {
"category": {
"type": "choice",
"instructions": f"Which {department['choice']} category does this product belong to?",
"criteria": CATEGORIES[department["choice"]],
},
})
category = second["category"]
if category["choice"] == "other" or category["confidence"] < SUB_THRESHOLD:
return None
return department["choice"] + "/" + category["choice"]
categorized, review = [], []
with open("products.csv", newline="", encoding="utf-8") as f:
for product in csv.DictReader(f): # columns: sku, title, description
try:
path = categorize(product)
except (requests.RequestException, RuntimeError, KeyError, TypeError, ValueError):
path = None
if path:
categorized.append({"sku": product["sku"], "category": path})
else:
review.append({"sku": product["sku"], "title": product["title"]})
for name, rows, fields in [("categorized.csv", categorized, ["sku", "category"]), ("review.csv", review, ["sku", "title"])]:
with open(name, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=fields)
writer.writeheader()
writer.writerows(rows)
print(len(categorized), "categorized,", len(review), "sent to review")
Eşik seçimi ve inceleme kuyruğu
Aşağıdaki örnek yanıt ilk isteğin biçimini gösterir; sayılar örnektir. Kamp ateşinde ve ev fırınında kullanılabilen bir döküm tava hem ev hem dış mekân bölümüne uyar; olasılık iki seçenek arasında bölünür ve confidence 0,33 ile 0,8'lik eşiğin altında kaldığı için ürün inceleme kuyruğuna gider. bundle yanıtı ürünün bir set olma olasılığıdır.
Koddaki 0,8, 0,7 ve 0,5 eşikleri örnektir; LLMTR varsayılan bir eşik önermez, Liquid'in belgesindeki eşikler de örnek niteliğindedir. Eşiği seçmek için ekibinizin daha önce kategorilendirdiği birkaç yüz ürünü betikten geçirin ve her eşik değerinde kaç ürünün otomatik kategorilendiğine, bunların kaçının doğru olduğuna bakın. İnceleme kuyruğunda bir kişinin verdiği kategoriler bu etiketli kümeyi zamanla büyütür; ağacı ve eşikleri bu kümeyle yeniden kontrol edin. Yanlış kategorinin pahalı olduğu bölümlerde eşiği yükseltin.
| Yanıt | Eylem |
|---|---|
| department.confidence 0,8 ve üstü, choice other değil, bundle.noul 0,5'in altında | alt kategori sorusu gönderilir |
| department.confidence 0,8'in altında, choice other ya da bundle.noul 0,5 ve üstü | ürün inceleme kuyruğuna gider |
| category.confidence 0,7 ve üstü, choice other değil | ürün bölüm/alt kategori yoluyla kaydedilir |
| category.confidence 0,7'nin altında ya da choice other | ürün inceleme kuyruğuna gider |
| HTTP hatası ya da yanıt yok | ürün inceleme kuyruğuna gider |
| 402 insufficient_credits | betik durur; bakiye yükleyip yeniden çalıştırın |
Örnek yanıt: alanlar Liquid'in belgelediği biçimdedir, sayılar örnektir.
{
"model": "liquid/d1-ultra",
"answers": {
"department": {
"type": "choice",
"choice": "outdoor",
"probabilities": { "home": 0.45, "outdoor": 0.5, "sports": 0.03, "other": 0.02 },
"confidence": 0.33
},
"bundle": { "type": "noul", "noul": 0.04 }
},
"usage": { "input_tokens": 604, "output_tokens": 0 }
}
Maliyet, sınırlar ve veri notu
liquid/d1-ultra için 1 milyon girdi token'ı 0,042 $, çıktı 0 $'dır. Liquid'in duyurusuna göre her soru ayrı bir istem olarak faturalanır; LLMTR ücreti yanıttaki usage.input_tokens değerinden hesaplar. Örnek hesap: 20.000 ürünlük bir katalogda her ürün en fazla üç soru alıyor (bölüm, set ve alt kategori) ve her soru durumla birlikte yaklaşık 300 token tutuyorsa üst sınır 20.000 x 3 x 300 = 18.000.000 token, yani 18.000.000 x 0,042 $ / 1.000.000 = 0,756 $ olur. İlk düzeyde incelemeye ayrılan ürünler alt kategori sorusunu almadığı için gerçek tutar bunun altında kalır.
Her soru durumla birlikte 32.768 token'ı aşamaz; aşan istek 422 provider_error döner, bu yüzden uzun açıklamalarda kategori için gereken kısmı gönderin. Ürün fotoğrafını images dizisiyle ekleyebilirsiniz (JPEG, PNG ya da WebP, en fazla 8); görsel her soruda yeniden sayılır ve 1024 x 1024 bir görsel soru başına 1.536 token tutar. Model kartındaki veri notu açıktır: bu model üçüncü taraf bir sağlayıcı üzerinden sunulur; gönderdiğiniz metin ve görseller sağlayıcı tarafından saklanabilir ve Liquid modellerinin eğitiminde kullanılabilir. Hassas, kişisel veya müşteri verilerini göndermeyin: state alanına ürün adını ve açıklamasını koyun, müşteri yorumlarını ya da satıcı iletişim bilgilerini koymayın. Liquid, d1-ultra için desteklenen dillerin listesini yayımlamıyor; Türkçe açıklamaları etiketli kümenize de ekleyin.
| Özellik | Değer |
|---|---|
| Model kimliği | liquid/d1-ultra |
| Uç nokta | POST /v1/systemone |
| Girdi fiyatı | 0,042 $ / 1M token |
| Çıktı fiyatı | 0 $ / 1M token |
| Faturalama | her soru durumla birlikte ayrı sayılır |
| Soru başına sınır | 32.768 token (durum ve görseller dahil) |
| Ürün görseli | istekte en fazla 8 adet; JPEG, PNG, WebP |
| İstekte en fazla soru | 1.000 soru |
d1-ultra ile ürün kataloğunu kategorilere ayırma
Kategori ağacını yazın, eşikleri etiketli ürünlerle seçin ve kataloğu emin olunmayan ürünleri inceleme kuyruğuna ayıran betikle işleyin.
- Kategori ağacı. Bölümleri ve alt kategorileri kısa açıklamalarla choice sorularının criteria alanına yazın ve her düzeye değeri null olan bir other seçeneği ekleyin.
- Eşik. Daha önce kategorilendirilmiş birkaç yüz ürünü liquid/d1-ultra ile https://llmtr.com/v1/systemone adresine gönderin ve doğru kategori oranına bakarak her düzeyin confidence eşiğini seçin.
- Toplu işleme. Kataloğu betikten geçirin; eşiği geçen ürünleri kategori dosyasına, eşiğin altında kalan, other seçilen ya da hata alan ürünleri inceleme kuyruğuna yazın.
Sık sorulan sorular
Bir choice sorusunda kaç kategori verebilirim?
d1-ultra için belgelenmiş bir seçenek sınırı yoktur; LLMTR tek istekte en fazla 1.000 soru kabul eder. Liste uzadıkça benzer seçenekler arasında olasılık bölünür ve confidence düşer; kategori sayısı arttığında iki düzeyli bir ağaç her düzeyde daha kısa liste sunar.
Hangi eşik değerini kullanmalıyım?
Varsayılan bir eşik yoktur; bu yazıdaki 0,8, 0,7 ve 0,5 örnektir. Ekibinizin daha önce kategorilendirdiği ürünleri modele sorun ve her eşik değerinde otomatik kategorilenen ürün oranına ve bunların doğruluğuna bakarak seçin.
Ürün fotoğrafını da gönderebilir miyim?
Evet. Fotoğrafı üst seviyedeki images dizisinde base64 veri URL'si ya da content_type ve base64 alanlı bir nesne olarak gönderin. JPEG, PNG ve WebP kabul edilir, bir istekte en fazla 8 görsel olabilir ve her görsel her soruda yeniden sayılır.