agentscope记忆模块使用和部署agent-memory-server记忆服务

news/2026/1/21 22:43:28/文章来源:https://www.cnblogs.com/peacemaple/p/19514254

参考资料

  • https://doc.agentscope.io/zh_CN/tutorial/task_memory.html

  • https://bai-lab.github.io/MemoryOS/docs

  • https://github.com/BAI-LAB/MemoryOS

  • https://docs.mem0.ai/open-source/python-quickstart

  • https://redis.github.io/agent-memory-server/quick-start/

agent记忆的概念和实现

对记忆系统产生最基本的认识,可以参考AI Agent 记忆系统:从短期到长期的技术架构与实践

  • 短期记忆参与模型推理,随着会话进行需要进行上下文工程策略(压缩、卸载、摘要等),可能的上下文管理策略可以参考AgentScope AutoContextMemory
  • 长期记忆从短期记忆中抽取。此外长期记忆的内容会经过检索注入短期记忆辅助推理。长期记忆通常是独立的第三方组件,其内部有相对比较复杂的流程(信息提取、向量化、存储、检索等),以及多种记忆类型(用户记忆,工具记忆、任务记忆)。
  • 常见的长期记忆组件包括 Mem0、Zep、Memos、ReMe 等。长期记忆相关的核心组件包括,大模型,向量数据库,图数据库,rerank,sql数据库等,关于这些组件具体的作用和场景可以参考特定实现,例如MemOS 深度拆解:构建企业级 Agent 的高性能记忆底座
图片

aws strands agent框架也通过社区工具包的方式提供了记忆支持,但是除了mem0_memory之外都似乎需要和Bedrock集成,实际上是基于mem0库封装的工具类,可以集成opensearch,neptune做向量和图数据库实现,具体参考Mem0 Memory Agent - Personalized Context Through Persistent Memory

from mem0 import Memory as Mem0Memory
def _initialize_client(self, config: Optional[Dict] = None) -> Any:...Mem0Memory.from_config(config_dict=merged_config)

agentscope提供了短期和长期记忆的实现,两者并不是通过简单的时间维度进行的划分,而是是否跨 Session 会话

短期(会话级)记忆,用户和智能体 Agent 在一个会话中的多轮交互,支持内存和关系非关系型数据库作为记忆存储,实现自定义的短期记忆需要从 MemoryBase 继承并实现特定方法。

async def in_memory_example():memory = InMemoryMemory()await memory.add(Msg("Alice", "我喜欢吃蔬菜", "user"),)

长期(跨会话)记忆,从用户和智能体 Agent 的多个会话中抽取的通用信息,可以跨会话辅助 Agent 推理,目前已经有基于Mem0和ReMe的记忆实现,实现自定义的长期记忆继承 LongTermMemoryBase 并实现特定方法即可。Mem0实现默认使用Qdrant作为向量存储。

  • 可以通过VectorStoreConfig指定使用向量存储库类型,这里修改为使用chroma
  • 默认会连接chroma cloud,为了指定嵌入的chroma数据库,还需要修改path为/tmp/my_chroma
import os
import asynciofrom agentscope.message import Msg
from agentscope.memory import InMemoryMemory, Mem0LongTermMemory
from agentscope.agent import ReActAgent
from agentscope.embedding import OpenAITextEmbedding
from agentscope.model import OpenAIChatModel
from mem0.vector_stores.configs import VectorStoreConfig# 使用 Chroma 作为向量数据库
vector_store_config = VectorStoreConfig(provider="chroma",config={"path": "/tmp/my_chroma",  # Chroma 数据存储路径}
)long_term_memory = Mem0LongTermMemory(agent_name="你是一个名为 Friday 的助手,具有长期记忆能力。",user_name="user_0",model=OpenAIChatModel(model_name="qwen3-vl",api_key= "sk-uzpq0u0n5FN14HorW45hUw",client_kwargs={"base_url": "http://localhost:4000"},stream=False,),embedding_model=OpenAITextEmbedding(model_name="embed-text-v2",dimensions=1024,base_url="http://localhost:4000",api_key="sk-uzpq0u0n5FN14HorW45hUw",),vector_store_config=vector_store_config,on_disk=False,
)async def basic_usage():# 记录记忆await long_term_memory.record([Msg("user", "我喜欢吃蔬菜,但是不喜欢吃胡萝卜", "user")])# 检索记忆results = await long_term_memory.retrieve([Msg("user", "我的喜欢吃什么蔬菜", "user")],)print(f"检索结果: {results}")asyncio.run(basic_usage())

以上代码运行报错"RuntimeError: Error generating embedding using agentscope model: Connection error" 的问题,可能是一个异步运行时的异常。经过AI帮助修改了修改了/.venv/lib/python3.13/site-packages/agentscope/memory/_long_term_memory/_mem0/_mem0_utils.py中的 AgentScopeEmbedding.embed 方法

  • mem0 在异步上下文中通过 asyncio.to_thread 调用 embedding
  • agentscope 的 embedding 模型是异步的,内部使用 OpenAI AsyncClient
  • 如果在子线程中直接使用 asyncio.run 创建新事件循环,会导致 OpenAI AsyncClient 连接池问题
def embed(self, text, ...):# 添加线程锁,防止并发问题with self._lock:try:loop = asyncio.get_running_loop()# 已有事件循环,使用 run_coroutine_threadsafe 线程安全调度asyncio.run_coroutine_threadsafe(self.agentscope_model(text_list),loop).result(timeout=30)except RuntimeError:# 无事件循环,直接使用 asyncio.runasyncio.run(self.agentscope_model(text_list))

修改完毕后可以正常触发记忆流程

image-20260121145823443

通过agent-memory-server部署记忆服务

agent-memory-server是一个使用 Redis 为agent和 AI 应用提供记忆的方案,尝试通过它来实现自定义记忆扩展。

agent-memory-server中将短期和长期记忆区分为Working Memory和Long-Term Memory。启动apiserver时在dev环境中通过指定--task-backend=asyncio会在单进程中运行,prod环境中使用docker作为后端worker负责上下文管理和记忆转移的工作。

# uv run agent-memory api --task-backend=asyncio
uv run agent-memory api --port 8000

官方提供了dockerfile构建可用镜像,使用如下的docker-compose配置启动服务,可见api,worker和mcp使用相同的镜像,只是入口不同

version: '3.8'
services:redis:image: redis/redis-stack:latestports:- "6379:6379"volumes:- redis_data:/dataapi:image: redis-agent-memory:latestports:- "8000:8000"environment:- REDIS_URL=redis://redis:6379- DISABLE_AUTH=truecommand: uv run agent-memory apidepends_on:- redisworker:image: redis-agent-memory:latestenvironment:- REDIS_URL=redis://redis:6379command: uv run agent-memory task-worker --concurrency 10depends_on:- redisdeploy:replicas: 2mcp:image: redis-agent-memory:latestports:- "9000:9000"environment:- REDIS_URL=redis://redis:6379command: uv run agent-memory mcp --mode sse --port 9000 --task-backend docketdepends_on:- redisvolumes:redis_data:

实际运行配置自己的litellm平台会报错,检查发现agent_memory_server/models.py中只支持特定的模型,为了避免修改配置,在litellm直接将模型改为如下环境变量配置gpt-4o-mini和text-embedding-3-small

REDIS_URL=redis://localhost:6379
PORT=8000
LONG_TERM_MEMORY=true
OPENAI_API_KEY=sk-uzpq0u0n5FN14HorW45hUw
OPENAI_BASE_URL=http://172.31.14.46:4000
GENERATION_MODEL=gpt-4o-mini
EMBEDDING_MODEL=text-embedding-3-small
DISABLE_AUTH=true

然后启动api服务端

uv run agent-memory api --task-backend=asyncio

使用如下客户端测试记忆

import asyncio
import openai
from agent_memory_client import MemoryAPIClient, MemoryClientConfig
from agent_memory_client.models import WorkingMemory, MemoryMessagememory_client = MemoryAPIClient(config=MemoryClientConfig(base_url="http://localhost:8000")
)openai_client = openai.AsyncClient(api_key="sk-uzpq0u0n5FN14HorW45hUw",base_url="http://default.test.com:4000/v1"
)def normalize_messages(messages):normalized = []for msg in messages:if isinstance(msg.get("content"), dict):normalized.append({"role": msg["role"],"content": msg["content"].get("text", "")})elif isinstance(msg.get("content"), str):normalized.append(msg)else:normalized.append(msg)return normalizedasync def chat_with_memory(message: str, session_id: str):context = await memory_client.memory_prompt(query=message,session_id=session_id,model_name="gpt-4o-mini",long_term_search={"text": message,"limit": 5})messages = normalize_messages(context.get("messages", [])) + [{"role": "user", "content": message}]response = await openai_client.chat.completions.create(model="gpt-4o-mini",messages=messages)working_memory = WorkingMemory(session_id=session_id,messages=[MemoryMessage(role="user", content=message),MemoryMessage(role="assistant", content=response.choices[0].message.content)])await memory_client.put_working_memory(session_id, working_memory)return response.choices[0].message.contentasync def main():response1 = await chat_with_memory("Hi! User works as a software engineer specializing in Python and web development. User prefers morning meetings and hates scheduling calls after 4 PM","my-session-123")print(f"AI: {response1}")asyncio.run(main())

然后修改msg再次询问

async def main():response1 = await chat_with_memory("Hi! Please tell me about User","my-session-123")print(f"AI: {response1}")asyncio.run(main())

检查记忆生效

image-20260121223149263

服务端日志如下

image-20260121222726886

检查redis中的记忆内容如下:working_memory:my-session-123 - 工作记忆

image-20260121223519552

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

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

相关文章

AI Agent核心技术揭秘:概念辨析、商业化路径与实践指南,值得收藏

文章解析了AI Agent的概念、商业化前景及发展方向。AI Agent被定义为循环调用工具的大语言模型,具有调用工具、完成复杂任务等优势,比聊天机器人更具商业价值。编程领域是Agent最先落地的场景,Skills生态正在兴起。尽管Agent本身难以形成垂直…

Java程序员转型大模型开发全攻略:月薪30K+的AI工程师成长路径_程序员转行AI大模型教程(非常详细)

本文为Java程序员提供大模型转型指南,包括五大学习步骤:基础知识、工具框架、编程能力、数学储备和项目实践。发挥Java工程师在软件架构方面的优势,掌握AI时代高薪岗位所需技能。大模型领域岗位缺口达47万,初级工程师平均薪资28K。…

docker部署及基本要点

一、核心内容整理Docker 核心概念与关联技术 Docker 是基于 Go 语言开发的容器化软件,核心解决软件安装部署的环境一致性问题,常应用于大模型部署(如 deepseek)等 AI 场景;K8s(Kubernetes,谷歌开发)是 Docker …

【课程设计/毕业设计】基于springboot + vue房屋租赁管理系统基于springboot的元宇宙平台的房屋租赁管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

资治通鉴对于大赦天下的评价

《资治通鉴》对“大赦天下”持 高度批判态度,司马光通过历史叙事和直接评论,系统揭露了滥赦的弊端。 一、司马光的核心批判观点 1. 破坏法治,助长犯罪 《资治通鉴汉纪十》(卷17):“赦者,权时之宜,非太平之常。…

【大数据毕设全套源码+文档】基于springboot+大数据的音乐数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【大数据毕设全套源码+文档】基于springboot+Hadoop的手机销售数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

宏智树 AI:破解期刊投稿密码,从初稿到见刊的智能学术引擎

作为深耕论文写作科普的教育博主,后台每天都被粉丝的期刊投稿困惑刷屏:“选题自嗨半天,却不在期刊收稿范围”“文献引用格式反复改,还是被审稿人标注错误”“数据图表不规范,优质成果卡在排版关”。很多科研人明明手握…

学长亲荐!专科生必看9款一键生成论文工具TOP9测评

学长亲荐!专科生必看9款一键生成论文工具TOP9测评 2026年专科生论文写作工具测评:为何值得一看? 随着高校教育的不断深化,专科生在学术写作上的需求也日益增长。然而,面对繁重的课程任务与有限的写作经验,许…

推荐算法:基于大数据python新闻推荐系统 爬虫 Django框架 协同过滤推荐算法 AI大模型 计算机 Hadoop大数据✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…

宏智树 AI:ChatGPT 学术版驱动的全流程学术创作智能中枢

当学术研究陷入文献检索的繁琐、数据可视化的困境、格式排版的内耗时,一款真正懂学术、强赋能的智能工具,成为万千科研人与高校师生的迫切需求。宏智树 AI(官网www.hzsxueshu.com,微信公众号搜一搜 “宏智树 AI”)应势…

【大数据毕设全套源码+文档】基于python深度学习的短视频内容理解与推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【大数据毕设全套源码+文档】基于Python+数据可视化的黑龙江旅游景点数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

stm32 CubeIDE DMA模式的串口收发

DMA模式串口收发原理DMA(Direct Memory Access)模式允许外设(如串口)直接与内存交换数据,无需CPU介入。在串口通信中,启用DMA可降低CPU。初始化DMA通道配置发送与接收DMA函数把启动串口函数改为ReceiveTold…

AI智能体从入门到精通:程序员必学的Agent开发实战指南,含LangGraph代码示例,建议收藏

本文详解AI智能体(Agent)的核心概念与开发实践,涵盖智能体定义、三大特征(LLM决策、工具使用、安全边界)、设计三要素(模型/工具/指令)、编排模式及安全护栏体系。通过LangGraph框架提供可直接运行的最小智能体示例,帮助开发者从底层原理到落地实践全面掌…

【大数据毕设源码分享】python基于爬虫与文本挖掘的网络舆情监控系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

[note] 本地12+16G极限部署 Qwen3-Coder-25B 搭配Continue插件实现代码补全

pre 本文关于用 Ollama 在16G内存+12G显存的机器上本地部署 Qwen3-Coder-REAP-25B-A3B 模型,然后搭配VSCode的Continue插件进行代码补全。但是目前有许多免费的API/插件/IDE等代码补全方案可以使用,为什么要本地部署…

【大数据毕设全套源码+文档】基于Python+大数据技术的热门微博数据可视化分析(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

STM32 CubeIDE 使用蓝牙模块实现手机控制LED灯

开启UART3异步模式,配置波特率9600。 开启USART3中断,添加DMA 通道。 将蓝牙模块连接到开发板上注意引脚对应 数据回显 if(huart &huart3){HAL_UART_Transmit_DMA(&huart3, receiveData, Size); }当确认是串口3的回调事件后,立即通…

查重去 AI 双保险!宏智树 AI:让论文告别 “标红焦虑” 的智能优化神器

还在为查重率反复超标熬夜改稿?好不容易把重复率压到 10%,却被 AIGC 检测系统标红 80%?用同义词替换降重,结果论文读起来像 “天书”,学术逻辑支离破碎?随着高校和期刊的学术检测技术全面升级,“…