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

Memory模块是agent的一个关键组件

Memory

2.6.1 简介

在Agent系统中,Memory模块是一个关键的组件,其主要功能是存储和检索信息,以支持agent的学习和决策过程。该模块模拟人类记忆的某些特征,能够动态地保存和更新信息,使agent能够利用过去的经验进行推理和决策。

为什么要有Memory模块?

试想一下,当你和agent交互时,如果agent没有记忆,那就没法进行多轮对话了。你每次提问都相当于重新开始一个对话,对话就不具备连续性。

Memory模块通常包括以下几个核心功能:

  1. 信息储存:能够高效存储多种形式的数据,包括事实、事件、规则和上下文信息,以便在需要时快速访问。

  2. 信息检索:支持根据特定查询或上下文快速检索相关信息,帮助agent在需要时做出准确的判断。

  3. 记忆更新:能够根据新的信息和经验动态更新存储内容,以反映环境或任务的变化。

  4. 记忆管理:包括老化机制和优先级管理,确保较重要的信息能够长期保留,而不再需要的信息可以被有效清除,以优化存储资源的使用。

CAMEL 中的Memory模块提供了一个灵活的系统,用于存储、检索和管理 Agent的信息。它使Agent能够在对话中维护上下文,并从过去的交互中检索相关信息,从而提高 AI 响应的连贯性和相关性。

2.6.2 ChatHistoryBlock

ChatHistoryBlock 是一个基于键值存储的聊天历史记忆块实现。

  • 使用键值存储后端(BaseKeyValueStorage)

  • 支持窗口式检索

  • 实现消息权重衰减机制

    初始化参数

  • storage: 存储后端,默认使用InMemoryKeyValueStorage

  • keep_rate: 历史消息权重衰减率,默认 0.9

    该模块主要实现了以下方法:

  • retrieve():使用可选的窗口大小获取最近的聊天记录

  • write_records():将新记录写入聊天记录

  • clear():删除所有聊天消息

keep_rate概述

keep_rate是 CAMEL 记忆系统中用于控制历史消息权重衰减的重要参数。它主要用于调整历史消息在上下文中的重要性。

  • 取值范围: [0,1]

  • 默认值: 0.9

  • 作用对象: 非system消息(system消息始终保持 score=1.0)

它的工作原理是在检索历史消息时:

  1. 最新消息的 score 初始值为 1.0

  2. 每往前一条消息,score 会乘以 keep_rate

  3. 最终每条消息的 score 值决定了其在上下文中的重要性

现在假设有5条历史消息,keep_rate=0.9:

消息位置Score 计算最终 Score
最新消息1.01.0
往前1条1.0 * 0.90.9
往前2条0.9 * 0.90.81
往前3条0.81 * 0.90.729
往前4条0.729 * 0.90.656

实际上,它的工作原理和我们人脑很像,我们对于近期的事情印象会更深刻,而对于久一些的事情反之。以下是一些值得注意的点:

  1. score 不影响消息的存储,但它会在总token数超过限制时决定哪些消息在生成下文时应该被保留。

  2. system消息不受 score 影响,也就是说在生成下文的时候,system_msg会一直保留。

  1. keep_rate 与 window_size 可以配合使用来更好地控制上下文

  2. 过低的 keep_rate 可能导致有价值的历史信息被过度弱化

  1. 过高的 keep_rate 可能导致上下文过于冗长

示例用法

我们可以通过以下例子直观感受keep_rate在ChatHistoryBlock中的作用。

from camel.memories.blocks import ChatHistoryBlock
from camel.memories.records import MemoryRecord
from camel.types import OpenAIBackendRole
from camel.messages import BaseMessage# 创建一个 ChatHistoryBlock 实例
chat_history = ChatHistoryBlock(keep_rate=0.8)# 模拟写入一些消息记录
chat_history.write_records([MemoryRecord(message=BaseMessage.make_assistant_message(role_name="user", content="Hello,今天感觉怎么样?"), role_at_backend=OpenAIBackendRole.USER),MemoryRecord(message=BaseMessage.make_user_message(role_name="assistant", content="我很好,谢谢!"), role_at_backend=OpenAIBackendRole.ASSISTANT),MemoryRecord(message=BaseMessage.make_user_message(role_name="user", content="你能做些什么?"), role_at_backend=OpenAIBackendRole.USER),MemoryRecord(message=BaseMessage.make_assistant_message(role_name="assistant", content="我可以帮助你完成各种任务。"), role_at_backend=OpenAIBackendRole.ASSISTANT),
])# 检索最近的 3 条消息
recent_records = chat_history.retrieve(window_size=4)for record in recent_records:print(f"消息: {record.memory_record.message.content}, 权重: {record.score}")>>>
消息: hello,你怎么样?, 权重: 0.40960000000000013
消息: 我很好,谢谢!, 权重: 0.5120000000000001
消息: 你能做些什么?, 权重: 0.6400000000000001
消息: 我可以帮助你完成各种任务。, 权重: 0.8

2.6.3 VectorDBBlock

VectorDBBlock 是一个基于向量数据库的语义记忆块实现。有关向量的部分可以参考第五章。

  • 使用向量存储后端(BaseVectorStorage

  • 支持语义相似度检索

  • 实现消息的向量化存储

初始化参数

  • storage:可选 BaseVectorStorage (默认:QdrantStorage)

  • embedding:可选 BaseEmbedding(默认值:OpenAIEmbedding)

该模块主要实现了以下方法:

  • retrieve():根据关键字获取相似记录

  • write_records():将新记录转换并写入矢量数据库

  • clear():从向量数据库中删除所有记录

该模块的工作流程如下:

  1. 存储过程:

    • 将消息内容转换为向量表示

    • 生成唯一标识符(UUID)

    • 将向量和原始消息存入向量数据库

  2. 检索过程:

    • 将查询关键词转换为向量

    • 在向量空间中搜索相似向量

    • 返回相似度最高的记录

示例用法

这里如果不定义VectorDBBlock中的embedding参数的话,则会调用默认的OpenAI的text-embedding-3-small模型,需要对应的OpenAI的API KEY,贴心的是,CAMEL也为我们提供了一个方便快捷的方式去一键调用我们的本地embedding模型,只需要导入SentenceTransformerEncoder,然后根据场景选择我们想用的embedding模型(默认为intfloat/e5-large-v2),这里是中文场景,笔者选择了bge-m3作为我们的embedding模型,模型的选择以及更多相关信息可以参考Hugging Face(embedding_model)以及我们的Embedding章节。

from camel.memories.blocks.vectordb_block import VectorDBBlock
from camel.memories.records import MemoryRecord
from camel.messages import BaseMessage
from camel.embeddings import SentenceTransformerEncoder
from camel.types import OpenAIBackendRole# 创建一个 VectorDBBlock 实例
vector_db_block = VectorDBBlock(embedding=SentenceTransformerEncoder(model_name="BAAI/bge-m3"))# 创建一些示例聊天记录
records = [MemoryRecord(message=BaseMessage.make_user_message(role_name="user", content="今天天气真好!"), role_at_backend=OpenAIBackendRole.USER),MemoryRecord(message=BaseMessage.make_user_message(role_name="user", content="你喜欢什么运动?"), role_at_backend=OpenAIBackendRole.USER),MemoryRecord(message=BaseMessage.make_user_message(role_name="user", content="今天天气不错,我们去散步吧。"), role_at_backend=OpenAIBackendRole.USER),
]# 将记录写入向量数据库
vector_db_block.write_records(records)# 使用关键词进行检索
keyword = "天气"
retrieved_records = vector_db_block.retrieve(keyword=keyword, limit=3)for record in retrieved_records:print(f"UUID: {record.memory_record.uuid}, Message: {record.memory_record.message.content}, Score: {record.score}")
>>>
UUID: f7519828-afe7-41e4-8331-7bbc4d7dcbd5, Message: 今天天气真好!, Score: 0.779863416845349
UUID: 0fbab391-f0e0-4580-877b-8fa2a837675b, Message: 今天天气不错,我们去散步吧。, Score: 0.6920892191464151
UUID: a640cf33-987b-4b52-ac2b-a987dd474e4e, Message: 你喜欢什么运动?, Score: 0.534536213348924

2.6.4 CAMEL中的具体实践

在CAMEL中目前支持key_value,graph,vector三种形式对于LLM信息进行存储,以供需要的时候检索。大模型生成自然语言文本的核心原理是基于预测。具体来说,语言模型的主要任务是根据给定的上下文预测下一个词。

CAMEL中主要会使用两个chat_history以及context两个数据结构处理记忆信息。其中Chat_history用于规范agent使用过程中的聊天记录,context部分用于从chat_history中获取上下文,由于模型有输入token的限制,因此如何从记录中获取到足够有效且重要的上下文并提供给模型至关重要。CAMEL通过权重的机制从chat_history中筛选重要的部分组成context,从而保证决策能力的有效性。

下面使用一个案例演示一下CAMEL中memory的实现,我们首先创建一个memory对象,之后创建一个agent,并将memory对象赋值给agent的memory属性。

from camel.memories import (LongtermAgentMemory,MemoryRecord,ScoreBasedContextCreator,ChatHistoryBlock,VectorDBBlock,
)
from camel.messages import BaseMessage
from camel.types import ModelType, OpenAIBackendRole
from camel.utils import OpenAITokenCounter
from camel.embeddings import SentenceTransformerEncoder# 1. 初始化内存系统
memory = LongtermAgentMemory(context_creator=ScoreBasedContextCreator(token_counter=OpenAITokenCounter(ModelType.GPT_4O_MINI),token_limit=1024,),chat_history_block=ChatHistoryBlock(),vector_db_block=VectorDBBlock(embedding=SentenceTransformerEncoder(model_name="BAAI/bge-m3")),
)# 2. 创建记忆记录
records = [MemoryRecord(message=BaseMessage.make_user_message(role_name="User",content="什么是CAMEL AI?"),role_at_backend=OpenAIBackendRole.USER,),MemoryRecord(message=BaseMessage.make_assistant_message(role_name="Agent",content="CAMEL-AI是第一个LLM多智能体框架,并且是一个致力于寻找智能体 scaling law 的开源社区。"),role_at_backend=OpenAIBackendRole.ASSISTANT,),
]# 3. 写入记忆
memory.write_records(records)context, token_count = memory.get_context()print(context)
print(f'token消耗: {token_count}')>>>
[{'role': 'user', 'content': '什么是CAMEL AI?'}, {'role': 'assistant', 'content': 'CAMEL-AI是第一个LLM多智能体框架,并且是一个致力于寻找智能体 scaling law 的开源社区。'}]
token消耗: 52

我们首先直接调用agent试一下:

from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
import os
from dotenv import load_dotenvload_dotenv()
# 定义系统消息
sys_msg = "你是一个好奇的智能体,正在探索宇宙的奥秘。"# 初始化agent 调用在线Qwen/Qwen2.5-72B-Instruct
api_key = os.getenv('QWEN_API_KEY')model = ModelFactory.create(model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL,model_type="Qwen/Qwen2.5-72B-Instruct",url='https://api-inference.modelscope.cn/v1/',api_key=api_key
)
agent = ChatAgent(system_message=sys_msg, model=model)# 定义用户消息
usr_msg = "告诉我基于我们讨论的内容,哪个是第一个LLM多智能体框架?"# 发送消息给agent
response = agent.step(usr_msg)# 查看响应
print(response.msgs[0].content)>>>
"截至目前(2023年),还没有一个明确被广泛认可为“第一个”LLM多智能体框架的具体项目或平台。然而,随着大语言模型(LLMs)和多智能体系统研 
究的快速发展,一些早期尝试将这两者结合起来的项目可以被视为先驱。例如,“AgentVerse”是一个基于大语言模型的多智能体框架,它允许不同的AI代理相互交互以完成任务或解决问题。虽然不能确切地说它是第一个,但
它确实是在这一领域较早进行探索的一个例子。此外,还有其他一些研究和项目也在探索如何利用LLMs构建多智能体系统,比如通过模拟社会动态、协作解决问题等。这些工作都在不同程度上推动了
该领域的进步。如果您有更具体的时间范围或其他标准来定义“第一个”,请提供更多信息,这样我可以尝试给出更加准确的答案。"

之后我们将之前设定的memory赋值给agent:

# 将memory赋值给agent
agent.memory = memory
# 发送消息给agent
response = agent.step(usr_msg)
# 查看响应
print(response.msgs[0].content)
>>>
"基于我们讨论的内容,CAMEL-AI 是第一个基于大型语言模型(LLM)的多智能体框架。"

可以看到我们新创建的智能体就能够根据设定好的记忆来回答问题了。

相关文章:

Memory模块是agent的一个关键组件

Memory 2.6.1 简介 在Agent系统中,Memory模块是一个关键的组件,其主要功能是存储和检索信息,以支持agent的学习和决策过程。该模块模拟人类记忆的某些特征,能够动态地保存和更新信息,使agent能够利用过去的经验进行推…...

初级社会工作者考试难点总结

初级社会工作者考试难点总结 初级社会工作者(助理社会工作师)考试是进入社会工作行业的入门级资格认证,考试内容涵盖社会工作理论、实务技能及相关法规政策。虽然考试难度相对适中,但部分知识点和题型仍让考生感到棘手。本文总结…...

mapbox进阶,手写放大镜功能

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀手写放大镜功能1. ☘️实现思路2. ☘️…...

EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案

一、方案概述​ 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题,而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术,打造稳定低延迟通信,满足基础通信…...

微信小程序中,解决lottie动画在真机不显示的问题

api部分 export function getRainInfo() {return onlineRequest({url: /ball/recruit/getRainInfo,method: get}); }data存储json数据 data:{rainJson:{} }onLoad方法获取json数据 onLoad(options) {let that thisgetRainInfo().then((res)>{that.setData({r…...

基于Flink的数据中台管理平台

基于Flink做的数据中台工程项目。数据从source到clickhouse全流程的验证。集成元数据管、数据资产、数据发现功能,自主管理元数据变更,集成元数据版本管理。 同时,对整个大数据集群使用到的组件或者是工具进行管理。比如nacos、kafka、zookee…...

Flink-Yarn运行模式

Yarn的部署过程 Yarn上部署的过程是:客户端把Flink应用提交给Yarn的ResourceManager,Yarn的ResourceManager会向Yarn的NodeManager申请容器,在这些容器上,Flink会部署JobManager和TaskManager的实例,从而启动集群,Flin…...

Java---斐波那契那数列

一、斐波那契数列的定义与起源 1. 数学定义 斐波那契数列(Fibonacci Sequence)又称黄金分割数列,其定义为: 初始项: F(0)0F(1)1 递推公式: 当 n≥2 时,F(n)F(n−1)F(n−2) 前 10 项数列&…...

通过AIoTedge或ThingsKit物联网平台内置的Node-RED读取OPC-UA

《通过AIoTedge或ThingsKit物联网平台内置的Node-RED读取OPC-UA》 一、引言 随着工业物联网(IIoT)的快速发展,设备之间的互联互通变得至关重要。OPC-UA(Open Platform Communications Unified Architecture)作为一种…...

《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》

开源智能体大模型的核心魅力,在于它构建起了一个全球开发者共同参与的超级协作网络。想象一下,来自世界各个角落的开发者、研究者,无论身处繁华都市还是偏远小镇,只要心怀对技术的热爱与追求,就能加入到这场技术狂欢中…...

genicamtl_lmi_gocator_objectmodel3d

目录 一、在halcon中找不到genicamtl_lmi_gocator_objectmodel3d例程二、在halcon中运行genicamtl_lmi_gocator_objectmodel3d,该如何配置三、代码分段详解(一)传感器连接四、代码分段详解(二)采集图像并显示五、代码分…...

Node.js 24发布:性能与安全双提升

在科技的迅速发展中,Node.js作为一个备受青睐的开源跨平台Java运行环境,近日迎来了其24.0版本的正式发布。此次更新不仅承诺提升性能和安全性,还为开发者提供了更为顺畅的开发体验,值得我们深入探讨。 Node.js 24.0的最大亮点之一…...

是德科技 | 单通道448G未来之路:PAM4? PAM6? PAM8?

内容来源:是德科技 随着数据中心规模的不断扩大以及AI大模型等技术的兴起,市场对高速、大容量数据传输的需求日益增长。例如,AI训练集群中GPU等设备之间的互联需要更高的传输速率来提升效率。在技术升级方面,SerDes技术的不断进步…...

Dify智能体开发实践

1.聊天助⼿:创建技术⽀持问答机器⼈,通过提示词约束回答范围并引导追问澄清。 1.提示词 (1)技术支持机器人提示词 你是一位专业的技术支持机器人,专门为公司的各类技术产品和服务提供支持。你的回答范围严格限制在以下…...

网络安全之APP渗透测试总结

1、脱壳 360免费版加固,frida-dexdump、blackdex都可以脱掉。这里就不演示了 GitHub - hluwa/frida-dexdump: A frida tool to dump dex in memory to support security engineers analyzing malware. 2、密码泄露 经过对app登录界面,有对密码强度进行…...

笔记:NAT

一、NAT 的基本概念 NAT(Network Address Translation,网络地址转换) 是一种在 IP 网络中重新映射 IP 地址的技术,主要用于解决 IPv4 地址短缺问题,同时提供一定的网络安全防护作用。 功能: 将内部网络&am…...

民锋视角下的多因子金融分析模型实践

在当前金融市场环境中,数据粒度与因子建模逐渐成为提升交易系统稳定性的重要方式。民锋长期专注于模型优化与策略深度挖掘,提出了一套适用于中短周期的数据判断体系,核心在于“多因子融合动态调权”。 具体而言,民锋的分析框架常…...

ThinkPHP 根据路由文件获取路由列表

定义一个路由变量 比如我们要获取admin的路由 $routeFile "admin.php"; 清除路由 调用 Route::clear() 方法,清除当前已定义的所有路由。 Route::clear();设置路由懒加载 调用 Route::lazy(false) 方法,禁用路由的懒加载功能,选择立即加…...

算法打卡第三天

10.长度最小的子数组 (力扣209题) 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子…...

04_spring容器管理单例多例

文章目录 1. 单例(Singleton)2. 多例(Prototype)3. 使用场景4. 注意事项 在Spring框架中,Spring容器负责创建、配置和管理应用程序中的bean。关于单例(Singleton)和多例(Prototype&a…...

算法C++最大公约数

原理 代码实现 #include <stdio.h>// 递归版本 int gcd_recursive(int a, int b) {if (b 0) return a; // 终止条件&#xff1a;余数为0时&#xff0c;除数即为GCDreturn gcd_recursive(b, a % b); // 递归调用&#xff0c;更新为(b, a%b) }// 迭代版本 int gcd_iterat…...

在 Ubuntu 下通过 C APP程序实现串口发送数据并接收返回数据

一、前言 使用 C 应用进行串口调用需要手动配置串口的各项参数&#xff0c;并且 Ubuntu 下的串口是通过读写文件实现的&#xff0c;所以还需要设置权限。 二、源码分析 serial.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <…...

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧&#xff0c;用mainline工具安装新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…...

ubuntu22.04上运行opentcs6.4版本

1、下载github上的源码&#xff1a; openTCS - Downloads 2、安装java21 我的版本是&#xff1a;java --version java 21.0.6 2025-01-21 LTS Java(TM) SE Runtime Environment (build 21.0.68-LTS-188) Java HotSpot(TM) 64-Bit Server VM (build 21.0.68-LTS-188, mixed mo…...

labelme进行关键点标注并转换为yolo格式

目录 1、labelme安装和打开2、边界框和关键点标注3、将lamelme的json格式转成yolo可以使用的txt格式4、将数据和标签按照9比1分为训练集和测试集 1、labelme安装和打开 在python3.9及以上环境中安装labelme&#xff0c;labelme要用到pyqt&#xff0c;所以在使用labelme之前要安…...

每日算法-250521

每日算法学习 大家好&#xff01;这是我今天的算法练习记录&#xff0c;分享四道 LeetCode 题目的解题思路和代码。希望能对大家有所帮助&#xff01; 219. 存在重复元素 II 题目 思路 哈希表 利用哈希表来存储数组中元素及其最近出现的索引。 解题过程 当我们遍历数组 num…...

正大模型视角下的高频交易因子构建策略研究

正大模型视角下的高频交易因子构建策略研究 在金融衍生品交易体系中&#xff0c;数据主导型模型逐渐成为核心竞争力。以正大为代表的量化团队&#xff0c;通过大量历史数据研究&#xff0c;构建出一套基于高频因子的模型框架&#xff0c;从成交节奏、盘口行为、价格波动等维度动…...

Babylon.js学习之路《八、动画基础:关键帧动画与缓动效果》

文章目录 1. 引言&#xff1a;动画在3D场景中的核心作用2. 关键帧动画基础2.1 键帧动画原理2.2 创建简单关键帧动画 3. 缓动函数&#xff08;Easing Functions&#xff09;3.1 缓动函数的作用3.2 应用缓动函数 4. 复杂动画&#xff1a;多属性联动与序列控制4.1 同时控制位置、旋…...

小满未满,是成长的序章

节气小满&#xff0c;昭示着奋斗正当时&#xff0c;Codigger 怀揣热忱&#xff0c;在代码的天地里披荆斩棘&#xff0c;向着圆满目标大步迈进 。...

JavaWeb 开发流程

项目建立 SpringBoot框架构建 Spring Boot 是基于 Spring 框架的开源 Java 基础框架&#xff0c;用于创建独立、生产级的基于 Spring Framework 的应用程序。 我们可以使用IDEA建立SpringBoot框架。 语言选择Java&#xff0c;类型选择Maven&#xff0c;JDK和Java要保持一致&…...

Cmake 使用教程

介绍 CMake 是一个开源、跨平台的构建系统&#xff0c;主要用于软件的构建、测试和打包。CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程&#xff0c;并生成适用于不同编译器环境的项目文件。例如&#xff0c;它可以生成 Unix 系统的 Makefile 、 Win…...

CLIP、ViLT 与 LLaVA:多模态模型是如何看图说话的?

一、前言&#xff1a;我们已经讲了 MLLM 能力&#xff0c;但它到底是怎么实现“看图说话”的&#xff1f; 在之前文章中&#xff0c;我们已经提到了MLLM可以看图说话以及文生图等能力&#xff0c;ViT统一图文多模态架构。那模型是如何处理图文信息以及不同处理所带来的能力是怎…...

基于Springboot + vue3实现的流动摊位管理系统

项目描述 本系统包含管理员、用户、商家三个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。 权限管理&#xff1a;分配和管理…...

我的软考经历

说明&#xff1a;本文分享博主软考经验&#xff0c;及软考证书在找工作时的作用。 软考 软考&#xff0c;全称&#xff1a;中国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;报名/考试/查询网址为&#xff0c;中国计算机技术职业资格网 考试分…...

C++的异常

引入&#xff1a;异常的意义是什么&#xff1f; ①&#xff1a;错误分离 将正常逻辑&#xff08;try&#xff09;与错误处理&#xff08;catch&#xff09;分离&#xff0c;避免代码被大量 if-else 污染。 ②&#xff1a;强制处理 若不捕获异常&#xff0c;程序终止&#xff0c…...

精益制造数字化转型智能工厂三年规划建设方案

该文档是精益制造数字化转型智能工厂三年规划建设方案,以打造高品质、低成本、柔性化的绿色智能工厂为愿景,围绕制造技术、自动化、数智化、管理赋能四大路径,通过夯实 EHS、品质一致性、生产安定化、现场整洁四大基石,推进标杆车间打造、联合管理、TOB 流程改善等专项。规…...

Linux 文件(3)

文章目录 1. Linux下一切皆文件2. 文件缓冲区2.1 缓冲区是什么2.2 缓冲区的刷新策略2.3 为什么要有缓冲区2.4 一个理解缓冲区刷新的例子 3. 标准错误 1. Linux下一切皆文件 在刚开始学习Linux的时候&#xff0c;我们就说Linux下一切皆文件——键盘是文件&#xff0c;显示器是文…...

Java异步编程利器:CompletableFuture 深度解析与实战

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、CompletableFuture 概述 CompletableFuture是Java 8引入的异步编程工具类&#xff0c;实现了Future和CompletionStage接口&#xff0c;支持链式调用、组…...

如何支持Enhanced RTMP H.265(HEVC)

在实时音视频传输中&#xff0c;H.264长期占据主流&#xff0c;但随着视频质量要求的不断提高和带宽压力的加大&#xff0c;H.265&#xff08;HEVC&#xff09;作为下一代视频编码标准逐渐崭露头角。 在这种背景下&#xff0c;我们顺应行业发展趋势&#xff0c;成功集成了对Enh…...

Idea 查找引用jar包依赖来源的Maven pom坐标

目录 问题引入 实现解决 问题引入&#xff1a; 在查看拉取的项目&#xff0c;维护自己项目、或者迁移原有项目时&#xff0c;会遇到不知道代码中引用到的依赖从哪里引用到的。 所以利用Idea&#xff0c;从import语句到Maven项目结构树中查找&#xff0c;最终找到pom文件里的…...

Linux操作系统之进程(二):进程状态

目录 前言 一、补充知识点 1、并行与并发 2、时间片 3、 等待的本质 4、挂起 二. 进程的基本状态 三、代码演示 1、R与S 2、T 3、Z 四、孤儿进程 总结&#xff1a; 前言 在操作系统中&#xff0c;进程是程序执行的基本单位。每个进程都有自己的状态&#xff0c;这些…...

web.py使用时报错AttributeError: No template named image_window

在使用python的web.py框架做前后端时遇到问题。 问题代码主要如下&#xff0c;当加上main(iamge_name)这行代码后就会报错。报错信息包含两个&#xff1a;第一是找不到image_window模板&#xff1b;第二是gbk无法解码... class ImageWindow:def GET(self, image_name):main(i…...

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p42178 过去一年&#xff0c;消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元&#xff0c;实物商品网零额占比27%&#xff0c;线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…...

全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!

Readest是一款好用的免费阅读工具&#xff0c;界面干净不花哨&#xff0c;特别适合喜欢专心读书的朋友。这个软件是经典阅读软件Foliate的全新升级版本&#xff0c;用最新技术开发&#xff0c;能在手机、电脑&#xff08;包括苹果和Windows系统&#xff09;以及网页上顺畅使用。…...

创建Workforce

创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce&#xff0c;首先需要创建一个 Workforce 实例。下面是最简单的示例&#xff1a; from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...

关于光谱相机的灵敏度

一、‌灵敏度的核心定义‌ ‌光谱灵敏度&#xff08;单色灵敏度&#xff09;‌ 描述光谱相机对单色辐射光的响应能力&#xff0c;即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如&#xff0c;若在680nm波长下的光谱灵敏度较高&#xff0c;则表示该相机对此…...

【Redis】二、Redis常用数据类型命令学习

目录 一、String 1. SET、GET&#xff1a;设置与读取键值对&#xff1a; 2. DEL&#xff1a;删除键 3. INCR、DECR&#xff1a;自增 / 自减&#xff08;常用于计数器&#xff09; 4. APPEND&#xff1a;内容追加 5. EXPIRE&#xff1a;设置过期时间 / 查看剩余时间&#x…...

HarmonyOS基础组件:Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能&#xff0c;这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说&#xff0c;功能比较丰富&#xff0c;扩展性高&#xff0c;减…...

RT_Thread——快速入门

文章目录 一、RT-Thread 目录结构二、核心文件三、移植时涉及的文件3.1 CPU 部分3.2 BSP 部分 四、内存管理五、启动流程及main函数5.1 启动流程5.2 关键函数速览5.3 main 函数示例 六、数据类型和编程规范6.1 数据类型6.2 函数名6.3 结构体定义6.4 注释规范 七、使用模拟器运行…...

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递&#xff1f; 答案是&#xff1a;值传递。 今天排查一个生产问题&#xff0c;数据库链接资源没有关闭。 大致代码逻辑如下&#xff1a; try{Preparestatement ps null;String sql "select * from tableA wher…...