Endüstriyel bir yapay zeka copilot'u, operatörlerin "hat 2 öğle yemeğinden sonra neden yavaşladı?" gibi sade dilde sorular sormasını ve gerçek tesis verisine dayanan yanıtlar almasını sağlayan bir asistandır. Bu rehberde böyle bir copilot'un nasıl bir araya getirildiğini, iyi yapılandırılmış bir ISA-95 topic ağacının neden en önemli bileşen olduğunu ve salt okunur bir copilot'u makinelere dokunmasına izin vermeden canlı MQTT verisine nasıl bağlayacağınızı öğreneceksiniz.
Endüstriyel Bir Yapay Zeka Copilot'u Aslında Ne Yapar?
"Copilot" sözcüğü gevşek bir şekilde kullanılıyor, bu yüzden net olmak faydalı. Bir tesiste yararlı bir copilot dört şey yapar:
- Canlı veriden durum sorularını yanıtlar: güncel hız, sıcaklık, alarm durumu, son sağlam parça.
- Canlı değerleri belgelerle birleştirerek bağlamı açıklar: bir arıza kodu için SOP, bir pompanın bakım geçmişi, ürün değişimi (changeover) kontrol listesi.
- Vardiyaları, alarmları ve duruşları bir amirin devir notuna yapıştırabileceği bir dille özetler.
- Sonraki adımları önerir, ancak kararı ve eylemi bir insana bırakır.
Yapmaması gereken şey, en azından başlangıçta, komut vermektir. Okuyan bir copilot bir verimlilik aracıdır. Ekipmana yazan bir copilot ise bir kontrol sistemidir ve IoT cihazlarının güvenli yapay zeka kontrolü rehberimizde ele aldığımız, farklı düzeyde bir mühendislik gerektirir.
Büyük dil modeli (LLM) tesisiniz hakkında kendi başına hiçbir şey bilmez. Yanıtı doğru kılan her şey, soru anında ona verdiğiniz veriden gelir. Bu yüzden modelin etrafındaki mimari, model seçiminden çok daha önemlidir.
Yapılandırılmış Canlı Veri Neden Veri Yığınından Üstündür?
Saf yaklaşım, tag'lerin bir CSV dışa aktarımını alıp prompt'a yapıştırmaktır. Hızla başarısız olur: PLC3_DB12_W4 gibi tag adları bir model için hiçbir anlam taşımaz, anlık görüntü biri yanıtı okuyana kadar bayatlamış olur ve bağlam penceresi alakasız değerlerle dolar.
ISA-95 yapısındaki bir namespace bu üç sorunun hepsini çözer. Her değer acme/plant1/assembly/line2/press4/temperature gibi bir yolda yaşadığında, hiyerarşinin kendisi anlam taşır. Model press4'ün line2'ye, onun da assembly'ye ait olduğunu görebilir. "Hat 2" hakkındaki bir soru doğal olarak acme/plant1/assembly/line2/# topic filtresine eşlenir. Bu, MQTT Sparkplug B ve Unified Namespace yazımızda açıklanan Unified Namespace'in arkasındaki fikrin aynısıdır.
| Veri yaklaşımı | Güncellik | LLM için anlamı | Bağlam maliyeti |
|---|---|---|---|
| Ham PLC tag dışa aktarımı | Bayat anlık görüntü | Düşük, şifreli adlar | Yüksek |
| Yalnızca historian sorgusu | Geçmiş için iyi, "şimdi" için yavaş | Orta | Orta |
| Retained değerli ISA-95 MQTT topic'leri | Canlı | Yüksek, hiyerarşi kendini tanımlar | Düşük, alt ağaca göre filtreleme |
| ISA-95 topic'leri artı belge erişimi | Canlı artı prosedürler | En yüksek | Düşükten ortaya |
MQTT doğal bir uyum sağlar, çünkü broker zaten her topic için en son retained değeri tutar. Bir copilot servisi ilgilendiği alt ağaca abone olabilir, bellekte bir anlık görüntü tutabilir ve modele yalnızca soruyla ilgili kısmı verebilir.
Endüstriyel Yapay Zeka Copilot'u için Referans Mimari
Pratik bir yerleşimin beş parçası vardır:
- Edge yayıncıları: PLC gateway'leri, Sparkplug B edge node'ları veya küçük Python servisleri makine verisini broker'a yayınlar.
- Ortadaki MQTT broker. ConnectMQ ISA-95 ve Unified Namespace topic'lerini tespit eder; ayrıca Sparkplug B payload'larını çözümleyip okunabilir ISA-95 topic'lerine yeniden yayınlayabilir; örneğin
spBv1.0/factory1/DDATA/line1/cnc1,connectmq/factory1/production/line1/cnc1/telemetryolur. Yeniden yayınlanan bu ağaç, bir dil modelinin iyi işlediği yapının ta kendisidir. - Broker'a sıradan bir MQTT client'ı olarak bağlanan, salt okunur abone olan ve canlı bir anlık görüntü tutan bir copilot servisi.
- LLM'in çağırabileceği
get_area_snapshot(path)veyalist_active_alarms(line)gibi araçlar. Model broker'ı asla doğrudan sorgulamaz; kodunuza sorar. - Prosedürler ve kılavuzlar için, endüstriyel veri için erişimle zenginleştirilmiş üretimin (RAG) alanına giren bir belge indeksi.
Copilot servisi sizin kodunuzdur; sizin altyapınızda çalışır ve seçtiğiniz LLM sağlayıcısıyla konuşur. ConnectMQ mesajlaşma katmanıdır; modeli çalıştırmaz. Bu ayrım sağlıklıdır: tesise dokunmadan model değiştirebilirsiniz.
Bu tablodaki broker'ın rolüne yeniyseniz, bir MQTT broker'ın ne yaptığını anlatan yazımız hızlı bir giriş sunar.
Canlı Bağlam Katmanını Python ile Oluşturmak
Copilot'un özü, topic ağacının bir bölümünü bellekte yansıtan ve onu bir araç olarak sunan küçük bir servistir. Aşağıdaki örnek paho-mqtt 2.x ve herkese açık test broker'ını kullanıyor; böylece hemen çalıştırabilirsiniz. Öneki kendi rastgele kimliğinizle değiştirin.
import json
import threading
import time
import paho.mqtt.client as mqtt
BROKER = "broker.connectmq.com"
PREFIX = "connectmq/demo/k7f3q9/plant1" # use your own random id
snapshot = {}
lock = threading.Lock()
def on_connect(client, userdata, flags, reason_code, properties):
print("connected:", reason_code)
client.subscribe(f"{PREFIX}/#", qos=1)
def on_message(client, userdata, msg):
try:
value = json.loads(msg.payload)
except ValueError:
value = msg.payload.decode(errors="replace")
with lock:
snapshot[msg.topic] = {"value": value, "received": time.time()}
def get_area_snapshot(path: str, max_age_s: int = 300) -> dict:
"""Tool exposed to the LLM: latest values under an ISA-95 path."""
base = f"{PREFIX}/{path.strip('/')}"
now = time.time()
with lock:
return {
topic[len(PREFIX) + 1:]: {
"value": entry["value"],
"age_s": round(now - entry["received"]),
"stale": now - entry["received"] > max_age_s,
}
for topic, entry in snapshot.items()
if topic == base or topic.startswith(base + "/")
}
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="copilot-reader-k7f3q9")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=60)
client.loop_start()
if __name__ == "__main__":
time.sleep(3)
print(json.dumps(get_area_snapshot("assembly/line2"), indent=2))
Okuyacak bir şeyi olması için başka bir terminalden birkaç retained değer yayınlayın:
mosquitto_pub -h broker.connectmq.com -p 1883 -i seed-k7f3q9 -r -q 1 \
-t connectmq/demo/k7f3q9/plant1/assembly/line2/press4/temperature -m '{"c": 71.4}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i seed-k7f3q9 -r -q 1 \
-t connectmq/demo/k7f3q9/plant1/assembly/line2/press4/state -m '"RUNNING"'
Bu koddaki üç tasarım tercihi göründüğünden daha önemlidir:
- Her değerle birlikte yaş ve bayatlık bilgisi döndürülür. Bir LLM iki saatlik bir sıcaklığı memnuniyetle güncel diye bildirir. Bayatlığı açık hâle getirmek, modelin sahte bir güven uydurmak yerine "yakın tarihli veri yok" demesini sağlar. Abonelik anında iletilen retained bir değerin yeni bir alım zaman damgası aldığını unutmayın; katı bir bayatlık kontrolü için payload'a kaynak zaman damgası ekleyin.
- Yollar göreli ve kapsamlıdır. Araç yalnızca
PREFIXaltını okur; böylece kafası karışmış bir model başka namespace'lere sapamaz. - Servis salt okunurdur. Abone olur ve ekipman topic'lerine asla yayın yapmaz.
Ardından get_area_snapshot fonksiyonunu kullandığınız LLM API'sinde bir araç (fonksiyon) olarak kaydedersiniz. IoT için LLM function calling rehberimiz araç şeması desenini adım adım anlatıyor; standart bir arayüzü tercih ederseniz de bir MQTT MCP sunucusu aynı yeteneği uyumlu her client'a sunar.
Tesis Soruları için Copilot'a Prompt Yazmak
Sistem prompt'u veriyi değil, namespace'i tanımlamalıdır. Şuna benzer bir şey iyi çalışır:
You are an assistant for operators at plant1.
Live data is organised as <area>/<line>/<cell>/<signal>, for example assembly/line2/press4/temperature.
Use get_area_snapshot(path) to read live values. Never guess a value you did not read.
If a value is marked stale, say so. You cannot change any equipment. For actions, tell the operator what to check.
Answer in short sentences and quote the topic path for every number you mention.
Modelden bahsettiği her sayı için topic yolunu belirtmesini istemek ucuz ama güçlü bir alışkanlıktır. Operatörler her iddiayı canlı topic gezgininde doğrulayabilir ve yanlış yanıtları fark edip bildirmek kolaylaşır.
Endüstriyel Yapay Zeka Copilot'u Tasarım Kontrol Listesi
Bir copilot'u vardiya ekibine göstermeden önce bu listeyi gözden geçirin:
- Namespace kalitesi: topic'ler sinyal düzeyine kadar tutarlı şekilde adlandırılmış mı, birimler payload'da veya adda yer alıyor mu?
- Retained değerler: yeni bir abonenin güncel değerleri hemen görmesi için her durum topic'i retained yayın yapıyor mu?
- Salt okunur kimlik bilgileri: copilot servisi, komut topic'leri için asla kullanılmayan kendi kimlik bilgilerini mi kullanıyor?
- Bayatlık yönetimi: her araç sonucu yaşı içeriyor mu ve prompt modele buna uymasını söylüyor mu?
- İzlenebilirlik: her yanıt topic yollarını veya belge kaynaklarını belirtiyor mu?
- Kayıt tutma: sorular, araç çağrıları ve yanıtlar inceleme için kaydediliyor mu?
- Kapsam: copilot, kullanıcının sorumlu olduğu hatlar ve alanlarla sınırlı mı?
- Eskalasyon: copilot yanıt veremediğinde operatöre kimi araması gerektiğini söylüyor mu?
Yaygın Tuzaklar
Halüsinasyonla uydurulan okumalar. Model boşlukları makul görünen sayılarla doldurur. Önlem: "asla tahmin etme" talimatı ve eksik veriyi açıkça gösteren araç sonuçları.
Çok fazla bağlam. Her isteğe tüm tesisi dökmek yavaştır ve modelin kafasını karıştırır. Modelin aracı dar bir yolla çağırmasına izin verin ve sayısal serileri döndürmeden önce özetleyin.
Birim karışıklığı. Birimsiz bir 71.4 değeri hatalara davetiye çıkarır. Birimleri payload'a ({"c": 71.4}) veya aracın döndürdüğü meta veriye koyun.
Herkese açık broker'larda hassas veri. broker.connectmq.com'un herkese açık alanı, topic'i tahmin eden herkes tarafından okunabilir. Bu demo için sorun değildir, ancak üretim tesisi verilerinin yeri kendi kimlik bilgilerine sahip özel bir broker'dır.
Copilot'u bir otorite gibi görmek. Operatörler onu güvenlik sistemi olarak değil, ekranları okuyan hızlı bir meslektaş olarak görmelidir. Alarm yönetimini ve kilitlemeleri (interlock) oldukları yerde tutun.
Copilot'u Üretim Verisiyle Çalıştırmak
Demodan gerçek bir hatta geçmek çoğunlukla bağlantıyı değiştirmek demektir. ConnectMQ portalında bir broker oluşturun, üretilen kimlik bilgilerini kopyalayın ve TLS üzerinden bağlanın:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set() # system CA store trusts the Let's Encrypt certificate
client.connect("broker.connectmq.com", 8883, keepalive=60)
Tam yönetilen bir MQTT servisi, broker'ı yama ve izleme yapmanız gereken şeyler listesinden çıkarır; böylece ekip namespace kalitesine ve copilot'un kendisine odaklanabilir. Yapay zeka ve mesajlaşmanın nasıl bir arada çalıştığına daha geniş bir bakış için yapay zeka ve IoT rehberine, barındırma seçenekleri için de bulut MQTT broker yaklaşımına göz atın.
Copilot'unuza Canlı Bir Tesis Namespace'i Verin
Bir copilot'un daha büyük bir modelden önce temiz, canlı ve iyi yapılandırılmış bir veri kaynağına ihtiyacı vardır. ConnectMQ size ISA-95 topic tespiti, Sparkplug B çözümleme ve copilot'un ne gördüğünü kontrol etmek için canlı bir topic gezgini sunan yönetilen bir broker sağlar. Kredi kartı gerektirmeden app.connectmq.com adresinde ücretsiz bir Serverless broker oluşturun ve yukarıdaki salt okunur servisi ona yönlendirin.
Sık Sorulan Sorular
ConnectMQ bir yapay zeka copilot'u içeriyor mu?
Hayır. ConnectMQ, canlı veriyi ileten MQTT broker'dır. Copilot ise bir MQTT client'ı olarak bağlanan ve seçtiğiniz LLM'i çağıran kendi servisinizdir.
Endüstriyel bir yapay zeka copilot'unun makineleri kontrol etmesine izin verilmeli mi?
Başlangıçta hayır. Salt okunur başlayın, doğruluğu ve yararlılığı kanıtlayın; ancak daha sonra izin listeleri, hız sınırları ve denetim kayıtlarıyla sıkı korunan, insan tarafından onaylanan eylemler ekleyin.
ISA-95 yapısı bir dil modeline neden yardımcı olur?
Kuruluş, saha, alan, hat ve hücre hiyerarşisi her değere kendini tanımlayan bir yol verir; böylece model "hat 2" hakkındaki bir soruyu şifreli tag adlarını tahmin etmek yerine kesin bir topic filtresine eşleyebilir.
Copilot geçmiş verileri de kullanabilir mi?
Evet. Canlı MQTT değerleri "şu anda ne oluyor" sorusunu, bir historian veya zaman serisi veritabanı ise "ne oldu" sorusunu yanıtlar. Modelin doğru kaynağı seçmesi için her birini ayrı bir araç olarak sunun.



