Olet rakentanut viikon aikana pohjan: ymmärrät agenttisilmukan, työkalut (CLI vs MCP), muistimallit ja RAG:n. Nyt yhdistät kaikki ja toimitat oikean agentin oman tiimisi todelliseen tarpeeseen.
Tämä harjoitus rytmitettiin Sessio 3:n Exercise 3 -muotoon: 90 min tiimityö, valmis output, joka näytetään muille.
Pro tip
Harjoituksen alustustiedostot (gemini_agent.py, esimerkkiagentit, ohjeet) jaetaan Sessio 3:n live-koulutuksessa Mon Jun 15 — facilitator antaa zip-paketin tai jakaa repo-linkin sessiossa. Itseopiskelussa lue tämä lesson ohjeena prosessista, mutta odota tiedostot live-sessiosta tai pyydä niitä tuki@modernpath.ai.
Tavoite
Toimita toimiva agentti, joka ratkaisee tiimisi nykyisen, oikean työnkulun (PR-katselmointi, deploy-pipeline, incident-triage, dokumentaation generointi, tms.) automaattisesti tai puoliautomaattisesti.
Multi-step agent
Multi-step agent on agentti, joka suorittaa useampia peräkkäisiä toimia (Observe → Plan → Act → Evaluate → Store) yhden kutsun aikana. Se eroaa yksinkertaisesta tool-callista siinä, että se iteroi: havaitsee tuloksen, päättää seuraavan askeleen ja jatkaa, kunnes tavoite on saavutettu tai max-iteraatiot täynnä.
Vaiheet (90 min)
Vaihe 1: Pick a Use Case (10 min)
Valitse tiiminä yksi oikean elämän työnkulku. Älä valitse mitään, mitä ei kannata automatisoida — valitse toistuva, manuaalinen ja tuskainen.
Hyviä esimerkkejä:
| Use case | Toistuvuus | AI:n arvo |
|---|---|---|
| PR-katselmointi (compliance + style) | Päivittäin | Korkea — vapauttaa senior-kehittäjän |
| Deploy-checklistin ajaminen | Per release | Korkea — virheherkkä manuaalinen työ |
| Incident triage (Sentry → Slack → Linear) | Aina kun jotain kaatuu | Erittäin korkea — nopeuttaa MTTR |
| Dokumentaation generointi PR:stä | Per PR | Keskitaso — usein "myöhemmin" -työ |
| Kustannusraportin koostaminen lähteistä | Viikoittain | Keskitaso — siedettävää manuaalisesti |
Pro tip
Kysy itseltäsi: "Jos tämä työnkulku rikkoutuu, kuka huutaa?" Jos vastaus on selkeä (esim. "release manager"), se on hyvä kohde — sillä on omistaja ja onnistumiskriteeri. Älä valitse abstrakteja ideoita kuten "yleinen koodikatselmointi" — valitse konkreettinen.
Vaihe 2: Define Tools (15 min)
Listaa työkalut, joita agentti tarvitsee. Käytä Sessio 3:n päätössääntöä:
- CLI-työkalu kun se on olemassa, mature ja unix-tyylillä komponoituva (git, npm, gh, kubectl)
- MCP-työkalu kun tarvitset type-safe schemoja, monimutkaisia integraatioita tai human-in-loop-hyväksyntöjä
## Tool Registry
### CLI tools (built-in)
- gh pr view <num> # Hae PR:n meta
- gh pr diff <num> # Hae diff
- git log <branch> # Commit-historia
- npm test # Aja testit
- npm run lint # Lintaa
### CLI tools (custom)
- check-spec-compliance # Vertaa diffiä spec.md:hen
- check-test-coverage # Coverage-raportti diffistä
### MCP tools
- linear-mcp.create_issue # Luo follow-up tiketti
- slack-mcp.post_message # Ilmoita reviewer:lleVaihe 3: Design Memory (15 min)
Suunnittele kolme muistityyppiä Sessio 3:n mallin mukaan:
| Muistityyppi | Mitä tallennetaan | Hakulogiikka |
|---|---|---|
| Working memory | Nykyinen plan, observation-listalle | Pidetään RAM:issa per ajo |
| Episodic memory | Aiemmat ajot: "PR #123 katselmointi → 2 issue löytyi → fixed" | Hae viimeiset N samalle reviewerille |
| Knowledge memory (RAG) | Spec.md, AGENTS.md, learnings.md, koodausstandardit | Embed → ChromaDB → semanttinen retrieve |
Haaste: Mitä RAG:iin?
Päätä tiiminä: mitkä dokumentit kannattaa indeksoida RAG:iin? Vinkki: mieti, mitä reviewer kysyy, kun hän epäilee jotakin.
Vaihe 4: Add Guardrails (10 min)
Guardrail = blokattu kuvio + pysähtymisehto + hyväksyntäportti.
GUARDRAILS = {
# Blokatut kuviot — agentti ei saa ehdottaa näitä
"blocked_patterns": [
r"git\s+push\s+--force",
r"rm\s+-rf",
r"DROP\s+TABLE",
r"DELETE\s+FROM\s+users",
],
# Pysähtymisehdot
"max_iterations": 8,
"max_token_cost_usd": 1.0,
"max_wall_time_seconds": 300,
# Hyväksyntäportit — vaaditaan ihmisen OK
"require_approval_for": [
"linear.create_issue", # Älä spamaa Lineariin
"slack.post_message", # Älä spamaa Slackiin
"git.commit", # Älä commitoi suoraan
],
}Vaihe 5: Build (40 min)
Aloita gemini_agent.py-pohjasta (löydät sen content/basematerials/session-3-ai-agents/gemini_agent.py-tiedostosta).
Build-tarkistuslista:
- UI-kerros — Chat- tai CLI-rajapinta, joka näyttää agentin ajattelun + tool-kutsut
- Agent loop — Observe → Plan → Act → Evaluate → Store
- Tool registry — Vaiheen 2 työkalut rekisteröity function declarations -muodossa
- RAG memory — Vaiheen 2 RAG-skill yhdistetty
- Guardrails — Vaiheen 4 säännöt ajetaan ennen jokaista tool-kutsua
- Sub-agents (valinnainen) — Delegoi review-task review-agentille, test-task test-agentille
- Audit trail — Jokainen iteraatio lokitetaan: timestamp, plan, tool, args, result
Pro tip
Älä yritä rakentaa kaikkea kerralla. Ship the smallest thing that works. Saa ensin happy path toimimaan päästä-päähän (yksi PR, yksi tool, ei guardraileja). Lisää sitten yksi kerros kerrallaan: lisää RAG → testaa → lisää guardrails → testaa.
Vaihe 6: Demo (10 min)
Jokainen tiimi näyttää 2 minuutin demon:
- Mitä agenttisi tekee? (yhdellä lauseella)
- Live-demo — aja agenttia oikealla syötteellä
- Mikä yllätti? Mitä opit rakentaessa?
Onnistumiskriteerit
Agenttisi on valmis demoaa, jos:
- ✅ Se ratkaisee oikean työnkulun loppuun ilman ihmisen interventiota (tai pyytää selkeästi hyväksyntää oikeissa kohdissa)
- ✅ Audit trail on auditoitavissa — voit selittää, miksi agentti teki kunkin valinnan
- ✅ Guardrails toimivat — testaa "vaarallisilla" syötteillä ja varmista, että ne blokataan
- ✅ RAG-memory tuottaa grounded vastauksia — ei hallusinaatioita
Common Pitfalls
| Pitfall | Oire | Korjaus |
|---|---|---|
| Loop ilman pysähtymistä | Agentti jumittuu | Aseta max_iterations ja loki jokainen kierros |
| Tool-spam | Agentti kutsuu samaa toolia uudestaan ja uudestaan | Lisää muistiin "viimeksi kutsuttu X" -tarkistus |
| RAG-saastuminen | Agentti vastaa epärelevanttia | Vähennä retrieve top_k 10 → 3, lisää reranking |
| Guardrails ohitettu | Agentti ehdottaa git push --force | Aja regex-tarkistus ENNEN tool-kutsua, ei sen jälkeen |
| Hidas ensimmäinen call | RAG-indeksin lataus | Pre-load embeddings agentin käynnistyksessä |
Lähdemateriaalit
content/basematerials/session-3-ai-agents/gemini_agent.py— Agenttipohjacontent/basematerials/session-3-ai-agents/exercises/03-build-agent.md— Yksityiskohtainen ohjecontent/basematerials/session-3-ai-agents/agents/— Esimerkkiagentteja eri use caseille
Bonus: Sub-agent delegation
Lisää agenttiisi sub-agent, joka hoitaa yhden vaiheen (esim. test-runner-subagent ajaa testit ja palauttaa pass/fail). Mikä on parent-agent vs sub-agent vastuujako?
Yhteenveto
Olet nyt rakentanut multi-step agentin, jolla on:
- 🛠️ Toolit — CLI:t ja/tai MCP:t valittu päätöskriteereillä
- 🧠 Muisti — Working + episodic + RAG-knowledge
- 🛡️ Guardrailit — Blokatut kuviot, max-iteraatiot, hyväksyntäportit
- 📋 Audit trail — Jokainen päätös selitettävissä
- 🤝 Sub-agentit — (Valinnainen) erikoistuneet apurit
Seuraavaksi (Sessio 4): Miten skaalaat tämän tiimitasolle? Miten tehdään useita agentteja, joilla on erilaiset roolit ja policyt? Vastaus: software factories.
Session 3 project → portfolio
Your own AI agent
By the end of Session 3, you have your own AI agent (or a small multi-agent setup), built from the gemini_agent.py base: tools, RAG memory, guardrails. Pick CLI vs MCP for the tool surface — and explain why.
What to capture
GitHub repo, the agent's system prompt, the tool list with your CLI/MCP rationale, and an example successful run. Tags are added automatically.