01

前言

记忆连接着人的过去与现在,塑造着人的身份和经验。每个人的记忆都是独一无二的,记忆存储着经历和知识,帮助人类不断提升与突破自我。如果在生活工作中,能有一个AI助手能像朋友一样,记住我们的喜好、习惯,甚至是微小的细节,提高工作效率必不在话下。

面对当下RAG( Retrieval-Augmented Generation)与各类Memory Management框架蓬勃发展的景象,构建一个既强大又个性化的智能体助手似乎成了技术探索中的新蓝海。要想在众多技术路线中找到那个“最优解”,关键在于识别那些能够平衡性能、灵活性及安全性的解决方案。

 

如何选择合适的方法构建自己的智能体助理呢?这里向您介绍强大、低延迟、安全可控的MemoryScope开源项目。MemoryScope可以为LLM聊天机器人提供强大且灵活的长期记忆能力,并提供了构建长期记忆能力的框架。MemoryScope可以用于个人助理、情感陪伴等记忆场景,通过长期记忆能力来不断学习,记得用户的基础信息以及各种习惯和喜好,使得用户在使用LLM时逐渐感受到一种“默契”。

与其他的RAG和记忆框架相比,MemoryScope具有⚡极低的线上时延(约500毫秒)、🌲分层记忆存储能力和⏰处理时间敏感性记忆的能力。

欢迎关注MemoryScope,在Github上(https://github.com/modelscope/memoryscope) 为我们star 🌟。

02

介绍MemoryScope

MemoryScope核心包含以下三个部分:

💾 记忆数据库: MemoryScope配备了向量数据库(默认是ElasticSearch),用于存储系统中记录的所有记忆片段。

🔧 Worker库: MemoryScope将长期记忆的能力原子化,抽象成单独的worker,包括信息过滤、记忆抽取,insight更新等20+Worker。

🛠️ 记忆算子库: 每个记忆算子把多个Worker集成在一起,形成完整的记忆工作流,从而构建MemoryScope核心服务,实现“记忆检索”,“记忆巩固”,“反思与再巩固”等核心能力。

 

欢迎关注MemoryScope,在Github上(https://github.com/modelscope/memoryscope) 为我们star 🌟。

03

MemoryScope Application构建 101

MemoryScope支持在线模型调用,不需要本地显卡,因此即使普通笔记本电脑也可以运行。我们推荐使用Docker或者Docker Compose运行MemoryScope,其他更多安装方法请参考https://github.com/modelscope/MemoryScope/blob/main/docs/installation_zh.md

1. 三步运行MemoryScope的Demo

先决条件:

  • 大模型:推荐注册并使用DashScope平台,无需特殊网络环境即可运行多种模型。

  • 硬件和操作系统要求:任意操作系统(Linux,Windows,MacOS)均可,已安装Docker以及Docker-Compose。(如果是ARM架构,还需要手动将docker-compose.yml中的`ghcr.io/modelscope/memoryscope:main`修改成`ghcr.io/modelscope/memoryscope_arm:main` )

  • 部署方法:推荐使用docker或者docker-compose体验MemoryScope。

# 下载memoryscope仓库
git clone https://github.com/modelscope/memoryscope

# 填写DashScope API-KEY
vim memoryscope/docker-compose.yml

# 运行!(P.S. 实现双窗口监控实时memory,请参考https://github.com/modelscope/MemoryScope/blob/main/docs/installation_zh.md)
docker-compose run memory_scope_main

2. 在Python项目中灵活运用MemoryScope

先决条件:

  • 大模型:推荐注册并使用DashScope平台,无需特殊网络环境即可运行多种模型。

  • Python 3.10 及以上版本

2.1. 通过PyPI包在自定义项目中调用

MemoryScope可以被灵活地嵌入到各种Python项目。要在自己的项目中使用MemoryScope,只需要import memoryscope即可。

 

i. 从PyPI安装MemoryScope。然后运行 Elasticsearch 服务存储记忆数据,请参照 [Elasticsearch 文档](https://www.elastic.co/guide/cn/elasticsearch/reference/current/getting-started.html)。

这里推荐使用 Docker 方法:

pip install memoryscope

sudo docker run -p 9200:9200 \
  -e "discovery.type=single-node" \
  -e "xpack.security.enabled=false" \
  -e "xpack.license.self_generated.type=trial" \
  docker.elastic.co/elasticsearch/elasticsearch:8.13.2

ii. 将DashScope或者Openai密钥等私密变量导入环境变量

# dashboard
export DASHSCOPE_API_KEY="sk-0000000000"
# openai
export OPENAI_API_KEY="sk-000000000000000000000"
# openai base url
export OPENAI_API_BASE="https://00000.0000.000/v1"

iii. 初始化memory scope实例

from memoryscope import MemoryScope, Arguments
arguments = Arguments(
    language="cn",
    human_name="用户",
    assistant_name="AI",
    memory_chat_class="api_memory_chat",
    generation_backend="dashscope_generation",
    generation_model="qwen2-72b-instruct",
    embedding_backend="dashscope_embedding",
    embedding_model="text-embedding-v2",
    rank_backend="dashscope_rank",
    rank_model="gte-rerank",
    enable_ranker=True,
    worker_params={"get_reflection_subject": {"reflect_num_questions": 3}}
)
ms = MemoryScope(arguments=arguments)
ms.default_memory_service.init_service()

iv. 与memoryscope对话

qs = [
    "I love playing the piano.", 
    "I work at Alibaba.", 
    "I really like eating watermelon.", 
    "Tomorrow I plan to go to Beijing for a business trip.", 
    "What fruit is good to eat this afternoon?", 
]
for query in qs:
    # 抽取之前的记忆,并对话
    response = memory_chat.chat_with_memory(query)
    print(query, '\n', response.message.content)
    # 巩固对新产生的对话的记忆
    result = memory_service.consolidate_memory()
    # 列举当前存储的记忆
    print(memory_chat.run_service_operation("list_memory"))
# 记忆的反思与再巩固
result = memory_service.reflect_and_reconsolidate()

2.2. 结合AutoGen使用MemoryScope

AutoGen是一个强大的多智能体互动与组织框架。MemoryScope可以用来管理智能体的记忆能力,增强AutoGen智能体的基础能力。一个简单的AutoGen增强智能体的实例如下:

class MemoryScopeAgent(ConversableAgent):
    def __init__(
            self,
            name: str = "assistant",
            system_message: Optional[str] = "",
            human_input_mode: Literal["ALWAYS", "NEVER", "TERMINATE"] = "NEVER",
            llm_config: Optional[Union[Dict, bool]] = None,
            arguments: Arguments = None,
            **kwargs,
    ):
        super().__init__(
            name=name,
            system_message=system_message,
            human_input_mode=human_input_mode,
            llm_config=llm_config,
            **kwargs,
        )

        # Create a memory client in MemoryScope
        self.memory_scope = MemoryScope(arguments=arguments)
        self.memory_chat = self.memory_scope.default_memory_chat

        self.register_reply([Agent, None], MemoryScopeAgent.generate_reply_with_memory, remove_other_reply_funcs=True)

    def generate_reply_with_memory(
            self,
            messages: Optional[List[Dict]] = None,
            sender: Optional[Agent] = None,
            config: Optional[Any] = None,
    ) -> Tuple[bool, Union[str, Dict, None]]:
        # Generate response

        contents = []
        for message in messages:
            if message.get("role") != self.name:
                contents.append(message.get("content", ""))

        query = contents[-1]
        response = self.memory_chat.chat_with_memory(query=query)
        return True, response.message.content

    def close(self):
        self.memory_scope.close()

接下来,只需要将memoryscope的参数传入上面定义的`MemoryScopeAgent`,就能够成功运行被MemoryScope增强的AutoGen了:

from typing import Optional, Union, Literal, Dict, List, Any, Tuple

from autogen import Agent, ConversableAgent, UserProxyAgent

from memoryscope import MemoryScope, Arguments

from where_you_define_the_new_agent import MemoryScopeAgent

def main():
    # Create the agent of MemoryScope
    arguments = Arguments(
        language="cn",
        human_name="用户",
        assistant_name="AI",
        memory_chat_class="api_memory_chat",
        generation_backend="dashscope_generation",
        generation_model="qwen-max",
        embedding_backend="dashscope_embedding",
        embedding_model="text-embedding-v2",
        rank_backend="dashscope_rank",
        rank_model="gte-rerank"
    )

    assistant = MemoryScopeAgent("assistant", arguments=arguments)

    # Create the agent that represents the user in the conversation.
    user_proxy = UserProxyAgent("user", code_execution_config=False)

    # Let the assistant start the conversation.  It will end when the user types exit.
    assistant.initiate_chat(user_proxy, message="有什么需要帮忙的吗?")
    assistant.close()


if __name__ == "__main__":
    main()

P.S. 另外,我们提供并持续更新更多案例,请参考项目demo: https://github.com/modelscope/MemoryScope/tree/main/examples/api

04

长期关注MemoryScope

MemoryScope正在经历飞速的成长与发展,我们诚挚邀请您持续关注我们的进展。

 

我们热烈欢迎更多对此领域充满热情的开发者加入我们的社群,携手共进。如果您希望通过贡献代码来共同塑造一个强大的RAG和Memory框架,那么,请不要犹豫,MemoryScope开发者社区正是理想平台,期待与您的加入!

@software{MemoryScope,
  author = {Li Yu and 
            Tiancheng Qin and
            Qingxu Fu and
            Sen Huang and
            Xianzhe Xu and
            Zhaoyang Liu and
            Boyin Liu},
  month = {09},
  title = {{MemoryScope}},
  url = {https://github.com/modelscope/MemoryScope},
  year = {2024}
}

 

欢迎访问项目:https://github.com/modelscope/memoryscope为 MemoryScope 点亮star🌟。

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐