Linux Ollama版

情景设计

🎯 问题场景: 你是一名AI应用开发者,已经学会了MemOS的基础操作,现在想要创建更结构化的记忆系统。你发现基础的TextualMemoryMetadata功能有限,无法满足复杂场景的需求,比如需要区分工作记忆和长期记忆,需要追踪记忆的来源,需要为记忆添加标签和实体信息。

🔧 解决方案: 通过本章,你将学会使用TreeNodeTextualMemoryMetadata创建结构化记忆,包括记忆生命周期管理、多源追踪、实体标签等功能,让你的AI应用拥有更智能的记忆系统。

配方 2.1:理解 TreeNodeTextualMemoryMetadata 的核心概念

🎯 问题场景: 你想要了解TreeNodeTextualMemoryMetadata与基础元数据的区别,以及它的核心功能。

🔧 解决方案: 通过这个配方,你将掌握TreeNodeTextualMemoryMetadata的核心概念和基本结构。

基本导入

from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata

核心概念

1. 记忆类型 (memory_type)

  • WorkingMemory: 工作记忆,临时存储
  • LongTermMemory: 长期记忆,持久存储
  • UserMemory: 用户记忆,个性化存储

2. 记忆状态 (status)

  • activated: 激活状态
  • archived: 归档状态
  • deleted: 删除状态

3. 记忆类型 (type)

  • fact: 事实
  • event: 事件
  • opinion: 观点
  • topic: 主题
  • reasoning: 推理
  • procedure: 程序

配方 2.2:创建基础的结构化记忆

🎯 问题场景: 你想要创建不同类型的内存,比如人物信息、项目信息、工作任务等,需要为每种记忆设置合适的元数据。

🔧 解决方案: 通过这个配方,你将学会创建各种类型的结构化记忆。

示例1:创建简单的人物记忆

创建文件 create_person_memory_ollama.py

# create_person_memory_ollama.py
# 🎯 创建人物记忆的示例 (Ollama版)
import os
from dotenv import load_dotenv
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata

def create_person_memory_ollama():
    """
    🎯 创建人物记忆的示例 (Ollama版)
    """
    
    print("🚀 开始创建人物记忆 (Ollama版)...")
    
    # 加载环境变量
    load_dotenv()
    
    # 检查Ollama配置
    ollama_base_url = os.getenv("OLLAMA_BASE_URL")
    ollama_chat_model = os.getenv("OLLAMA_CHAT_MODEL")
    ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL")
    
    if not ollama_base_url or not ollama_chat_model or not ollama_embed_model:
        raise ValueError("❌ 未配置Ollama环境变量。请在.env文件中配置OLLAMA_BASE_URL、OLLAMA_CHAT_MODEL、OLLAMA_EMBED_MODEL。")
    
    print("✅ 检测到Ollama本地模型模式")
    
    # 获取用户ID
    user_id = os.getenv("MOS_USER_ID", "default_user")
    
    # 创建人物记忆的元数据
    metadata = TreeNodeTextualMemoryMetadata(
        user_id=user_id,
        type="fact",
        source="conversation",
        confidence=90.0,
        memory_type="LongTermMemory",
        key="张三_信息",
        entities=["张三", "工程师"],
        tags=["人员", "技术"]
    )

    # 创建记忆项
    memory_item = TextualMemoryItem(
        memory="张三是我们公司的资深工程师,擅长Python和机器学习",
        metadata=metadata
    )

    print(f"记忆内容: {memory_item.memory}")
    print(f"记忆键: {memory_item.metadata.key}")
    print(f"记忆类型: {memory_item.metadata.memory_type}")
    print(f"标签: {memory_item.metadata.tags}")
    print(f"🎯 配置模式: OLLAMA")
    print(f"🤖 聊天模型: {ollama_chat_model}")
    print(f"🔍 嵌入模型: {ollama_embed_model}")
    
    return memory_item

if __name__ == "__main__":
    create_person_memory_ollama()

运行命令:

cd test_cookbook/chapter2/Ollama/2
python create_person_memory_ollama.py

示例2:创建项目记忆

创建文件 create_project_memory_ollama.py

# create_project_memory_ollama.py
# 🎯 创建项目记忆的示例 (Ollama版)
import os
from dotenv import load_dotenv
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata

def create_project_memory_ollama():
    """
    🎯 创建项目记忆的示例 (Ollama版)
    """
    
    print("🚀 开始创建项目记忆 (Ollama版)...")
    
    # 加载环境变量
    load_dotenv()
    
    # 检查Ollama配置
    ollama_base_url = os.getenv("OLLAMA_BASE_URL")
    ollama_chat_model = os.getenv("OLLAMA_CHAT_MODEL")
    ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL")
    
    if not ollama_base_url or not ollama_chat_model or not ollama_embed_model:
        raise ValueError("❌ 未配置Ollama环境变量。请在.env文件中配置OLLAMA_BASE_URL、OLLAMA_CHAT_MODEL、OLLAMA_EMBED_MODEL。")
    
    print("✅ 检测到Ollama本地模型模式")
    
    # 获取用户ID
    user_id = os.getenv("MOS_USER_ID", "default_user")
    
    # 创建项目记忆的元数据
    project_metadata = TreeNodeTextualMemoryMetadata(
        user_id=user_id,
        type="fact",
        source="file",
        confidence=95.0,
        memory_type="LongTermMemory",
        key="AI项目_详情",
        entities=["AI项目", "机器学习"],
        tags=["项目", "AI", "重要"],
        sources=["项目文档", "会议记录"]
    )

    # 创建记忆项
    project_memory = TextualMemoryItem(
        memory="AI项目是一个智能客服系统,使用最新的NLP技术,预计6个月完成",
        metadata=project_metadata
    )

    print(f"项目记忆: {project_memory.memory}")
    print(f"来源: {project_memory.metadata.sources}")
    print(f"🎯 配置模式: OLLAMA")
    print(f"🤖 聊天模型: {ollama_chat_model}")
    print(f"🔍 嵌入模型: {ollama_embed_model}")
    
    return project_memory

if __name__ == "__main__":
    create_project_memory_ollama()

运行命令:

python create_project_memory_ollama.py

示例3:创建工作记忆

创建文件 create_work_memory_ollama.py

# create_work_memory_ollama.py
# 🎯 创建工作记忆的示例 (Ollama版)
import os
from dotenv import load_dotenv
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata

def create_work_memory_ollama():
    """
    🎯 创建工作记忆的示例 (Ollama版)
    """
    
    print("🚀 开始创建工作记忆 (Ollama版)...")
    
    # 加载环境变量
    load_dotenv()
    
    # 检查Ollama配置
    ollama_base_url = os.getenv("OLLAMA_BASE_URL")
    ollama_chat_model = os.getenv("OLLAMA_CHAT_MODEL")
    ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL")
    
    if not ollama_base_url or not ollama_chat_model or not ollama_embed_model:
        raise ValueError("❌ 未配置Ollama环境变量。请在.env文件中配置OLLAMA_BASE_URL、OLLAMA_CHAT_MODEL、OLLAMA_EMBED_MODEL。")
    
    print("✅ 检测到Ollama本地模型模式")
    
    # 获取用户ID
    user_id = os.getenv("MOS_USER_ID", "default_user")
    
    # 创建工作记忆的元数据
    work_metadata = TreeNodeTextualMemoryMetadata(
        user_id=user_id,
        type="procedure",
        source="conversation",
        confidence=80.0,
        memory_type="WorkingMemory",  # 工作记忆
        key="今日任务",
        tags=["任务", "今日"]
    )

    # 创建记忆项
    work_memory = TextualMemoryItem(
        memory="今天需要完成代码审查、团队会议、以及准备明天的演示",
        metadata=work_metadata
    )

    print(f"工作记忆: {work_memory.memory}")
    print(f"记忆类型: {work_memory.metadata.memory_type}")
    print(f"🎯 配置模式: OLLAMA")
    print(f"🤖 聊天模型: {ollama_chat_model}")
    print(f"🔍 嵌入模型: {ollama_embed_model}")
    
    return work_memory

if __name__ == "__main__":
    create_work_memory_ollama()

运行命令:

python create_work_memory_ollama.py

配方 2.3:常用字段说明和配置

🎯 问题场景: 你需要了解TreeNodeTextualMemoryMetadata的所有可用字段,以及如何正确配置它们。

🔧 解决方案: 通过这个配方,你将掌握所有字段的含义和配置方法。

常用字段说明

字段类型说明示例
user_idstr用户ID"user123"
typestr记忆类型"fact", "event"
sourcestr来源"conversation", "file"
confidencefloat置信度(0-100)90.0
memory_typestr记忆生命周期类型"LongTermMemory"
keystr记忆键/标题"重要信息"
entitieslist实体列表"张三", "项目"
tagslist标签列表"重要", "技术"
sourceslist多源列表"文档", "会议"

配方 2.4:实际应用 - 创建记忆并添加到MemCube

🎯 问题场景: 你已经学会了创建结构化记忆,现在想要将这些记忆添加到MemCube中,并进行查询和管理。

🔧 解决方案: 通过这个配方,你将学会如何将结构化记忆集成到MemCube中,并实现完整的记忆管理流程。

创建文件 memcube_with_structured_memories_ollama.py

# memcube_with_structured_memories_ollama.py
# 🎯 将结构化记忆添加到MemCube的完整示例 (Ollama版)
import os
from dotenv import load_dotenv
from memos.mem_cube.general import GeneralMemCube
from memos.configs.mem_cube import GeneralMemCubeConfig
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata

def create_memcube_config_ollama():
    """
    🎯 创建MemCube配置 (Ollama版)
    """
    
    print("🔧 创建MemCube配置 (Ollama版)...")
    
    # 加载环境变量
    load_dotenv()
    
    # 检查Ollama配置
    ollama_base_url = os.getenv("OLLAMA_BASE_URL")
    ollama_chat_model = os.getenv("OLLAMA_CHAT_MODEL")
    ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL")
    
    if not ollama_base_url or not ollama_chat_model or not ollama_embed_model:
        raise ValueError("❌ 未配置Ollama环境变量。请在.env文件中配置OLLAMA_BASE_URL、OLLAMA_CHAT_MODEL、OLLAMA_EMBED_MODEL。")
    
    print("✅ 检测到Ollama本地模型模式")
    
    # 获取配置
    user_id = os.getenv("MOS_USER_ID", "default_user")
    top_k = int(os.getenv("MOS_TOP_K", "5"))
    
    # Ollama模式配置
    cube_config = {
        "user_id": user_id,
        "cube_id": f"{user_id}_structured_memories_cube",
        "text_mem": {
            "backend": "general_text",
            "config": {
                "extractor_llm": {
                    "backend": "ollama",
                    "config": {
                        "model_name_or_path": ollama_chat_model,
                        "api_base": ollama_base_url
                    }
                },
                "embedder": {
                    "backend": "ollama",
                    "config": {
                        "model_name_or_path": ollama_embed_model,
                        "api_base": ollama_base_url
                    }
                },
                "vector_db": {
                    "backend": "qdrant",
                    "config": {
                        "collection_name": f"{user_id}_structured_memories",
                        "vector_dimension": 768,
                        "distance_metric": "cosine"
                    }
                }
            }
        },
        "act_mem": {"backend": "uninitialized"},
        "para_mem": {"backend": "uninitialized"}
    }
    
    # 创建MemCube实例
    config_obj = GeneralMemCubeConfig.model_validate(cube_config)
    
    return config_obj

def create_structured_memories_ollama():
    """
    🎯 将结构化记忆添加到MemCube的完整示例 (Ollama版)
    """
    
    print("🚀 开始创建结构化记忆MemCube (Ollama版)...")
    
    # 创建MemCube配置
    config = create_memcube_config_ollama()
    
    # 创建MemCube
    mem_cube = GeneralMemCube(config)
    
    print("✅ MemCube创建成功!")
    print(f"  📊 用户ID: {mem_cube.config.user_id}")
    print(f"  📊 MemCube ID: {mem_cube.config.cube_id}")
    print(f"  📊 文本记忆后端: {mem_cube.config.text_mem.backend}")
    
    # 获取Ollama配置用于显示
    load_dotenv()
    ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL")
    ollama_chat_model = os.getenv("OLLAMA_CHAT_MODEL")
    print(f"  🔍 嵌入模型: {ollama_embed_model} (Ollama)")
    print(f"  🤖 聊天模型: {ollama_chat_model} (Ollama)")
    print(f"  🎯 配置模式: OLLAMA")
    
    # 创建多个记忆项
    memories = []

    # 记忆1:人物信息
    person_metadata = TreeNodeTextualMemoryMetadata(
        user_id=mem_cube.config.user_id,
        type="fact",
        source="conversation",
        confidence=90.0,
        memory_type="LongTermMemory",
        key="李四_信息",
        entities=["李四", "设计师"],
        tags=["人员", "设计"]
    )

    memories.append({
        "memory": "李四是我们的UI设计师,有5年经验,擅长用户界面设计",
        "metadata": person_metadata
    })

    # 记忆2:项目信息
    project_metadata = TreeNodeTextualMemoryMetadata(
        user_id=mem_cube.config.user_id,
        type="fact",
        source="file",
        confidence=95.0,
        memory_type="LongTermMemory",
        key="移动应用项目",
        entities=["移动应用", "开发"],
        tags=["项目", "移动端", "重要"]
    )

    memories.append({
        "memory": "移动应用项目正在进行中,预计3个月完成,团队有8个人",
        "metadata": project_metadata
    })

    # 记忆3:工作记忆
    work_metadata = TreeNodeTextualMemoryMetadata(
        user_id=mem_cube.config.user_id,
        type="procedure",
        source="conversation",
        confidence=85.0,
        memory_type="WorkingMemory",
        key="本周任务",
        tags=["任务", "本周"]
    )

    memories.append({
        "memory": "本周需要完成需求分析、原型设计、以及技术选型",
        "metadata": work_metadata
    })

    # 添加到MemCube
    mem_cube.text_mem.add(memories)

    print("✅ 成功添加了3个记忆项到MemCube")

    # 查询记忆
    print("\n🔍 查询所有记忆:")
    all_memories = mem_cube.text_mem.get_all()
    for i, memory in enumerate(all_memories, 1):
        print(f"{i}. {memory.memory}")
        print(f"   键: {memory.metadata.key}")
        print(f"   类型: {memory.metadata.memory_type}")
        print(f"   标签: {memory.metadata.tags}")
        print()

    # 搜索特定记忆
    print("🔍 搜索包含'李四'的记忆:")
    search_results = mem_cube.text_mem.search("李四", top_k=2)
    for result in search_results:
        print(f"- {result.memory}")
    
    return mem_cube

if __name__ == "__main__":
    create_structured_memories_ollama()

运行命令:

cd test_cookbook/chapter2/Ollama/4
python memcube_with_structured_memories_ollama.py

常见问题和解决方案

Q1: 如何选择合适的memory_type?

# 🔧 根据记忆的重要性选择
if is_important:
    memory_type = "LongTermMemory"  # 长期存储
elif is_temporary:
    memory_type = "WorkingMemory"   # 临时存储
else:
    memory_type = "UserMemory"      # 个性化存储

Q2: 如何设置合适的confidence值?

# 🔧 根据信息来源的可靠性设置
if source == "verified_document":
    confidence = 95.0
elif source == "conversation":
    confidence = 80.0
elif source == "web_search":
    confidence = 70.0

Q3: 如何有效使用tags和entities?

# 🔧 使用有意义的标签和实体
tags = ["项目", "技术", "重要"]  # 便于分类和检索
entities = ["张三", "AI项目"]    # 便于实体识别和关联