AI 文摘

mem0解决多轮会话和个性化AI的记忆层





作者: AI博主之路 来源: AI博主之路

1.什么是mem0

mem0是一个个性化AI的记忆层,用于多轮会话,持续改进用户的会话体验,能够高质量的捕捉到用户的个人兴趣点或者意图。

2.核心操作

add操作核心步骤如下

  • 基于用户问题,让大模型做记忆抽取,提取事实,偏好信息

  • 对问题做embeding,基于语义做相似度的向量检索(top5)

  • 基于抽取记忆和相关记忆,选择工具(call function),新增/更新/删除记忆,更新向量数据库qdrant和关系数据库sqlite

  • 上报信息到mem0

流程图如下

暂时无法在飞书文档外展示此内容

记忆抽取prompt 如下:


Deduce the facts, preferences, and memories from the provided text.
Just return the facts, preferences, and memories in bullet points:
Natural language text: {user_input}
User/Agent details: {metadata}
  

Constraint for deducing facts, preferences, and memories:
- The facts, preferences, and memories should be concise and informative.
- Don't start by "The person likes Pizza". Instead, start with "Likes Pizza".
- Don't remember the user/agent details provided. Only remember the facts, preferences, and memories.
  

Deduced facts, preferences, and memories:

Prompt 中文版本


从提供的文本中推断事实、偏好和记忆。
只需以项目符号的形式返回事实、偏好和记忆:
自然语言文本:{user_input}
用户/代理详细信息:{metadata}
  

推断事实、偏好和记忆的约束:
- 事实、偏好和记忆应简洁且信息丰富。
- 不要以“此人喜欢披萨”开头。相反,以“喜欢披萨”开头。
- 不要记住提供的用户/代理详细信息。只记住事实、偏好和记忆。
  

推断出的事实、偏好和记忆:

demo


Deduce the facts, preferences, and memories from the provided text.
Just return the facts, preferences, and memories in bullet points:
Natural language text: 山西有哪些景点
User/Agent details: {'user_id': 'traveler_123'}
  

Constraint for deducing facts, preferences, and memories:
- The facts, preferences, and memories should be concise and informative.
- Don't start by "The person likes Pizza". Instead, start with "Likes Pizza".
- Don't remember the user/agent details provided. Only remember the facts, preferences, and memories.
  

Deduced facts, preferences, and memories:

输出结果

'- Interested in tourist attractions in Shanxi, China.'
#对中国山西的景点感兴趣

collection_name:默认是’mem0'

记忆更新的prompt 如下


You are an expert at merging, updating, and organizing memories. When provided with existing memories and new information, your task is to merge and update the memory list to reflect the most accurate and current information. You are also provided with the matching score for each existing memory to the new information. Make sure to leverage this information to make informed decisions about which memories to update or merge.
  

Guidelines:
- Eliminate duplicate memories and merge related memories to ensure a concise and updated list.
- If a memory is directly contradicted by new information, critically evaluate both pieces of information:
    - If the new memory provides a more recent or accurate update, replace the old memory with new one.
    - If the new memory seems inaccurate or less detailed, retain the original and discard the old one.
- Maintain a consistent and clear style throughout all memories, ensuring each entry is concise yet informative.
- If the new memory is a variation or extension of an existing memory, update the existing memory to reflect the new information.
  

Here are the details of the task:
- Existing Memories:
{existing_memories}
  

- New Memory: {memory}

中文翻译


您是合并、更新和组织记忆的专家。当提供现有记忆和新信息时,您的任务是合并和更新记忆列表以反映最准确和最新的信息。您还将获得每个现有记忆与新信息的匹配分数。确保利用这些信息做出明智的决定,确定要更新或合并哪些记忆。
  

准则:
- 消除重复记忆并合并相关记忆,以确保列表简洁且更新。
    - 如果记忆与新信息直接矛盾,请批判性地评估这两条信息:
    - 如果新记忆提供了更新或更准确的更新,请用新记忆替换旧记忆。
- 如果新记忆似乎不准确或不够详细,请保留原始记忆并丢弃旧记忆。
- 在所有记忆中保持一致和清晰的风格,确保每个条目简洁而信息丰富。
- 如果新记忆是现有记忆的变体或扩展,请更新现有记忆以反映新信息。
  

以下是任务的详细信息:
- 现有记忆:
{existing_memories}
  

- 新记忆:{memory}

add操作中用的数据库

  • 向量数据库(默认qdrant) 主要用于语义相似性检索,取top,会把相似性打分喂给大模型,进行记忆的更新

  • 关系型数据库(默认是sqlite) 主要用于存储所有的用户问题记录,用于查询所有的历史记录

add操作中用的大模型

  • embeding模型(默认是mem0.embeddings.openai.OpenAIEmbedding) 主要用于对用户问题做embedding

  • 生成模型(默认是mem0.llms.openai.OpenAILLM) 主要用于用户记忆抽取,记忆更新的工具选择

3.案例实践


import os
from openai import OpenAI
from mem0 import Memory
from dotenv import load_dotenv
import os
  

load_dotenv()  # 加载 .env 文件
# Set the OpenAI API key
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')
  

class PersonalTravelAssistant:
    def __init__(self):
        self.client = OpenAI()
        self.memory = Memory()
        self.messages = [{"role": "system", "content": "You are a personal AI Assistant."}]
  

    def ask_question(self, question, user_id):
        # Fetch previous related memories
        previous_memories = self.search_memories(question, user_id=user_id)
        prompt = question
        if previous_memories:
            prompt = f"User input: {question}\n Previous memories: {previous_memories}"
        self.messages.append({"role": "user", "content": prompt})
  

        # Generate response using GPT-4o
        response = self.client.chat.completions.create(
            model="gpt-4o",
            messages=self.messages
        )
        answer = response.choices[0].message.content
        self.messages.append({"role": "assistant", "content": answer})
  

        # Store the question in memory
        self.memory.add(question, user_id=user_id)
        return answer
  

    def get_memories(self, user_id):
        memories = self.memory.get_all(user_id=user_id)
        return [m['text'] for m in memories]
  

    def search_memories(self, query, user_id):
        memories = self.memory.search(query, user_id=user_id)
        return [m['text'] for m in memories]
  

# Usage example
user_id = "traveler_123"
ai_assistant = PersonalTravelAssistant()
  

def main():
    while True:
        question = input("Question: ")
        if question.lower() in ['q', 'exit']:
            print("Exiting...")
            break
  

        answer = ai_assistant.ask_question(question, user_id=user_id)
        print(f"Answer: {answer}")
        memories = ai_assistant.get_memories(user_id=user_id)
        print("Memories:")
        for memory in memories:
            print(f"- {memory}")
        print("-----")
  

if __name__ == "__main__":
    main()

具体案例


Question: 我想去北京旅游,有哪些景点
Answer: 北京作为中国的历史文化名城,有许多著名的景点值得一游。以下是一些推荐的景点:
  

1.**故宫博物院(紫禁城)**:明清两代皇宫,是世界上规模最大、保存最完好的木结构古建筑之一。
  

2.**天安门广场**:世界上最大的城市广场,可以观赏升旗仪式,并且附近有毛主席纪念堂、人民英雄纪念碑等。
  

3.**天坛公园**:明清两代皇帝祭天的场所,以其独特的建筑和园林设计著称。
  

4.**颐和园**:清朝的皇家园林,包含了湖泊、寺庙和宫殿,风景优美。
  

5.**长城(八达岭或慕田峪)**:世界闻名的古代防御工程,步行体验其壮丽和历史感。
  

6.**胡同**:北京的传统民居区,感受老北京的风情和生活。
  

7.**王府井大街**:北京的商业街,适合购物和品尝各种美食。
  

8.**南锣鼓巷**:一个经典的北京胡同区域,现已成为时尚和历史交融的网红打卡地。
  

9.**圆明园**:昔日清朝的皇家园林,后在第二次鸦片战争中被毁,现在是一片充满历史意义的地方。
  

10.**北京动物园**:拥有丰富的动物种类,特别是大熊猫馆很受游客欢迎。
  

11.**鸟巢和水立方**:奥运场馆,现代建筑的代表,可以参观和体验奥林匹克精神。
  

在旅游时,请注意查阅各景点的开放时间和旅游须知,以便顺利游览。祝你玩的愉快!
Memories:
- Wants to travel to Beijing and is interested in tourist attractions in Beijing.
-----
Question: 我不想去北京了,我想去山西旅游
Answer: 山西是一个充满历史和文化底蕴的省份,有许多值得一游的景点。以下是一些热门的山西旅游景点推荐:
  

1.**平遥古城**:联合国教科文组织列为世界文化遗产的古城镇,以其保存完好的明清时期的建筑和城墙而闻名。
  

2.**云冈石窟**:大同市的一处世界文化遗产,是中国三大石窟之一,以壮观的佛像雕刻和石窟艺术闻名。
  

3.**悬空寺**:位于恒山脚下,这座建在悬崖上的寺庙建筑非常独特,被称为世界建筑史上的奇观。
  

4.**五台山**:中国四大佛教名山之一,拥有众多古老的寺庙和佛教文化遗址,是朝圣与旅游的理想之地。
  

5.**晋祠**:位于太原市,是一组以供奉周武王次子叔虞为主的古建筑群,融合了丰富的历史、文化和自然景观。
  

6.**壶口瀑布**:位于山西和陕西交界处的黄河上,是世界上唯一的黄河瀑布,水势壮观,景象壮丽。
  

7.**长治壶关大峡谷**:又称为太行山大峡谷,景色壮丽,有多个景区,如红石峡、黑龙潭等,可以徒步和探险。
  

8.**乔家大院**:位于祁县,是清代民居建筑的代表,有“皇家有故宫,民宅看乔家”的美誉。
  

9.**王家大院**:山西省灵石县的一个大型古建筑群,被誉为“中国民间紫禁城”,保存非常完好。
  

10.**太原晋祠园林**:是中国现存最早的皇家园林之一,融合了多种建筑和雕塑艺术。
  

这些景点各具特色,从历史文化到自然风光,无论你是喜欢古建筑、佛教文化还是大自然的爱好者,山西都能满足你的需求。祝你旅途愉快!
Memories:
- Does not want to go to Beijing.
- Wants to travel to Shanxi.
-----
Question: 帮我推荐一下山西的小吃
Answer: 山西不仅有丰富的旅游资源,还有许多独具风味的小吃。以下是一些你在山西旅行时不容错过的小吃推荐:
  

1.**刀削面**:山西最著名的面食之一,面条由手工刀削而成,形状独特,口感劲道,通常搭配丰富的浇头和调料。
  

2.**过油肉**:这是一道经典的山西菜,主要食材是猪肉片,经过油炸处理,然后配以各种调料炒制而成,味道鲜美。
  

3.**剔尖**:这是一种独特的手工面,通过手工剔出的面条,口感柔软,有嚼劲,常与羊肉汤或各种浓郁的料汁搭配。
  

4.**莜面窝窝**:以莜面为主要材料,制作成小窝窝的形状,蒸熟后食用,通常蘸着蒜汁、酱汁或者搭配炒菜。
  

5.**猫耳朵**:这种小吃的面条状似猫耳朵,口感独特,常用来做汤面或者拌面。
  

6.**山西凉粉**:用绿豆或豌豆淀粉制成,切成条状或块状,配以花生、黄瓜丝等,拌上丰富的调料,非常解暑。
  

7.**醋熘土豆丝**:山西人爱吃醋,这道菜用山西老陈醋调味,使得土豆丝酸辣开胃。
  

8.**阳泉炸糕**:以糯米和红豆沙为主要材料,外皮酥脆,内馅软糯,是一道传统的甜点小吃。
  

9.**太原小米糕**:用小米面制作的糕点,口感柔软、香甜,有很高的营养价值。
  

10.**枣糕**:山西大枣闻名,这种小吃将大枣与面粉混合,蒸制或烤制而成,甜而不腻。
  

11.**羊杂割**:一种用羊肝、羊肺、羊肚等羊杂熬制成的汤品,味道鲜美,尤其适合冬天食用。
  

12.**太谷饼**:一种传统的甜饼,以面粉、大油、白糖等为主要材料,酥脆可口,香甜味美。
  

这些小吃不仅能满足你的味蕾,还能带你更深入地了解山西的饮食文化。希望你在山西的旅行不仅玩得开心,也能吃得尽兴!
Memories:
- Does not want to go to Beijing.
- Wants to travel to Shanxi and is interested in Shanxi cuisine. Seeking recommendations for snacks or small dishes from Shanxi.
- Seeking recommendations for snacks or small dishes from Shanxi.
-----
Question: 我现在又想去北京了,帮我推荐北京的小吃
Answer: 没问题,北京也有丰富多样的小吃,以下是一些你在北京旅行时不容错过的小吃推荐:
  

1.**北京烤鸭**:虽然严格来说不是小吃,但这是北京的代表性美食。片片鸭肉皮脆肉嫩,配上薄饼、甜面酱和葱丝,味道绝佳。
  

2.**炸酱面**:这是一道经典的北京面食,以炸酱为主料,配上黄瓜丝、豆芽等,味道咸鲜浓厚。
  

3.**豆汁儿**:北京传统小吃,味道独特,很多外地人需要时间适应,搭配焦圈、咸菜等。
  

4.**驴打滚**:一种糯米糕点,是用豆沙馅儿包裹糯米面,再裹上一层豆粉,口感软糯。
  

5.**艾窝窝**:用糯米粉、红豆馅制成的小圆团,外面裹着一层白糖,是一种传统的甜食。
  

6.**炒肝**:以猪肝和猪大肠为主料,勾芡之后汤汁厚实,味道鲜美。通常配烧饼吃。
  

7.**卤煮火烧**:用猪内脏和豆腐熬煮,再加上火烧(类似于硬面包),味道浓郁,适合喜欢重口味的游客。
  

8.**京酱肉丝**:用甜面酱和猪肉丝炒制而成,通常用豆皮包裹着吃,味道鲜美。
  

9.**爆肚**:将牛羊肚快速爆炒或涮烫,以保持其鲜嫩的口感,蘸上调料吃,别具风味。
  

10.**糖葫芦**:用山楂串制而成,外面裹上一层糖汁,酸甜适口,是冬季最受欢迎的小吃之一。
  

11.**茯苓夹饼**:是一种北京传统糕点,用茯苓粉和五仁馅制成,口感松软。
  

12.**驼峰**:以驴肉为主料,制作成的汉堡状小吃,味道鲜美。
  

13.**炸咯吱**:一种炸制的面食,外脆内软,适合蘸着调料吃。
  

14.**奶油炸糕**:传统的北京小吃,面粉包裹着豆沙馅或者奶黄馅,炸至金黄,外脆里嫩。
  

这些小吃不仅能满足你的味蕾,也能让你更深入地了解北京的饮食文化。希望你在北京的旅行愉快,品尝到丰富多样的美食!
Memories:
- Wants to travel to Shanxi and is interested in Shanxi cuisine. Seeking recommendations for snacks or small dishes from Shanxi. Wants to visit Beijing again.
- Seeking recommendations for snacks or small dishes from Shanxi. Interested in Beijing's local snacks.
-----

4.总结

mem0项目主要是用于多轮对话,实现个性化的兴趣点或者意图的捕捉,每次提问更新最新的用户意图或者兴趣点。每次用户提问都会使用2次大模型。通过语义检索相关会话,降低历史会话大模型上下文的长度。关系型数据库保存所有的历史问题。相比一次会话全部喂给大模型提取用户的兴趣点或者意图,mem0项目优点:通过先抽取+检索相关性,能够降低大模型理解上下文的难度和减少大模型token的使用量。对于私有化小模型,会有很大的帮助。缺点:使用了两次大模型,耗时可能会增加。

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具