入门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向量数据库的实现,目前仅支持Qdrant
mem0.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…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...