Siirry sisältöön

Neuron Muisti- ja tarkistustilakone

Tämä toimintamalli on hyödyllinen, kun agentin pitää säilyttää keskustelun konteksti toistuvien ihmisen tekemien tarkistuskierrosten välillä, mutta koko elinkaarta hallitsee edelleen Queuety.

Queuety hallitsee tarkistustilakonetta, kun taas Neuron hallitsee luonnostelusäikeen agenttimuistia.

Miksi Neuron-muistista on hyötyä tässä

Jos tarkistaja hylkää luonnoksen ja pyytää muutoksia, seuraavan agenttikutsun ei pitäisi joutua kokoamaan kontekstia uudelleen alusta.

Neuronn SQLChatHistory sopii tähän hyvin, koska agentti voi jatkaa työskentelyä samassa keskustelusäikeessä samalla, kun Queuety reitittää tarkistajan päätökset ja muokkauskierrokset.

Neuron-agentti, jonka historia perustuu SQL-palveluun

PHP
namespace App\Neuron;

use NeuronAI\Agent\Agent;
use NeuronAI\Chat\History\ChatHistoryInterface;
use NeuronAI\Chat\History\SQLChatHistory;
use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\Providers\Anthropic\Anthropic;
use NeuronAI\SystemPrompt;

final class EditorAgent extends Agent
{
    public function __construct(
        private readonly string $threadId,
        private readonly \PDO $pdo,
    ) {}

    protected function provider(): AIProviderInterface
    {
        return new Anthropic(
            key: $_ENV['ANTHROPIC_API_KEY'],
            model: $_ENV['ANTHROPIC_MODEL'],
        );
    }

    protected function chatHistory(): ChatHistoryInterface
    {
        return new SQLChatHistory(
            thread_id: $this->threadId,
            pdo: $this->pdo,
            table: 'neuron_chat_history',
            contextWindow: 50000,
        );
    }

    public function instructions(): string
    {
        return (string) new SystemPrompt(
            background: [
                'You are an editorial agent for long-form product briefs.',
                'Apply reviewer notes without losing the original intent.',
            ],
        );
    }
}

Luonnostele kerran, muokkaa samassa muistisäikeessä

PHP
namespace App\StateMachines\Actions;

use App\Neuron\EditorAgent;
use NeuronAI\Chat\Messages\UserMessage;
use Queuety\Contracts\StateAction;

final class DraftBriefAction implements StateAction
{
    public function handle(array $state, ?string $event = null, array $event_payload = [], array $payload = []): array|string
    {
        // Queuety creates actions with `new DraftBriefAction()`, so build dependencies here.
        $pdo = new \PDO($_ENV['NEURON_DB_DSN'], $_ENV['NEURON_DB_USER'], $_ENV['NEURON_DB_PASSWORD']);

        $threadId = $state['neuron_thread_id'] ?? sprintf(
            'brief:%d:editor',
            $state['brief_id'],
        );

        $prompt = "Write the first draft for brief {$state['brief_id']}.";

        if ('reject' === $event) {
            $prompt = sprintf(
                'Revise the draft using these review notes: %s',
                $event_payload['reason'] ?? 'Tighten the draft and address reviewer concerns.',
            );
        }

        $agent = new EditorAgent($threadId, $pdo);
        $message = $agent->chat(
            new UserMessage($prompt)
        )->getMessage();

        return [
            'neuron_thread_id' => $threadId,
            'draft_markdown' => $message->getContent(),
            'review_round' => (int) ($state['review_round'] ?? 0) + 1,
            '_event' => 'draft_ready',
        ];
    }
}

Queuety-tilakone

PHP
use Queuety\Enums\StateMachineStatus;
use Queuety\Queuety;

$machine_id = Queuety::machine('brief_review_session')
    ->version('brief-review-session.v1')
    ->state('drafting')
    ->action(DraftBriefAction::class)
    ->on('draft_ready', 'awaiting_review')
    ->state('awaiting_review')
    ->on('approve', 'completed')
    ->on('reject', 'drafting')
    ->state('completed', StateMachineStatus::Completed)
    ->dispatch([
        'brief_id' => 42,
    ]);

// Later, once the draft action has finished and the machine waits in `awaiting_review`:
Queuety::machine_event(
    $machine_id,
    'reject',
    [ 'reason' => 'Tighten the introduction and add pricing context.' ]
);

Queuety::machine_event(
    $machine_id,
    'approve',
    [ 'reviewer' => 'editor@example.com' ]
);

Ensimmäinen käsittelykierros siirtyy tilaan drafting, suorittaa jonotetun toiminnon ja siirtyy sitten tilaan awaiting_review.

Jos tarkistaja hylkää luonnoksen, kone palaa tilaan drafting. Koska tapahtuman reject hyötykuorma välitetään kohteeseen DraftBriefAction, seuraava luonnos voi hyödyntää tarkistajan huomioita menettämättä alkuperäisen Neuron-säikeen historiaa.

Miksi tämä on selkeämpää kuin työnkulun toistaminen

Tässä ongelmassa on kyse elinkaaresta. Luonnos odottaa ihmisen tekemää tarkistusta, tarkistaja voi hyväksyä tai hylätä sen, hylkäys palauttaa istunnon luonnosteluun ja hyväksyntä päättää istunnon. Tämä sopii paremmin tilakoneeseen kuin lineaariseen työnkulkuun, jossa on paluuyhteys.

Työnkulun tila sopii edelleen erinomaisesti orkestrointitietoihin, kuten tarkistuskierrosten määrään, artefaktien tunnisteisiin, työnkulkujen tunnisteisiin ja reitityspäätöksiin. Neuron-muisti sopii paremmin keskustelukontekstiin, kuten aiempiin kehotteisiin, iteratiivisiin muokkauksiin ja mallin vastauksiin, joiden tulee pysyä osana luonnostelusäiettä.

Kun käytät molempia, kumpikin järjestelmä hoitaa parhaiten sopivan tehtävän.

Milloin tämä kannattaa toteuttaa työnkulkuna

Suosi työnkulkua, kun tarkistuspolku on tarkasti rajattu ja suorituspainotteinen, esimerkiksi:

Luo yksi luonnos, odota yksi hyväksyntä ja julkaise.

Suosi tilakonetta, kun istunto voi palata samoihin tiloihin useita kertoja ja ulkoiset tapahtumat ohjaavat sen elinkaarta.