### [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? 認知心理學中,人的三種記憶類型 ![image](https://hackmd.io/_uploads/S1-pjbl0yl.png) > [Types of long term memory, Tulving (1944)](https://slideplayer.com/slide/15044299/) ![image](https://hackmd.io/_uploads/HkT72bx0kg.png =400x) [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 ![image](https://hackmd.io/_uploads/SJ_OskN6Je.png) > 圖 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 透過學習與推理等過程來管理代理人的內部狀態。 ![image](https://hackmd.io/_uploads/Hksq6kNTkl.png) > 圖 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」層與真實或模擬環境互動。 ![image](https://hackmd.io/_uploads/H1YCCkEp1l.png) > 圖 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 ![image](https://hackmd.io/_uploads/rk1EvkE6ye.png) | 分類 | 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/) ![image](https://hackmd.io/_uploads/rJby_JNpyx.png) > > | 圖示元素 | 說明 | > |-----------------|----------------------------------------------------------------------| > | **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` 機制 ![image](https://hackmd.io/_uploads/ByV3uyEayx.png) ::: --- ## [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) ![image](https://hackmd.io/_uploads/H16-blNTye.png) 記憶寫入策略比較 | 項目 | 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 ![image](https://hackmd.io/_uploads/ByEVQed3ye.png =800x) - 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(語意記憶) ![image](https://hackmd.io/_uploads/Skx8IeOhJg.png =800x) Semantic Memory 在此系統中分為兩個核心部分: 1. **Semantic Memory Profile (語意記憶檔案)** - **會議偏好** (Meeting preferences) - **回應優先順序** (Response priorities) - **VIP 聯絡人** (VIP contacts) 2. **Semantic Memory Collection (語意記憶資料庫)** - **事實性資訊 (Facts)** - **過去互動記錄 (Past interactions)** #### Semantic Memory(語意記憶)+ Episodic Memory(情節記憶) ![image](https://hackmd.io/_uploads/S1ehLxdn1e.png =800x) - **定義:** 儲存「過去事件」的記憶,幫助系統理解並根據以往經驗做出判斷。 - **在圖中的角色:** - 應用於 **Triage (分流)** 階段,使用「Few-shot examples」快速判斷郵件的重要性。 - **成功範例 (Success examples):** - ✅ 緊急客戶請求 - ✅ 來自 VIP 的會議邀請 - **失敗範例 (Failure examples):** - ❌ 垃圾郵件 (Spam) - ❌ 電子報 (Newsletters) - ❌ 低優先度通知 (Low-priority updates) - 🔎 **功能** - 快速判斷郵件的優先級,減少處理不必要郵件的時間。 - 模型根據「過去經驗」自動標記郵件並過濾垃圾信。 #### Semantic(語意記憶)+ Episodic(情節記憶) + Procedural Memory(程序性記憶) - ![image](https://hackmd.io/_uploads/SyeVPxd21g.png =1200x) - **定義:** 儲存「如何執行某項任務」的知識,類似於機器人學習的技能或操作規則。 - **在圖中的角色:** - **System Prompts (系統提示)** 應用於: - Calendar Tool (行事曆工具) - 📆 **會議時長** (Meeting duration) - ⏳ **緩衝時間設置** (Buffer times) - Writing Tool (撰寫工具) - ✍️ **郵件風格與語氣偏好** (Writing style and tone preferences) - 🔁 **回應模式** (Response patterns) - 🔎 **功能** - 讓系統自動執行多步驟任務並根據不同情境調整。 - 例如,系統可根據用戶的指示選擇「正式」、「非正式」、「簡潔」等回應風格。