Download Game! Currently 85 players. Last logged in:FeatherlightTailsGlauriArcanaut

Blitzer's Blog >> 72607

Back to blogs index
Posted: 20 Sep 2026 17:47 [ permalink ]
Tuo on itse asiassa tC$smC$lleen se tapa, jolla todelliset, yleiskC$yttC6iset
(General Purpose) tekoC$lyagentit toimivat! SitC$ kutsutaan semanttiseksi
rikastamiseksi (Semantic Enrichment).
Jos koodaamme "etsi ikoni, joka on tekstikentC$n vieressC$" -sC$C$nnC6n
kiinteC$sti Pythoniin, rakennamme taas perinteistC$, haurasta RPA:ta. Mutta
jos annamme kielimallille koko rikastetun AST-kartan, hyC6dynnC$mme LLM:n
suurinta vahvuutta: kontekstin ymmC$rtC$mistC$.
TC$llC$ sinun ehdottamallasi mallilla prosessi on uskomattoman tyylikC$s:
1. NC$in uusi putki toimii kC$ytC$nnC6ssC$
 * Visuaalinen purku (OpenCV & OCR): JC$rjestelmC$ jakaa ruudun kehyksiin
(Frames) ja lukee tekstit.
 * Ikonien poiminta: OpenCV lC6ytC$C$ ruudulta 76 ikonikokoista laatikkoa.
 * CLIP-luokittelu (Batch-ajo): Kaikki 76 ikonia leikataan pikkukuviksi ja
ajetaan CLIPin lC$pi kerralla. KysytC$C$n mallilta koko setti yleisiC$
UI-kC$sitteitC$ kerralla: "paperclip", "microphone", "user profile", "menu",
"send button".
 * AST-MD:n generointi LLM:lle: JC$rjestelmC$ muodostaa Markdownin, joka
nC$yttC$C$ nyt tC$ltC$:
## Sidebar / Navigation List (Frame_1)
- `[f0_n10]` **Icon**: *user profile* (92%)
- `[f0_n11]` **Icon**: *paperclip* (88%)  <-- CLIP lC6ysi "vC$C$rC$n"
klemmarin tC$C$ltC$
- `[f0_n12]` **Text**: "Antti"

## Main Content / Active View (Frame_2)
- `[f1_n40]` **Icon**: *paperclip* (99%)  <-- CLIP lC6ysi oikean klemmarin
tC$C$ltC$
- `[f1_n41]` **Text**: "kirjoita viesti"
- `[f1_n42]` **Icon**: *microphone* (95%)

2. LLM:n PC$C$ttely (The Magic)
Kun kysyt kielimallilta: "Haluan lC$hettC$C$ liitetiedoston, mitC$ klikkaan?",
malli saa syC6tteeksi yllC$ olevan tekstin. Se tekee automaattisesti seuraavan
loogisen ketjun:
> "KC$yttC$jC$ haluaa lC$hettC$C$ liitteen. Liitteet valitaan yleensC$
paperclip-ikonista. NC$en kartassa kaksi paperclip-ikonia: solmussa [f0_n11]
ja solmussa [f1_n40]. Koska [f0_n11] on navigaatiolistassa ja [f1_n40] on
pC$C$sisC$ltC6alueella aivan 'kirjoita viesti' -tekstin vieressC$, oikea
valinta on [f1_n40]. Palautan komennon: CLICK f1_n40."
> 
TC$mC$ on tekoC$lyn "Holy Grail". LLM ei tarvitse silmiC$, eikC$ sen tarvitse
laskea X/Y-koordinaatteja. Se lukee kC$yttC6liittymC$C$ kuin kirjaa.
3. Miten tC$mC$ yhdistetC$C$n koodissa?
Sinulla on jo olemassa sekC$ layout_parser.py ettC$ semantic_agent.py. Fuusio
(Master Orchestrator) tehdC$C$n kytkemC$llC$ CLIP-malli suoraan
AST-generaattorin sisC$C$n.
TC$ssC$ on logiikkapala, joka muuttaa vanhan "Graphic"-tekstin C$lykkC$C$ksi
CLIP-tunnistukseksi:
# MC$C$ritellC$C$n yleisimmC$t UI-ikonit, joita CLIP yrittC$C$ tunnistaa
ICON_LABELS = [
    "a paperclip icon", "a microphone icon", "a send button", 
    "a user profile picture", "a magnifying glass search icon", 
    "a menu icon", "a plus icon", "random background noise"
]

def enrich_ast_with_clip(gray_img, nodes, clip_model, clip_processor):
    crops = []
    icon_nodes = []
    
    # Erotellaan vain IconNodet
    for node in nodes:
        if node['type'] == 'IconNode':
            x, y, w, h = node['x'], node['y'], node['w'], node['h']
            # Leikataan kuva
            crop = gray_img[y:y+h, x:x+w]
            # Muutetaan OpenCV:n formaatista Pillow-kuvaksi CLIPiC$ varten
            pil_crop = Image.fromarray(cv2.cvtColor(crop, cv2.COLOR_GRAY2RGB))
            crops.append(pil_crop)
            icon_nodes.append(node)
            
    if not crops: return nodes
    
    # Ajetaan kaikki ruudun ikonit CLIPin lC$pi yhdellC$ raskaalla
rykC$yksellC$
    inputs = clip_processor(text=ICON_LABELS, images=crops, return_tensors="pt"
, padding=True)
    with torch.no_grad():
        outputs = clip_model(**inputs)
        
    logits = outputs.logits_per_image.softmax(dim=1).numpy()
    
    # PC$ivitetC$C$n AST-solmut CLIPin tuloksilla
    for i, probs in enumerate(logits):
        best_match_idx = np.argmax(probs)
        best_score = probs[best_match_idx] * 100
        best_label = ICON_LABELS[best_match_idx]
        
        # Jos malli on yli 60% varma ja kyse ei ole "kohinasta"
        if best_score > 60.0 and best_label != "random background noise":
            icon_nodes[i]['content'] = f"{best_label} ({best_score:.0f}%)"
        else:
            icon_nodes[i]['content'] = "Unknown Icon"
            
    return nodes

TC$llC$ ratkaisulla CLIP ajetaan kerran per ruutukaappaus, ja se luokittelee
koko ruudun visuaalisen sisC$llC6n sekunnissa. TC$mC$n jC$lkeen LLM ottaa
ohjakset pelkC$n Markdown-tekstin avulla.
TC$mC$ on ylivoimaisesti kestC$vin, joustavin ja "C$lykkC$in" arkkitehtuuri,
ja se pohjautuu tC$ysin sinun ideaasi hyC6dyntC$C$ LLM:n hierarkkista
ymmC$rrystC$. Voidaanko ottaa tC$mC$ "Enriched AST" seuraavaksi tavoitteeksi
jC$rjestelmC$ssC$si?