Tekoälyagentit · Oppitunti

Interaktiiviset REPL-tyyliset agentit

Syötesilmukat, historia ja monivuoroinen keskustelu pääteagenteissa

Oppitunti 2/413 vaihetta

Interaktiiviset REPL-tyyliset agentit on ilmainen Tekoälyagentit-oppitunti CoddyKitissä. Tämä on oppitunti 2/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 REPL-tyylinen agentti

REPL (Read-Eval-Print Loop) on vuorovaikutteinen pääteistunto, jossa kirjoitatte syötteen, saatte tulosteen ja jatkatte työskentelyä. Päätteessä toimivat chat-agentit toimivat juuri näin: käyttäjä kirjoittaa viestin, agentti vastaa ja keskustelu jatkuu, kunnes käyttäjä poistuu.

REPL-silmukan perusteet

Yksinkertaisin REPL on while True -silmukka, joka lukee käyttäjän syötteen komennolla input(), käsittelee sen ja tulostaa tuloksen. Silmukka jatkuu loputtomasti, kunnes käyttäjä ilmoittaa haluavansa poistua.

def run_agent_repl(inputs):
    print('Agent started. Type /exit to quit.')
    conversation_history = []
    for user_input in inputs:
        user_input = user_input.strip()
        if not user_input:
            continue
        if user_input == '/exit':
            print('Goodbye!')
            break
        conversation_history.append({'role': 'user', 'content': user_input})
        agent_reply = f'[Agent reply to: {user_input}]'
        conversation_history.append({'role': 'assistant', 'content': agent_reply})
        print(f'Agent: {agent_reply}')

run_agent_repl(['Hello agent', 'What can you do?', '/exit'])

KeyboardInterruptin hallittu käsittely

Kun käyttäjä painaa Ctrl+C, Python nostaa KeyboardInterrupt-poikkeuksen. Siepatkaa se ylimmällä tasolla ja tulostakaa ystävällinen hyvästiviesti pinonjäljityksen sijaan.

def run_agent_repl():
    print('Agent ready. Press Ctrl+C to exit.')
    conversation_history = []

    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input:
                continue

            conversation_history.append({'role': 'user', 'content': user_input})
            reply = '[mocked agent response]'
            conversation_history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')

    except KeyboardInterrupt:
        print('\nSession ended. Goodbye!')
    except EOFError:
        # Triggered when stdin is closed (piped input ends)
        print('\nEnd of input. Exiting.')

if __name__ == '__main__':
    import builtins
    _demo_inputs = iter(['What agents can you build?', EOFError])
    def _fake_input(prompt=''):
        val = next(_demo_inputs)
        if val is EOFError:
            raise EOFError
        print(prompt + val)
        return val
    builtins.input = _fake_input
    run_agent_repl()

Monivaiheisen keskusteluhistorian ylläpitäminen

Jotta agentti muistaa keskustelun, ylläpitäkää viestiluetteloa ja välittäkää koko historia LLM:lle jokaisella vuorolla. Aloittakaa järjestelmäviestillä, joka määrittää agentin persoonan.

import openai

client = openai.OpenAI(api_key='YOUR_API_KEY')

def run_chat_repl():
    history = [
        {'role': 'system', 'content': 'You are a helpful AI assistant.'}
    ]

    print('Chat started. Type /exit to quit.')

    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input or user_input == '/exit':
                break

            history.append({'role': 'user', 'content': user_input})

            response = client.chat.completions.create(
                model='gpt-4o-mini',
                messages=history
            )

            reply = response.choices[0].message.content
            history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')

    except KeyboardInterrupt:
        print('\nGoodbye!')

readline: syötehistoria ja muokkaus

readline-moduuli (Unix/Mac) mahdollistaa siirtymisen nuolinäppäimillä aiempien syötteiden välillä aivan kuten oikeassa shellissä. Käyttäjät voivat palauttaa aiempia viestejä painamalla ylänuolta.

try:
    import readline  # available on Unix/Mac, not Windows
    # Enable persistent history between sessions
    import os
    HISTORY_FILE = os.path.expanduser('~/.agent_history')
    try:
        readline.read_history_file(HISTORY_FILE)
    except FileNotFoundError:
        pass

    import atexit
    atexit.register(readline.write_history_file, HISTORY_FILE)
    readline.set_history_length(500)
    print('History enabled (use up/down arrows)')
except ImportError:
    pass  # readline not available on Windows

# After this, input() automatically has history support

Sisäänrakennetut kauttaviivakomennot

Antakaa REPL-agentille sisäänrakennetut kauttaviivakomennot yleisiä toimintoja varten: /help, /exit, /clear keskustelun nollaamiseen ja /history aiempien viestien tarkastelemiseen.

def handle_command(cmd: str, history: list) -> bool:
    'Returns True if the command was handled, False if it is a regular message'
    if cmd == '/exit' or cmd == '/quit':
        print('Goodbye!')
        raise SystemExit(0)

    elif cmd == '/help':
        print('Commands: /exit, /clear, /history, /help')
        return True

    elif cmd == '/clear':
        # Keep only the system message
        system = history[0] if history and history[0]['role'] == 'system' else None
        history.clear()
        if system:
            history.append(system)
        print('[Conversation cleared]')
        return True

    elif cmd == '/history':
        for i, msg in enumerate(history):
            if msg['role'] != 'system':
                print(f'  [{msg["role"]}] {msg["content"][:80]}')
        return True

    return False  # not a command, treat as regular message

if __name__ == '__main__':
    demo_history = [
        {'role': 'system', 'content': 'You are a helpful agent.'},
        {'role': 'user', 'content': 'Hi there'},
        {'role': 'assistant', 'content': 'Hello! How can I help?'},
    ]
    handle_command('/help', demo_history)
    handle_command('/history', demo_history)

Keskusteluhistorian pituuden rajoittaminen

Koko keskusteluhistorian välittäminen LLM:lle jokaisella vuorolla kasvattaa tokenien määrää lineaarisesti. Lyhentäkää historia viimeisiin N viestiin ja säilyttäkää järjestelmäviesti kustannusten hallitsemiseksi.

def trim_history(history: list, max_turns: int = 10) -> list:
    system_messages = [m for m in history if m['role'] == 'system']
    non_system = [m for m in history if m['role'] != 'system']

    # Keep the last max_turns messages (each turn = 1 user + 1 assistant)
    max_messages = max_turns * 2
    trimmed = non_system[-max_messages:]

    return system_messages + trimmed

# Usage in the REPL loop:
# history.append({'role': 'user', 'content': user_input})
# trimmed = trim_history(history, max_turns=10)
# response = client.chat.completions.create(model='gpt-4o-mini', messages=trimmed)
print('Trimming history prevents token count from growing unboundedly')

Tervehdysbannerin näyttäminen

Tervehdysbanneri tekee REPL:stä viimeistellyn oloisen. Tulostakaa se kerran käynnistyksen yhteydessä ja ilmoittakaa siinä agentin nimi, versio ja käytettävissä olevat komennot. Käyttäkää yksinkertaista ASCII-taidetta tai rich-kirjastoa värien lisäämiseen.

def print_banner():
    banner = '''
====================================
  AI Research Agent v1.0
====================================
  Type your question to begin.
  Commands: /help  /clear  /exit
====================================
    '''
    print(banner)

# Or with rich colors:
# from rich.console import Console
# from rich.panel import Panel
# console = Console()
# console.print(Panel('[bold cyan]AI Research Agent[/] v1.0', subtitle='Type /help for commands'))

print_banner()

Kirjoitusilmaisimien näyttäminen

LLM-kutsut voivat kestää useita sekunteja. Näyttäkää odotuksen aikana ”thinking...”-viesti, jotta käyttäjät tietävät agentin käsittelevän pyyntöä. Poistakaa viesti, kun vastaus saapuu.

import sys
import threading
import time

def thinking_spinner(stop_event: threading.Event):
    frames = ['|', '/', '-', '\\']
    i = 0
    while not stop_event.is_set():
        sys.stdout.write(f'\rAgent is thinking... {frames[i % 4]}')
        sys.stdout.flush()
        time.sleep(0.1)
        i += 1
    sys.stdout.write('\r' + ' ' * 30 + '\r')  # clear the line
    sys.stdout.flush()

def call_agent_with_spinner(query: str) -> str:
    stop = threading.Event()
    spinner = threading.Thread(target=thinking_spinner, args=(stop,))
    spinner.start()

    # result = agent.run(query)  # the actual slow call
    time.sleep(1)  # simulating work
    result = 'The answer is 42.'

    stop.set()
    spinner.join()
    return result

if __name__ == '__main__':
    answer = call_agent_with_spinner('What is 6 * 7?')
    print(f'\nFinal answer: {answer}')

Istunnon tallentaminen tiedostoon

Antakaa käyttäjien tallentaa keskustelu tiedostoon istunnon lopussa. Tämä on hyödyllistä tutkimusistunnoissa, joissa agentin löytämistä asioista halutaan säilyttää merkintä.

import json
import datetime
import os

def save_session(history: list, directory: str = 'sessions'):
    os.makedirs(directory, exist_ok=True)
    timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = os.path.join(directory, f'session_{timestamp}.json')

    with open(filename, 'w') as f:
        json.dump({
            'saved_at': timestamp,
            'messages': history
        }, f, indent=2)

    print(f'Session saved to {filename}')

# Usage in REPL on /save command:
# save_session(conversation_history)

if __name__ == '__main__':
    import tempfile
    demo_dir = tempfile.mkdtemp()
    demo_history = [
        {'role': 'user', 'content': 'Hello'},
        {'role': 'assistant', 'content': 'Hi! How can I help?'},
    ]
    save_session(demo_history, directory=demo_dir)

Täydellinen REPL-agentin mallipohja

Kun kaikki yhdistetään, saadaan tuotantokäyttöön valmis REPL-mallipohja, joka sisältää historian hallinnan, kauttaviivakomennot, näppäinkeskeytysten käsittelyn ja istunnon tallentamisen.

def run_repl(agent):
    history = [{'role': 'system', 'content': 'You are a helpful AI assistant.'}]
    print('Agent ready. Type /help for commands.')
    try:
        while True:
            user_input = input('You: ').strip()
            if not user_input:
                continue
            if user_input.startswith('/'):
                handle_command(user_input, history)
                continue
            history.append({'role': 'user', 'content': user_input})
            trimmed = trim_history(history, max_turns=10)
            reply = agent.run(trimmed)
            history.append({'role': 'assistant', 'content': reply})
            print(f'Agent: {reply}')
    except KeyboardInterrupt:
        print('\nSession ended.')
        save_session(history)

Tietojen tarkistus: REPL-tyyliset agentit

Testatkaa, kuinka hyvin ymmärrätte vuorovaikutteisia REPL-agentteja.

Kertaus: vuorovaikutteiset REPL-tyyliset agentit

Osaatte nyt rakentaa päätettä varten monipuolisen vuorovaikutteisen agentin:

  • Käyttäkää while True: input() -rakennetta lukusilmukan perustana
  • Käsitelkää KeyboardInterrupt, jotta Ctrl+C lopettaa ohjelman siististi
  • Ylläpitäkää conversation_history-luetteloa monivaiheista muistia varten
  • Käyttäkää readline-moduulia nuolinäppäinten syötehistoriaan
  • Toteuttakaa /help-, /clear- ja /exit-kauttaviivakomennot
  • Lyhentäkää historiaa, jotta tokenien määrä ei kasva rajoittamattomasti
  • Näyttäkää latausanimaatio tai edistymisen ilmaisin LLM-kutsujen aikana
Aloita maksutta

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 ”Interaktiiviset REPL-tyyliset agentit” ilmainen?

Kyllä – oppitunnin ”Interaktiiviset REPL-tyyliset agentit” 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 ”Interaktiiviset REPL-tyyliset agentit”?

Syötesilmukat, historia ja monivuoroinen keskustelu pääteagenteissa 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 2/4.

Kuinka kauan ”Interaktiiviset REPL-tyyliset agentit”-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

  1. Komentoriviagentin käyttöliittymän rakentaminen
  2. Interaktiiviset REPL-tyyliset agentit
  3. Argumenttien jäsentäminen ja ohjeteksti
  4. Tulosteen suoratoisto CLI-agenteissa
← Takaisin: Tekoälyagentit