【LLM應用開發】上下文記憶的解決方案(主流全面)

一、前言

  • 上下文記憶(Contextual Memory)解決方案的作用:
    • 提升 AI(尤其是大語言模型,LLM)的對話連貫性個性化
  • 本文將介紹幾個主流的實現方式。

二、🧠 什么是上下文記憶?

  • 在對話系統中,上下文記憶的目標是讓模型記住:
    • 你過去說過什么(對話歷史
    • 你的一些偏好/背景(長期記憶
    • 你最近的意圖(短期記憶

三、? 實現方案一:對話歷史拼接(最基礎)

描述:將所有之前的對話作為 prompt 的一部分,一起傳給模型。
示例:
history = [{"role": "user", "content": "我叫小明"},{"role": "assistant", "content": "你好,小明"},{"role": "user", "content": "我喜歡籃球"}
]
new_input = {"role": "user", "content": "我最喜歡的球星是誰?"}messages = history + [new_input]
response = llm.chat(messages=messages)
缺點:token長度易爆;對長時間記憶力弱。

四、? 實現方案二:嵌入向量 + 檢索記憶(RAG + Memory)

描述:
  • 將用戶歷史對話或知識用向量化方式存入向量數據庫
  • 后續查詢時根據當前問題檢索“相關記憶”,再加到 prompt 里。
結構:
當前用戶輸入 → 嵌入查詢 → 找相關記憶 → 構造 prompt → LLM回答
示例步驟:
  • 1.用戶說:“我住在北京”
  • 2.你將這句話嵌入并存入向量庫(如 Weaviate)
  • 3.用戶說:“最近北京天氣咋樣?”
  • 4.向量檢索出“我住在北京”這一記憶,構造 prompt:
記憶:你住在北京
問題:最近北京天氣咋樣?

五、? 實現方案三:顯式記憶管理框架(如 mem0 / LangChain)

描述:使用專門的“記憶管理器”
  • 自動保存每輪對話為 memory
  • 檢索、插入相關 memory
  • 支持短期、長期、多用戶等場景
示例:偽代碼
memory = Memory()
memory.add(messages, user_id="user1")# 下一輪輸入
relevant_memory = memory.search("北京天氣")
prompt = format_prompt(relevant_memory, user_input)
response = llm.call(prompt)

六、? Demo:簡單聊天機器人,帶上下文記憶

1,技術棧:Python、OpenAI、Mem0(上下文記憶實現框架)
2.📦 安裝依賴(確保你安裝了 mem0 和 openai):
pip install mem0 openai
  • (?? 注意:mem0 目前默認支持 OpenAI,你可以手動適配 DashScope 等其他 LLM)
3.📁 文件:mem0_chat_demo.py
from mem0 import Memory
import openai
import os# ? 設置 API key
openai.api_key = os.getenv("OPENAI_API_KEY") or "sk-xxx"  # 替換為你的 OpenAI Key# ? 初始化 memory 管理器(默認使用 OpenAI Chat 和 Embedding)
memory = Memory()# ? 聊天方法:結合歷史記憶生成回復
def chat_with_memory(user_input, user_id="user1"):# 1?? 檢索相關歷史記憶(最近與本輪問題相似的歷史記錄)relevant = memory.search(user_input, user_id=user_id)memories_str = "\n".join([f"- {r['memory']}" for r in relevant["results"]])# 2?? 構造提示詞 prompt:加入歷史“記憶”+當前輸入system_prompt = f"""
你是一個有記憶的智能助手,請根據以下用戶記憶回答問題:
用戶記憶:
{memories_str}
"""messages = [{"role": "system", "content": system_prompt.strip()},{"role": "user", "content": user_input}]# 3?? 向 LLM 發起請求response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages)answer = response.choices[0].message.content# 4?? 添加對話內容進 memorymessages.append({"role": "assistant", "content": answer})memory.add(messages, user_id=user_id)return answer# ? 啟動交互
if __name__ == "__main__":print("開始對話(輸入 'exit' 退出)")while True:user_input = input("你:")if user_input.lower() == "exit":breakreply = chat_with_memory(user_input)print(f"AI:{reply}")
4.🔍 Demo 解讀
  • (1)?? 上下文記憶體現在哪?
    • 使用 memory.search(user_input) 從過往對話中檢索與當前輸入 最相關的內容
    • 使用 memory.add(messages) 保存本輪的對話內容
    • 模型不僅根據當前提問回答,還會利用“過去的你說過的話”,這就是“記憶”
  • (2)🔁 示例對話:
你:我喜歡籃球
AI:好的,我記住了你喜歡籃球。
你:我最喜歡的球星是誰?
AI:你可能最喜歡的球星是籃球相關的,例如科比或詹姆斯。tag: 即使你沒說球星是誰,模型可以結合“你喜歡籃球”的歷史信息做推理。
  • (3)?? 提示詞 Prompt 如何構建的?
你是一個有記憶的智能助手,請根據以下用戶記憶回答問題:
用戶記憶:
- 我喜歡籃球
- 我的城市是北京
  • 這種方式稱為:增強提示詞(prompt augmentation)
  • 通過把 memory 拼接進 prompt,引導模型在更具上下文的條件下回答問題。
小總結
要素實現方式
記憶存儲memory.add(messages)
記憶檢索memory.search(user_input)
提示詞構建把相關記憶拼接進 system prompt
LLM 響應生成用拼接后的 prompt 交給 OpenAI 的 Chat 模型處理

七、方案選擇建議 / 總結

適用場景方案
簡單對話拼接歷史 messages
長對話、知識 Q&A向量數據庫 + RAG
多用戶、多記憶管理mem0 / LangChain Memory
  • 上下文記憶實現本質是解決 模型無法長期記憶的問題,常見方法包括:
    • Prompt 拼接
    • 向量數據庫檢索(RAG)
    • 顯式框架(如 mem0, LangChain Memory)

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

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

相關文章

C/C++ 面試復習筆記(2)

C語言如何實現快速排序算法? 答案:快排是一種分治算法,選擇一個基準元素,將數據劃分成兩部分,然后遞歸排序 補充: void quick_sort(int arr[], int start, int end) {//判斷是否需要排序if (start > …

2025吉林CCPC 題解(前六題)

// Problem: J - Odd-Even Game // Contest: Virtual Judge - sdccpc20250527 // URL: https://vjudge.net/contest/719585#problem/J // Memory Limit: 1024 MB // Time Limit: 1000 ms // 簽到題 // Powered by CP Editor (https://cpeditor.org)#include <bits/std…

Q: dify知識庫模塊主要庫表和字段

【回到目錄】~~~~【回到問題集】 Q: dify知識庫模塊主要庫表和字段 A: 表1&#xff1a;datasets 知識庫表 name 知識庫名稱 index_struct 向量索引node 表2&#xff1a;document 文檔表 name 文檔名稱 word_count 字數 doc_form 分段類型(hierarchical_model、qa_model、te…

NodeMediaEdge快速上手

NodeMediaEdge快速上手 簡介 NodeMediaEdge是一款部署在監控攝像機網絡前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http視頻流并使用rtmp/kmp推送到公網流媒體服務器的工具。 通過云平臺協議注冊到NodeMediaServer后&#xff0c;可以同NodeMediaServer結合使用。使用圖形化的…

通用前端框架項目靜態部署到Hugging Face Space的實踐指南

背景介紹 在輕量級展示前端項目的場景中,Hugging Face Space 提供了一個便捷的靜態托管平臺。需求是將無后端服務的Vite的 Vue項目部署到Hugging Face Space 上。其實無論是基于Vite的Vue/React項目,還是使用Webpack構建的工程化方案,都可以通過兩種方式將其部署到Space:自…

Android studio 查看aar源碼出現/* compiled code */

如圖查看aar源碼時看不到具體實現&#xff0c;在排除是sdk版本導致的問題后&#xff0c;下面說解決方法 打開設置&#xff0c;找到插件 輸入decompiler 搜索 這個是自帶的反編譯工具&#xff0c;啟用就好了

Spark實時流數據處理實例(SparkStreaming通話記錄消息處理)

所用資源&#xff1a; 通過網盤分享的文件&#xff1a;spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar等4個文件 鏈接: https://pan.baidu.com/s/1zYHu29tLgDvS_L2Ud-22ZA?pwdhnpg 提取碼: hnpg 1.需求分析 &#xff1a; 假定有一個手機通信計費系統&#xff0c;用戶通…

Vue3處理number輸入框避免NaN

在 Vue3 中處理 number 類型輸入框避免顯示 NaN&#xff0c;核心在于正確處理用戶輸入的非數字值。以下是幾種解決方案&#xff1a; 方案1&#xff1a;使用字符串中轉 計算屬性&#xff08;推薦&#xff09; vue 復制 下載 <template><input v-model"input…

Python自動化之selenium語句——瀏覽器設置顯示尺寸、截圖、刷新網頁

目錄 一、瀏覽器設置最大化、最小化 1.瀏覽器最大化 2.瀏覽器最小化 二、瀏覽器打開的位置、尺寸 1.瀏覽器打開位置 2.瀏覽器打開尺寸 三、瀏覽器截圖 1.截圖語句 2.運行成功后查看 四、刷新網頁 上一節實現了打開瀏覽器、打開指定網址、關閉瀏覽器的操作&#xff0c…

model.classifier:分類頭

model.classifier:分類頭 分類頭(model.classifier)含義 在基于Transformer架構的模型(如BERT、GPT等 )用于分類任務時,“分類頭(model.classifier)” 是模型的一個重要組成部分。以Hugging Face的Transformers庫為例,許多預訓練模型在完成通用的預訓練任務(如語言…

4.1.2 操作數據集

在本實戰中&#xff0c;我們深入學習了Spark SQL的操作數據集&#xff0c;包括了解Spark會話、準備數據文件、啟動Spark Shell以及獲取和操作學生數據集。通過Spark Shell&#xff0c;我們可以直接使用SparkSession實例來加載、轉換和處理數據。我們學習了如何將文本文件加載為…

LangChain整合Milvus向量數據庫實戰:數據新增與刪除操作

導讀&#xff1a;在AI應用開發中&#xff0c;向量數據庫已成為處理大規模語義搜索和相似性匹配的核心組件。本文通過詳實的代碼示例&#xff0c;深入探討LangChain框架與Milvus向量數據庫的集成實踐&#xff0c;為開發者提供生產級別的向量數據管理解決方案。 文章聚焦于向量數…

從根源解決Augment免費額度限制問題:Windows詳細教程

從根源解決Augment免費額度限制問題&#xff1a;Windows詳細教程 本文將詳細介紹如何在Windows系統上解決Augment AI助手的"Too many free trials"限制問題&#xff0c;通過清理VS Code緩存和修改設備ID實現無限制使用Augment的方法。 視頻地址 augment從根源上解決免…

IoTDB 集成 DBeaver,簡易操作實現時序數據清晰管理

數據結構一目了然&#xff0c;跨庫分析輕松實現&#xff0c;方便 IoTDB “內部構造”管理&#xff01; 隨著物聯網場景對時序數據處理需求激增&#xff0c;時序數據庫與數據庫管理工具的集成尤為關鍵。作為數據資產的 “智能管家”&#xff0c;借助數據庫管理工具的可視化操作界…

應用層協議http(無代碼版)

目錄 認識URL urlencode 和 urldecode HTTP 協議請求與響應格式 HTTP 的請求方法 GET 方法 POST 方法 HTTP 的狀態碼 HTTP 常見 Header Location 關于 connection 報頭 HTTP版本 遠程連接服務器工具 setsockopt 我們來學習應用層協議http。 雖然我們說, 應用層協…

Cangjie 中的值類型與引用類型

1. 值類型和引用類型 1.1 值的存儲方式 所有變量在底層實現中&#xff0c;都會關聯一個具體的“值”&#xff0c;這個值可能存儲在 內存地址 或 寄存器 中。 寄存器用于優化常用變量的訪問速度。只有局部、小、頻繁使用的變量才更可能被分配到寄存器中。實際行為由編譯器根據…

使用el-input數字校驗,輸入漢字之后校驗取消不掉

先說說復現方式 本來input是只能輸入數字的&#xff0c;然后你不小心輸入了漢字&#xff0c;觸發校驗了&#xff0c;然后這時候&#xff0c;你發現校驗取消不掉了 就這樣了 咋辦啊&#xff0c;你一看校驗沒錯啊&#xff0c;各種number啥的也寫了,發現沒問題啊 <el-inputv…

使用 Zabbix 監控 MySQL 存儲空間和性能指標的完整實踐指南

目錄 引言 一、最終目標支持功能 二、監控方案設計 2.1 技術選型 2.2 設計思路 三、實現步驟 3.1 準備工作 3.11 創建 MySQL 監控賬號 3.12 配置 .my.cnf 文件 3.2 編寫統一腳本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建議 四、總結 引言 MySQL …

多元素納米顆粒:開啟能源催化新紀元

在能源轉型的浪潮中&#xff0c;納米催化劑正成為推動能源技術突破的關鍵力量。多元素納米顆粒&#xff08;Polyelemental Nanoparticles&#xff09;憑借其獨特的元素協同效應&#xff0c;展現出在能源催化領域的巨大潛力。然而&#xff0c;合成這些復雜體系的納米顆粒面臨著諸…

鐵路行業數字化應用建設方案

數字化轉型面臨的挑戰 鐵路行業正處于數字化轉型的關鍵時期&#xff0c;鐵路行業應用場景復雜&#xff0c;數據量巨大&#xff0c;傳統信息化建設模式難以滿足日益增長的業務需求。鐵路企業亟需引入敏捷高效的數字化工具&#xff0c;加速推進業務創新&#xff0c;實現提質增效…