### [AI / ML領域相關學習筆記入口頁面](https://hackmd.io/@YungHuiHsu/BySsb5dfp)
#### [Deeplearning.ai GenAI/LLM系列課程筆記](https://learn.deeplearning.ai/)
##### GenAI
- [Large Language Models with Semantic Search。大型語言模型與語義搜索 ](https://hackmd.io/@YungHuiHsu/rku-vjhZT)
- [LangChain for LLM Application Development。使用LangChain進行LLM應用開發](https://hackmd.io/1r4pzdfFRwOIRrhtF9iFKQ)
- [Finetuning Large Language Models。微調大型語言模型](https://hackmd.io/@YungHuiHsu/HJ6AT8XG6)
##### RAG
- [Preprocessing Unstructured Data for LLM Applications。大型語言模型(LLM)應用的非結構化資料前處理](https://hackmd.io/@YungHuiHsu/BJDAbgpgR)
- [Building and Evaluating Advanced RAG。建立與評估進階RAG](https://hackmd.io/@YungHuiHsu/rkqGpCDca)
- [[GenAI][RAG] Multi-Modal Retrieval-Augmented Generation and Evaluaion。多模態的RAG與評估
](https://hackmd.io/@YungHuiHsu/B1LJcOlfA)
##### AI Agents
原理可參考這篇綜論: [How Agents for LLM Perform Task Planning。大型語言模型的代理如何進行任務規劃](https://hackmd.io/@YungHuiHsu/rkK52BkQp)
- 相關framework選擇
- [AI Agents in LangGraph](https://hackmd.io/@YungHuiHsu/BJTKpkEHC)
- [Building Agentic RAG with LlamaIndex](https://learn.deeplearning.ai/courses/building-agentic-rag-with-llamaindex/lesson/1/introduction)
- [Multi AI Agent Systems with crewAI](https://learn.deeplearning.ai/courses/multi-ai-agent-systems-with-crewai/lesson/1/introduction)
- [Functions, Tools and Agents with LangChain](https://learn.deeplearning.ai/courses/functions-tools-agents-langchain/lesson/1/introduction)
- Agent相關
- [Long-Term Agentic Memory With LangGraph](https://hackmd.io/@YungHuiHsu/S1f1cyOnke)
---
# [Long-Term Agentic Memory With LangGraph](https://learn.deeplearning.ai/courses/long-term-agentic-memory-with-langgraph/lesson/ovv0p/introduction?courseName=long-term-agentic-memory-with-langgraph)
* [Introduction to Agent Memory](https://hackmd.io/@YungHuiHsu/S1f1cyOnke)
* [Baseline Email Assistant、Email Assistant with Semantic Memory](https://hackmd.io/@YungHuiHsu/ryOkald2kl)
* [Email Assistant with Semantic + Episodic Memory](https://hackmd.io/@YungHuiHsu/r15H8kQTkx)
* [Email Assistant with Semantic + Episodic + Procedural Memory](https://hackmd.io/@YungHuiHsu/ByDawymp1e)
- 課程完整程式碼: [github/Long-Term-Agentic-Memory-With-LangGraph](https://github.com/YunghuiHsu/Long-Term-Agentic-Memory-With-LangGraph)
- [簡報: How AI Agents Optimize Performance Through Experience_Memory](https://drive.google.com/file/d/1OOlJSuGwk_B5cBcmFj3tSoBFUxqFg2qy/view?usp=sharing)
---
## 補充: LangGraph 的 Memory管理機制設計
#### What are types of memory? 認知心理學中,人的三種記憶類型

> [Types of long term memory, Tulving (1944)](https://slideplayer.com/slide/15044299/)

[Types of Long-Term Memory](https://www.simplypsychology.org/long-term-memory.html)
```mermaid
graph TD
A[Memory<br>記憶] --> B[Explicit<br>顯性記憶]
A --> C[Implicit<br>隱性記憶]
B --> B1[Episodic<br>情節記憶]
B --> B2[Semantic<br>語意記憶]
C --> C1[Skills<br>技能與動作]
C --> C2[Priming<br>啟動效應]
C --> C3[Classical<br>Conditioning<br>古典制約]
C --> C4[Emotional<br>Conditioning<br>情緒反射]
```
:::info
**Procedural Memory(程序記憶)**:不需有意識回想,自動啟動的記憶,也稱為非陳述性記憶。
- Skills(技能):例如騎腳踏車、打字,透過練習學會,自動執行的動作記憶。
- Priming(啟動效應)
- Priming 是一種潛意識記憶現象,指的是:「當你先接觸某個刺激後,會無意識地影響你對後續資訊的處理方式。」
- 我們的大腦會在背景中建立「關聯網絡」,一個概念被啟動後,與之相關的其他概念也會被默默活化。
- 這種活化過程可以讓人「更快反應」或「偏向某種判斷」,即使沒有意識地思考。
- 例如:候選人藉由重複出現、口號訴求、視覺色彩、價值語言等方式,在潛意識中建立「值得信賴」、「關心人民」等形象。
- Classical Conditioning(古典制約):例如聽到鈴聲就肚子餓,因為刺激與反應重複連結。
- Other(其他):例如習慣形成或情緒反射,屬於其他非意識型記憶類型。
:::
| 記憶類型 | 儲存內容 | 人類範例 | AI Agent 範例 |
|----------|-----------|-----------|----------------|
| **Semantic**(語意) | 事實<br>Facts | 學校學到的知識 | 關於使用者的事實資料 |
| **Episodic**(情節) | 經驗<br>Experiences | 自己做過的事 | Agent 過去執行的動作序列(範例) |
| **Procedural**(隱性/程序) |指令/規格<br>Instructions/rules | 本能、技能(如騎腳踏車<br>Instincts or motor skills | Agent 的系統提示詞或行為邏輯設定 |
這個分類方法 CoALA 論文中對參考認知心理學對人類記憶與 AI 記憶的對應研究。
---
在 LLM Agents (大型語言模型代理) 的架構中,這三種記憶類型有以下對應與功能:
1. **Semantic Memory (語意記憶)**
- **儲存內容**:儲存的是「事實性知識」或「長期穩定的資訊」。
- **在人類中的對應**:像是在學校學到的知識。
- **在 LLM 中的應用**:
- 儲存有關使用者的背景資料、偏好、興趣等長期資訊。
- 例如:「使用者的名字」、「最喜歡的顏色是藍色」或「使用者對科技新聞感興趣」。
- 此類資訊通常不會頻繁更新,屬於較固定的背景知識。
2. **Episodic Memory (情節記憶)**
- **儲存內容**:儲存模型與使用者的「互動記錄」及「過去行為」(Few-shot Example)。
- **在人類中的對應**:像是「我昨天去了超市」或「我在某年參加過某場演唱會」。
- **在 LLM 中的應用**:
- 儲存模型在過去對話中的行為、決策及回應。
- 例如:「昨天你問了我關於Python的問題」、「上次我推薦了某本書」。
- 此類記憶有助於模型理解對話上下文,提升連貫性。
3. **Procedural Memory (程序性/內在 記憶)**
- **儲存內容**:儲存「如何完成某件事」的指令或技能(System Prompt)。
- **在人類中的對應**:像是「如何打網球」或「如何開車」。
- **在 LLM 中的應用**:
- 包括代理系統的「Prompt 模板」、「行動計畫」或「多步驟工作流」。
- 例如:「先查找資料,再進行彙整,最後以條列式回答」。
- Procedural memory 讓 LLM Agents 更具執行複雜任務的能力。
---
- LangGraph的記憶管理機制來自於[Cognitive Architectures for Language Agents](https://arxiv.org/pdf/2309.02427)這篇paper

> 圖 1:大型語言模型(LLMs)的不同應用方式。
A:在自然語言處理(NLP)中,LLM 將文字作為輸入,並輸出文字。
B:語言代理人(Language Agents)(Ahn 等人, 2022;Huang 等人, 2022c)將 LLM 置於與外部環境的直接回饋迴圈中,透過將觀察轉換為文字,並使用 LLM 來選擇動作。
C:認知型語言代理人(Cognitive Language Agents)(Yao 等人, 2022b;Shinn 等人, 2023;Wang 等人, 2023a)進一步利用 LLM 透過學習與推理等過程來管理代理人的內部狀態。

> 圖 2 展示了認知架構(Cognitive Architectures)如何整合知覺輸入、長期記憶、決策程序與動作執行,以模擬類似人類的智能代理人系統。這裡分為兩個子圖:
🧠 A:**Soar 認知架構的整體架構圖**
此圖展示了 Soar 架構的核心組件與資訊流動方式,模擬人類認知過程:
| 模組 | 說明 |
|--------------------------|----------------------------------------------------------------------|
| **Symbolic Long-Term Memories** | 長期記憶分為三種:<br> - **Procedural**(程序記憶):儲存行為規則(Productions)<br> - **Semantic**(語意記憶):儲存事實知識<br> - **Episodic**(情節記憶):儲存過去經驗或事件 |
| **Symbolic Working Memory** | 工作記憶,儲存當前感知、目標、中間推理結果,作為決策的依據 |
| **Decision Procedure** | 根據工作記憶的內容評估規則(Productions)是否符合條件,並選擇最適行動 |
| **Preference Memory** | 儲存對行動選項的偏好值,輔助決策程序 |
| **RL(Reinforcement Learning)**| 強化學習模組,用於調整規則的偏好值,根據行為結果學習 |
| **Chunking / Learning Modules**| 學習新知識並寫入記憶(semantic/episodic/procedural) |
| **感知與動作模組** | 包括 Visual/Other Perception、Motor,實現與外部世界的互動 |
➡️ 所有感知輸入與行動命令皆經由「Embodiment」層與真實或模擬環境互動。

> 圖 4:語言代理人的認知架構(CoALA)
A:CoALA 定義了一組相互作用的模組與流程。決策程序(Decision Procedure)負責執行代理人的原始碼,這些原始碼包含與 LLM(提示模板與解析器)、內部記憶(檢索與學習),以及外部環境(對應與連結)的互動程序。
B:在時間流程上,代理人的決策程序與外部環境形成一個迴圈,每次循環中,代理人會透過記憶檢索與推理,進行規劃(包括提出與評估候選的學習或對應行動)。接著選擇並執行最合適的行動。執行後可能產生新的觀察,進而啟動下一輪循環。
- A:模組化架構(CoALA 系統結構圖)
| 區塊 | 說明 |
|-------------------------|------|
| **Procedural Memory** | 程序性記憶包含兩部分:<br>- **LLM**:語言模型能力(透過 prompt、parse 使用)<br>- **Agent Code**:定義與記憶、環境互動的規則與邏輯 |
| **Semantic Memory** | 儲存事實知識(e.g., 世界知識、規則)<br>支援**Retrieval** 與 **Learning** |
| **Episodic Memory** | 儲存經驗與歷史(e.g., 對話紀錄、任務經驗)<br>支援**Retrieval** 與 **Learning** |
| **Working Memory** | 儲存當前上下文,包括觀察、任務狀態、推理中間結果<br>供 Decision Procedure 與 Memory 模組使用 |
| **Decision Procedure** | 執行代理人的決策邏輯(類似程式碼主迴圈),整合各模組做出選擇 |
| **Actions / Observations** | 代理人與外部世界的互動結果<br>來源包括:<br>- **Dialogue**(對話)<br>- **Physical**(物理環境)<br>- **Digital**(系統介面) |
➡️ 每個記憶模組皆具備學習(Learning)與檢索(Retrieval)能力。
---
:::info
根據[LangGraph官網的Guides Concepts/Memory](https://langchain-ai.github.io/langgraph/concepts/memory/?ref=blog.langchain.dev)的記憶管理機制概念,主要依照threads之間是否能共享資料進行區分
- Short-term (within-thread) memory v.s. Long-term (cross-thread) memory

| 分類 | Short-term memory(短期記憶) | Long-term memory(長期記憶) |
|-------------------|--------------------------------------------------|------------------------------------------------------|
| 別名 | Thread-scoped memory | Cross-thread memory |
| 存取範圍 | 僅限單一對話 thread | 可跨 thread 共用 |
| 使用場景 | 目前對話中持續追蹤上下文 | 在多個對話中記住持久資訊 |
| 資料更新時機 | 當 graph 被啟動或步驟完成時更新 | 依照開發者儲存行為自行寫入 |
| 儲存方式 | 透過 `Checkpointer` 寫入 database | 透過 `Store` 寫入特定的命名空間 |
| 資料結構 | 最近的 AI / Human 訊息序列 | 可自訂的多筆訊息記憶庫 |
| 回讀時機 | 每次步驟開始時讀取 | 任意時機可讀取 |
- [LangGraph官網的persistence機制](https://langchain-ai.github.io/langgraph/concepts/persistence/)

>
> | 圖示元素 | 說明 |
> |-----------------|----------------------------------------------------------------------|
> | **Graph** | 流程圖的起點與控制流,包含狀態(`state`)與節點(node) |
> | **Node** | 每一個節點是一步操作,按順序或平行執行,構成 super-step |
> | **Super-steps** | 節點的執行單元,一個 sequential node 為一個 super-step,平行節點共享 |
> | **Checkpoint** | 每次 super-step 執行後,將 state 和 metadata 儲存的快照 |
> | **StateSnapshot** | `Checkpoint` 的資料結構類型,封裝了 state、下一步節點、ID 等資訊 |
> | **Thread** | 多個 checkpoint 的集合,對應一次完整執行流程 |
>
- 長期記憶使用的`Memory Store` 機制

:::
---
## [LangGraph官網對Long-term memory的介紹](https://langchain-ai.github.io/langgraph/concepts/memory/?ref=blog.langchain.dev#framework-for-thinking-about-long-term-memory)
:::info
🧠 長期記憶(Long-term Memory)
在 LangGraph 中,**長期記憶** 允許系統在不同的對話或會話之間**保留資訊**。與僅限於單一 thread 的**短期記憶**不同,長期記憶是透過自訂的「**namespace(命名空間)**」儲存的。
- 🗃️ 記憶儲存方式
LangGraph 會將長期記憶以 **JSON 文件格式** 儲存在記憶體儲存系統中(可參考官方文件)。每筆記憶都會被組織在:
- 一個自訂的 **命名空間**(類似資料夾)
- 一個獨立的 **key**(像是檔名)
命名空間通常會包含使用者 ID、組織 ID,或其他方便分類的標籤。這種結構支援階層式管理,也支援跨命名空間的搜尋(可透過內容篩選)。
- 以下是範例程式碼:
```python
from langgraph.store.memory import InMemoryStore
# 自訂嵌入函式(實務上應替換成真實的 embedding)
def embed(texts: list[str]) -> list[list[float]]:
return [[1.0, 2.0] * len(texts)]
# 建立記憶體儲存(開發用,正式環境建議接 DB)
store = InMemoryStore(index={"embed": embed, "dims": 2})
user_id = "my-user"
application_context = "chitchat"
namespace = (user_id, application_context)
# 儲存記憶
store.put(
namespace,
"a-memory",
{
"rules": [
"User likes short, direct language",
"User only speaks English & python",
],
"my-key": "my-value",
},
)
# 透過 ID 取得記憶
item = store.get(namespace, "a-memory")
# 透過 filter + 向量相似度搜尋記憶
items = store.search(
namespace, filter={"my-key": "my-value"}, query="language preferences"
)
```
- 🧭 長期記憶的設計思考框架
長期記憶本身是一個複雜課題,沒有「一體適用」的方案。不過,你可以透過以下問題來建立思考架構:
- 1️⃣ 記憶的類型是什麼?
人類的記憶可分為:事實(facts)、經驗(experiences)、規則(rules)。
AI agent 也可以以同樣方式使用記憶。例如 agent 可以記住使用者的偏好,以更有效完成任務。
- 2️⃣ 什麼時候要更新記憶?
- **即時更新**:在主要應用邏輯中即時寫入(on the hot path),例如在回覆使用者前記住某些事。
- **背景更新**:作為背景程序異步執行,定期掃描資料並寫入記憶。
:::
---
## Introduction to Agent Memory。Agent 記憶機制介紹
### 記憶寫入/儲存機制 (Memory Storage Mechanisms)

記憶寫入策略比較
| 項目 | In the hot path(熱路徑) | In the background(背景處理) |
| ------------------ | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| **記憶寫入時機** | 每次使用者訊息後立即更新記憶 | 定期或條件式地,在背景中批次更新記憶 |
| **優點** | - 記憶即時更新<br>- 可立即應用於後續互動<br>- 使用者可被通知記憶更新 | - 無延遲<br>- 應用邏輯與記憶管理分離<br>- 可以更專注地處理記憶任務 |
| **缺點** | - 增加 agent 負擔與決策延遲<br>- 記憶過濾決策需另建工具<br>- 多工可能降低記憶品質 | - 記憶延遲導致其他 thread 缺乏最新上下文<br>- 需妥善設計觸發頻率與機制 |
| **典型策略或工具** | 例如 ChatGPT 使用 `save_memories` 工具,每則訊息判斷是否上傳記憶 | 常用策略:<br>- 固定時間後更新<br>- cron 任務<br>- 手動/邏輯觸發 |
| **應用示意圖** | 使用者訊息 → 更新記憶 → 回覆 | 使用者訊息 → 回覆 →(延遲 30 分鐘後)記憶更新 |
---
## 以Email Assistant為例 with Semantic Memory
- Al assistants often need context, personalization, ability to
adapt to your feedback

- Maintain context over time, adapt to our preferences, **learn from past interactions**
1. **Inbox (收件匣)**
➔ 所有郵件進入收件匣等待處理。
2. **Triage (分流)**
➔ 使用 **Episodic Memory** 判斷哪些郵件需優先處理。
3. **LLM (大型語言模型)**
➔ 根據郵件內容決定是否需安排會議 (Calendar Tool)、撰寫回應 (Writing Tool) 或更新記憶 (Memory Tool)。
4. **Agent (代理)**
➔ 協調多個工具並根據使用者偏好最佳化回應行為。
✅ **Episodic Memory (情節記憶)**
✅ **Semantic Memory (語意記憶)**
✅ **Procedural Memory (程序性記憶)**
#### Semantic Memory(語意記憶)

Semantic Memory 在此系統中分為兩個核心部分:
1. **Semantic Memory Profile (語意記憶檔案)**
- **會議偏好** (Meeting preferences)
- **回應優先順序** (Response priorities)
- **VIP 聯絡人** (VIP contacts)
2. **Semantic Memory Collection (語意記憶資料庫)**
- **事實性資訊 (Facts)**
- **過去互動記錄 (Past interactions)**
#### Semantic Memory(語意記憶)+ Episodic Memory(情節記憶)

- **定義:** 儲存「過去事件」的記憶,幫助系統理解並根據以往經驗做出判斷。
- **在圖中的角色:**
- 應用於 **Triage (分流)** 階段,使用「Few-shot examples」快速判斷郵件的重要性。
- **成功範例 (Success examples):**
- ✅ 緊急客戶請求
- ✅ 來自 VIP 的會議邀請
- **失敗範例 (Failure examples):**
- ❌ 垃圾郵件 (Spam)
- ❌ 電子報 (Newsletters)
- ❌ 低優先度通知 (Low-priority updates)
- 🔎 **功能**
- 快速判斷郵件的優先級,減少處理不必要郵件的時間。
- 模型根據「過去經驗」自動標記郵件並過濾垃圾信。
#### Semantic(語意記憶)+ Episodic(情節記憶) + Procedural Memory(程序性記憶)
- 
- **定義:** 儲存「如何執行某項任務」的知識,類似於機器人學習的技能或操作規則。
- **在圖中的角色:**
- **System Prompts (系統提示)** 應用於:
- Calendar Tool (行事曆工具)
- 📆 **會議時長** (Meeting duration)
- ⏳ **緩衝時間設置** (Buffer times)
- Writing Tool (撰寫工具)
- ✍️ **郵件風格與語氣偏好** (Writing style and tone preferences)
- 🔁 **回應模式** (Response patterns)
- 🔎 **功能**
- 讓系統自動執行多步驟任務並根據不同情境調整。
- 例如,系統可根據用戶的指示選擇「正式」、「非正式」、「簡潔」等回應風格。