当LangGraph遇上Mem0:如何让你的AI Agent具有更智能的记忆与个性化的体验?

AI Agent(智能体)的记忆(Memory)被认为是一项必备的基础能力,它用来提取、存储会话中的重要信息并用于后续的检索与使用。可以把记忆简单地分成短期记忆与长期记忆两种,用来“记住”不同类型的信息:

在这里插入图片描述

短期记忆通常用来缓存一次会话过程的上下文与推理过程;而长期记忆则为AI 智能体提供了持久的重要信息存储与快速检索能力。

目前无论是LangChain/LlamaIndex这样的底层LLM框架,还是一些低代码平台,在短期记忆能力上都有相对完善的解决方案;但在长期记忆能力的实现上则相对不足,特别是更智能的个性化记忆能力

本文介绍一种广受欢迎的AI记忆开源解决方案:Mem0(Mem0背后公司的一款基于Mem0的AI聊天应用获得了OpenAI的投资):

  1. AI应用需要怎样的长期记忆

  2. Mem0是怎么工作的

  3. 用LangGraph+Mem0实现个性化Agent体验

01

AI应用需要怎样的长期记忆

很多时候,我们希望AI应用能够提供一种更个性化的人工智能体验:随着时间的推移,AI能够记住每个使用者的一些独特信息,比如个人资料、专业细节、偏好、个人计划、习惯等,并能够在未来的交互中轻松地检索到这些信息,用来实现更针对性与个性化的AI体验。比如:

  • 个性化的AI学习。记住不同学员的特点与习惯以提供针对性的教学过程。

  • 个性化的AI客户服务。 根据客户的历史交互与信息提供更智能的服务体验。

  • 个性化的AI个人助理。 根据个人偏好与习惯提供更有吸引力的推荐与帮助。

  • 个性化的AI医疗咨询。根据咨询者的信息、病史、用药等做更精准的诊断。

注意这些信息需要在跨越多用户、多次会话、甚至多个AI应用时保留与检索。

除此之外,参考人类的记忆习惯,我们还希望AI的长期记忆能够:

  • 智能记忆: 并非简单对话历史的存储,而是智能的理解、提取与记住重要信息与相关事实。

    比如:从一次旅游规划对话中识别客户偏好的酒店类型、出行习惯。

  • 自适应学习: 随着用户的不断使用与交互,能够持续提高个性化信息的丰富性与准确性。

    比如:在多次对话中不断完善对客户信息与画像的了解。

  • 动态更新: 根据新的交互信息动态更新记忆内容。

    比如:在对话中识别出使用者的工作发生了变化,需要更新之前的记忆。

  • 更准确的检索与响应: 优先考虑最近最相关的记忆信息,及时忘记过时信息,以提供更准确的个性化上下文。
    比如:回忆最近一段时间的客户用餐爱好,并做针对性推荐。

以上这些能力要求,也正是Mem0已经具备的核心特性。

02

Mem0是怎么工作的?

简单地说,Mem0就是为基于LLM的AI应用而设计的独立记忆层。通过它可以帮助AI应用实现跨应用持久、智能、自适应与动态的长期记忆与回忆能力,以用来实现真正的个性化AI体验。

Mem0的主要构成与工作方式用下图表示:

  • Mem0提供了简单的记忆管理API用来集成到你自己的AI应用

  • Mem0借助LLM与嵌入模型来智能的生成与更新记忆,并实现语义检索

  • Mem0的后端需借助向量数据库或者图数据库来组织、存储与检索记忆

以Mem0简单的增加记忆(add方法)为例,其核心处理过程大致为:

可以看到,Mem0借助了LLM来实现对记忆事实的提取,并能够根据新的交互信息来动态更新历史记忆,以保留最新的个性化记忆,并遗忘无用的记忆。由于借助了LLM,因此提示词就显得非常重要。如果你需要定制自己的记忆提取的提示词,可以在创建Memory对象时,设置custom_prompt参数。

03

用LangGraph+Mem0创建个性化体验的AI Agent

现在,让我们来创建一个具有个性化记忆能力的AI Agent,相对LangChain框架中的记忆组件,Mem0提供了更强大与智能的另外一种选项。

这里仍然用之前我们演示使用的智能体:**一个带有网络搜索功能的简单对话机器人。****但这次我们增加了长期记忆选项,用来实现跨多次会话、多用户甚至多Agent的个性化交互能力。**工作流程如下:

【创建记忆】

创建一个Mem0的Memory对象,向量数据库使用嵌入式的Chroma,LLM使用OpenAI的gpt-4o-mini模型(OpenAI的Key在环境变量配置):

from mem0 import Memory  
from typing import Annotated, TypedDict, List  
from langgraph.graph import StateGraph, START, END  
from langgraph.graph.message import add_messages  
from langchain_openai import ChatOpenAI  
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage  
from langchain_community.tools.tavily_search import TavilySearchResults  
from langgraph.prebuilt import ToolNode  #个性化长期记忆,采用chrona向量库存储  
mem0 = Memory.from_config({  "version":"v1.1",  "llm": {  "provider": "openai",  "config": {  "model": "gpt-4o-mini"  }    },  "vector_store": {  "provider": "chroma",  "config": {  "collection_name": "chat_memory",  "path": "./db",  }  }  
})

【创建LangGraph工作流与Agent】

定义LangGraph中的节点行为,最后创建工作流,并添加节点与边。这里针对Mem0的主要修改集中在chatbot这个节点方法中。简单解释如下:

  • 为了区分不同用户的记忆,会在state中保留一个mem0_user_id。在添加记忆或者检索记忆时都需要携带这个user_id。(在实际应用中,这个id很可能是你的某个客户ID)

  • 在chatbot回复之前,先根据输入消息内容检索关联的个性化记忆(search),并把检索到的记忆组装成System Message。(这是一个常见的优化点,即如何检索出更相关的记忆,可以参考RAG优化中的一些方法)

  • System Message与用户消息一起作为上下文输入给LLM,从而在生成响应时,大模型能够根据个性化的记忆作出响应。

  • 在本轮交互结束后,调用add接口将该用户的本次对话信息添加到记忆中。Mem0会自动识别和合并,以用于下次检索。

#定义LangGraph的State  
class State(TypedDict):  messages: Annotated[List[HumanMessage | AIMessage], add_messages]  mem0_user_id: str  # 调用搜索引擎的工具节点,利用ToolNode构建  
tools = [TavilySearchResults(max_results=1)]  
tool_node = ToolNode(tools)  #定义chatbot节点  
def chatbot(state: State):  messages = state["messages"]  user_id = state["mem0_user_id"]  # 取出关联的个性化记忆,并组装成context,放在system message中  memories = mem0.search(messages[-1].content, user_id = user_id)["results"]  context = "历史对话中的相关信息有:\n"  for memory in memories:  context += f"- {memory['memory']}\n"  system_message = SystemMessage(content=f"你是一个乐于助人的客户支持助手。利用所提供的上下文来个性化你的回复,并会记住用户的偏好和过去的交互。\n{context}")  # 组装消息,并调用LLM(注意绑定tools)  full_messages = [system_message] + messages  llm = ChatOpenAI(model="gpt-4o-mini") .bind_tools(tools)  response = llm.invoke(full_messages)  # 记住本地对话的信息  mem0.add(f"User: {messages[-1].content}\nAssistant: {response.content}", user_id=user_id)  return {"messages": [response]}  # 一个辅助方法:判断是否需要调用工具  
def should_continue(state):  messages = state["messages"]  last_message = messages[-1]  #根据大模型的反馈来决定是结束,还是调用工具  if not last_message.tool_calls:  return "end"  else:  return "continue"  # 定义一个graph  
workflow = StateGraph(State)  
workflow.add_node("llm", chatbot)  
workflow.add_node("search", tool_node)  
workflow.set_entry_point("llm")  # 一个条件边,即从agent出来的两个分支及条件  
workflow.add_conditional_edges(  "llm",  should_continue,  {  "continue": "search",  "end": END,  },  
)  # action调用后返回agent  
workflow.add_edge("search", "llm")  
graph = workflow.compile()

【测试Agent的记忆能力】

准备如下的简单测试代码:

if __name__ == "__main__":  print("AI: 你好!有什么可以帮助你?")  mem0_user_id = "testuser"  # You can generate or retrieve this based on your user management system  while True:  user_input = input("输入: ")  if user_input.lower() in ['quit', 'exit', 'bye']:  break  config = {"configurable": {"thread_id": mem0_user_id}}  state = {"messages": [HumanMessage(content=user_input)], "mem0_user_id": mem0_user_id}  response = graph.invoke(state,config)  print("AI: ",response["messages"][-1].content)

我们首先做一些简单的交互对话,试图让Agent产生一些“记忆”:

在这里插入图片描述

这里的会话中传递了一些个性化的信息:最近爱看足球、不喜欢坐飞机、对历史文化名城感兴趣等。

现在让我们退出,然后重新启动应用,并开始新的对话:

在这里插入图片描述

可以看到,AI知道你最近对足球比赛感兴趣,并进行了推荐。继续上面的对话:

在这里插入图片描述

没错,AI也了解你对历史文化名城感兴趣,所以做了更贴心更针对性的规划。

注意,这里Agent的记忆是和user_id相关的(测试代码中为testuser),如果你更换这个user_id,那么将不会获得之前testuser的记忆信息,而会重新开始创建新的用户记忆。

04

小结

借助Mem0你可以快速地给自己的AI应用与智能体添加额外的持久记忆体,以记住用户偏好、曾经的互动、任务的进度等,从而构建自适应的学习与记忆能力,实现完全个性化的AI应用体验。这在个人助理、客户服务、智能咨询、企业生产力应用等领域都可以有广泛的应用。

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

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

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

相关文章

Navicat连接openGauss数据库详细指南

文章目录 环境准备总体的技术路线root权限下,防火墙的关闭切换用户修改文件修改文件pg_hba.conf修改文件postgresql.conf重启数据库 创建用于连接的数据库和数据库用户使用Navicat连接 资料参考 环境准备 自行安装Navicat连接工具(自己找破解版)已经安装好openGaus…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架,可以让小白也能搭建出一个智能体其次是拥有丰富的插件,可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【Linux内核】eBPF基础篇

系列综述: 💞目的:本系列是个人整理为了学习ebpf机制的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于–知乎ebpf专栏文章–进行的,每个知识点的修正和深…

python获取当前鼠标位置的RGB值

效果 依赖 pip install Pillow pyautoguisudo apt install gnome-screenshot代码 import pyautogui import timedef get_rgb_at_mouse():try:while True:# 获取当前鼠标的位置x, y pyautogui.position()# 截取当前屏幕图像screenshot pyautogui.screenshot()# 获取鼠标位置…

小O睡眠省电调研

摘要 AI 预测睡眠 断网 杀应用为主的策略 UI 睡眠识别 AI 识别 将亮灭屏、音频、上传下载、运动状态数据存到xml中,供预测分析 睡眠策略 OPPO 睡眠省电 1. sOSysNetControlManagerNewInstance:断网(wifi\mobiledata)2. S…

【D3.js in Action 3 精译_036】4.1 DIY 实战:在 Observable 平台实现 D3折线图坐标轴的绘制

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

百度统计提示:为了满足法律法规最新规定和要求,您的网站由于存在合规风险将被暂停使用百度统计服务

今天打开百度统计后看到提示: 为了满足法律法规及政府监管的最新规定和要求,保护广大网民的合法权益,您的网站由于存在合规风险将被暂停使用百度统计服务。 请您在10日内完成整改,否则将删除违规站点及数据,有问题可发…

使用dotnet-counters和dotnet-dump 分析.NET Core 项目内存占用问题

在.NET Core 项目部署后,我们往往会遇到内存占用越来越高的问题,但是由于项目部署在Linux上,因此无法使用VS的远程调试工具来排查内存占用问题。那么这篇文章我们大家一起来学习一下如何排查内存占用问题。 首先,我们来看一下应用…

手机数据恢复技巧:适用于手机的恢复应用程序

发现自己意外删除了 Android 设备上的照片,这让人很痛苦。这些照片可能是值得纪念的文件,会让您想起一些难忘的回忆。删除它们后,您知道如何恢复它们。在这种情况下,您需要使用 Android 的照片恢复应用程序。 无论您需要直接从 A…

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

💯 欢迎光临清流君的博客小天地,这里是我分享技术与心得的温馨角落 💯 🔥 个人主页:【清流君】🔥 📚 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 📚 🌟始终保持好奇心&…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作,从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例,并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

QUIC(Quick UDP Internet Connections)与 RTMP(Real Time Messaging Protocol)

QUIC(Quick UDP Internet Connections)和 RTMP(Real Time Messaging Protocol)是两种不同的网络传输协议,它们在一些方面有不同的特点和应用场景。 QUIC 协议 特点 基于 UDP:QUIC 建立在 UDP 之上&#xff…

探索 Jupyter 核心:nbformat 库的神秘力量

文章目录 探索 Jupyter 核心:nbformat 库的神秘力量1. 背景介绍:为何选择 nbformat?2. nbformat 是什么?3. 如何安装 nbformat?4. 简单的库函数使用方法4.1 读取 Notebook 文件4.2 修改 Notebook 中的单元格4.3 添加 M…

灵当CRM index.php 任意文件上传漏洞复现

0x01 产品描述: 灵当CRM是一款专为中小企业量身定制的智能客户关系管理工具,由上海灵当信息科技有限公司开发和运营。该系统广泛应用于多个行业,包括金融、教育、医疗、IT服务及房地产等领域,旨在满足企业对客户个性化管理的需求&…

【2024版】sql-liabs靶场前十关解题过程和思路----适合入门小白

在你们看到这个靶场之前,你们可以先去听一下课,然后再来做这个靶场你们的感悟就会比较深,当你听过课再来做就不会觉得这么懵了,重庆橙子科技-sql注入,我之前学习是听的他的课,我觉得是全网讲的最好的一个师…

vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件)

前情提要 在一开始要使用pdf预览的时候,第一次选的是vue-pdf,但是vue-pdf支持的功能太少,缺少了项目中需要的一项-复制粘贴功能 之后我一顿搜搜搜,最终貌似只有pdfjs能用 但是网上支持text-layer的貌似都是用的2.09那个版本。 使…

MySQL同步到ES的方案选型

文章目录 1. 同步双写优点缺点实现方式 2. 异步双写优点缺点实现方式 3. 另起应用 SQL 查询写入优点缺点实现方式 4. Binlog 实时同步优点缺点实现方式 5. 应用场景 本文参考: https://www.bilibili.com/video/BV13hvZeaErr/?vd_sourceb7e4d17fd13ffa91c4da6d37c08a6c7c 最近在…

【题解】—— LeetCode一周小结42

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结41 14.鸡蛋掉落 题目链接:887. 鸡蛋掉落 给你 k 枚…

c++迷宫游戏

1、问题描述 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求: 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;迷宫的墙足够结…