نقطهگذاری و اجرای پایدار
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Explain checkpoints, thread identifiers, snapshots, and state history.
- Configure in-memory checkpointing for development and persistent checkpointing for local durability.
- Resume a workflow after an interrupt or recoverable failure.
چرا اجرای بادوام؟
**ایدهٔ اصلی**
checkpoint وضعیت اجرای Graph را در یک مرز مشخص ذخیره میکند؛ thread_id تاریخچهٔ همان مسیر را مشخص میکند.
**مثال مسیر**
اگر پس از Node اول داشته باشیم \(step=2\)، checkpoint مقدار \(step=2\) را نگه میدارد و Resume از Node بعدی ادامه میدهد.
```mermaid
flowchart LR
A["State ورودی"] --> B["Node 1"]
B --> C["Checkpoint"]
C --> D["Node 2"]
D --> E["Interrupt یا Failure"]
E --> F["Resume با همان thread_id"]
F --> D
```
واژهها و معماری ذخیرهسازی
**سه مفهوم**
- State: وضعیت فعلی
- Snapshot: یک نسخهٔ ذخیرهشده از State
- State history: دنبالهٔ Snapshotها برای یک thread_id
**اثر شناسه**
مسیر `"1"`: \(0\rightarrow1\rightarrow2\). مسیر تازهٔ `"2"`: \(0\rightarrow1\). شناسهٔ متفاوت یعنی تاریخچهٔ متفاوت.
```mermaid
flowchart TD
A["Graph"] --> B{"thread_id"}
B -->|"1"| C["Snapshotهای مسیر 1"]
B -->|"2"| D["Snapshotهای مسیر 2"]
C --> E["History و Resume"]
D --> F["History و Resume"]
```
پیکربندی و اجرای چندگامی
**ردیابی مقدار**
در اجرای اول `name` برابر `"bob"` ذخیره میشود. اجرای چهارم با همان config، مقدار ذخیرهشده را میخواند؛ بنابراین پاسخ نام `"bob"` است.
```mermaid
sequenceDiagram
participant C as Client
participant G as Graph
participant S as Checkpointer
C->>G: invoke با input و config
G->>S: save snapshot با thread_id
S-->>G: state history
G-->>C: output
```
بازبینی Snapshot و History
**خواندن Snapshot**
دادهٔ ذخیرهشده شامل پرسش `Q` و سند `D1` است و `next` فقط `generate` را نشان میدهد؛ بنابراین `retrieve` کامل شده و ادامه از `generate` است.
```mermaid
flowchart LR
A["thread_id"] --> B["دریافت history"]
B --> C["انتخاب snapshot موردنظر"]
C --> D["بررسی values"]
C --> E["بررسی next"]
D --> F{"State کافی است؟"}
E --> G["ادامه از گام بعد"]
```
وقفه، Resume و دوام پایدار
**تأیید و ادامه**
مقدار `amount = 120` در snapshot میماند. پس از `Command(resume=True)`، ادامه از همان نقطه انجام میشود و Node بعدی میتواند مقدار را به `121` تغییر دهد.
**دو ذخیرهساز**
- `InMemorySaver`: مناسب توسعه؛ دوام پس از پایان فرایند تضمین نمیشود.
- `PostgresSaver`: ذخیره در پایگاه داده؛ مناسب بازیابی پس از خاموشی.
- هر دو برای Resume به `thread_id` ثابت نیاز دارند.
بازگشت به دوره