Toimintoratoihin perustuva itsensä kehittäminen
Onnistuneista ja epäonnistuneista toimintasarjoista oppiminen tulevan toiminnan parantamiseksi.
Toimintoratoihin perustuva itsensä kehittäminen on ilmainen Tekoälyagentit-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Tekoälyagentit-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
Mikä on suorituspolku?
Suorituspolku on täydellinen sarja tiloja ja toimintoja, jotka agentti kävi läpi tietyn tehtävän alusta loppuun. Se tallentaa lopullisen vastauksen lisäksi myös sen, miten agentti päätyi siihen: mitä työkaluja kutsuttiin, missä järjestyksessä ja millä parametreilla sekä mitä välituloksia havaittiin.
Suorituspolun tallentaminen
Käärikää jokainen agentin toiminto tallentimeen, joka tallentaa tilan ennen toimintoa ja sen jälkeen. Tilaan kuuluvat nykyinen tavoite, muistin sisältö ja viimeisimmät havainnot. Toimintoon kuuluvat työkalun nimi, parametrit ja tulos.
from dataclasses import dataclass, field
from datetime import datetime
from typing import Any
@dataclass
class TrajectoryStep:
step_index: int
state_summary: str # short description of world state
action_name: str # tool or reasoning step name
action_params: dict
result: Any
timestamp: str = ''
def __post_init__(self):
if not self.timestamp:
self.timestamp = datetime.utcnow().isoformat()
@dataclass
class Trajectory:
trajectory_id: str
task: str
steps: list = field(default_factory=list)
outcome: str = 'unknown' # 'success', 'failure', 'partial'
final_score: float = 0.0
def add_step(self, step: TrajectoryStep):
self.steps.append(step)
def mark_success(self, score: float = 1.0):
self.outcome = 'success'
self.final_score = score
def mark_failure(self, reason: str = ''):
self.outcome = 'failure'
self.final_score = 0.0
if __name__ == '__main__':
traj = Trajectory(trajectory_id='t-1', task='Book a flight to Tokyo')
traj.add_step(TrajectoryStep(
step_index=0, state_summary='searching flights',
action_name='search_flights', action_params={'dest': 'NRT'}, result='5 options found'
))
traj.mark_success(score=0.95)
print(f'Trajectory {traj.trajectory_id}: outcome={traj.outcome}, score={traj.final_score}')
print('Steps recorded:', len(traj.steps))
Suorituspolkujen tallentaminen
Suorituspolut voivat olla suuria. Tallentakaa ne pakattuina JSON-tiedostoina, yksi suorituspolku kutakin tiedostoa kohden. Indeksoikaa ne tuloksen ja tehtävätyypin perusteella, jotta niiden hakeminen on nopeaa. Onnistuneista suorituspoluista tulee few-shot-esimerkkejä ja epäonnistuneista koulutussignaaleja.
import json
import os
from dataclasses import asdict
TRAJECTORY_DIR = 'trajectories'
def save_trajectory(traj: Trajectory):
os.makedirs(TRAJECTORY_DIR, exist_ok=True)
filename = f'{TRAJECTORY_DIR}/{traj.trajectory_id}_{traj.outcome}.json'
data = asdict(traj)
with open(filename, 'w') as f:
json.dump(data, f, indent=2)
print(f'Saved trajectory: {filename}')
def load_successful_trajectories(task_type: str, n: int = 5) -> list:
results = []
for fname in os.listdir(TRAJECTORY_DIR):
if '_success.json' not in fname:
continue
with open(os.path.join(TRAJECTORY_DIR, fname)) as f:
traj = json.load(f)
if task_type.lower() in traj['task'].lower():
results.append(traj)
results.sort(key=lambda t: t['final_score'], reverse=True)
return results[:n]Onnistuneiden suorituspolkujen käyttäminen few-shot-esimerkkeinä
Onnistunut suorituspolku on toimiva esimerkki: agentti voi oppia vaiheiden järjestyksen näkemällä sen ennen uuden, samankaltaisen tehtävän yrittämistä. Lisätkää parhaat pisteet saanut suorituspolku few-shot-etuliitteeksi järjestelmäkehotteeseen.
def trajectory_to_few_shot(traj: dict) -> str:
lines = [f'Example task: {traj["task"]}', 'Steps taken:']
for step in traj['steps']:
lines.append(
f' [{step["step_index"]}] {step["action_name"]}'
f'({json.dumps(step["action_params"])}) -> {str(step["result"])[:80]}'
)
lines.append(f'Outcome: {traj["outcome"]} (score={traj["final_score"]:.2f})')
return '\n'.join(lines)
def build_few_shot_system_prompt(task_type: str) -> str:
successful = load_successful_trajectories(task_type, n=2)
if not successful:
return 'Complete the following task step by step.'
examples = '\n\n---\n\n'.join(
trajectory_to_few_shot(t) for t in successful
)
return (
'Here are examples of successfully completed similar tasks:\n\n'
+ examples
+ '\n\n---\n\nNow complete the new task using the same approach.'
)Epäonnistuneiden suorituspolkujen analysointi
Epäonnistuneet suorituspolut ovat yhtä arvokkaita. Analysoikaa niitä löytääksenne epäonnistumistavan: mikä vaihe meni pieleen ja miksi. Yleisiä epäonnistumistapoja ovat väärän työkalun valitseminen, oikean työkalun käyttäminen väärillä parametreilla, keksitty välitulos ja päättämätön silmukka.
def analyze_failure(traj: dict, client) -> dict:
steps_str = json.dumps(traj['steps'], indent=2)
prompt = (
f'Task: {traj["task"]}\n\n'
f'Agent trajectory (failed):\n{steps_str}\n\n'
'Identify the failure mode. Return JSON:\n'
'{"failure_step": 0, "failure_mode": "", "root_cause": "", '
'"prevention": ""}'
)
import anthropic
client_obj = anthropic.Anthropic(api_key='YOUR_API_KEY')
result = client_obj.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': prompt}]
)
import json
return json.loads(result.content[0].text)Epäonnistumistapojen taksonomia
Epäonnistuneista suorituspoluista koottu epäonnistumistapojen taksonomia auttaa havaitsemaan kaavoja. Kun riittävän monella epäonnistumisella on sama perimmäinen syy, se on merkki siitä, että agentin työkalua, kehotetta tai logiikkaa on korjattava — ei vain yhtä suorituskertaa.
from collections import Counter
def build_failure_taxonomy(failed_trajectories: list, client) -> dict:
failure_modes = []
for traj in failed_trajectories:
analysis = analyze_failure(traj, client)
failure_modes.append(analysis['failure_mode'])
counts = Counter(failure_modes)
total = len(failure_modes)
taxonomy = [
{
'failure_mode': mode,
'count': count,
'percentage': round(count / total * 100, 1)
}
for mode, count in counts.most_common()
]
print('Failure Mode Taxonomy:')
for entry in taxonomy:
print(f' {entry["failure_mode"]}: {entry["count"]} ({entry["percentage"]}%)')
return {'taxonomy': taxonomy, 'total_failures': total}Koulutusparien luominen suorituspoluista
Valvottua hienosäätöä varten tarvitsette (input, ideal_output) -pareja. Epäonnistunut suorituspolku antaa virheellisen tulosteen, ja epäonnistumisanalyysi kertoo, mitä sen sijaan olisi pitänyt tapahtua. Yhdessä ne muodostavat koulutusparin.
def trajectory_to_training_pair(
failed_traj: dict,
failure_analysis: dict
) -> dict:
"""
Creates an SFT-ready training pair:
input = task + context at failure step
output = what the agent should have done
"""
fail_step_idx = failure_analysis['failure_step']
steps = failed_traj['steps']
# Context up to (but not including) the failure step
context_steps = steps[:fail_step_idx]
context_str = '\n'.join(
f'Step {s["step_index"]}: {s["action_name"]}({s["action_params"]})'
for s in context_steps
)
return {
'input': f'Task: {failed_traj["task"]}\n\nPrevious steps:\n{context_str}\n\nNext action:',
'output': failure_analysis['prevention'], # correct action
'source': 'failure_trajectory',
'trajectory_id': failed_traj.get('trajectory_id', 'unknown')
}
if __name__ == '__main__':
failed_traj = {
'task': 'Cancel subscription',
'trajectory_id': 'traj-7',
'steps': [
{'step_index': 0, 'action_name': 'find_account', 'action_params': {'user': 'u1'}},
{'step_index': 1, 'action_name': 'delete_account', 'action_params': {'user': 'u1'}},
]
}
failure_analysis = {'failure_step': 1, 'prevention': 'call cancel_subscription(user="u1") instead'}
pair = trajectory_to_training_pair(failed_traj, failure_analysis)
print('Training input:')
print(pair['input'])
print('Expected output:', pair['output'])
Hienosäätö suorituspolkujen avulla
Kun käytettävissänne on riittävästi laadukkaita koulutuspareja (yleensä 50–500 kapeaa tehtävää varten), voitte hienosäätää pienemmän mallin omaksumaan onnistuneet toimintamallit. OpenAI:n hienosäätö-API hyväksyy JSONL-tiedostoja messages-muodossa.
import json
def export_fine_tuning_jsonl(
training_pairs: list,
output_file: str,
system_prompt: str = 'You are an efficient AI agent.'
):
with open(output_file, 'w') as f:
for pair in training_pairs:
record = {
'messages': [
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': pair['input']},
{'role': 'assistant', 'content': pair['output']}
]
}
f.write(json.dumps(record) + '\n')
print(f'Exported {len(training_pairs)} training pairs to {output_file}')
# Upload via OpenAI API (pseudocode):
# client.files.create(file=open('train.jsonl','rb'), purpose='fine-tune')
# client.fine_tuning.jobs.create(training_file='file-id', model='gpt-4o-mini')
if __name__ == '__main__':
import tempfile, os
pairs = [{'input': 'Task: Cancel subscription\n\nNext action:', 'output': 'cancel_subscription(user="u1")'}]
out_path = os.path.join(tempfile.gettempdir(), 'demo_training.jsonl')
export_fine_tuning_jsonl(pairs, out_path)
Suorituspolkujen laadun suodattaminen
Kaikki onnistuneet suorituspolut eivät ole yhtä hyviä. 15 uudelleenyrityksen jälkeen onnistunut suorituspolku on kohinaisempi kuin ensimmäisellä yrityksellä onnistunut. Suodattakaa tehokkuuden perusteella: onnistuminen mahdollisimman vähillä vaiheilla, korkea lopputulos ja ei keksittyjä välituloksia.
def filter_high_quality_trajectories(
trajectories: list,
max_steps: int = 8,
min_score: float = 0.85
) -> list:
high_quality = []
for traj in trajectories:
if traj['outcome'] != 'success':
continue
if traj['final_score'] < min_score:
continue
if len(traj['steps']) > max_steps:
continue
high_quality.append(traj)
# Sort by (score DESC, steps ASC)
high_quality.sort(
key=lambda t: (-t['final_score'], len(t['steps']))
)
print(f'High-quality trajectories: {len(high_quality)} / {len(trajectories)}')
return high_quality
if __name__ == '__main__':
trajectories = [
{'outcome': 'success', 'final_score': 0.92, 'steps': [1, 2, 3]},
{'outcome': 'failure', 'final_score': 0.10, 'steps': [1]},
{'outcome': 'success', 'final_score': 0.60, 'steps': [1, 2]},
]
filter_high_quality_trajectories(trajectories)
Suorituspolkujen vertaaminen oivallusten löytämiseksi
Onnistuneen ja epäonnistuneen, samaan tehtävätyyppiin liittyvän suorituspolun vertaaminen paljastaa täsmälleen, missä kohdassa ne erosivat toisistaan. Eroamiskohta on vaikutuksiltaan merkittävin paikka parantaa agentin päätöksentekoa.
def compare_trajectories(success_traj: dict, failure_traj: dict) -> dict:
s_steps = {s['step_index']: s for s in success_traj['steps']}
f_steps = {s['step_index']: s for s in failure_traj['steps']}
divergences = []
for idx in sorted(set(s_steps) & set(f_steps)):
s_action = s_steps[idx]['action_name']
f_action = f_steps[idx]['action_name']
if s_action != f_action:
divergences.append({
'step': idx,
'success_action': s_action,
'failure_action': f_action
})
break # First divergence is most important
return {
'first_divergence': divergences[0] if divergences else None,
'success_steps': len(s_steps),
'failure_steps': len(f_steps)
}
# Usage:
# comparison = compare_trajectories(good_traj, bad_traj)
# print('First divergence:', comparison['first_divergence'])
if __name__ == '__main__':
good_traj = {'steps': [{'step_index': 0, 'action_name': 'search'}, {'step_index': 1, 'action_name': 'summarize'}]}
bad_traj = {'steps': [{'step_index': 0, 'action_name': 'search'}, {'step_index': 1, 'action_name': 'delete'}]}
comparison = compare_trajectories(good_traj, bad_traj)
print('First divergence:', comparison['first_divergence'])
Suorituspolkupohjaisen kehityksen vauhtipyörä
Täydellinen vauhtipyörä: suorita agentti → tallenna suorituspolku → arvioi tulos → tallenna suorituspolkukirjastoon → analysoi epäonnistumiset → luo koulutusparit → hienosäädä mallia tai päivitä kehotteita → suorita parannettua agenttia → tallenna uusi suorituspolku. Jokainen kierros parantaa agenttia.
class TrajectorySelfImprovement:
def __init__(self, agent_id: str):
self.agent_id = agent_id
self.trajectory_lib = []
def run_and_record(self, task: str, agent_fn) -> Trajectory:
traj = Trajectory(
trajectory_id=f'{self.agent_id}_{len(self.trajectory_lib)}',
task=task
)
result = agent_fn(task, traj) # agent_fn appends steps to traj
# Evaluate result (e.g., via reflection or user rating)
score = evaluate_result(result)
if score >= 0.7:
traj.mark_success(score)
else:
traj.mark_failure('Low quality score')
save_trajectory(traj)
self.trajectory_lib.append(traj)
return traj
def improvement_cycle(self, client):
failed = [t for t in self.trajectory_lib if t.outcome == 'failure']
if len(failed) >= 10:
taxonomy = build_failure_taxonomy([vars(t) for t in failed], client)
print('Improvement cycle complete:', taxonomy)
def evaluate_result(result: str) -> float:
return 0.8 # placeholderTietojen tarkistus
Mikä on epäonnistuneiden suorituspolkujen analysoinnin ensisijainen tarkoitus?
Kertaus: suorituspolkupohjainen itsekehitys
Hienoa työtä! Tämän oppitunnin tärkeimmät asiat:
- Suorituspolku: (tila, toiminto, tulos) -vaiheiden sarja alusta loppuun
- Onnistuneet suorituspolut: ennen samankaltaisia tehtäviä lisättävät few-shot-esimerkit
- Epäonnistuneet suorituspolut: analysoidaan epäonnistumistapojen löytämiseksi → koulutusparit → hienosäätö
- Laadun suodattaminen: suositaan lyhyitä ja korkean tuloksen tuottaneita suorituspolkuja
- Vauhtipyörä: suorita → tallenna → analysoi → hienosäädä → suorita parannettua agenttia
Seuraavaksi: mikä voi mennä pieleen itsekehityksessä — palkkion manipulointi, jakaumasiirtymä ja suojamekanismit.
Opi Tekoälyagentit tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 60
- Oppitunnit
- 239
Usein kysytyt kysymykset
Onko oppitunti ”Toimintoratoihin perustuva itsensä kehittäminen” ilmainen?
Kyllä – oppitunnin ”Toimintoratoihin perustuva itsensä kehittäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Tekoälyagentit-kurssin, päivitä CoddyKit PROhon. Tekoälyagentit-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Toimintoratoihin perustuva itsensä kehittäminen”?
Onnistuneista ja epäonnistuneista toimintasarjoista oppiminen tulevan toiminnan parantamiseksi. Harjoittelet Tekoälyagentit-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyagentit-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyagentit-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Toimintoratoihin perustuva itsensä kehittäminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyagentit-oppitunnilla?
Kyllä. Jokainen Tekoälyagentit-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Palautteen kerääminen ja tallentaminen
- Reflektio- ja itsekritiikkisyklit
- Toimintoratoihin perustuva itsensä kehittäminen
- Kun itsensä kehittäminen menee pieleen