Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die je kunt uitvoeren
Een AI-agent doet meer dan alleen antwoorden. Het vergt een doel, kiest acties, controleert de resultaten en gaat door. Ontdek wat er in zit, voer een kleine lus uit in Python en begrijp de risico’s voordat u er een vertrouwt.
- Een AI-agent is doorgaans een taalmodel dat in een lus draait, met tools en een doel.
- De lus is eenvoudig: besluit, handel, observeer het resultaat en herhaal totdat het klaar is.
- Het model suggereert alleen acties. Uw code voert ze uit, en dat is waar u de regels afdwingt.
- Agenten kunnen tools herhalen of misbruiken, dus stel staplimieten in en heb goedkeuring nodig voor risicovolle acties.
Vraag een chatbot naar een late bestelling en hij geeft je advies. Vraag het aan een AI-agent en deze kan de bestelling opzoeken, de vertraging controleren, een voucher toepassen en terugrapporteren. Het verschil is dat een agent actie kan ondernemen en kan reageren op wat er gebeurt, in plaats van slechts één antwoord te geven.
In marketing wordt de term steeds uitgebreider, dus deze gids blijft bij de manier waarop deze systemen daadwerkelijk werken. Om het concreet te maken, hebben we een kleine agentlus in Python 3.13 gebouwd en uitgevoerd, en de onderstaande uitvoer is afkomstig van die runs. Ons ‘model’ is een scriptfunctie, geen echt AI-model, zodat de lus door iedereen kan worden uitgevoerd en getest. Het toont de controlestructuur, niet de intelligentie. Nieuw bij de basis? Lees eerst wat een groot taalmodel is.
Wat is een AI-agent?
Er bestaat geen eenduidige definitie. In de huidige praktijk is een AI-agent software die een doel nastreeft door herhaaldelijk te beslissen wat er vervolgens moet gebeuren, tools te gebruiken om op de wereld in te spelen en zich aan te passen op basis van resultaten. Meestal komt de besluitvorming voort uit een groot taalmodel.
Denk eens aan het verschil tussen iemand die aanwijzingen geeft en iemand die de boodschap doet. De eerste antwoorden één keer. De tweede gaat naar buiten, vindt de winkel gesloten, probeert een andere en komt pas terug als de klus geklaard is.
Chatbot, workflow of agent?
| Typ | Wie bepaalt de stappen? | Kan het handelen? | Voorbeeld |
|---|---|---|---|
| Chatbot | De gebruiker rijdt elke beurt | Meestal niet | Beantwoordt vragen uit de tekst |
| Vaste werkstroom | De ontwikkelaar, vooraf | Ja, op vaste paden | Vat elk ticket samen en stuur het vervolgens door |
| AI-agent | Het model, tijdens runtime | Ja, binnen de perken | Onderzoekt en lost een ticket op |
Deze bestaan op een spectrum, en veel nuttige systemen zijn een mix. De belangrijkste vraag is hoeveel van het pad tijdens runtime wordt bepaald.
Wat zit er in een agent?
| Deel | Rol |
|---|---|
| Model | Bepaalt de volgende stap, op basis van het doel en wat er tot nu toe is gebeurd |
| Instructies | Het doel, de regels en de grenzen die het moet volgen |
| Gereedschap | Functies die het kan opvragen, zoals zoeken of een API aanroepen |
| Geheugen | Wat het weet van eerdere stappen of eerdere sessies |
| Controlelus | Gewone code die tools uitvoert en limieten afdwingt |
De agentenlus
- Beslis. Het model kijkt naar het doel en de geschiedenis, en kiest een actie of besluit dat deze is voltooid.
- Act. Uw code voert de gevraagde tool uit.
- Observeren. Het resultaat wordt toegevoegd aan de geschiedenis.
- Herhaal totdat het doel is bereikt of een limiet is bereikt.
Dat is de kern van de meeste agenten. De verfijning ligt vooral in het model, de tools en de beveiligingen rondom deze lus.
Een lus die je kunt lopen
Onze kleine agent handelt vertraagde bestellingen af. Het heeft twee instrumenten, en één ervan heeft menselijke goedkeuring nodig omdat het geld kost:
ORDERS = {
"A100": {"status": "delayed", "days_late": 6},
"B200": {"status": "shipped", "days_late": 0},
}
def get_order(order_id):
return ORDERS.get(order_id, {"error": "order not found"})
def issue_voucher(order_id, amount):
return {"voucher": f"V-{order_id}", "amount": amount}
TOOLS = {"get_order": get_order, "issue_voucher": issue_voucher}
NEEDS_APPROVAL = {"issue_voucher"}
En hier is de lus zelf. Het is gewone code en elke veiligheidsregel leeft hier in plaats van in het model:
def run_agent(goal, model, approve, max_steps=5):
history = []
for step in range(1, max_steps + 1):
decision = model(goal, history)
if "finish" in decision:
return decision["finish"]
name, args = decision["tool"], decision["args"]
if name in NEEDS_APPROVAL and not approve(name, args):
result = {"denied": True}
else:
result = TOOLS[name](**args)
history.append({"tool": name, "result": result})
return None # stopped: step limit reached
Om een echt model te gebruiken, zou je de functie model vervangen door een aanroep naar een LLM API, waarbij je het doel, de geschiedenis en beschrijvingen van je tools doorgeeft. De lus blijft vrijwel hetzelfde.
Wat er gebeurde tijdens onze runs
We hebben vijf situaties uitgeprobeerd met de scriptbeslissingsfunctie en elke stap vastgelegd.
Een vertraagde bestelling, waarbij de voucher is goedgekeurd
step 1: get_order({'order_id': 'A100'}) -> {'status': 'delayed', 'days_late': 6}
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'voucher': 'V-A100', 'amount': 200}
step 3: finish -> Sorry for the delay. Voucher V-A100 issued.
Bij elke stap werd het resultaat van de voorgaande stap gebruikt. De voucher werd pas in aanmerking genomen nadat de vertraging was bevestigd.
Hetzelfde bevel, waarbij de goedkeuring werd geweigerd
step 2: issue_voucher({'order_id': 'A100', 'amount': 200}) -> {'denied': True}
step 3: finish -> Your order is late. A person will review compensation.
De mens zei nee, de tool werkte nooit en de agent paste zijn antwoord aan.
Een onbekende bestelling
step 1: get_order({'order_id': 'Z999'}) -> {'error': 'order not found'}
step 2: finish -> I could not find that order.
Tools duidelijke foutmeldingen geven helpt. Een echt model kan ze lezen en verstandig reageren, in plaats van te raden.
Een model dat vastloopt
We hebben ook een defecte beslissingsfunctie ingewisseld die dezelfde actie voor altijd herhaalde:
step 1: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 2: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
step 3: get_order({'order_id': 'B200'}) -> {'status': 'shipped', 'days_late': 0}
stopped: step limit reached
Agenten kunnen echt in dit soort lussen terechtkomen, en elke stap met een echt model kost geld. Zonder max_steps zou deze nooit zijn geëindigd.
Hoe hulpmiddelen werken
Dit is het meest verkeerd begrepen deel. Een taalmodel kan niets op zichzelf uitvoeren. Het produceert gestructureerde tekst waarin staat welk hulpmiddel het wil, met welke argumenten. Uw code beslist of deze wordt uitgevoerd. Daarom is de lus de juiste plek voor machtigingen, validatie en logging.
Modelaanbieders bieden hiervoor tool- of functieaanroepen. Het Model Context Protocol (MCP) is een open standaard voor het verbinden van modellen met tools en gegevens, en ons artikel over Playwright MCP laat één gebruik zien. Schrijf duidelijke gereedschapsnamen en -beschrijvingen, omdat het model ervan afhankelijk is om de juiste keuze te maken.
Tip: Begin met alleen-lezen-tools. Een agent die alleen maar dingen kan opzoeken is veel minder gevaarlijk dan een agent die kan versturen, verwijderen of betalen. Voeg schrijftoegang per tool toe, zodra je hebt gezien hoe het zich gedraagt.
Geheugen
| Typ | Houdt | Voorbeeld |
|---|---|---|
| Korte termijn | De geschiedenis van de huidige taak | De history lijst in onze lus |
| Lange termijn | Feiten bewaard tussen sessies | Gebruikersvoorkeuren in een database |
| Kennis | Documenten die worden opgehaald wanneer dat nodig is | RAG met behulp van insluitingen |
Lange taken kunnen het contextvenster van een model ontgroeien, waardoor systemen vaak oudere stappen samenvatten. In samenvattingen kunnen details verloren gaan, wat een van de redenen is dat langlopende agenten van hun koers kunnen afwijken.
Multi-agentsystemen
Sommige systemen verdelen het werk over verschillende gespecialiseerde agenten, zoals een planner, een onderzoeker en een recensent. Dit kan helpen bij grote taken die netjes verdeeld zijn. Het voegt ook kosten toe, meer manieren om te falen en moeilijker debuggen. Probeer eerst een enkele agent met goede tools en splits deze alleen als er een duidelijke reden is.
Risico’s en limieten
- Verkeerde acties. De fout van een chatbot is een slechte zin. De fout van een agent kan een verzonden e-mail of een verwijderd record zijn.
- Snelle injectie. Een webpagina of e-mail die de agent leest, kan verborgen instructies bevatten. Behandel alle tooluitvoer als niet-vertrouwde gegevens, niet als opdrachten.
- Samengestelde fouten. Een kleine fout in het begin kan elke latere stap in de verkeerde richting sturen.
- Kosten en latentie. Elke stap kan een andere modelaanroep zijn, waardoor een taak veel langzamer en duurder kan zijn dan een enkele prompt.
- Inconsistentie. Hetzelfde doel kan bij elke run een ander pad volgen, waardoor testen moeilijker wordt.
- Verantwoording. Mensen blijven verantwoordelijk voor wat het systeem doet, dus houd een administratie bij.
Vangrails die ertoe doen
- Minste rechten. Geef elke agent alleen de tools en toegang die hij nodig heeft.
- Menselijke goedkeuring voor alles wat duur, onomkeerbaar of extern is, zoals onze demo doet.
- Harde limieten voor stappen, tijd en uitgaven.
- Valideer toolinvoer in code en vertrouw niet op instructies van het model.
- Log elke stap, zodat je kunt zien waarom er iets is gebeurd. Zie monitoring versus waarneembaarheid.
- Test met echte scenario’s, inclusief mislukkingen. Controleer de eindresultaten en individuele antwoorden. Onze gids met best practices voor AI-agenten gaat verder over de implementatie.
Wanneer moet u een agent gebruiken?
| Gebruik een agent wanneer | Gebruik iets eenvoudiger wanneer |
|---|---|
| De stappen kunnen niet vooraf bekend zijn | De stappen zijn altijd hetzelfde |
| Voor de taak zijn verschillende hulpmiddelen nodig | Eén prompt kan het werk doen |
| Resultaten veranderen wat er daarna gebeurt | Een vaste workflow zou werken |
| Fouten zijn goedkoop of kunnen worden beoordeeld | Fouten zijn kostbaar en moeilijk ongedaan te maken |
Codeerassistenten zijn tegenwoordig een van de meest volwassen voorbeelden, omdat ze bestanden kunnen lezen, tests kunnen uitvoeren, fouten kunnen zien en het opnieuw kunnen proberen, terwijl een mens het resultaat beoordeelt. Een testsuite geeft hen een duidelijk signaal van succes. Onze gids voor snelle engineering is ook van toepassing op het schrijven van goede instructies voor agenten. Begin met het eenvoudigste dat kan werken, want een goed gemotiveerd telefoontje is vaak beter dan een ingewikkelde agent.
Tot slot
Een AI-agent is minder mysterieus dan het klinkt: een model, enkele tools en een lus met limieten. Het moeilijkste deel is vertrouwen, niet de code. Om te leren hoe ze zich gedragen, neem je onze kleine lus, verbind je deze met een echt model met alleen-lezen tools en bekijk je de logboeken terwijl deze werken. Je zult snel zien waar het schittert en waar het een mens nodig heeft.
Veelgestelde vragen
Wat is een AI-agent in eenvoudige woorden?
Het is software die naar een doel toewerkt door acties te kiezen, tools te gebruiken en de resultaten in een lus te controleren, in plaats van slechts één antwoord te geven.
Wat is het verschil tussen een chatbot en een AI-agent?
Een chatbot reageert voornamelijk op elk bericht. Een agent kan verschillende stappen plannen, tools oproepen en van koers veranderen op basis van wat er onderweg gebeurt.
Hebben AI-agenten een groot taalmodel nodig?
De meeste moderne gebruiken een LLM voor beslissingen, hoewel het bredere idee van softwareagenten ouder is en regels of andere AI-methoden kan gebruiken.
Zijn AI-agenten veilig?
Ze brengen reële risico’s met zich mee, waaronder verkeerde handelingen en snelle injecties. Beperk hun rechten, eis goedkeuring voor risicovolle stappen, stel harde limieten in en log alles.
Kan een AI-agent een ontwikkelaar of tester vervangen?
Vandaag niet in het algemeen. Ze kunnen veel goed gedefinieerde taken aan, maar mensen moeten nog steeds doelen stellen, de output beoordelen en verantwoordelijkheid nemen voor het resultaat.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →