آلة حالات ذاكرة Neuron والمراجعة
يفيد هذا النمط عندما ينبغي لوكيل الاحتفاظ بسياق المحادثة عبر جولات مراجعة بشرية متكررة، مع استمرار تنسيق دورة الحياة الإجمالية بواسطة Queuety.
تتولى Queuety آلة حالات المراجعة، بينما تتولى Neuron ذاكرة الوكيل لمحادثة الصياغة.
لماذا تفيد ذاكرة Neuron هنا
إذا رفض المراجع مسودة وطلب تعديلات، فلا ينبغي أن تضطر المكالمة التالية للوكيل إلى إعادة بناء السياق بأكمله من البداية.
تلائم SQLChatHistory في Neuron هذا الغرض، إذ يمكن للوكيل مواصلة العمل ضمن سلسلة المحادثة نفسها بينما توجّه Queuety قرارات المراجعين وجولات التعديل.
وكيل Neuron مع سجل مدعوم بـSQL
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.',
],
);
}
}
أنشئ المسودة مرة، ثم راجعها مع سلسلة الذاكرة نفسها
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
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' ]
);
تدخل المحاولة الأولى إلى drafting، وتشغّل الإجراء الموضوع في قائمة الانتظار، ثم تنتقل إلى awaiting_review.
إذا رفض المراجع المسودة، تعود الآلة إلى drafting. وبما أن حمولة حدث reject تُمرر إلى DraftBriefAction، يمكن للمسودة التالية الاستفادة من ملاحظات المراجع دون فقدان سجل سلسلة Neuron الأصلية.
لماذا يعد هذا أوضح من تكرار سير العمل
تتعلق هذه المشكلة بدورة الحياة. تنتظر المسودة مراجعة بشرية، ويمكن للمراجع الموافقة عليها أو رفضها، ويعيد الرفض الجلسة إلى الصياغة، بينما تنهي الموافقة الجلسة. ويناسب ذلك آلة حالات أكثر من سير عمل خطي يتضمن مسار عودة.
تظل حالة سير العمل ممتازة لحقائق التنسيق مثل عدد جولات المراجعة ومعرّفات الملفات الناتجة ومعرّفات سير العمل وقرارات التوجيه. أما ذاكرة Neuron فهي أنسب لسياق المحادثة، مثل المطالبات السابقة والتعديلات المتكررة واستجابات النموذج التي ينبغي أن تبقى جزءًا من سلسلة الصياغة.
يمنح استخدام النظامين كلًا منهما المهمة التي يجيدها.
متى تُبقي هذا كسير عمل بدلًا من ذلك
فضّل سير عمل عندما يكون مسار المراجعة محددًا بإحكام ويركز على التنفيذ، مثلًا:
أنشئ مسودة واحدة، وانتظر موافقة واحدة، ثم انشرها.
فضّل آلة حالات عندما يحتمل أن تعود الجلسة إلى الحالات نفسها عدة مرات، وتتحكم الأحداث الخارجية في دورة الحياة.