حالت مکالمه و حافظه کوتاهمدت
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Represent conversation history as ordered messages.
- Explain thread-scoped short-term memory.
- Use a checkpointer to persist state across turns.
از فراخوانی تا حافظه
**ایده اصلی**
`model.invoke(...)` حافظهدار نیست؛ برنامه باید وضعیت و تاریخچه پیامها را مدیریت کند.
**مثال کامل**
ورودی اول: `My name is Bob` → ذخیره در `messages` → ورودی دوم: `What is my name?` → پاسخ بر اساس پیام ذخیرهشده: `Your name is Bob.`
```mermaid
flowchart LR
A["پیام ورودی"] --> B["وضعیت گفتگو"]
B --> C["فراخوانی مدل"]
C --> D["پاسخ"]
D --> B
E["thread دوم"] --> F["وضعیت مستقل"]
```
پیامها و شناسه thread
**استخراج پاسخ از تاریخچه**
پیام ۱ مقدار `Bob` را معرفی میکند؛ پیام ۲ آن را تأیید میکند؛ پیام ۳ سؤال را میپرسد. چون هر سه پیام به ترتیب ارسال میشوند، پاسخ نهایی `Your name is Bob.` است.
**دو شناسه**
`chat-1` در هر دو فراخوانی → ادامه همان وضعیت. `chat-2` در فراخوانی دوم → وضعیت جدا، بدون تاریخچه `chat-1`.
```mermaid
flowchart TD
T["thread_id"] --> S["وضعیت همان thread"]
S --> M["ترتیب messages"]
X["thread_id دیگر"] --> Y["وضعیت دیگر"]
```
Checkpointer؛ نگهداری بین اجراها
**قاعده اتصال**
`graph = builder.compile(checkpointer=checkpointer)`
**دو فراخوانی کامل**
۱. `first` پیام معرفی Bob را ذخیره میکند. ۲. همان `config` با `thread_id` برابر `chat-1` دوباره استفاده میشود. ۳. `second` تاریخچه را بازیابی میکند. ۴. پاسخ درباره نام بر اساس Bob ساخته میشود.
**محدودیت**
`InMemorySaver` برای آزمایش است؛ با پایان برنامه، وضعیت آن برای ذخیرهسازی ماندگار طراحی نشده است.
آزمایش دو thread
**ردیابی A**
پیام `My favorite color is blue` در A ذخیره میشود. سؤال دوم با A اجرا میشود. تاریخچه A شامل هر دو پیام است؛ پس نتیجه مورد انتظار `Your favorite color is blue.` است.
**ردیابی B**
سؤال با B اجرا میشود. تاریخچه B خالی است؛ پس fact مربوط به A در آن وجود ندارد و نباید بهعنوان حافظه بازیابی شود.
```mermaid
flowchart LR
A1["A: ثبت blue"] --> A2["A: پاسخ درباره رنگ"]
B1["B: سؤال بدون تاریخچه A"] --> B2["بدون fact مشترک"]
```
بازگشت به دوره