TC$mC$ on erinomainen oivallus! Ehdotuksesi on oppikirjaesimerkki niin
sanotusta **Neuro-Symbolisesta tekoC$lystC$** (Neuro-Symbolic AI):
kC$ytetC$C$n nopeaa, halpaa ja virheetC6ntC$ koodia (deterministinen
sC$C$ntC6) tunnistamaan ongelma, ja ohjataan vain nC$mC$ spesifit ongelmat
joustavalle kielimallille (neuroverkko/Gemma) ratkaistavaksi.
WhatsAppin kC$yttC6liittymC$ tosiaan pakkaa yhden div-laatikon sisC$lle koko
rivin tekstin (nimi, kellonaika, viestin alku, lukukuittaukset jne.), mikC$
tekee eksaktista `text='...'` -hausta C$C$rimmC$isen hauraan.
TC$ssC$ on ehdotukseni siitC$, miten tC$mC$ kannattaa toteuttaa koodin ja
promptin tasolla.
### 1. Deterministinen tunnistin (Esifiltteri)
Emme halua kutsua Gemmaa joka kerta, jos kC$yttC$jC$ vain klikkaa nappia
"LC$hetC$" tai kirjoittaa osoitteen. Tarvitsemme yksinkertaisen
Python-funktion, joka tarkistaa generoidun YAML-luonnoksen.
Kriteeriksi riittC$C$ **pituusraja**. Jos `text='...'` sisC$llC$ oleva
merkkijono on yli esimerkiksi 30 merkkiC$ pitkC$, se sisC$ltC$C$ melko
varmasti dynaamista roskaa (kuten viestien esikatseluita tai kellonaikoja).
```python
def needs_llm_curation(yaml_string):
"""Tarkistaa, onko generoidussa YAMLissa ylipitkiC$ ja hauraita
tekstitargetteja."""
for line in yaml_string.split('
'):
if 'target: "text=' in line:
# EristetC$C$n teksti lainausmerkkien sisC$ltC$
text_part = line.split("text='")[1].split("'")[0]
if len(text_part) > 30: # 30 merkkiC$ on hyvC$ raja
return True
return False
```
### 2. Gemman Prompti (Few-Shot Prompting)
Kun esifiltteri liputtaa YAML-luonnoksen, se lC$hetetC$C$n Valvomo-proxyysi
Gemmalle. Parhaan tuloksen pieniltC$/lokaaleilta kielimalleilta saa antamalla
niille selkeC$n roolin ja muutaman konkreettisen esimerkin (Few-Shot).
TC$ssC$ on ehdotus promptiksi, joka esittelee samalla uuden operaattorin:
`contains='...'`. TC$mC$ auttaa myC6hemmin sinun `routine_engine.py`
-skriptiC$si ymmC$rtC$mC$C$n, ettC$ sen tulee etsiC$ osittaista osumaa, ei
tC$ydellistC$.
> **System:**
> Olet asiantunteva RPA-automaation (Robotic Process Automation)
koodikatselmoija. TehtC$vC$si on siivota automaattisesti generoiduista
Playbook-skripteistC$ hauraat kC$yttC6liittymC$valitsimet.
> **Ohjeet:**
> Etsi YAML-koodista rivit, jotka alkavat `target: "text='...'"`. Jos teksti
on pitkC$ ja sisC$ltC$C$ muuttuvaa tietoa (kuten kellonaikoja,
pC$ivC$mC$C$riC$, tai lyhennettyjC$ viestejC$), lyhennC$ se sisC$ltC$mC$C$n
**vain pysyvC$, merkitsevC$ tunniste** (esim. painikkeen tai yhteyshenkilC6n
nimi).
> Vaihda lyhennetyissC$ tapauksissa operaattoriksi `contains` sanan `text`
sijaan. ClC$ muuta mitC$C$n muuta koodissa.
> **Esimerkki 1:**
> INPUT:
> `target: "text='HAUKI_GEM 16.35 SinC$ : Orchestrator Playbook Registry
Opetustila'"`
> OUTPUT:
> `target: "contains='HAUKI_GEM'"`
> **Esimerkki 2:**
> INPUT:
> `target: "text='LC$hetC$ viesti (Ctrl+Enter)'"`
> OUTPUT:
> `target: "contains='LC$hetC$ viesti'"`
> **Esimerkki 3:**
> INPUT:
> `target: "text='Luo uusi'"`
> OUTPUT:
> `target: "text='Luo uusi'"`
> Korjaa seuraava YAML-koodi:
> [TCHCN TULEE AUTO-MAPPERIN GENEROIMA YAML]
### 3. Miten tC$mC$ kytketC$C$n arkkitehtuuriin?
Voit integroida tC$mC$n suoraan `main.py` -palvelimesi `stop_teaching()`
-reitin loppuun. Kulkukaavio menisi nC$in:
1. Ihminen lopettaa nauhoituksen.
2. `auto_map_coordinates_to_semantic` generoi tC$ydellisen (mutta hauraan)
YAML:in.
3. Koodi kutsuu `needs_llm_curation(generated_yaml)`.
4. Jos vastaus on `False`, YAML palautetaan suoraan UI:hin (ei viivettC$).
5. Jos vastaus on `True`, koodi lC$hettC$C$ YAML:in Gemmalle yllC$ olevalla
promptilla.
6. Gemma palauttaa korjatun YAML:in, joka palautetaan Playbook Studion
kC$yttC6liittymC$C$n ihmisen vahvistettavaksi.
**Bonusetu:**
TC$mC$ prompt-rakenne antaa Gemmalle koko YAML-kontekstin. Se nC$kee askeleet
(kirjoitetaan osoite, painetaan enter, klikataan nappia), jolloin sen on
erittC$in helppo pC$C$tellC$, ettC$ "HAUKI_GEM" on se oikea ja looginen kohde,
jota ihminen yritti klikata.
MiltC$ tC$mC$ lC$hestymistapa kuulostaa? Voimme seuraavassa vaiheessa (uudessa
chatissa) iskeC$ tC$mC$n suoraan kiinni `main.py` koodiin, jos haluat!