Muistimallit ja RAG agenteille
Edellisessä oppitunnissa rakensimme agentin joka toimii yhden session ajan. Nyt opimme antamaan agentille muistin — kyvyn oppia, muistaa ja hakea tietoa pitkäkestoisesti.
Muistin kolme tasoa
Agentin muistitasot
AI-agentin muisti jakautuu kolmeen tasoon: Työmuisti (nykyinen tehtävä ja havainnot), Episodinen muisti (aiemmat suoritukset ja opitut asiat) ja Tietomuisti (indeksoidut dokumentit ja data). Kukin taso palvelee eri tarkoitusta ja vaatii erilaisen toteutuksen.
| Muistityyppi | Laajuus | Tyypillinen käyttö |
|---|---|---|
| Työmuisti | Nykyinen tehtävä/sessio | Pidä välitulokset ja suunnitelma |
| Episodinen muisti | Aiemmat suoritukset | Käytä uudelleen onnistuneet strategiat |
| Tietomuisti | Indeksoidut dokumentit | Vastaa perustellusti (RAG) |
Työmuisti
Työmuisti on agentin "RAM" — mitä se tietää juuri nyt:
class WorkingMemory:
"""Agentin lyhytkestoinen muisti."""
def __init__(self):
self.messages = [] # Keskusteluhistoria
self.plan = [] # Nykyinen suunnitelma
self.observations = [] # Havainnot ympäristöstä
self.tool_results = [] # Työkalujen tulokset
def add_observation(self, obs: str):
self.observations.append(obs)
# Pidä muisti hallittavana
if len(self.observations) > 50:
self.observations = self.observations[-30:]Episodinen muisti
Episodinen muisti tallentaa aiempia kokemuksia:
class EpisodicMemory:
"""Pitkäkestoinen kokemusmuisti."""
def __init__(self, path="memory/episodes.json"):
self.path = path
self.episodes = self._load()
def remember(self, task: str, outcome: str, strategy: str):
"""Tallenna kokemus."""
self.episodes.append({
"task": task,
"outcome": outcome, # "success" | "failure"
"strategy": strategy,
"timestamp": datetime.now().isoformat(),
})
self._save()
def recall(self, query: str, limit=3) -> list:
"""Hae relevantit kokemukset."""
# Yksinkertainen: etsi samankaltaisia tehtäviä
relevant = [e for e in self.episodes
if any(word in e["task"].lower()
for word in query.lower().split())]
return relevant[-limit:]Tietomuisti (RAG)
Tietomuisti perustuu Retrieval-Augmented Generation -arkkitehtuuriin.
RAG agenteille
RAG (Retrieval-Augmented Generation)
RAG on arkkitehtuuri jossa LLM:n vastauksia rikastetaan hakemalla relevanttia tietoa ulkoisesta tietolähteestä. Prosessi: Dokumentit → Pilko → Upota (embeddings) → Tallenna (vektoritietokanta) → Hae → Rikasta promptia → LLM päättelee perustellusti.
RAG-pipeline
Dokumentit → Pilkominen → Upotus → Tallennus (ChromaDB)
↓
Kysely → Haku (top-K) → Promptin rikastus → Agentti päättelee → Perusteltu vastausToteuttaminen ChromaDB:llä
import chromadb
# 1. Luo tietokanta
client = chromadb.Client()
collection = client.create_collection("project_docs")
# 2. Indeksoi dokumentit
def index_document(doc_path: str):
"""Lue, pilko ja indeksoi dokumentti."""
with open(doc_path) as f:
content = f.read()
# Pilko kappaleisiin
chunks = split_into_chunks(content, max_size=500)
for i, chunk in enumerate(chunks):
collection.add(
documents=[chunk],
metadatas=[{"source": doc_path, "chunk": i}],
ids=[f"{doc_path}_{i}"],
)
# 3. Hae relevantti tieto
def retrieve(query: str, top_k: int = 5) -> list:
"""Hae relevantit kappaleet."""
results = collection.query(
query_texts=[query],
n_results=top_k,
)
return results["documents"][0]
# 4. Rikasta agentin promptia
def augmented_prompt(query: str) -> str:
"""Luo RAG-rikastettu prompt."""
context = retrieve(query)
return f"""Answer based on the following context:
{chr(10).join(context)}
Question: {query}
"""RAG agentin työkaluna
Kun RAG on osa agenttia, haku muuttuu työkalukutsuksi agentin suunnitelmassa:
Käyttäjä: "Miten autentikointi toimii tässä projektissa?"
Agentti:
→ Plan: Tarvitsen tietoa autentikoinnista → käytän RAG-hakua
→ Act: retrieve("authentication flow")
→ Observe: Sain 5 relevanttia kappaletta
→ Plan: Yhdistän tiedon vastaukseksi
→ Act: Vastaan perustellusti viitaten lähteisiinMikä muuttuu kun RAG on agentin sisällä?
| Lähestymistapa | Ominaisuudet |
|---|---|
| Pelkkä LLM | Saattaa hallusinoida, käyttää koulutusdataa |
| RAG-haku | Perusteltu indeksoidulla sisällöllä |
| Agentti + RAG | Päättää milloin hakea, yhdistää useita lähteitä, käyttää muita työkaluja rinnalla |
Pro-vinkki
RAG on parhaimmillaan faktakysymyksissä ("miten X toimii tässä projektissa?"). Se ei korvaa agentin päättelykykyä — se täydentää sitä. Agentti päättää milloin hakea ja mitä tehdä tuloksilla.
Muistin suunnitteluperiaatteet
1. Pidä työmuisti kevyenä
Älä tallenna kaikkea — poista vanhat, irrelevantit havainnot.
2. Tallenna vain arvokkaat kokemukset
Episodiseen muistiin vain onnistumiset, merkittävät epäonnistumiset ja oivallukset.
3. Merkitse lähde ja aika
Jokainen muistimerkintä sisältää lähteen ja aikaleiman — vanhentunut tieto on vaarallista.
4. Erottele haku ja muisti
RAG (tietomuisti) vastaa faktoihin, episodinen muisti strategioihin. Älä sekoita niitä.
Mikä muuttuu kun RAG on osa agenttia eikä itsenäinen haku?
Lisää RAG-haku agenttiisi
Lisää RAG-kyvykkyys edellisessä tunnissa rakentamaasi agenttiin: 1) Asenna ChromaDB, 2) Indeksoi projektin README ja docs-kansio, 3) Lisää 'search_docs' työkalu agenttiin, 4) Testaa kysymyksellä joka vaatii haettua tietoa vs. kysymyksellä joka ei vaadi. Vertaa tuloksia.
Moduulin yhteenveto
AI-agentit -moduulissa opit:
- Mikä on AI-agentti? — LLM-silmukka + suunnittelu + työkalut + muisti
- Agenttisilmukka — Observe → Plan → Act → Evaluate → Store
- CLI vs. MCP — Valitse oikea työkalu oikeaan tarpeeseen
- Oman agentin rakentaminen — System prompt, työkalut, guardrails, testaus
- Muisti ja RAG — Kolme muistitasoa + RAG pitkäkestoisena tietomuistina
Seuraavassa moduulissa siirrymme ohjelmistotehtaisiin: miten yksittäisistä agenteista rakennetaan toistettavia toimitusputkia ja tiimitason järjestelmiä.