Vam tancar el mòdul 1 amb la llista de nou casos d'ús candidats de NovaMarket i amb la promesa de construir els fonaments conceptuals. Comencem pel més important de tots: la noció d'agent intel·ligent. Gairebé tot el que veuràs a la resta del curs (un recomanador, un planificador de rutes, un assistent d'atenció al client, fins i tot un model de llenguatge) es pot descriure com un agent que percep el seu entorn, decideix i actua. Aprendre a descriure un sistema en aquests termes, i a caracteritzar l'entorn en què opera, és el que permet triar després la tècnica adequada: no es resol igual un problema en un entorn determinista i totalment observable que en un d'estocàstic i parcialment observable. En aquesta lliçó definirem què és un agent i el seu cicle percebre-decidir-actuar, què vol dir que actuï racionalment, com descriure qualsevol sistema amb l'esquema PEAS, quines propietats tenen els entorns, quins tipus d'agent existeixen i, com a pont cap al mòdul 3, com es formula un problema perquè un agent el pugui resoldre. Tot plegat aplicat a tres sistemes de NovaMarket: l'assistent d'atenció al client, el recomanador i el planificador de rutes.
Contingut
- Què és un agent intel·ligent
- El cicle percebre-decidir-actuar
- Racionalitat i mesura de rendiment
- La descripció PEAS aplicada a NovaMarket
- Propietats dels entorns
- Tipus d'agent
- Formulació d'un problema: pont cap al mòdul 3
- Exemple en Python: de l'agent reflex a l'agent basat en utilitat
- Què és un agent intel·ligent
A la lliçó 01-02 vam adoptar la visió de la IA com la construcció de sistemes que actuen racionalment. El concepte que fa operativa aquesta definició és el d'agent. Un agent és qualsevol cosa que:
- percep el seu entorn a través de sensors, i
- actua sobre aquest entorn a través d'actuadors.
La definició és deliberadament àmplia. Un termòstat és un agent (sensor: termòmetre; actuador: interruptor de la caldera). Un robot de magatzem és un agent (sensors: càmeres, lectors de codis de barres, encoders de les rodes; actuadors: motors, pinça). I un programa que respon correus també ho és, encara que no tingui cos: els seus sensors són les entrades de dades que rep (el text del correu, la base de dades de comandes) i els seus actuadors són les sortides que produeix (un correu de resposta, una crida a l'API del magatzem). Els agents purament de programari s'anomenen de vegades agents de programari o softbots.
Vocabulari bàsic que farem servir durant tot el curs:
| Terme | Definició | Exemple a l'assistent d'atenció al client de NovaMarket |
|---|---|---|
| Percepció | El que l'agent rep de l'entorn en un instant | El missatge del client: "On és la meva comanda 48213?" |
| Seqüència de percepcions | Tot el que l'agent ha percebut fins ara | Els missatges anteriors de la mateixa conversa i les dades consultades |
| Acció | El que l'agent fa sobre l'entorn | Respondre amb l'estat de l'enviament; obrir una incidència; passar el cas a una persona |
| Sensor | Mecanisme pel qual arriba la percepció | El canal de xat, la consulta a la base de dades de comandes |
| Actuador | Mecanisme pel qual s'executa l'acció | L'enviament del missatge al xat, l'API que crea la incidència |
| Funció de l'agent | La correspondència entre seqüències de percepcions i accions | "Si el client pregunta per una comanda i en dona el número, consulta l'estat i respon-lo" |
| Programa de l'agent | La implementació concreta d'aquesta funció | El codi Python (o el model) que la calcula |
Fixa't en la distinció entre funció i programa de l'agent. La funció és una descripció abstracta ("què hauria de fer davant de cada historial de percepcions"); el programa és com ho aconseguim. El chatbot de regles que NovaMarket va abandonar el 2015 i un assistent modern basat en un model de llenguatge poden aspirar a la mateixa funció; el que canvia radicalment és el programa. I aquí apareix la idea central del curs: en molts casos la funció és massa complexa per escriure-la a mà regla a regla (que és el que va fracassar el 2015), així que s'aprèn a partir de dades, exactament el canvi de paradigma que vam veure a 01-02.
- El cicle percebre-decidir-actuar
Tot agent, per simple o sofisticat que sigui, repeteix el mateix bucle:
flowchart LR
E[Entorn] -- percepció --> S[Sensors]
S --> D{Decidir<br/>funció de l'agent}
D --> A[Actuadors]
A -- acció --> E
- Percebre: els sensors capturen l'estat (o una part de l'estat) de l'entorn.
- Decidir: el programa de l'agent, a partir de la percepció actual i, segons el tipus d'agent, del que recordi, tria una acció.
- Actuar: els actuadors executen l'acció, que modifica l'entorn.
- L'entorn canvia (per l'acció de l'agent i, sovint, per si mateix), i el cicle torna a començar.
Vegem-ho amb el recomanador que vam construir al final de 01-03. A cada visita d'un client a la fitxa d'un producte:
- Percepció: el producte que està veient (i, en versions més avançades, el seu historial i la seva cistella).
- Decisió: la funció
recomanar, que consulta la taula de co-compres i tria els productes amb més coincidències. - Acció: mostrar aquests productes a la caixa "també van comprar".
- Canvi de l'entorn: el client fa clic (o no), afegeix a la cistella (o no); si ho registrem, la propera volta del bucle tindrà més dades.
Aquest últim punt és important: quan les accions de l'agent influeixen en les percepcions futures (el que recomanes avui canvia el que es compra demà), l'agent i l'entorn formen un sistema tancat, i això té conseqüències que veurem en parlar d'entorns seqüencials.
- Racionalitat i mesura de rendiment
Un agent que percep i actua no és necessàriament intel·ligent: l'ELIZA de 01-01 percebia i actuava. El que distingeix un agent racional és que tria, en cada moment, l'acció que maximitza el valor esperat de la seva mesura de rendiment, donada l'evidència que li aporten les seves percepcions i el coneixement que tingui incorporat.
Desgranem la frase, perquè cada peça importa:
- Mesura de rendiment: el criteri amb què s'avalua l'èxit de l'agent. La fixa el dissenyador, no l'agent, i sempre ha d'expressar el que volem aconseguir a l'entorn, no com creiem que l'agent s'hauria de comportar. És la part més delicada del disseny.
- Valor esperat: com que l'agent rarament té certesa sobre les conseqüències de les seves accions, s'avaluen en mitjana, ponderant per la seva probabilitat. Un recomanador no sap si el client comprarà, però pot estimar que la probabilitat és més alta amb un producte que amb un altre.
- Donada l'evidència i el coneixement: la racionalitat es jutja amb el que l'agent sap, no amb el que se sap a posteriori. Un planificador de rutes que tria l'autopista i es troba un accident imprevist no ha estat irracional; hauria estat irracional ignorar un avís de trànsit que ja tenia.
Racionalitat no és el mateix que omnisciència (saber el resultat real de cada acció) ni que perfecció (encertar sempre). És "fer-ho tan bé com es pugui amb el que se sap". I un agent racional també ha de recollir informació (preguntar al client el número de comanda abans de respondre) i aprendre de l'experiència quan l'entorn ho permet. Un agent el comportament del qual depèn només del que li van programar els seus dissenyadors té poca autonomia; un que corregeix les seves decisions amb el que percep en té més.
La mesura de rendiment importa més del que sembla
Triar malament la mesura de rendiment produeix agents que "fan trampes": optimitzen exactament el que se'ls va demanar, que no era el que volíem. En Diego ho descriu amb una anècdota real de NovaMarket: durant un temps l'equip d'atenció al client cobrava un incentiu per "converses tancades per hora"; el resultat va ser que moltes converses es tancaven sense resoldre el problema. Un agent artificial fa exactament el mateix, només que més ràpid i sense sentir vergonya. Compara aquestes possibles mesures per a l'assistent:
| Mesura de rendiment | Quin comportament premia | Problema |
|---|---|---|
| Nombre de converses tancades | Tancar ràpid | Tanca sense resoldre |
| Temps mitjà de resposta | Respondre ràpid | Respon qualsevol cosa |
| Percentatge de consultes resoltes sense intervenció humana | Evitar l'escalada | Mai deriva casos que sí que ho requereixen |
| Satisfacció del client (enquesta) + cost per conversa + percentatge d'escalades correctes | Resoldre bé, barat i saber quan demanar ajuda | Més difícil de mesurar, però és el que volem |
L'última fila és més complexa, però és la que reflecteix l'objectiu real. Regla pràctica: defineix la mesura de rendiment en termes del resultat desitjat a l'entorn, combina diversos criteris si cal, i pregunta't sempre "què faria un agent que volgués maximitzar això sense que li importés res més?". Reprendrem aquesta idea a 02-04 (ètica) i a 04-05 (avaluació de models).
- La descripció PEAS aplicada a NovaMarket
Per dissenyar un agent convé començar per descriure el seu entorn de tasques amb quatre elements, que es recorden amb l'acrònim PEAS:
- Performance (mesura de rendiment): com es mesura l'èxit?
- Environment (entorn): en quin món actua? Què hi ha allà fora?
- Actuators (actuadors): què pot fer?
- Sensors (sensors): què pot percebre?
Apliquem-ho a tres dels casos d'ús de NovaMarket. La Marta i en Diego van omplir aquesta taula en una reunió, i és un bon exercici de com PEAS obliga a fer-se les preguntes correctes abans d'escriure una línia de codi:
| Element | Assistent d'atenció al client (cas 7) | Recomanador (cas 1) | Planificador de rutes de repartiment (cas 5) |
|---|---|---|---|
| Performance | Satisfacció del client, percentatge de consultes resoltes correctament, cost per conversa, escalades a humà ben decidides (ni de més ni de menys) | Ingressos addicionals per recomanació, taxa de clic i de compra, diversitat del que es recomana, no molestar (les recomanacions irrellevants penalitzen) | Quilòmetres i hores totals, lliuraments dins de la franja promesa, cost de combustible, compliment de la jornada dels conductors |
| Environment | Clients amb dubtes de tota mena (enviaments, devolucions, garanties, factures), base de dades de comandes i incidències, polítiques de l'empresa, altres canals (correu, telèfon) | Catàleg d'uns 12.000 productes, unes 3.000 comandes/dia, historial de navegació i compres, estoc, campanyes actives | Xarxa de carrers de cada ciutat, trànsit, unes 3.000 comandes/dia repartides entre repartiment propi i missatgeria, furgonetes i conductors, franges horàries promeses, magatzems de Zaragoza i Getafe |
| Actuators | Enviar missatges al xat, consultar i crear incidències, iniciar una devolució, derivar a una persona | Mostrar N productes a la fitxa, a la cistella o en un correu; ordenar el llistat | Assignar comandes a furgonetes, fixar l'ordre de parades, enviar la ruta al conductor, replanificar durant el dia |
| Sensors | Text del client, identificador de client/comanda, estat de la comanda a la base de dades, historial de la conversa | Producte en pantalla, identificador del client, cistella, historial, hora, dispositiu | Llista de comandes del dia amb adreces i franges, posició GPS de les furgonetes, trànsit en temps real, incidències del conductor |
Observacions que surten de la taula:
- En els tres casos la mesura de rendiment és composta: mai és una sola xifra. En Diego va insistir a incloure el cost en totes tres.
- L'entorn del planificador de rutes és físic i canvia per si sol (el trànsit); el del recomanador és purament digital. Això afectarà la tècnica.
- Els sensors de l'assistent inclouen "historial de la conversa": és la pista que l'assistent necessitarà memòria (ho veurem als tipus d'agent).
Quan al mòdul 8 abordem com desenvolupar un projecte d'IA, la descripció PEAS serà un dels primers lliurables.
- Propietats dels entorns
No tots els entorns són igual de difícils. Es caracteritzen amb sis dimensions, i la combinació determina quines tècniques són viables:
| Dimensió | Opció "fàcil" | Opció "difícil" | Pregunta clau |
|---|---|---|---|
| Observabilitat | Totalment observable: els sensors donen l'estat complet rellevant | Parcialment observable: hi ha informació oculta o sorollosa | Veig tot el que necessito per decidir? |
| Determinisme | Determinista: l'estat següent queda fixat per l'estat actual i l'acció | Estocàstic: hi ha atzar o factors que no controlo | Si repeteixo la mateixa acció en la mateixa situació, passa sempre el mateix? |
| Episòdic / seqüencial | Episòdic: cada decisió és independent de les anteriors | Seqüencial: les decisions d'avui condicionen les de demà | La meva acció actual afecta les meves decisions futures? |
| Estàtic / dinàmic | Estàtic: l'entorn no canvia mentre l'agent delibera | Dinàmic: canvia encara que l'agent no faci res | Puc pensar amb calma o el món continua avançant? |
| Discret / continu | Discret: nombre finit d'estats, accions i percepcions clarament separats | Continu: valors que varien suaument (posicions, temps, quantitats) | Puc enumerar les opcions? |
| Agents | Monoagent: només actua el meu agent | Multiagent: hi ha altres agents (cooperatius o competitius) les decisions dels quals importen | Algú més està decidint en aquest món? |
Alguns exemples clàssics per calibrar la intuïció: uns mots encreuats són totalment observables, deterministes, seqüencials, estàtics, discrets i monoagent (el cas més fàcil). Els escacs són igual, tret que són multiagent (competitiu). Un taxi autònom és parcialment observable, estocàstic, seqüencial, dinàmic, continu i multiagent (el cas més difícil, i per això va costar tant). El pòquer afegeix al que tenen els escacs l'observabilitat parcial (no veus les cartes del rival) i l'atzar del repartiment.
Classifiquem ara els tres sistemes de NovaMarket:
| Dimensió | Assistent d'atenció al client | Recomanador | Planificador de rutes |
|---|---|---|---|
| Observabilitat | Parcial: el client no sempre diu què li passa; les dades internes poden estar desactualitzades | Parcial: no sabem les intencions ni el pressupost del client; només veiem el seu comportament | Parcial: el trànsit i les incidències futures no es coneixen; el GPS té error |
| Determinisme | Estocàstic: la mateixa resposta produeix reaccions diferents en clients diferents | Estocàstic: la mateixa recomanació de vegades converteix i de vegades no | Estocàstic: temps de trajecte variables, absències del destinatari |
| Episòdic / seqüencial | Seqüencial dins d'una conversa (cada missatge depèn dels anteriors) | Gairebé episòdic a cada visita, però seqüencial a llarg termini (el que recomanes canvia el que es compra i, per tant, les dades futures) | Seqüencial: cada parada condiciona les següents |
| Estàtic / dinàmic | Dinàmic (el client escriu mentre l'agent "pensa"; a la pràctica, semidinàmic) | Estàtic a cada petició (el catàleg no canvia en els mil·lisegons que triga a respondre) | Dinàmic: el trànsit i les comandes noves canvien mentre es planifica |
| Discret / continu | Discret en les accions (respostes, derivacions), tot i que el text és un espai enorme | Discret: catàleg finit | Continu en posicions i temps; discret en la tria de l'ordre de parades |
| Agents | Multiagent: el client és un altre agent amb els seus objectius | Monoagent en primera aproximació (tot i que competeix amb la mateixa navegació del client i amb altres botigues) | Multiagent: altres vehicles, altres conductors, missatgeries |
Conclusions pràctiques de la classificació:
- Cap dels tres és el "cas fàcil". Al món real gairebé cap problema ho és; els entorns totalment observables i deterministes apareixen sobretot en jocs i trencaclosques, que és on el mòdul 3 introduirà els algorismes de cerca abans de complicar-los.
- L'observabilitat parcial i l'estocasticitat són les que empenyen cap a l'aprenentatge automàtic (mòdul 4) i el raonament amb incertesa (06-03): si no pots veure-ho tot ni predir amb certesa, necessites estimar.
- El caràcter dinàmic del planificador de rutes obliga que l'agent sigui ràpid i pugui replanificar: no serveix un algorisme perfecte que trigui tres hores.
- El recomanador sembla el més senzill (estàtic, discret, gairebé episòdic), i per això NovaMarket va encertar en triar-lo com a primer projecte.
- Tipus d'agent
Els agents s'organitzen en una escala de sofisticació creixent segons quina informació fan servir per decidir. Cada nivell inclou l'anterior:
flowchart TB
A[Agent reflex simple<br/>percepció actual → regla → acció] --> B[Agent reflex basat en model<br/>afegeix estat intern: què recordo del món]
B --> C[Agent basat en objectius<br/>afegeix metes: què vull aconseguir]
C --> D[Agent basat en utilitat<br/>afegeix preferències: quant valoro cada resultat]
D --> E[Agent que aprèn<br/>afegeix millora amb l'experiència]
6.1 Agent reflex simple
Decideix mirant només la percepció actual, mitjançant regles condició-acció: "si el missatge conté 'on és la meva comanda', respon amb l'estat de l'enviament". És ràpid i fàcil d'entendre, però:
- Només funciona bé si l'entorn és totalment observable: si la percepció actual no n'hi ha prou per decidir, s'equivoca.
- No té memòria: si el client va donar el número de comanda al missatge anterior, aquest agent ja no ho sap.
- Pot entrar en bucles (repetir la mateixa pregunta una vegada i una altra).
El chatbot de 2015 de NovaMarket era exactament això, i el seu fracàs va ser en gran part per operar en un entorn parcialment observable i seqüencial amb una arquitectura pensada per a entorns totalment observables i episòdics.
6.2 Agent reflex basat en model
Afegeix un estat intern: una representació del que l'agent creu que passa al món, mantinguda amb dos tipus de coneixement: com evoluciona el món per si sol i quin efecte tenen les pròpies accions. A l'assistent, l'estat intern és el context de la conversa (número de comanda ja identificat, si ja s'ha ofert una devolució, quantes vegades ha preguntat el mateix el client). Continua decidint amb regles, però ara les regles poden consultar la memòria. Això resol l'observabilitat parcial dins d'una conversa.
6.3 Agent basat en objectius
Les regles diuen "què fer", però no "per a què". Un agent basat en objectius té una descripció explícita de la meta (lliurar totes les comandes del dia dins de la seva franja) i tria accions raonant sobre les seves conseqüències: "si vaig primer a Delicias i després a Actur, assoleixo la meta?". Això és més flexible: si canvia l'objectiu (per exemple, prioritzar una comanda urgent), no cal reescriure les regles, n'hi ha prou amb canviar la meta. La contrapartida és que decidir exigeix cercar o planificar entre seqüències d'accions, que és el que estudia el mòdul 3.
6.4 Agent basat en utilitat
Un objectiu diu si un estat és bo o dolent (binari). Però moltes vegades hi ha moltes maneres d'assolir la meta i unes són millors que altres: arribar a tots els lliuraments és la meta, però fer-ho en 6 hores és millor que en 8, i molestar un client amb una trucada té un cost. Una funció d'utilitat assigna a cada estat (o resultat) un nombre que expressa quant el valora l'agent, i l'agent racional tria l'acció que maximitza la utilitat esperada. És la traducció directa de la definició de racionalitat de la secció 3: la utilitat interna de l'agent hauria de coincidir amb la mesura de rendiment externa. Al recomanador, la utilitat de recomanar un producte podria combinar la probabilitat de compra, el marge i una penalització per repetir sempre el mateix.
6.5 Agent que aprèn
Qualsevol dels anteriors pot, a més, aprendre: millorar la seva funció de decisió a partir de l'experiència. Conceptualment té quatre components: l'element d'actuació (l'agent tal com l'hem descrit), l'element d'aprenentatge (que el modifica), el crític (que compara els resultats amb la mesura de rendiment i informa l'element d'aprenentatge) i el generador de problemes (que proposa accions exploratòries per descobrir coses noves, com recomanar de tant en tant un producte poc vist per veure si funciona). El mòdul 4 dedica sis lliçons a com s'aprèn; aquí n'hi ha prou amb situar-ho al mapa. El nostre aprendre_llindar de 01-02, que va substituir els 300 € d'en Diego per 120 €, era un element d'aprenentatge rudimentari.
Taula resum:
| Tipus d'agent | Què fa servir per decidir | Requereix de l'entorn | Exemple a NovaMarket |
|---|---|---|---|
| Reflex simple | Percepció actual + regles | Totalment observable, episòdic | Regla "import > 300 € → revisar" |
| Reflex basat en model | Percepció + estat intern + regles | Tolera observabilitat parcial | Assistent que recorda el número de comanda |
| Basat en objectius | Estat + metes + raonament sobre conseqüències | Necessita poder predir efectes | Planificador de rutes: "lliurar-ho tot dins la franja" |
| Basat en utilitat | Estat + preferències graduades | Ídem, i permet comparar alternatives | Recomanador que pondera probabilitat de compra i marge |
| Que aprèn | Qualsevol dels anteriors + retroalimentació | Necessita dades o experiència | Recomanador que reentrena amb comandes noves |
- Formulació d'un problema: pont cap al mòdul 3
Quan un agent basat en objectius ha de decidir quina seqüència d'accions el porta a la meta, el primer pas és formular el problema de manera precisa. La formulació estàndard té cinc components:
- Estat inicial: on comença l'agent. Exemple: la furgoneta és al magatzem de Getafe amb 40 comandes carregades.
- Accions: què pot fer en cada estat. Exemple: desplaçar-se a qualsevol de les parades pendents.
- Model de transició: quin estat resulta d'aplicar una acció en un estat. Exemple: "anar a la parada 7" porta a un estat amb la furgoneta a la parada 7 i 39 comandes pendents.
- Test d'objectiu: com es reconeix que s'ha assolit la meta. Exemple: no queden comandes pendents i la furgoneta ha tornat al magatzem.
- Cost del camí: un nombre que mesura el cost d'una seqüència d'accions. Exemple: quilòmetres o minuts acumulats.
Amb aquests cinc elements, resoldre el problema consisteix a trobar una seqüència d'accions (un camí en l'espai d'estats) que porti de l'estat inicial a un estat objectiu, idealment amb cost mínim. Aquí no resoldrem res: els algorismes que fan aquesta cerca (amplada, profunditat, cost uniforme, A*) són el contingut de la lliçó 03-02, i les tècniques per a quan l'espai és massa gran per explorar-lo sencer, el de 03-04. El que sí que convé retenir ara són dues idees:
- La formulació és una abstracció: eliminem tots els detalls irrellevants (el color de la furgoneta, la música que escolta el conductor) i ens quedem amb el que afecta la decisió. Triar bé el nivell d'abstracció és mitja solució.
- El cost és la versió "de cerca" de la mesura de rendiment: si defineixes malament el cost (només quilòmetres, oblidant les franges horàries), l'agent trobarà camins òptims per al problema equivocat.
Un segon exemple, més discret: el diagnòstic d'una incidència (cas 9). Estat inicial: incidència oberta amb símptomes coneguts. Accions: fer una comprovació (ha arribat el paquet?, està danyat?, coincideix la referència?). Transició: cada comprovació revela informació i redueix les causes possibles. Objectiu: causa identificada. Cost: nombre de comprovacions o temps de l'operador. Reprendrem aquest cas al mòdul 6 amb sistemes experts.
- Exemple en Python: de l'agent reflex a l'agent basat en utilitat
Construirem un assistent d'atenció al client en miniatura i el farem evolucionar per tres dels nivells de la secció 6. Farem servir només Python estàndard. L'objectiu no és un assistent útil, sinó veure en codi què diferencia cada tipus d'agent.
8.1 Agent reflex simple
class AgentReflex:
"""Agent reflex simple: decideix mirant nomes la percepcio actual."""
def __init__(self, regles):
# regles: llista de tuples (condicio, accio).
# condicio es una funcio que rep la percepcio i retorna True/False.
self.regles = regles
def percebre(self, missatge):
# El "sensor" normalitza el text: minuscules i sense espais sobrers.
return missatge.lower().strip()
def decidir(self, percepcio):
# Recorre les regles en ordre i executa la primera que es compleix.
for condicio, accio in self.regles:
if condicio(percepcio):
return accio
return "derivar_a_huma" # accio per defecte
def actuar(self, accio):
# L'"actuador": aqui nomes imprimeix, en produccio enviaria el missatge.
respostes = {
"informar_estat_enviament": "Consulto l'estat del teu enviament. Em pots indicar el numero de comanda?",
"explicar_devolucio": "Pots retornar-lo en 30 dies des de la teva area de client.",
"derivar_a_huma": "Et passo amb una persona de l'equip.",
}
print(f"[{accio}] {respostes[accio]}")
def pas(self, missatge):
# Cicle complet: percebre -> decidir -> actuar
percepcio = self.percebre(missatge)
accio = self.decidir(percepcio)
self.actuar(accio)
regles = [
(lambda p: "comanda" in p or "enviament" in p, "informar_estat_enviament"),
(lambda p: "retornar" in p or "devolucio" in p, "explicar_devolucio"),
]
assistent = AgentReflex(regles)
assistent.pas("Hola, on és la meva comanda?")
assistent.pas("És el 48213")
assistent.pas("Vull retornar un producte")Sortida:
[informar_estat_enviament] Consulto l'estat del teu enviament. Em pots indicar el numero de comanda? [derivar_a_huma] Et passo amb una persona de l'equip. [explicar_devolucio] Pots retornar-lo en 30 dies des de la teva area de client.
Explicació línia a línia:
reglesés una llista de parells(condicio, accio). Cada condició és una funció anònima (lambda) que rep la percepció i retornaTruesi la regla s'aplica. Aquesta és l'essència de l'agent reflex: una taula percepció → acció.percebreés el sensor: converteix el missatge brut en una cosa comparable (minúscules, sense espais sobrers). Fixa't en com n'és, de fràgil: si la primera regla busqués la frase completa "on es la meva comanda" (sense accents), el missatge real "on és la meva comanda?" (amb accents) no l'activaria i l'agent derivaria a humà sense motiu. Per això la regla busca només la paraula "comanda". Els agents reflex basats en cadenes de text fallen davant de variacions trivials (accents, sinònims, errates), i ampliar les regles per cobrir-les totes és una cursa sense fi: és una de les raons per les quals el processament del llenguatge natural va acabar recorrent a l'aprenentatge (mòduls 4 i 5).- El segon missatge, "És el 48213", és la resposta a la pregunta de l'agent. Però l'agent reflex no recorda que acaba de preguntar per un número de comanda, així que no reconeix la resposta i deriva a humà. Aquesta és la fallada estructural de l'agent reflex en un entorn seqüencial, i exactament el tipus de conversa que trencava el chatbot de 2015.
8.2 Agent reflex basat en model: afegim estat intern
import re
class AgentAmbModel(AgentReflex):
"""Agent reflex basat en model: mante un estat intern de la conversa."""
def __init__(self, regles):
super().__init__(regles)
self.estat = {"esperant_comanda": False, "comanda": None}
def actualitzar_estat(self, percepcio):
# Model del mon: si esperavem un numero i n'arriba un, el desem.
numero = re.search(r"\b\d{4,6}\b", percepcio)
if self.estat["esperant_comanda"] and numero:
self.estat["comanda"] = numero.group()
self.estat["esperant_comanda"] = False
def decidir(self, percepcio):
self.actualitzar_estat(percepcio)
if self.estat["comanda"] and "comanda_acabada_identificar" not in self.estat:
self.estat["comanda_acabada_identificar"] = True
return "informar_estat_comanda"
accio = super().decidir(percepcio)
if accio == "informar_estat_enviament":
self.estat["esperant_comanda"] = True # efecte de la nostra propia accio
return accio
def actuar(self, accio):
if accio == "informar_estat_comanda":
print(f"[{accio}] La teva comanda {self.estat['comanda']} surt avui del magatzem de Zaragoza.")
else:
super().actuar(accio)
regles = [
(lambda p: "comanda" in p or "enviament" in p, "informar_estat_enviament"),
(lambda p: "retornar" in p or "devolucio" in p, "explicar_devolucio"),
]
assistent = AgentAmbModel(regles)
assistent.pas("Hola, on és la meva comanda?")
assistent.pas("És el 48213")Sortida:
[informar_estat_enviament] Consulto l'estat del teu enviament. Em pots indicar el numero de comanda? [informar_estat_comanda] La teva comanda 48213 surt avui del magatzem de Zaragoza.
Explicació:
self.estatés l'estat intern: el que l'agent creu del món. Aquí només desa si està esperant un número de comanda i quin és.actualitzar_estatimplementa el "model": fa servir una expressió regular (\b\d{4,6}\b, un nombre de 4 a 6 xifres aïllat) per detectar el número de comanda, però només l'interpreta com a tal si l'estava esperant. És la combinació de percepció actual i memòria.- Quan l'agent pregunta pel número (
informar_estat_enviament), registra l'efecte de la seva pròpia acció (esperant_comanda = True). Aquest és el segon tipus de coneixement de l'agent basat en model: quin efecte tenen les meves accions sobre el món (en aquest cas, sobre la conversa). - El resultat: la mateixa conversa que trencava l'agent reflex ara flueix. Amb molt poc codi hem passat d'un agent inadequat per a entorns seqüencials a un que els tolera. En un assistent real l'estat seria molt més ric (intenció detectada, productes esmentats, to del client), i amb models de llenguatge aquest "estat" és en gran mesura el mateix historial de la conversa (ho veurem a 05-05).
8.3 Agent basat en utilitat: triar entre alternatives
Suposem ara que, davant d'una queixa per un retard, l'assistent té tres accions possibles i vol triar la de més utilitat esperada. Per a cada acció estimem la probabilitat que el client quedi satisfet i el cost per a NovaMarket:
def utilitat_esperada(prob_satisfaccio, cost_euros, valor_client_satisfet=15.0):
"""Utilitat = benefici esperat de la satisfaccio - cost de l'accio."""
return prob_satisfaccio * valor_client_satisfet - cost_euros
# Estimacions per a un client amb un retard de 2 dies en una comanda de 80 EUR
opcions = {
"disculpa_i_data_nova": {"prob": 0.55, "cost": 0.0},
"cupo_5_euros": {"prob": 0.80, "cost": 5.0},
"reenviament_urgent": {"prob": 0.90, "cost": 12.0},
}
def triar_accio(opcions):
millor_accio, millor_utilitat = None, float("-inf")
for accio, dades in opcions.items():
u = utilitat_esperada(dades["prob"], dades["cost"])
print(f"{accio:28s} utilitat esperada = {u:6.2f}")
if u > millor_utilitat:
millor_accio, millor_utilitat = accio, u
return millor_accio
print("Accio triada:", triar_accio(opcions))Sortida:
disculpa_i_data_nova utilitat esperada = 8.25 cupo_5_euros utilitat esperada = 7.00 reenviament_urgent utilitat esperada = 1.50 Accio triada: disculpa_i_data_nova
Explicació:
utilitat_esperadaés la funció d'utilitat: tradueix a un nombre el que NovaMarket valora (un client satisfet "val" 15 € en fidelitat futura, xifra que la Marta va estimar a partir de la recompra mitjana) menys el que costa l'acció.- Cada acció té un resultat incert (el client pot quedar satisfet o no), per això multipliquem per la probabilitat: és l'"esperança" de la definició de racionalitat.
triar_acciorecorre les opcions i es queda amb la de més utilitat esperada. Aquí guanya la disculpa: el cupó augmenta molt la satisfacció però el seu cost el penalitza. Prova de canviarvalor_client_satisfeta 40 (un client molt valuós) i veuràs que la decisió canvia acupo_5_euros. Aquesta sensibilitat és una virtut: la política s'adapta canviant les preferències, no reescrivint regles.- D'on surten les probabilitats 0,55, 0,80 i 0,90? Aquí estan escrites a mà. En un sistema real s'aprendrien de les dades històriques d'incidències i enquestes: aquest és el pas cap a l'agent que aprèn, i el contingut del mòdul 4.
Amb aquests tres fragments has vist l'escala completa: regles sobre la percepció actual, regles més memòria, i tria per utilitat esperada. Un assistent modern combina els tres nivells i hi afegeix aprenentatge.
Errors Comuns i Consells
- Confondre la mesura de rendiment amb el comportament desitjat. "Vull que l'assistent respongui ràpid" és un comportament; "vull clients satisfets a baix cost" és un resultat. Mesura resultats, i pregunta't sempre com faria trampes un agent que optimitzés cegament la teva mètrica.
- Jutjar la racionalitat a posteriori. Que una decisió surti malament no vol dir que fos irracional. Avalua amb la informació que l'agent tenia en el moment de decidir.
- Triar l'arquitectura sense classificar l'entorn. El chatbot de 2015 va fracassar per fer servir un agent reflex en un entorn parcialment observable i seqüencial. Omple la taula de propietats de l'entorn abans de decidir la tècnica.
- Omplir PEAS de manera vaga. "Entorn: internet" no serveix. Sigues concret: quines dades, quins usuaris, quines restriccions. La qualitat del PEAS anticipa la qualitat del projecte.
- Sobredimensionar l'agent. No tot necessita utilitat i aprenentatge. Si l'entorn és realment simple (una regla clara de negoci), un agent reflex ben fet és més barat, més ràpid i més explicable. La sofisticació es justifica per l'entorn, no per la moda.
- Oblidar el cost de les accions. En Diego té raó a insistir-hi: una acció amb gran probabilitat d'èxit però cost alt pot tenir pitjor utilitat que una de modesta i gratuïta.
- Consell: quan et presentin qualsevol sistema "intel·ligent", intenta omplir mentalment el seu PEAS i classificar el seu entorn. En un minut sabràs si el sistema és adequat per al problema i què pot fallar.
Exercicis
Exercici 1: PEAS i entorn del sistema de previsió de demanda
NovaMarket ha decidit començar també per la previsió de demanda (cas 2): estimar quantes unitats de cada producte es vendran la setmana vinent per fer comandes a proveïdors i reubicar estoc entre Zaragoza i Getafe. Escriu la seva descripció PEAS i classifica l'entorn en les sis dimensions, justificant cadascuna en una frase.
Exercici 2: Mesures de rendiment amb trampa
Per al planificador de rutes, indica quin comportament indesitjat produiria cadascuna d'aquestes mesures de rendiment si fos l'única: (a) minimitzar quilòmetres totals; (b) maximitzar lliuraments fets per hora; (c) minimitzar queixes de clients. Proposa després una mesura composta raonable.
Exercici 3: Ampliar l'agent basat en model
Modifica AgentAmbModel perquè, si el client repeteix tres vegades una consulta que l'agent no sap resoldre (acció derivar_a_huma), l'agent ho detecti i afegeixi al missatge de derivació el text "Veig que no aconsegueixo ajudar-te". Necessitaràs un comptador a self.estat. Explica quina propietat de l'entorn fa necessària aquesta memòria.
Solucions
Solució 1.
| Element | Previsió de demanda |
|---|---|
| Performance | Error de previsió (diferència entre unitats previstes i venudes), trencaments d'estoc evitats, cost de sobreestoc, cost de trasllats entre magatzems |
| Environment | Catàleg d'uns 12.000 productes, historial d'unes 3.000 comandes/dia, estacionalitat, campanyes i promocions, preus propis i de la competència, terminis de proveïdors |
| Actuators | Emetre previsió per producte i magatzem; suggerir comandes a proveïdor i trasllats entre magatzems |
| Sensors | comandes.csv històric, productes.csv (categoria, preu, estoc), calendari de campanyes, festius |
Entorn: parcialment observable (no veiem les intencions dels clients ni les accions de la competència); estocàstic (la demanda té atzar); seqüencial (una previsió errònia avui deixa estoc que condiciona el mes següent; a més, la mateixa recomanació i les promocions canvien la demanda); estàtic en el moment de calcular (es fa de nit amb dades tancades; el món no canvia durant el càlcul); discret en les unitats, tot i que les sèries temporals de vendes se solen tractar com a contínues; monoagent en primera aproximació (tot i que la competència i els proveïdors són agents que hi influeixen). És un problema de predicció típic d'aprenentatge supervisat sobre sèries temporals, que es reprendrà al mòdul 4.
Solució 2.
- (a) Minimitzar quilòmetres: l'agent agruparà parades properes ignorant les franges horàries promeses; lliurarà tard a qui estigui "de pas" més endavant. També podria deixar comandes sense repartir si això redueix quilòmetres (el mínim és no sortir!), tret que s'obligui a lliurar-ho tot.
- (b) Maximitzar lliuraments per hora: premiarà els lliuraments fàcils (portals accessibles, client a casa) i posposarà els difícils indefinidament; incentiva a "marcar com a lliurat" sense comprovar.
- (c) Minimitzar queixes: pot portar a no prometre mai franges (no hi ha incompliment si no hi ha promesa) o a assignar recursos desproporcionats als clients que més es queixen.
- Mesura composta: percentatge de lliuraments dins de la franja promesa (obligatori lliurar tot l'assignat) + cost total (quilòmetres × cost per km + hores × cost per hora) + penalització per incompliment de jornada laboral + satisfacció del client en enquestes de lliurament. Amb pesos acordats amb en Diego.
Solució 3.
class AgentAmbPaciencia(AgentAmbModel):
def __init__(self, regles):
super().__init__(regles)
self.estat["fallades_seguides"] = 0
def decidir(self, percepcio):
accio = super().decidir(percepcio)
if accio == "derivar_a_huma":
self.estat["fallades_seguides"] += 1
else:
self.estat["fallades_seguides"] = 0
return accio
def actuar(self, accio):
if accio == "derivar_a_huma" and self.estat["fallades_seguides"] >= 3:
print("[derivar_a_huma] Veig que no aconsegueixo ajudar-te. Et passo amb una persona de l'equip.")
else:
super().actuar(accio)
assistent = AgentAmbPaciencia(regles)
for _ in range(3):
assistent.pas("Necessito la factura en PDF")El tercer missatge produeix el text ampliat. La memòria és necessària perquè l'entorn és seqüencial: la decisió correcta davant de "necessito la factura" depèn de quantes vegades s'ha dit ja, una cosa que la percepció actual, per si sola, no conté (observabilitat parcial de la conversa si no es desa l'historial). Nota: en aquest exemple simple l'agent deriva a humà des de la primera vegada; en un assistent real la derivació és una acció cara (ocupa una persona) i el comptador serviria per decidir quan escalar en lloc de continuar intentant-ho.
Conclusió
En aquesta lliçó hem definit el concepte que vertebra tot el curs: l'agent intel·ligent, que percep el seu entorn mitjançant sensors i actua mitjançant actuadors en un cicle continu de percebre-decidir-actuar. Hem precisat què vol dir que un agent sigui racional (triar l'acció que maximitza la mesura de rendiment esperada amb la informació disponible) i hem vist que definir bé aquesta mesura és la decisió de disseny més delicada. Hem après a descriure qualsevol sistema amb l'esquema PEAS i a classificar el seu entorn en sis dimensions (observabilitat, determinisme, episòdic/seqüencial, estàtic/dinàmic, discret/continu, mono/multiagent), aplicant-ho a l'assistent, al recomanador i al planificador de rutes de NovaMarket. Hem recorregut l'escala de tipus d'agent (reflex simple, basat en model, basat en objectius, basat en utilitat, que aprèn) i l'hem vista en codi amb l'evolució d'AgentReflex a AgentAmbModel i a la tria per utilitat esperada. Finalment, hem presentat la formulació de problemes (estat inicial, accions, transició, objectiu, cost) que el mòdul 3 farà servir per resoldre'ls amb algorismes de cerca.
A la lliçó següent, Tipus d'Intel·ligència Artificial, canviarem d'escala: en lloc de mirar dins d'un agent, classificarem els sistemes d'IA en conjunt segons la seva capacitat (estreta, general, superintel·ligència), la seva funcionalitat (reactius, amb memòria limitada, teoria de la ment, autoconsciència) i altres dicotomies útils, i situarem en aquest mapa els nou casos d'ús de NovaMarket. Veuràs que els "agents reactius" i "amb memòria" que acabem de programar tenen el seu correlat directe en aquesta classificació.
Fonaments d'Intel·ligència Artificial (IA)
Mòdul 1: Introducció a la Intel·ligència Artificial
Mòdul 2: Principis Bàsics de la IA
- Conceptes Fonamentals: Agents, Entorns i Racionalitat
- Tipus d'Intel·ligència Artificial
- Les Dades com a Matèria Primera de la IA
- Ètica i Consideracions en IA
Mòdul 3: Algorismes en IA
- Introducció als Algorismes
- Algorismes de Cerca
- Cerca amb Adversari: Jocs i Minimax
- Algorismes d'Optimització
Mòdul 4: Aprenentatge Automàtic (Machine Learning)
- Conceptes Bàsics de Machine Learning
- Tipus d'Aprenentatge Automàtic
- Preparació de Dades i Característiques
- Algorismes de Machine Learning
- Avaluació i Validació de Models
- Sobreajust, Regularització i Ajust d'Hiperparàmetres
Mòdul 5: Xarxes Neuronals i Deep Learning
- Introducció a les Xarxes Neuronals
- Arquitectura de Xarxes Neuronals
- Com Aprèn una Xarxa: Descens del Gradient i Retropropagació
- Deep Learning i les seves Aplicacions
- Transformers, Grans Models de Llenguatge i IA Generativa
Mòdul 6: Lògica i Sistemes Experts
- Lògica en IA
- Sistemes Experts
- Raonament amb Incertesa: Probabilitat i Xarxes Bayesianes
- Aplicacions dels Sistemes Experts
Mòdul 7: Eines i Llenguatges de Programació en IA
- Llenguatges de Programació per a IA
- Python Científic: NumPy, pandas i Matplotlib
- Eines i Llibreries Populars
- Entorns de Desenvolupament
Mòdul 8: Projectes i Casos d'Estudi
Mòdul 9: Exercicis i Pràctiques
- Exercicis d'Algorismes
- Pràctiques de Machine Learning
- Projectes de Xarxes Neuronals
- Projecte Integrador: de la Idea al Prototip
