当前位置: 首页 > news >正文

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

参考资料

  • 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.jsqmd.com/news/280488/

相关文章:

  • 【毕业设计】基于springboot的婚庆公司服务平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。 - 指南
  • AI Agent核心技术揭秘:概念辨析、商业化路径与实践指南,值得收藏
  • Java程序员转型大模型开发全攻略:月薪30K+的AI工程师成长路径_程序员转行AI大模型教程(非常详细)
  • docker部署及基本要点
  • 无线网络仿真:无线网络基础_(19).网络协议栈仿真
  • 【大数据毕设全套源码+文档】基于Python+数据可视化的黑龙江旅游景点数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 【大数据毕设全套源码+文档】基于springboot+大数据的音乐数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 资治通鉴对于大赦天下的评价
  • docker安装部署PostgreSQL带有pgvector扩展向量数据(高维数组)
  • 【大数据毕设全套源码+文档】基于springboot+Hadoop的手机销售数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 基于提供的镜像构建PostGIS、pgvector 的 PostgreSQL 18镜像的Dockerfile
  • 学长亲荐!专科生必看9款一键生成论文工具TOP9测评
  • 推荐算法:基于大数据python新闻推荐系统 爬虫 Django框架 协同过滤推荐算法 AI大模型 计算机 Hadoop大数据✅
  • 机器学习:基于python新闻推荐系统 热点新闻分析 可视化分析 协同过滤推荐算法 Django框架 冷启动 推荐算法 计算机毕业设计(源码+文档)
  • 宏智树 AI:ChatGPT 学术版驱动的全流程学术创作智能中枢
  • 【大数据毕设全套源码+文档】基于python深度学习的短视频内容理解与推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 记一次 DOIO KB04-B01 改映射
  • stm32 CubeIDE DMA模式的串口收发
  • AI智能体从入门到精通:程序员必学的Agent开发实战指南,含LangGraph代码示例,建议收藏
  • 【大数据毕设全套源码+文档】基于Python+大数据技术的热门微博数据可视化分析(丰富项目+远程调试+讲解+定制)
  • STM32 CubeIDE 使用蓝牙模块实现手机控制LED灯
  • 查重去 AI 双保险!宏智树 AI:让论文告别 “标红焦虑” 的智能优化神器
  • 【大数据毕设源码分享】基于python的时尚女装抖音号评论数据分析系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【大数据毕设全套源码+文档】基于python的爬虫与文本挖掘的网络舆情监控系统设计与实现(丰富项目+远程调试+讲解+定制)
  • AI应用架构师避坑:量子计算与AI协同中的资源竞争问题
  • 为什么说“ChatGPT的思考、判断、归纳、回答最具有人类智慧特征”?Why Is It Said “ChatGPT the Most Human-Like Wisdom Traits“?
  • Ivan Zhao | 蒸汽、钢铁与无限心智
  • 学术写作新选择:6个AI优化平台评测,智能润色改善论文逻辑与流畅性
  • python: excel 两个工作表中的员工比对