当前位置: 首页 > news >正文

入门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.EntityFrameworkCoreEntityFrameworkCore的实现,因为我们需要记录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 的机制特别适合于需要个性化和记忆功能的场景,这包括但不限于以下几个应用领域:

  1. 客户支持系统:通过记忆用户的过往交互,Mem0 可以帮助客户服务系统提供更加个性化的响应和建议,改善客户体验。

  2. 健康护理应用:在健康管理和患者护理领域,Mem0 可以存储和回顾患者的历史健康信息,帮助医疗专业人员提供针对性的医疗建议。

  3. 教育技术:Mem0 可以用于跟踪学生的学习进度和偏好,提供定制化的学习体验和资源。

  4. 电子商务:电商平台可以利用Mem0 记录用户的购物习惯和偏好,从而推荐更合适的产品,提高转化率。

  5. 内容推荐系统:对于流媒体服务,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 前提条件&#xff0c;安装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静态代理生成的静态页面(二十六)

目录&#xff1a; &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 &#xff08;3&#xff09;修改web-all模块 &#xff08;4&#xff09;页面渲染 &#xff08;1&#xff09;问题详解 &#xff08;2&#xff09;首页商品分类实现 前面做了…...

对象存储及其相关概念介绍

对象存储是一种用来描述解决和处理离散单元&#xff08;这些离散单元被称作为对象&#xff09;的方法的通用术语。以下是关于对象存储的详细解析&#xff1a; 一、基本概念 定义&#xff1a;对象存储&#xff0c;也叫做基于对象的存储&#xff0c;是一种将数据以对象的形式进…...

TypeScript 研发系列

#TypeScript 编写HTML 游戏...

三维世界,一图打尽!Matplotlib带你玩转3D绘图,让数据跳舞的魔法棒!

1. 引言 嘿&#xff0c;亲爱的数据探险家们&#xff01;你们是否曾梦想过&#xff0c;在二维的屏幕上&#xff0c;让数据跳出束缚&#xff0c;翩翩起舞&#xff0c;展现它那迷人的三维身姿&#xff1f;今天&#xff0c;就让我这位自封的‘数据魔术师’&#xff0c;带你解锁Mat…...

计算机常识与NOIP历史-CSP初赛知识点整理

真题练习 [2021-CSP-J-第2题] 以下奖项与计算机领域最相关的是&#xff08; &#xff09;。 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. 长度最小的子数组 题目链接&#xff1a;209 1、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于…...

鼻咽癌综述

小罗碎碎念 本期推文主题&#xff1a;鼻咽癌综述 这篇文章提供了一个全面的综述&#xff0c;探讨了鼻咽癌&#xff08;NPC&#xff09;的关键研究进展&#xff0c;包括病理机制、治疗、筛查和生物标志物的发展。 文章首先强调了NPC在特定地理区域的流行情况&#xff0c;并讨论了…...

中国AI PC行业研究报告

核心摘要&#xff1a; 2020-2023年中国笔电出货量呈下降趋势&#xff0c;PC厂商亟需从产品形态、软硬技术、需求场景等角度寻求新的增长机会。而随着大模型、生成式AI技术的到来&#xff0c;其强大的数据处理、学习泛化与内容生成能力&#xff0c;高质效加速了各行各业人工智能…...

Mybatis实战:图书管理系统(笔记)

前言&#xff1a;如果在接口的声明方法中鼠标右键没有Test的单元测试。 你的鼠标光标问题&#xff1a;要在花括号范围内&#xff01;&#xff01;&#xff01;&#xff01; 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚…...

win11 amd64 python安装matplotlib、pytorch报错记录

win11 amd64 python matplotlib 安装报错记录 安装时 错误是 metadata-generation-failed 查看上面的具体报错原因&#xff0c;来自&#xff1a; Files\Python\Python3_10_11\Include: linker input file not found: No such file or director注意Python 的路径中最好不要有…...

Python写UI自动化--playwright(等待页面加载机制)

很多情况下&#xff0c;我们都需要等待页面加载到一定程度才能进行下一步操作&#xff0c;而这个度该怎么操作&#xff0c;这篇文章就来详细讲一讲 目录 expect_popup() wait_until参数 "load" commit: "domcontentloaded" "networkidle"…...

书籍将整数字符串转成整数值(5)0804

题目 给定一个字符串str&#xff0c;如果str符合日常书写的整数形式&#xff0c;并且属于32位整数的范围&#xff0c;返回str所代表的整数值&#xff0c;否则返回0。 举例 str“123” 返回 123 str“023” 因为023 不符合日常的书写习惯&#xff0c;所以返回0 str“A13” …...

【2024年华数杯C题老外游中国】(完整题解+代码+完整参考论文)

请问 352 个城市中所有 35200 个景点评分的最高分&#xff08;Best Score&#xff0c;简称 BS&#xff09;是多少&#xff1f;全国有多少个景点获评了这个最高评分&#xff08;BS&#xff09;&#xff1f;获评了这个最高评分&#xff08;BS&#xff09;景点最多的城市有哪些&am…...

全球氢化双酚A (HBPA)市场规划预测:2030年市场规模将接近1330亿元,未来六年CAGR为2.7%

一、引言 随着全球化工行业的持续发展&#xff0c;氢化双酚A (HBPA)作为重要的化工原料&#xff0c;其市场重要性日益凸显。本文旨在探索HBPA行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球HBPA市场的增长主要受全球化工行业增加、消费者对高性能化工产品要求提高…...

【C++】异常处理:深度解析与实战精髓,不容错过的编程秘籍

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 &#x1f680; 前言&#xff1a;C语言传统的处理错误的方式 一&#xff1a; &#x1f525; C异常概念二&#xff1a; &#x1f525; 异常的使用 2.1 &#x1f4d6; 异常的抛出和…...

智能指针的循环引用 是什么 怎么引起的

智能指针的循环引用 是什么 怎么引起的 智能指针的循环引用&#xff08;Circular Reference&#xff09;是指两个或多个对象之间的共享指针相互引用&#xff0c;导致这些对象永远不会被释放&#xff0c;从而引发内存泄露。主要发生在使用std::shared_ptr时&#xff0c;因为它们…...

Stegdetect教程:如何用Stegdetect检测和破解JPG图像隐写信息

一、Stegdetect简介 Stegdetect 是一个开源工具&#xff0c;专门设计用于检测图像文件&#xff08;JPG格式&#xff09;中的隐写信息。Stegdetect 可以检测多种常见的隐写方法&#xff0c;比如 JSteg、JPHide 和 OutGuess 等。 二、使用Stegdetect检测图像隐写 官方描述&#…...

Co-Detr

参考&#xff1a;https://www.bilibili.com/video/BV1Sh4y1F7ur/?spm_id_from333.788&vd_source156234c72054035c149dcb072202e6be 之前的detr正样本数量少&#xff0c;匹配不平衡。 主要修改两个地方&#xff1a;encoder和decoder。 1.在encoder之后加入RPN&#xff0c;a…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...