【LangChain】存儲與管理對話歷史

0. 代碼演示

from langchain_community.chat_message_histories import SQLChatMessageHistorydef get_session_history(session_id):# 通過 session_id 區分對話歷史,并存儲在 sqlite 數據庫中return SQLChatMessageHistory(session_id, "sqlite:///memory.db")
from langchain_core.messages import HumanMessage
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain.schema.output_parser import StrOutputParsermodel = ChatOpenAI(model="gpt-4o-mini", temperature=0)runnable = model | StrOutputParser()runnable_with_history = RunnableWithMessageHistory(runnable, # 指定 runnableget_session_history, # 指定自定義的歷史管理方法
)runnable_with_history.invoke([HumanMessage(content="你好,我叫麥酷")],config={"configurable": {"session_id": "wzr"}},
)'你好,麥酷!很高興再次見到你。有什么想聊的或者需要幫助的呢?'runnable_with_history.invoke([HumanMessage(content="你知道我叫什么名字")],config={"configurable": {"session_id": "wzr"}},
)'是的,你叫麥酷。有什么我可以幫助你的嗎?'runnable_with_history.invoke([HumanMessage(content="你知道我叫什么名字")],config={"configurable": {"session_id": "test"}},
)'抱歉,我無法知道你的名字。你可以告訴我你的名字,或者如果你有其他問題,我也很樂意幫助你!'

代碼功能解析

這段代碼實現了一個帶持久化歷史記憶的對話系統,通過 session_id 區分不同用戶的對話歷史,并存儲到 SQLite 數據庫中。以下是核心模塊的解析:


1. 對話歷史管理模塊

from langchain_community.chat_message_histories import SQLChatMessageHistorydef get_session_history(session_id):# 每個 session_id 對應獨立的數據庫記錄return SQLChatMessageHistory(session_id=session_id, connection_string="sqlite:///memory.db" # SQLite 數據庫路徑)
  • 核心作用: 為每個用戶/會話創建獨立的歷史存儲
  • 技術細節:
    • 使用 SQLite 數據庫存儲對話記錄(文件名為 memory.db
    • session_id 作為主鍵區分不同對話(如用戶ID、設備ID等)
    • 實際表結構包含 id, session_id, message, timestamp 等字段
  • 擴展性:可替換為其他存儲后端(如PostgreSQL、Redis)

2. 對話鏈構建模塊

from langchain_core.runnables.history import RunnableWithMessageHistorymodel = ChatOpenAI(model="gpt-4o-mini", temperature=0)
runnable = model | StrOutputParser()  # 基礎問答鏈runnable_with_history = RunnableWithMessageHistory(runnable=runnable,                # 原始鏈get_session_history=get_session_history, # 歷史管理方法input_messages_key="input",       # 輸入消息字段名(默認)history_messages_key="history"    # 歷史消息字段名(默認)
)
  • 組件連接:
    用戶輸入
    附加歷史
    大模型
    輸出解析
    保存歷史
  • 關鍵參數:
    • input_messages_key: 輸入消息在上下文中的鍵名
    • history_messages_key: 歷史消息的鍵名(模型需支持上下文窗口)

3. 對話調用示例

response = runnable_with_history.invoke([HumanMessage(content="你好,我叫麥酷")], # 當前消息config={"configurable": {"session_id": "wzr"}} # 指定會話
)
  • 執行流程:
    1. 根據 session_id="wzr" 從數據庫加載歷史消息
    2. 將當前消息 "你好,我叫麥酷" 添加到歷史記錄
    3. 組合歷史消息 + 當前輸入 → 發送給 GPT-4
    4. 解析模型輸出 → 返回最終響應
    5. 將新消息對(用戶輸入 + 模型回復)保存到數據庫

4. 數據庫操作示例

假設進行三次連續對話:

調用順序用戶輸入數據庫存儲內容(session_id=“wzr”)
第一次“你好,我叫麥酷”[Human: 你好,我叫麥酷, AI: 回復1]
第二次“記住我的名字了嗎?”添加 [Human: 記住我的名字了嗎?, AI: 回復2]
第三次“我是誰?”添加 [Human: 我是誰?, AI: 回復3]

模型在第三次調用時,實際接收的上下文包含前兩次對話歷史,因此能正確回答姓名。


5. 關鍵技術點

5.1 歷史注入機制
# 偽代碼展示實際發送給模型的內容
full_context = [{"role": "user", "content": "你好,我叫麥酷"},{"role": "assistant", "content": "回復1"},{"role": "user", "content": "記住我的名字了嗎?"},{"role": "assistant", "content": "回復2"},{"role": "user", "content": "我是誰?"}
]
response = model.generate(full_context)
5.2 自動歷史管理
  • 自動追加:每次調用自動添加新消息到歷史
  • 上下文截斷:當歷史超過模型窗口時需處理(此示例未展示)

6. 優化建議

6.1 歷史長度控制
from langchain.memory import ConversationBufferWindowMemory# 僅保留最近3輪對話
memory = ConversationBufferWindowMemory(k=3)
runnable_with_history.memory = memory
6.2 自定義歷史格式
def custom_history_formatter(history):return "\n".join([f"{msg.type}: {msg.content}" for msg in history])chain = runnable_with_history.configure(history_formatter=custom_history_formatter
)
6.3 多模態歷史支持
from langchain_core.messages import ImageMessage# 支持圖片消息存儲
history.add_message(ImageMessage(content="path/to/image.png"))

7. 常見問題排查

現象可能原因解決方案
數據庫無寫入文件權限問題檢查 memory.db 可寫權限
歷史消息未生效session_id 不一致確認每次調用使用相同 session_id
響應時間越來越長歷史消息過多未截斷添加窗口記憶或摘要記憶
中文內容存儲亂碼數據庫編碼問題使用 sqlite:///memory.db?charset=utf8

8. 典型應用場景

  1. 客服系統

    # 根據用戶手機號保持對話連續性
    session_id = user.phone_number
    
  2. 教育機器人

    # 為每個學生保存學習進度
    session_id = f"{student_id}-{course_id}"
    
  3. 多設備同步

    # 通過用戶賬戶實現跨設備同步
    session_id = user.account_id
    

該代碼展示了如何快速構建具備長期記憶能力的對話系統,通過簡潔的接口實現復雜的狀態管理,是開發智能對話應用的基石。

通過 LCEL,還可以實現

  1. 配置運行時變量:https://python.langchain.com/v0.2/docs/how_to/configure/
  2. 故障回退:https://python.langchain.com/v0.2/docs/how_to/fallbacks
  3. 并行調用:https://python.langchain.com/v0.2/docs/how_to/parallel/
  4. 邏輯分支:https://python.langchain.com/v0.2/docs/how_to/routing/
  5. 動態創建 Chain: https://python.langchain.com/v0.2/docs/how_to/dynamic_chain/

更多例子:https://python.langchain.com/v0.2/docs/how_to/lcel_cheatsheet/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897096.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從0開始的操作系統手搓教程21:進程子系統的一個核心功能——簡單的進程切換

目錄 具體說說我們的簡單RR調度 處理時鐘中斷處理函數 調度器 schedule switch_to 我們下面,就要開始真正的進程切換了。在那之前,筆者想要說的是——我們實現的進程切換簡單的無法再簡單了——也就是實現一個超級簡單的輪詢調度器。 每一個進程按照…

mysql新手常見問題解決方法總結

1. 安裝與配置問題 1.1 無法安裝MySQL Server MySQL Server安裝失敗是新手常見的問題之一,以下是具體原因及解決方案: 系統要求不滿足:MySQL對操作系統有最低版本要求,如Windows 7 SP1及以上、macOS 10.13及以上。若系統版本過…

數字組合(信息學奧賽一本通-1291)

【題目描述】 有n個正整數,找出其中和為t(t也是正整數)的可能的組合方式。如:n5,5個數分別為1,2,3,4,5,t5;那么可能的組合有514和523和55三種組合方式。 【輸入】 輸入的第一行是兩個正整數n和t,用空格隔開&#xff0c…

搜索引擎(基于java在線文檔)

背景: 基于java文檔的搜索引擎,可以輸入搜索詞,然后就可以查詢出與搜索詞相關的文檔。該項目的最主要的工作是要構建索引,就是正排和倒排索引。正排索引:根據文檔id獲取到文檔;倒排索引:根據搜…

【每日學點HarmonyOS Next知識】web滾動、事件回調、selectable屬性、監聽H5內部router、Grid嵌套時高度設置

【每日學點HarmonyOS Next知識】web滾動、事件回調、selectable屬性、監聽H5內部router、Grid嵌套時高度設置 1、HarmonyOS WebView加載url無法滾動? scroll 里面嵌套webView,demo參考: // xxx.ets import web_webview from ohos.web.webv…

Flink性能指標詳解MetricsAnalysis

文章目錄 Flink 組成1.JobManager2.TaskManager3.ResourceManager4.Dispatcher5.Client6. Env JobManager MetricsTaskManager Metrics Flink 組成 1.JobManager 管理任務 作業調度:負責接收和調度作業,分配任務到 TaskManager。資源管理:…

Flutter底層實現

1. Dart 語言 Dart 是 Flutter 的主要編程語言。Dart 設計之初就是為了與 JavaScript 兼容,并且可以編譯為機器代碼運行。Dart 提供了一些特性,如異步支持(通過 async 和 await),這使得編寫高效的網絡請求和復雜動畫變…

< 自用文兒 > CertBot 申請 SSL 證書 使用 challenge 模式 避開防火墻的阻擋

環境: 騰訊 VPS 騰訊會向你銷售 SSL , 這個本是免費的。CertBot 默認申請證書要用到 80 端口,會蹭邊什么什么條款,備案法律來阻止80端口的通訊,沒有網站也一樣被阻攔。 通過騰訊買的域名: bestherbs.cn …

【AI】【Unity】關于Unity接入DeepseekAPI遇到的坑

前言 由于deepseek網頁端在白天日常抽風,無法正常的使用,所以調用API就成了目前最好的選擇,尤其是Deepseek的API價格低得可怕,這不是和白送的一樣嗎!然后使用過很多本地部署接入API的方式,例如Chatbox、Pa…

【微知】Mellanox驅動中to是什么?有哪些超時時間?(time out,心跳2s,reset 1分鐘)

to是tout縮寫,tout是time out 單位是毫秒。 static const u32 tout_def_sw_val[MAX_TIMEOUT_TYPES] {[MLX5_TO_FW_PRE_INIT_TIMEOUT_MS] 120000, # 2min。預初始化的總超時時間[MLX5_TO_FW_PRE_INIT_ON_RECOVERY_TIMEOUT_MS] 7200000, #設備恢復過程中的固件預初…

linux | Vim 命令快捷操作

注:本文為過去的 “vim 使用筆記”。 跳轉命令 跳轉命令 #:向前查找光標當前所在單詞,并跳轉到該單詞的上一個出現位置。*:向后查找光標當前所在單詞,并跳轉到該單詞的下一個出現位置。 行內跳轉 0:跳轉…

樹莓派3B+的初步使用

樹莓派3B的初步使用 一、安裝使用樹莓派系統1.將系統寫入SD卡2.登錄樹莓派系統3.用C和Python編譯運行hello world 一、安裝使用樹莓派系統 1.將系統寫入SD卡 首先,準備至少16GB大小的SD卡以便裝入樹莓派系統,將SD卡插入讀卡器后連接電腦準備給SD卡寫入…

基于Windows11的DockerDesktop安裝和布署方法簡介

基于Windows11的DockerDesktop安裝和布署方法簡介 一、下載安裝Docker docker 下載地址 https://www.docker.com/ Download Docker Desktop 選擇Download for Winodws AMD64下載Docker Desktop Installer.exe 雙點擊 Docker Desktop Installer.exe 進行安裝 測試Docker安裝是…

文檔處理控件Aspose.Total教程:使用 C# 將 Obsidian Markdown 轉換為 OneNote

Obsidian 是一款廣泛使用的基于 Markdown 的筆記應用程序。它提供了一種強大而有效的方式來構建和組織想法。用戶可以無縫地連接他們的想法,提高清晰度和工作效率。另一方面,OneNote 是 Microsoft 的一款功能強大的筆記應用程序。它還可以幫助用戶組織他…

第5章:vuex

第5章:vuex 1 求和案例 純vue版2 vuex工作原理圖3 vuex案例3.1 搭建vuex環境錯誤寫法正確寫法 3.2 求和案例vuex版細節分析源代碼 4 getters配置項4.1 細節4.2 源代碼 5 mapState與mapGetters5.1 總結5.2 細節分析5.3 源代碼 6 mapActions與mapMutations6.1 總結6.2…

迷你世界腳本對象庫接口:ObjectLib

對象庫接口:ObjectLib 迷你世界 更新時間: 2023-04-26 20:21:09 具體函數名及描述如下: 序號 函數名 函數描述 1 getAreaData(...) 獲取區域數據 2 getPositionData(...) 獲取位置數據 3 getLivingData(...) 獲取生物數據 4 getItemDat…

測試是如何跟進和管理 bug

測試在跟進和管理 Bug定位精確、問題反饋及時、修復閉環高效 三大關鍵環節中起到了至關重要的作用。Bug定位精確 是整個流程的基礎,通過詳細記錄和復現問題,可以幫助開發團隊迅速找出缺陷根源;而及時有效的反饋機制則確保問題不會被遺漏&…

運動控制卡--固高實用

目錄 組件 配置參數 編程控制 組件 我手頭有固高卡,記錄使用。 用運動控制卡 伺服(步進)電機搭建一個運動控制系統,主要包括:1、控制器 2、端子板 1、控制器 2、端子板 3、伺服(步進)…

2025年能源工作指導意見

2025年是“十四五”規劃收官之年,做好全年能源工作意義重大。為深入貫徹落實黨中央、國務院決策部署,以能源高質量發展和高水平安全助力我國經濟持續回升向好,滿足人民群眾日益增長的美好生活用能需求,制定本意見。 一、總體要求…

鍵值對(C++實現)

目錄 鍵值對的定義 鍵值對的底層實現 鍵值對的作用 鍵值對的使用 對鍵值對中的值的搜索 一、鍵值對的定義 鍵值對(Key-Value Pair)是一種數據結構,用于存儲和表示兩個相關聯的值。在鍵值對中,一個值被關聯到一個唯一的鍵上&…