在 LangGraph 中集成 Mem0 记忆系统教程

简介

LangGraph 是一个强大的对话流程编排框架,而 Mem0 则是一个高效的记忆系统。本教程将介绍如何将两者结合,创建一个具有记忆能力的客服助手系统。

环境准备

首先安装必要的依赖:

pip install langgraph mem0 langchain openai

基础配置

1. 导入必要的模块

from openai import OpenAI
from mem0 import Memory
from mem0.configs.base import MemoryConfig
from mem0.embeddings.configs import EmbedderConfig
from mem0.llms.configs import LlmConfig
from typing import Annotated, TypedDict, List
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

2. 配置基础参数

# 集中管理配置
API_KEY = "your-api-key"
BASE_URL = "your-base-url"# 配置 LLM
llm = ChatOpenAI(temperature=0,openai_api_key=API_KEY,openai_api_base=BASE_URL,model="qwen-turbo"
)# 配置 Mem0
config = MemoryConfig(llm = LlmConfig(provider="openai",config={"model": "qwen-turbo","api_key": API_KEY,"openai_base_url": BASE_URL}),embedder = EmbedderConfig(provider="openai",config={"embedding_dims": 1536,"model": "text-embedding-v2","api_key": API_KEY,"openai_base_url": BASE_URL})
)

核心概念解析

1. 状态定义

在 LangGraph 中,我们需要定义对话状态:

class State(TypedDict):messages: Annotated[List[HumanMessage | AIMessage], add_messages]mem0_user_id: str

这个状态包含:

  • messages:当前对话的消息列表
  • mem0_user_id:用户标识,用于 Mem0 记忆检索

2. 对话节点实现

def chatbot(state: State):messages = state["messages"]user_id = state["mem0_user_id"]# 检索相关记忆memories = mem0.search(messages[-1].content, user_id=user_id)context = "\n".join([f"- {memory['memory']}" for memory in memories["results"]])# 构建系统提示system_prompt = f"""You are a helpful customer support assistant. Use the provided context to personalize your responses and remember user preferences and past interactions.
Relevant information from previous conversations:
{context}"""# 生成回复并存储记忆response = llm.invoke([SystemMessage(content=system_prompt)] + messages)mem0.add(f"User: {messages[-1].content}\nAssistant: {response.content}", user_id=user_id)return {"messages": [response]}

3. 图结构构建

graph = StateGraph(State)
graph.add_node("chatbot", chatbot)
graph.add_edge(START, "chatbot")
graph.add_edge("chatbot", "chatbot")
compiled_graph = graph.compile()

工作流程解析

  1. 状态初始化

    • 创建初始状态,包含用户消息和用户ID
    • 状态通过图结构传递给对话节点
  2. 记忆检索

    • 使用 Mem0 的 search 方法检索相关历史记忆
    • 根据语义相似度返回最相关的记忆
  3. 上下文整合

    • 将检索到的记忆整合到系统提示中
    • 确保 AI 能够理解历史上下文
  4. 响应生成

    • 使用 LLM 生成回复
    • 将新的对话内容存储到 Mem0 中

运行对话

def run_conversation(user_input: str, mem0_user_id: str):config = {"configurable": {"thread_id": mem0_user_id}}state = {"messages": [HumanMessage(content=user_input)], "mem0_user_id": mem0_user_id}for event in compiled_graph.stream(state, config):for value in event.values():if value.get("messages"):print("Customer Support:", value["messages"][-1].content)return

主程序示例

if __name__ == "__main__":mem0_user_id = "customer_123"print("Welcome to Customer Support! How can I assist you today?")while (user_input := input("You: ").lower()) not in ['quit', 'exit', 'bye']:run_conversation(user_input, mem0_user_id)

关键特性

  1. 状态管理

    • LangGraph 提供了清晰的状态管理机制
    • 支持复杂的对话流程控制
  2. 记忆检索

    • Mem0 提供语义化的记忆检索
    • 支持多用户隔离
  3. 流程编排

    • 通过图结构定义对话流程
    • 支持灵活的节点扩展

完整代码与示例

from openai import OpenAI
from mem0 import Memory
from mem0.configs.base import MemoryConfig
from mem0.embeddings.configs import EmbedderConfig
from mem0.llms.configs import LlmConfigfrom langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from typing import List, DictAPI_KEY = "your api key"
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"openai_client = OpenAI(api_key=API_KEY,base_url=BASE_URL,
)llm = ChatOpenAI(temperature=0,openai_api_key=API_KEY,openai_api_base=BASE_URL,model="qwen-turbo"
)config = MemoryConfig(llm = LlmConfig(provider="openai",config={"model": "qwen-turbo","api_key": API_KEY,"openai_base_url": BASE_URL}),embedder = EmbedderConfig(provider="openai",config={"embedding_dims": 1536,"model": "text-embedding-v2","api_key": API_KEY,"openai_base_url": BASE_URL})
)mem0 = Memory(config=config)prompt = ChatPromptTemplate.from_messages([SystemMessage(content="""You are a helpful travel agent AI. Use the provided context to personalize your responses and remember user preferences and past interactions. Provide travel recommendations, itinerary suggestions, and answer questions about destinations. If you don't have specific information, you can make general suggestions based on common travel knowledge."""),MessagesPlaceholder(variable_name="context"),HumanMessage(content="{input}")
])def retrieve_context(query: str, user_id: str) -> List[Dict]:"""Retrieve relevant context from Mem0"""memories = mem0.search(query, user_id=user_id)seralized_memories = ' '.join([mem["memory"] for mem in memories["results"]])context = [{"role": "system", "content": f"Relevant information: {seralized_memories}"},{"role": "user","content": query}]return contextdef generate_response(input: str, context: List[Dict]) -> str:"""Generate a response using the language model"""chain = prompt | llmresponse = chain.invoke({"context": context,"input": input})return response.contentdef save_interaction(user_id: str, user_input: str, assistant_response: str):"""Save the interaction to Mem0"""interaction = [{"role": "user","content": user_input},{"role": "assistant","content": assistant_response}]mem0.add(interaction, user_id=user_id)def chat_turn(user_input: str, user_id: str) -> str:# Retrieve contextcontext = retrieve_context(user_input, user_id)# Generate responseresponse = generate_response(user_input, context)# Save interactionsave_interaction(user_id, user_input, response)return responseif __name__ == "__main__":print("Welcome to your personal Travel Agent Planner! How can I assist you with your travel plans today?")user_id = "john"while True:user_input = input("You: ")if user_input.lower() in ['quit', 'exit', 'bye']:print("Travel Agent: Thank you for using our travel planning service. Have a great trip!")breakresponse = chat_turn(user_input, user_id)print(f"Travel Agent: {response}")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ceph 报错 full ratio(s) out of order

full ratio(s) out of order你遇到的错误信息: full ratio(s) out of order说明你设置的 OSD 空间使用阈值之间的数值顺序不正确,即: nearfull_ratio ≤ backfillfull_ratio ≤ full_ratio ≤ osd_failsafe_full_ratio如果它们的关系不满足这个顺序,Ceph 就会报这个错误。…

NB-IoT NPUSCH(三)-资源映射

资源映射单独做一章节,是因为NPUSCH的资源映射比较复杂。与LTE不同,为了提高数据传输的质量,NB-IoT的数据会有重复传输。NPUSCH一开始生成的TBS只与子载波个数、RU个数有关,与重复次数没有关系。初始产生的数据为 个时隙&#xff…

华为OD机试真题——荒岛求生(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

centos7安装MySQL(保姆级教学)

在 Linux 系统的软件管理中,YUM(Yellowdog Updater, Modified)包管理器是不可或缺的工具,而 YUM 源的选择与配置直接影响着软件安装与更新的效率。本文将深入解析网络 YUM 源的分类,详细介绍如何使用知名平台提供的 YU…

DeepSeek 赋能教育游戏化:AI 重构学习体验的技术密码

目录 一、引言:教育游戏化与 DeepSeek 的相遇二、DeepSeek 技术剖析2.1 核心架构2.2 关键技术 三、教育游戏化设计的奥秘3.1 概念与意义3.2 常见方法与元素3.3 成功案例借鉴 四、DeepSeek 在教育游戏化设计中的多面应用4.1 个性化学习路径打造4.2 智能教学辅助工具4…

WPF命令与MVVM模式:打造优雅的应用程序架构

🎮 打造优雅的应用程序架构 1. 🧩 命令系统基础1.1 🤔 为什么需要命令?1.2 🏗️ ICommand接口1.3 🛠️ 实现基本命令2. 🏛️ MVVM模式详解2.1 🧱 MVVM三大组件2.2 🏗️ 创建ViewModel基类2.3 🎯 典型ViewModel示例3. 🧩 命令绑定实战3.1 🎨 View中的命令…

真实案例拆解:智能AI客服系统中的两类缓存协同

真实案例拆解:智能客服系统中的两类缓存协同 在AI客服系统中,“响应速度”与“语义准确性”是一对天然的矛盾体。为了实现秒级应答与智能理解的双重目标,系统需要在技术架构中融合精确命中的缓存系统(如Redis)与模糊语义识别的向量数据库(如Milvus)。这两种能力的结合,…

FastAPI与MongoDB分片集群:异步数据路由与聚合优化

title: FastAPI与MongoDB分片集群:异步数据路由与聚合优化 date: 2025/05/26 16:04:31 updated: 2025/05/26 16:04:31 author: cmdragon excerpt: FastAPI与MongoDB分片集群集成实战探讨了分片集群的核心概念、Motor驱动配置技巧、分片数据路由策略、聚合管道高级应用、分片…

一起学数据结构和算法(三)| 字符串(线性结构)

字符串(String) 字符串是由字符组成的有限序列,在计算机中通常以字符数组形式存储,支持拼接、查找、替换等操作。 简介 字符串是计算机科学中最常用的数据类型之一,由一系列字符组成的有限序列。在大多数编程语言中&…

2025电工杯数学建模竞赛A题 光伏电站发电功率日前预测问题 保姆级教程讲解|模型讲解

完整内容请看文章最下面的推广群 2025电工杯数学建模竞赛 A题保姆级分析完整思路代码数据教学 2025电工杯 A题保姆级教程思路分析 DS数模-全国大学生电工数学建模(电工杯) A题保姆级教程思路分析 A题:光伏电站发电功率日前预测问题 下面我…

React Native 拼音及拼音首字母搜索组件开发

写在前面 “用户说找不到联系人?拼音搜索功能必须安排上!” —— 当产品经理第N次提出这个需求时,我意识到需要开发一个强大的拼音搜索组件。本文将详细介绍如何开发一个支持拼音匹配、首字母搜索的React Native搜索组件,让你的应…

springboot--实战--大事件--用户接口开发

开发模式&环境搭建 开发模式: 前后端分离开发 前端程序员写前端页面,后端程序员写后端的接口,前端工程发送请求来访问后台,后台处理完请求后要给前端相应对应的数据。 还需要一套标准来约束即接口文档,在接口文…

html使用JS实现账号密码登录的简单案例

目录 案例需求 思路 错误案例及问题 修改思路 案例提供 所需要的组件 <input>标签&#xff0c;<button>标签&#xff0c;<script>标签 详情使用参考&#xff1a;HTML 教程 | 菜鸟教程 案例需求 编写一个程序&#xff0c;最多允许用户尝试登录 3 次。…

小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解

前言 这两天&#xff0c;小米的全新SOC玄戒O1横空出世&#xff0c;引发了科技数码圈的一次小地震&#xff0c;那么小米的这颗所谓的自研SOC&#xff0c;内部究竟有着什么不为人知的秘密呢&#xff1f;我们一起一探究竟。 目录 前言1 架构总览1.1 基本构成1.2 SLC缺席的原因探…

VSCode如何像Pycharm一样“““回车快速生成函数注释文档?如何设置文档的样式?autoDocstring如何设置自定义模板?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 让VSCode拥有PyCharm级注释生成能力 📒🚀 实现方案🛠️ 备用方案📒 自定义注释文档格式样式 📒🔄 切换主流注释风格✨ 深度自定义模板🛠️ 类型提示与注释联动优化⚓️ 相关链接 ⚓️📖 介绍 📖 用PyCharm写P…

数据库的事务(Transaction)

在数据库中&#xff0c;事务&#xff08;Transaction&#xff09; 是保证数据操作一致性和完整性的核心机制。它通过一组原子性的操作单元&#xff0c;确保所有操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失败&#xff08;回滚&#xff09;。以下是数据…

2025-05-27 Python深度学习7——损失函数和反向传播

文章目录 1 损失函数1.1 L1Loss1.2 MSELoss1.3 CrossEntropyLoss 2 反向传播 本文环境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 1 损失函数 ​ 损失函数 (loss function) 是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的"风险&…

python+tkinter实现GUI界面调用即梦AI文生图片API接口

背景 目前字节跳动公司提供了即梦AI的接口免费试用&#xff0c;但是并发量只有1&#xff0c;不过足够我们使用了。我这里想做个使用pythontkinter实现的GUI可视化界面客户端&#xff0c;这样就不用每次都登录官方网站去进行文生图片&#xff0c;当然文生视频&#xff0c;或者图…

#git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt

问题&#xff1a;通常是由于 Git 的索引文件损坏导致 原因&#xff1a;系统崩溃或断电、硬盘故障、Git 操作错误等 方案&#xff1a;重建索引文件&#xff1a;将当前的索引文件重命名为其他名称或删除&#xff0c;比如 index.m&#xff0c;然后命令行重建索引&#xff0c;git…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…