入门mem0.NET
入门mem0.NET
安装包
如果你的项目使用了EntityFrameworkCore,那么你可以跟随这个教程走
<ItemGroup><PackageReference Include="mem0.NET" Version="0.1.7" /><PackageReference Include="mem0.NET.Qdrant" Version="0.1.7" /><PackageReference Include="mem0.EntityFrameworkCore" Version="0.1.7" />
</ItemGroup>
mem0.NET是我们的核心类库,包含核心prompt和功能实现mem0.NET.Qdrant是Qdrant向量数据库的实现,目前仅支持Qdrantmem0.EntityFrameworkCore是EntityFrameworkCore的实现,因为我们需要记录AI利用Function的操作记录,当然您也可以自己实现其他的。
开始使用
我们需要先创建一个DbContext或者在现有的DbContext上也可以,
创建MasterDbContext
using mem0.NET.Service.DataAccess;
using Microsoft.EntityFrameworkCore;namespace mem0.NET.Service;public class MasterDbContext(DbContextOptions<MasterDbContext> options) : Mem0DbContext<MasterDbContext>(options)
{
}
DbContext需要继承Mem0DbContext,
然后打开appsettings.json
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","ConnectionStrings": {"Default": "Host=localhost;Port=5432;Database=test;Username=token;Password=dd666666"},"Mem0": {"OpenAIEndpoint": "https://api.token-ai.cn","OpenAIKey": "sk-asdasdaskdalksjdla","OpenAIChatCompletionModel": "gpt-4o-mini","OpenAITextEmbeddingModel": "text-embedding-ada-002","CollectionName": "mem0-test"},"Qdrant": {"Host": "127.0.0.1","Port": 6334,"Https": false,"ApiKey": "dd666666"}
}
我们需要配置一下我们的连接字符串和向量数据库的连接字符串,然后Mem0使用的AI相关的配置,我们推荐使用https://api.token-ai.cn,提供了非常多的AI模型,
创建MemoryService.cs
using mem0.Core;
using mem0.NET.Services;#pragma warning disable SKEXP0001namespace mem0.NET.Service.Services;public static class ServiceCollectionExtensions
{public static WebApplication MapMemoryService(this WebApplication app){var memoryService = app.MapGroup("/api/v1/memory").WithTags("Memory").WithDescription("Memory management").WithDisplayName("Memory");memoryService.MapPost("/memory", async (MemoryService memoryService,CreateMemoryInput input) =>{await memoryService.CreateMemoryAsync(input);}).WithDescription("创建记忆").WithDisplayName("创建记忆").WithTags("记忆").WithName("CreateMemory");memoryService.MapPost("memory_tool", async (MemoryService memoryService,CreateMemoryToolInput input) =>{await memoryService.CreateMemoryToolAsync(input);}).WithDescription("创建记忆工具").WithDisplayName("创建记忆工具").WithTags("记忆");memoryService.MapGet("history/{memoryId}",async (MemoryService memoryService, string memoryId, int page, int pageSize) =>await memoryService.GetHistory(memoryId, page, pageSize)).WithDescription("获取历史").WithDisplayName("获取历史").WithTags("记忆");memoryService.MapGet("memory/{memoryId}", async (MemoryService memoryService, Guid memoryId) =>await memoryService.GetMemory(memoryId)).WithDescription("获取记忆").WithDisplayName("获取记忆").WithTags("记忆");memoryService.MapGet("memory", async (MemoryService memoryService,string? userId,string? agentId, string? runId, uint limit) =>await memoryService.GetMemoryAll(userId, agentId, runId, limit)).WithDescription("获取所有记忆").WithDisplayName("获取所有记忆").WithTags("记忆");memoryService.MapGet("search", async (MemoryService memoryService,string query,string? userId,string? agentId, string? runId, uint limit) =>await memoryService.SearchMemory(query,userId,agentId, runId, limit)).WithDescription("搜索记忆").WithDisplayName("搜索记忆").WithTags("记忆");memoryService.MapPut("memory",async (MemoryService memoryService, UpdateMemoryInput input) => await memoryService.Update(input)).WithDescription("更新记忆").WithDisplayName("更新记忆").WithTags("记忆");memoryService.MapDelete("memory/{memoryId}",async (MemoryService memoryService, Guid memoryId) => await memoryService.Delete(memoryId)).WithDescription("删除记忆").WithDisplayName("删除记忆").WithTags("记忆");memoryService.MapDelete("memory", async (MemoryService memoryService, string? userId,string? agentId, string? runId) =>await memoryService.DeleteAll(userId, agentId, runId)).WithDescription("删除所有记忆").WithDisplayName("删除所有记忆").WithTags("记忆");memoryService.MapDelete("reset", async (MemoryService memoryService) =>await memoryService.Reset()).WithDescription("重置记忆").WithDisplayName("重置记忆").WithTags("记忆");return app;}
}
我们将mem0.NET提供的接口全部外放到WebAPI中,并且使用了MiniAPIs超级简单的实现了。
然后我们打开Program.cs
using mem0.NET.Options;
using mem0.NET.Service.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection.Options;namespace mem0.NET.Service;public static class Program
{public static async Task Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();builder.Services.AddOptions<Mem0Options>().Bind(builder.Configuration.GetSection("Mem0"));builder.Services.AddOptions<QdrantOptions>().Bind(builder.Configuration.GetSection("Qdrant"));var options = builder.Configuration.GetSection("Mem0").Get<Mem0Options>();var qdrantOptions = builder.Configuration.GetSection("Qdrant").Get<QdrantOptions>();builder.Services.AddMem0DotNet(options).WithMem0EntityFrameworkCore<MasterDbContext>(optionsBuilder =>{optionsBuilder.UseNpgsql(builder.Configuration.GetConnectionString("Default"));}).WithVectorQdrant(qdrantOptions);var app = builder.Build();using (var scope = app.Services.CreateScope()){var dbContext = scope.ServiceProvider.GetRequiredService<MasterDbContext>();await dbContext.Database.EnsureCreatedAsync();}if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}app.MapMemoryService();await app.RunAsync();}
}
我们需要先将AI配置和向量配置绑定到Options中
builder.Services.AddOptions<Mem0Options>().Bind(builder.Configuration.GetSection("Mem0"));
builder.Services.AddOptions<QdrantOptions>().Bind(builder.Configuration.GetSection("Qdrant"));
然后添加我们的Mem0核心服务
builder.Services.AddMem0DotNet(options).WithMem0EntityFrameworkCore<MasterDbContext>(optionsBuilder =>{optionsBuilder.UseNpgsql(builder.Configuration.GetConnectionString("Default"));}).WithVectorQdrant(qdrantOptions);
在AddMem0DotNet中则是我们的核心服务,然后我们的WithMem0EntityFrameworkCore则是EntityFrameworkCore服务,
通过WithVectorQdrant则添加了向量数据库服务。
然后需要先部署好数据库和向量数据库,下面我们会使用docker-compose.yml进行部署,请先确认一下自己的环境。
部署数据库和向量数据库
docker-compose.yml
services:qdrant:image: registry.token-ai.cn/qdrant/qdrant:latestrestart: alwayscontainer_name: qdrantports:- 6333:6333- 6334:6334expose:- 6333- 6334- 6335configs:- source: qdrant_configtarget: /qdrant/config/production.yamlvolumes:- ./qdrant_data:/qdrant/storagepostgres:image: registry.token-ai.cn/postgres:16restart: alwayscontainer_name: qdrant_postgresenvironment:POSTGRES_USER: tokenPOSTGRES_PASSWORD: dd666666POSTGRES_DB: mem0ports:- 5432:5432volumes:- ./postgres_data:/var/lib/postgresql/dataconfigs:qdrant_config:content: |log_level: INFO
执行我们的启动脚本
docker compose up -d
启动项目
创建记忆

案例数据
{"data":"# C# 入门教程目录列表\n\n## 1. C# 概述\n - C# 的历史与发展\n - C# 的特点与优势\n - C# 的应用领域\n\n## 2. 开发环境搭建\n - 安装 Visual Studio\n - 配置开发环境\n - 创建第一个 C# 项目\n\n## 3. C# 基础语法\n - 数据类型与变量\n - 运算符与表达式\n - 控制流语句(if, switch, for, while)\n\n## 4. 面向对象编程\n - 类与对象\n - 封装、继承与多态\n - 接口与抽象类\n\n## 5. 常用类与集合\n - 字符串与字符串操作\n - 数组与集合(List, Dictionary等)\n - LINQ 查询\n\n## 6. 异常处理\n - 异常的概念\n - try-catch-finally 语句\n - 自定义异常\n\n## 7. 文件与数据操作\n - 文件读写操作\n - 数据序列化与反序列化\n - 数据库连接与操作(ADO.NET)\n\n## 8. 多线程与异步编程\n - 线程的基本概念\n - 使用 Task 和 async/await\n - 线程安全与锁\n\n## 9. C# 的高级特性\n - 委托与事件\n - Lambda 表达式\n - 属性与索引器\n\n## 10. 项目实战\n - 实现一个简单的控制台应用\n - 开发一个 Windows 窗体应用\n - 部署与发布应用程序\n\n## 11. 资源与学习路径\n - 推荐书籍与在线课程\n - C# 社区与论坛\n - 实践项目与开源资源\n\n## 12. 总结与展望\n - 学习 C# 的重要性\n - 未来的学习方向与发展趋势\n"}
然后在等创建内存完成以后我们使用search接口查看一下搜索效果

结束
mem0的机制是什么?
mem0适合什么场景?
mem0的机制是什么?
Mem0的主要功能包括添加、更新、搜索、检索和跟踪存储在系统中的记忆历史。通过简单易用的API实现这一点,支持与各种应用的集成,确保跨平台的一致性和开发者的使用便利性。Mem0还提供不同的部署选项,包括自托管的开源版本和面向企业的托管解决方案。
当你在创建Memory的时候并不是直接添加到数据库当中,也不是直接添加到向量数据库当中,然后先利用AI将您的文本提取或说总结内容,然后利用总结的内容去向量数据库搜索,将得到的搜索结果结合您的文本一块通过定义好的提示词发送给AI,然后利用AI理解能力和执行Function的能力,让他帮我们根据新的记忆(您的文本)和旧的记忆(向量数据库操查询的数据)进行对比,然后默认提供了三个Function,一个是新增,一个是更新,一个是删除,然后自行理解去更新记忆和删除新增记忆,然后mem0的特点就在于这一点,不像普通的RAG只在创建的时候一次优化,而mem0则会在您不断的添加数据库和上传数据库的同时进行优化您之前已经上传的向量数据,并随着时间的推移不断改进,这在从客户支持到医疗保健再到内容推荐等领域都至关重要。
mem0ai/mem0: The memory layer for Personalized AI (github.com)
AIDotNet/mem0.NET (github.com)
mem0适合什么场景
Mem0 的机制特别适合于需要个性化和记忆功能的场景,这包括但不限于以下几个应用领域:
-
客户支持系统:通过记忆用户的过往交互,Mem0 可以帮助客户服务系统提供更加个性化的响应和建议,改善客户体验。
-
健康护理应用:在健康管理和患者护理领域,Mem0 可以存储和回顾患者的历史健康信息,帮助医疗专业人员提供针对性的医疗建议。
-
教育技术:Mem0 可以用于跟踪学生的学习进度和偏好,提供定制化的学习体验和资源。
-
电子商务:电商平台可以利用Mem0 记录用户的购物习惯和偏好,从而推荐更合适的产品,提高转化率。
-
内容推荐系统:对于流媒体服务,Mem0 可以帮助系统记忆用户的观看历史和喜好,用以提供更加准确的内容推荐。
相关文章:
入门mem0.NET
入门mem0.NET 安装包 如果你的项目使用了EntityFrameworkCore,那么你可以跟随这个教程走 <ItemGroup><PackageReference Include"mem0.NET" Version"0.1.7" /><PackageReference Include"mem0.NET.Qdrant" Version"0.1.7…...
虚拟机(CentOS7)安装jenkins
centos7安装jenkins 前提条件,安装jdk与maven 1、JDK17安装 # 进入系统管理员 sudo root # 进入对应文件夹下 cd /usr/local # 下载jdk17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm # rpm命令安装下载的jdk17 rpm -ivh jdk-17_li…...
尚品汇-首页三级分类实现-nginx静态代理生成的静态页面(二十六)
目录: (1)问题详解 (2)首页商品分类实现 (3)修改web-all模块 (4)页面渲染 (1)问题详解 (2)首页商品分类实现 前面做了…...
对象存储及其相关概念介绍
对象存储是一种用来描述解决和处理离散单元(这些离散单元被称作为对象)的方法的通用术语。以下是关于对象存储的详细解析: 一、基本概念 定义:对象存储,也叫做基于对象的存储,是一种将数据以对象的形式进…...
TypeScript 研发系列
#TypeScript 编写HTML 游戏...
三维世界,一图打尽!Matplotlib带你玩转3D绘图,让数据跳舞的魔法棒!
1. 引言 嘿,亲爱的数据探险家们!你们是否曾梦想过,在二维的屏幕上,让数据跳出束缚,翩翩起舞,展现它那迷人的三维身姿?今天,就让我这位自封的‘数据魔术师’,带你解锁Mat…...
计算机常识与NOIP历史-CSP初赛知识点整理
真题练习 [2021-CSP-J-第2题] 以下奖项与计算机领域最相关的是( )。 A.奥斯卡奖 B.图灵奖 C.诺贝尔奖 D.普利策奖 [2017-NOIP-第7题] 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。 A. 1983 B. 1984 C. 1985 D. 1986 [2018-NOIP-第5题…...
代码随想录算法训练营第二天 | 209. 长度最小的子数组、59. 螺旋矩阵 II
目录 209. 长度最小的子数组1、题目描述2、思路3、code4、复杂度分析 LC59 螺旋矩阵 II1、题目描述2、思路3、code4、复杂度分析 209. 长度最小的子数组 题目链接:209 1、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于…...
鼻咽癌综述
小罗碎碎念 本期推文主题:鼻咽癌综述 这篇文章提供了一个全面的综述,探讨了鼻咽癌(NPC)的关键研究进展,包括病理机制、治疗、筛查和生物标志物的发展。 文章首先强调了NPC在特定地理区域的流行情况,并讨论了…...
中国AI PC行业研究报告
核心摘要: 2020-2023年中国笔电出货量呈下降趋势,PC厂商亟需从产品形态、软硬技术、需求场景等角度寻求新的增长机会。而随着大模型、生成式AI技术的到来,其强大的数据处理、学习泛化与内容生成能力,高质效加速了各行各业人工智能…...
Mybatis实战:图书管理系统(笔记)
前言:如果在接口的声明方法中鼠标右键没有Test的单元测试。 你的鼠标光标问题:要在花括号范围内!!!! 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚…...
win11 amd64 python安装matplotlib、pytorch报错记录
win11 amd64 python matplotlib 安装报错记录 安装时 错误是 metadata-generation-failed 查看上面的具体报错原因,来自: Files\Python\Python3_10_11\Include: linker input file not found: No such file or director注意Python 的路径中最好不要有…...
Python写UI自动化--playwright(等待页面加载机制)
很多情况下,我们都需要等待页面加载到一定程度才能进行下一步操作,而这个度该怎么操作,这篇文章就来详细讲一讲 目录 expect_popup() wait_until参数 "load" commit: "domcontentloaded" "networkidle"…...
书籍将整数字符串转成整数值(5)0804
题目 给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。 举例 str“123” 返回 123 str“023” 因为023 不符合日常的书写习惯,所以返回0 str“A13” …...
【2024年华数杯C题老外游中国】(完整题解+代码+完整参考论文)
请问 352 个城市中所有 35200 个景点评分的最高分(Best Score,简称 BS)是多少?全国有多少个景点获评了这个最高评分(BS)?获评了这个最高评分(BS)景点最多的城市有哪些&am…...
全球氢化双酚A (HBPA)市场规划预测:2030年市场规模将接近1330亿元,未来六年CAGR为2.7%
一、引言 随着全球化工行业的持续发展,氢化双酚A (HBPA)作为重要的化工原料,其市场重要性日益凸显。本文旨在探索HBPA行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球HBPA市场的增长主要受全球化工行业增加、消费者对高性能化工产品要求提高…...
【C++】异常处理:深度解析与实战精髓,不容错过的编程秘籍
🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 🚀 前言:C语言传统的处理错误的方式 一: 🔥 C异常概念二: 🔥 异常的使用 2.1 📖 异常的抛出和…...
智能指针的循环引用 是什么 怎么引起的
智能指针的循环引用 是什么 怎么引起的 智能指针的循环引用(Circular Reference)是指两个或多个对象之间的共享指针相互引用,导致这些对象永远不会被释放,从而引发内存泄露。主要发生在使用std::shared_ptr时,因为它们…...
Stegdetect教程:如何用Stegdetect检测和破解JPG图像隐写信息
一、Stegdetect简介 Stegdetect 是一个开源工具,专门设计用于检测图像文件(JPG格式)中的隐写信息。Stegdetect 可以检测多种常见的隐写方法,比如 JSteg、JPHide 和 OutGuess 等。 二、使用Stegdetect检测图像隐写 官方描述&#…...
Co-Detr
参考:https://www.bilibili.com/video/BV1Sh4y1F7ur/?spm_id_from333.788&vd_source156234c72054035c149dcb072202e6be 之前的detr正样本数量少,匹配不平衡。 主要修改两个地方:encoder和decoder。 1.在encoder之后加入RPN,a…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
