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

微软AutoGen高级功能——Memory

介绍

大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体之间交互的历史信息,有助于智能体在对话和协作过程中参考过往内容,以更智能地推进任务。那我们直接进入正题。

Memory

在几种用例中,维护一个有用事实的存储库是很有价值的,这些事实能在特定步骤即将开始前被智能地添加到智能体的上下文中。这里的典型用例是检索增强生成(RAG)模式,在这种模式下,一个查询被用于从数据库中检索相关信息,然后这些信息会被添加到智能体的上下文中。

AgentChat提供了一种记忆协议,该协议可以进行扩展以实现这一功能。其关键方法包括查询(query)、更新上下文(update_context)、添加(add)、清除(clear)和关闭(close)。

  • 添加(add):向记忆存储中添加新的条目。
  • 查询(query):从记忆存储中检索相关信息。
  • 更新上下文(update_context):通过添加检索到的信息来改变智能体的内部模型上下文(在助理智能体类中使用)。
  • 清除(clear):从记忆存储中清除所有条目。
  • 关闭(close):清理记忆存储所使用的任何资源。

ListMemory示例

Pythonautogen_core.memory.ListMemory作为Pythonautogen_core.memory.Memory协议的一个示例实现被提供。它是一个基于简单列表的记忆实现方式,按时间顺序保存记忆内容,将最新的记忆添加到模型的上下文中。这种实现方式设计得简单直接且具有可预测性,便于理解和调试。我们通过一个示例来演示,我们将使用ListMemory来维护一个用户偏好的记忆库,并展示随着时间推移,它如何被用来为智能体的回复提供一致的上下文信息。

完整代码

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType
from autogen_ext.models.openai import OpenAIChatCompletionClient# 初始化用户记忆
user_memory = ListMemory()async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)stream = assistant_agent.run_stream(task="What is the weather in Beijing?")await Console(stream)asyncio.run(run_stream())

运行结果

---------- user ----------
What is the weather in Beijing?
---------- assistant_agent ----------
[MemoryContent(content='The weather should be in metric units', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None), MemoryContent(content='Meal recipe must be vegan', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None)]
---------- assistant_agent ----------
[FunctionCall(id='call_pHq4p89gW6oGjGr3VsVETCYX', arguments='{"city":"Beijing","units":"metric"}', name='get_weather')]
---------- assistant_agent ----------
[FunctionExecutionResult(content='The weather in Beijing is 23 °C and Sunny.', call_id='call_pHq4p89gW6oGjGr3VsVETCYX')]
---------- assistant_agent ----------
The weather in Beijing is 23 °C and Sunny.进程已结束,退出代码为 0

我们可以查看发现,assistant_agent的模型上下文实际上已用检索到的记忆条目进行了更新。transform方法被用于将检索到的记忆条目格式化为可供智能体使用的字符串。在这种情况下,我们只是简单地将每个记忆条目的内容连接成一个单一的字符串。

从上述内容我们可以看到,正如用户偏好中所要求的那样,天气信息是以摄氏度为单位返回的。
同样地,假设我们另外提出一个关于制定一份餐食计划的问题,智能体能够从记忆存储中检索到相关信息,并给出个性化的回复。

完整代码

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType
from autogen_ext.models.openai import OpenAIChatCompletionClient# 初始化用户记忆
user_memory = ListMemory()async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)await assistant_agent._model_context.get_messages()stream = assistant_agent.run_stream(task="Write brief meal recipe with broth")await Console(stream)asyncio.run(run_stream())

运行结果

---------- user ----------
Write brief meal recipe with broth
---------- assistant_agent ----------
[MemoryContent(content='The weather should be in metric units', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None), MemoryContent(content='Meal recipe must be vegan', mime_type=<MemoryMimeType.TEXT: 'text/plain'>, metadata=None)]
---------- assistant_agent ----------
Here's a simple vegan meal recipe using broth:**Vegan Vegetable Soup****Ingredients:**
- 1 liter vegetable broth
- 1 cup chopped carrots
- 1 cup chopped celery
- 1 cup diced tomatoes
- 1 cup chopped zucchini
- 1 cup cooked chickpeas (optional)
- 2 cloves garlic, minced
- 1 tablespoon olive oil
- Salt and pepper to taste
- Fresh parsley for garnish**Instructions:**
1. Heat olive oil in a large pot over medium heat.
2. Add minced garlic and sauté until fragrant (about 1 minute).
3. Add carrots, celery, zucchini, and diced tomatoes to the pot. Stir and cook for 5 minutes.
4. Pour in the vegetable broth and bring it to a boil.
5. Lower the heat and let the soup simmer for 20–25 minutes, until the vegetables are tender.
6. Add cooked chickpeas (if using), and season with salt and pepper.
7. Garnish with fresh parsley before serving. Enjoy your warm vegan vegetable soup! TERMINATE进程已结束,退出代码为 0

自定义记忆存储(向量数据库等)

我们可以基于记忆协议来实现更复杂的记忆存储方式。例如,我们可以实现一个自定义的记忆存储系统,利用向量数据库来存储和检索信息,或者创建一个使用机器学习模型的记忆存储系统,以便根据用户的偏好等生成个性化的回复。

具体来说,我们需要重载addqueryupdate_context方法,以实现所需的功能,并将记忆存储传递给你的智能体。

完整代码

import asyncio
from typing import Any
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
from autogen_core import CancellationToken
from autogen_core.memory import Memory, MemoryContent, MemoryMimeType, UpdateContextResult
from autogen_core.model_context import ChatCompletionContext
from autogen_ext.models.openai import OpenAIChatCompletionClient# 自定义记忆存储类
class CustomMemory(Memory):def __init__(self):self.memory_store = []async def add(self, entry: MemoryContent, cancellation_token: CancellationToken | None = None) -> None:self.memory_store.append(entry)print(f"Added entry: {entry.content}")async def query(self, query_str: str | MemoryContent, cancellation_token: CancellationToken | None = None,**kwargs: Any) -> list[Any]:passasync def update_context(self, agent: ChatCompletionContext) -> UpdateContextResult:passasync def clear(self):self.memory_store = []print("Memory store cleared")async def close(self):print("Memory store closed")async def get_weather(city: str, units: str = "imperial") -> str:if units == "imperial":return f"The weather in {city} is 73 °F and Sunny."elif units == "metric":return f"The weather in {city} is 23 °C and Sunny."else:return f"Sorry, I don't know the weather in {city}."async def run_stream() -> None:# 初始化自定义用户记忆user_memory = CustomMemory()# 将用户偏好添加到记忆中await user_memory.add(MemoryContent(content="The weather should be in metric units", mime_type=MemoryMimeType.TEXT))await user_memory.add(MemoryContent(content="Meal recipe must be vegan", mime_type=MemoryMimeType.TEXT))assistant_agent = AssistantAgent(name="assistant_agent",model_client=OpenAIChatCompletionClient(model="gpt-4o",),tools=[get_weather],memory=[user_memory],)await assistant_agent._model_context.get_messages()stream = assistant_agent.run_stream(task="Write brief meal recipe with broth")await Console(stream)asyncio.run(run_stream())

运行结果

Added entry: The weather should be in metric units
Added entry: Meal recipe must be vegan
---------- user ----------
Write brief meal recipe with broth
---------- assistant_agent ----------
**Chicken Broth Soup****Ingredients:**
- 4 cups chicken broth
- 1 cup shredded cooked chicken
- 1 cup chopped vegetables (carrots, celery, peas)
- 1/2 cup small pasta or rice
- 1-2 garlic cloves (minced)
- Salt and pepper to taste
- 1 tbsp olive oil**Instructions:**
1. In a pot, heat olive oil over medium heat and sauté garlic until fragrant.
2. Add vegetables and cook for 2-3 minutes.
3. Pour in chicken broth and bring to a boil.
4. Add pasta or rice and cook according to package directions.
5. Stir in shredded chicken, season with salt and pepper, and simmer for 5-10 minutes.
6. Serve hot and enjoy!TERMINATE进程已结束,退出代码为 0

说明

如果大家在运行上述代码的时候有AutoGen相关的提示或报错(例如:该参数不存在,没有此类方法等),请尝试更新一下AutoGen,博主在分享这篇博文的时候,AutoGen的版本是0.4.6稳定版

安装或更新命令

pip install -U "autogen-agentchat" "autogen-ext[openai,azure]"

另外大家要根据业务需求,设置使用的LLM,不一定要按照我给大家分享代码中的设置来,如果只是为了测试并看运行结果可直接复制粘贴代码(完整代码)

结束

好了,以上就是本次分享的全部内容,细心的小伙伴可能会发现该功能有点类似于之前博主给大家分享的Managing State(管理状态)机制。那么它们二者之间的区别是什么呢?博主在这里给大家整理如下:

在微软的AutoGen框架中,MemoryManaging State机制在功能和应用场景上存在一些区别。

Memory

  1. 功能特性:Memory主要用于存储和检索与交互过程相关的信息,它提供了一种结构化的方式来保存历史对话、用户偏好、任务相关的上下文等内容。通过记忆功能,智能体可以参考之前的交互信息,从而在后续的对话或任务处理中提供更连贯、更符合上下文的回复。例如,用户在之前的对话中提到了自己喜欢的食物类型(如素食),记忆模块可以存储这个信息,当后续询问关于餐食推荐的问题时,智能体能够从记忆中检索到该信息并据此给出合适的建议。
  2. 接口和方法:Memory通常定义了一系列接口和方法,如add(添加记忆条目)、query(根据特定条件检索记忆条目)、update_context(将检索到的记忆信息更新到智能体的上下文)等。这些方法使得开发者可以方便地操作记忆存储,实现对记忆数据的管理和利用。比如,通过add方法可以将新的用户输入或重要信息添加到记忆中,query方法则可以根据关键词或其他条件从记忆中查找相关的历史记录。
  3. 应用场景:主要应用于多轮对话场景,帮助智能体维护对话的上下文连贯性,提升对话质量;也适用于需要记住用户特定偏好、设置等信息的场景,以便为用户提供个性化的服务。例如在智能客服系统中,记忆功能可以记录用户之前反馈的问题和解决方案,当用户再次咨询类似问题时,客服智能体能够快速给出准确的答复。

Managing State

  1. 功能特性:Managing State机制更侧重于管理智能体在执行任务过程中的整体状态信息。这包括任务的当前阶段、已经执行的操作、任务的目标和约束条件等。它关注的是智能体在处理复杂任务时的状态流转和协调,确保智能体能够按照正确的流程和逻辑完成任务。例如,在一个涉及多个步骤的任务(如策划一次旅行,包括选择目的地、预订机票、酒店等步骤)中,管理状态机制会记录每个步骤的完成情况和相关的状态信息,以便智能体能够合理地推进后续操作。
  2. 实现方式:管理状态可能涉及到状态机、状态变量的维护和更新等技术手段。通过定义不同的状态和状态转换规则,智能体可以根据当前的任务状态决定下一步的行动。例如,当智能体处于 “预订机票” 的状态时,它会执行与机票预订相关的操作,如查询航班信息、选择合适的航班等,并在预订成功后更新状态为 “机票已预订”。
  3. 应用场景:主要应用于复杂任务的执行和管理,如工作流自动化、多步骤问题解决等场景。在这些场景中,智能体需要根据不同的状态来协调多个子任务的执行,确保任务能够顺利完成。例如在一个项目管理智能体中,管理状态机制可以跟踪项目的各个阶段(如规划、执行、监控等),并根据项目状态做出相应的决策和调整。

综上所述,Memory主要聚焦于存储和利用交互历史和上下文信息,而Managing State更关注智能体在任务执行过程中的状态管理和协调,两者在AutoGen中分别承担着不同但又相互关联的重要角色,共同支持智能体的高效运行和复杂任务处理。

通过本次分享,大家有所收获吗?请大家多去大胆的尝试和使用。博主还是那句话:成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。这次分享就到这,如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。

相关文章:

微软AutoGen高级功能——Memory

介绍 大家好&#xff0c;博主又来给大家分享知识了。这次又要给大家分享什么呢&#xff1f;哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能&#xff1a;Memory。在微软AutoGen中&#xff0c;Memory(记忆)是一个重要概念&#xff0c;它主要用于存储和管理智能体…...

【鸿蒙开发】第三十六章 状态管理 - V1V2混用和迁移指导

目录​​​​​​​ 1 自定义组件混用场景指导 1.1 概述 1.2 状态管理装饰器总览 状态管理V1的装饰器 状态管理V2的装饰器 状态管理装饰器支持的数据类型总览 1.3 限制条件 1.3.1 V1和V2的装饰器不允许混用 1.V1的自定义组件中不可以使用V2的装饰器 2.V2的自定义组件…...

轮子项目--消息队列的实现(3)

上一篇文章中我把一些关键的类以及表示出来&#xff0c;如何对这些类对应的对象进行管理呢&#xff1f;管理分为硬盘和内存上&#xff0c;硬盘又分为数据库&#xff08;管理交换机&#xff0c;队列和绑定&#xff09;和文件&#xff08;管理消息&#xff09;&#xff0c;本文就…...

一文深入了解DeepSeek-R1:模型架构

本文深入探讨了 DeepSeek-R1 模型架构。让我们从输入到输出追踪 DeepSeek-R1 模型&#xff0c;以找到架构中的新发展和关键部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架构。本文旨在涵盖其设计的所有重要方面。 &#x1f4dd; 1. 输入上下文长度 DeepSeek-R1的输入上下文长…...

秘密信息嵌入到RGB通道的方式:分段嵌or完整嵌入各通道

目录 1. 将秘密信息分为三部分的理由 &#xff08;1&#xff09;均匀分布负载 &#xff08;2&#xff09;提高鲁棒性 &#xff08;3&#xff09;容量分配 2. 不将秘密信息分为三部分的情况 &#xff08;1&#xff09;嵌入容量 &#xff08;2&#xff09;视觉质量 &#…...

Ai人工智能的未来:趋势、挑战与机遇

Ai人工智能的未来&#xff1a;趋势、挑战与机遇 引言 人工智能&#xff08;AI&#xff09;已经成为当代科技发展的核心驱动力&#xff0c;其影响力渗透到各个行业&#xff0c;并塑造了我们未来的社会结构。无论是在医疗、金融、制造业&#xff0c;还是在自动驾驶、智能客服、…...

理解WebGPU 中的 GPUDevice :与 GPU 交互的核心接口

在 WebGPU 开发中&#xff0c; GPUDevice 是一个至关重要的对象&#xff0c;它是与 GPU 进行交互的核心接口。通过 GPUDevice &#xff0c;开发者可以创建和管理 GPU 资源&#xff08;如缓冲区、纹理、管线等&#xff09;&#xff0c;并提交命令缓冲区以执行渲染和计算任…...

Java 设计模式之桥接模式

文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge)&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。通过桥接模式&#xff0c;可以避免类爆炸问题&#xff0c;并提高系统的可扩展性。 UML 核心…...

机器学习(李宏毅)——GAN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 不得不说GAN真是博大精深&#xff01; 二、大纲 GAN问世基本思想原理剖析Tips of GANGAN的应用Cycle GANEva…...

QT无弹窗运行和只允许运行一个exe

最近做一个小功能&#xff0c;需要后台运行QT程序&#xff0c;无弹窗&#xff0c;并且只允许一个exe运行&#xff0c;不关闭程序&#xff0c;无法2次启动。 main.cpp #include "deleteshotcurveflie.h" #include <QApplication> #include <QSharedMemory&…...

C++ STL 容器

C 的 STL&#xff08;Standard Template Library&#xff09; 提供了多种容器&#xff0c;分为以下几类&#xff1a; 序列容器&#xff08;Sequence Containers&#xff09;关联容器&#xff08;Associative Containers&#xff09;无序关联容器&#xff08;Unordered Associa…...

开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码

工业物联网的机遇与挑战&#xff1a;为什么企业需要Odoo&#xff1f; 《中国智能制造发展研究报告2023》指出&#xff0c;85%的制造企业已启动数字化转型&#xff0c;但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备&#xff0c;而定…...

CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display

核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...

K8s组件

一、Kubernetes 集群架构组件 K8S 是属于主从设备模型&#xff08;Master-Slave 架构&#xff09;&#xff0c;即有 Master 节点负责集群的调度、管理和运维&#xff0c;Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点&#xff0c;master节点上有 apis…...

python面试题

以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...

AOS安装及操作演示

文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...

蓝桥杯单片机组第十三届初赛试题-程序题(第2批)

题目到官网看即可&#xff0c;有点久了有些细节记不清了&#xff0c;可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的&#xff0c;像代码结构什么的肯定有可以提升的地方&#xff0c;多多包涵&#xff0c;将就看一下。 i2c文件使用官方的&#xff0c;pcf8591函数…...

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...

Python Pandas(11):Pandas 数据可视化

数据可视化是数据分析中的重要环节&#xff0c;它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式&#xff0c;数据可视化将复杂的数字和统计信息转化为易于理解的图像&#xff0c;从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...

【练习】图论

F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...