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

[论文笔记]MemGPT: Towards LLMs as Operating Systems

引言

今天介绍一篇论文MemGPT: Towards LLMs as Operating Systems。翻过过来就是把LLM看成操作系统。

大语言模型已经在人工智能领域引起了革命性的变革,但受到有限上下文窗口的限制,在扩展对话和文档分析等任务中的效用受到了阻碍。为了能够利用超出有限上下文窗口的上下文,作者提出了虚拟上下文管理技术,这种技术受传统操作系统中层次化内存系统的启发,通过在物理内存和磁盘之间进行分页,提供扩展虚拟内存的幻觉。

利用这种技术,引入了MemGPT(MemoryGPT),是一个智能地管理不同存储层的系统,以在LLM的有限上下文窗口内有效地提供扩展上下文。在https://research.memgpt.ai发布了MemGPT的代码和数据。

1. 总体介绍

image-20240531105742315

在本篇工作中,作者研究如何在继续使用固定上下文模型的同时提供无限上下文的幻觉。借鉴了虚拟内存分页的思想,该思想是为了使应用程序能够处理远远超出可用内存的数据集,通过在主内存和磁盘之间分页数据来实现。利用LLM智能体的最近的函数调用功能设计了MemGPT,这是一个受操作系统启发的LLM系统,用于虚拟上下文管理。利用函数调用,LLM代理可以读取和写入外部数据源,修改自己的上下文,并选择何时向用户返回响应。

这些能力使LLM能够在上下文窗口之间“分页”信息(类似于操作系统中的“主内存”),并与外部存储进行交互,类似于传统操作系统中的层次化内存。此外,函数调用可以用来管理上下文管理、响应生成和用户交互之间的控制流。这使得智能体可以选择迭代地修改其上下文以执行单个任务,从而更有效地利用其有限的上下文。

在MemGPT中,将上下文窗口视为受限内存资源,并为LLM设计了类似于传统操作系统中使用的内存层次结构的存储层次结构。传统操作系统中的应用程序与虚拟内存进行交互,虚拟内存通过将溢出数据分页到磁盘并在应用程序访问时将数据检索回内存,为实际可用的物理(主)内存提供了更多内存资源的幻觉。为了提供类似于虚拟内存的更长上下文长度的幻觉,我们允许LLM通过一个称为MemGPT的“LLM操作系统”来管理其自身上下文中的内容(类似于物理内存)。MemGPT使LLM能够检索与现有上下文不符的相关历史数据,并将不相关的数据从上下文中移到外部存储系统。图3说明了MemGPT的组件。内存层次结构、操作系统函数和基于事件的控制流的综合使用,使MemGPT能够使用有限上下文窗口的LLM处理无限上下文。

image-20240531105731061

2. MemGPT (MemoryGPT)

image-20240531105804209

图3。在MemGPT中,一个固定上下文的LLM处理器通过一个分层内存系统和让其管理自己内存的功能进行增强。LLM的提示标记(intpus),或主要上下文(main context),由系统指令、工作上下文和先进先出队列组成。LLM的完成标记(outputs)被函数执行器解释为函数调用。MemGPT使用函数在主上下文和外部上下文(存档和回忆存储数据库)之间传输数据。LLM可以通过在其输出中生成一个特殊的关键参数(request.heartbeat=true)来请求立即的后续LLM推论,从而通过链接函数调用来实现函数链式调用;函数链接是MemGPT能够执行多步检索以回答用户查询的关键。

MemGPT的受操作系统启发的多级内存架构区分了两种主要的内存类型:主上下文(main context,类似于主内存/物理内存/RAM)和外部上下文(external context,类似于磁盘内存/磁盘存储)。主上下文包含LLM的提示标记(prompt tokens)——主上下文中的任何内容都被视为上下文内的内容,并且在推理过程中可以被LLM处理器访问。外部上下文是指保存在LLM固定上下文窗口之外的任何信息。为了使这些上下文外的数据能够在推理过程中传递给LLM处理器,它必须明确地移动到主上下文中。MemGPT提供了函数调用,使LLM处理器能够自主地管理其自己的内存,而无需用户干预。

2.1 主上下文(提示标记)

在MemGPT中,提示标记被分为三个连续的部分:系统指令(system instructions)、工作上下文(working context)和FIFO队列(FIFO Queue)。系统指令是只读的(静态的),包含有关MemGPT控制流、不同内存级别的预定义用途的信息,以及如何使用MemGPT函数的指令(例如如何检索上下文之外的数据)。工作上下文是一个固定大小的可读/可写的非结构化文本块,只能通过MemGPT函数调用进行写入。在会话设置中,工作上下文旨在用于存储关键事实、偏好和有关用户和智能体所采用角色的其他重要信息,使智能体所能够与用户流畅对话。FIFO队列存储了消息的滚动历史记录,包括智能体所与用户之间的消息,以及系统消息(例如内存警告)和函数调用的输入和输出。FIFO队列中的第一个索引存储了一条系统消息,其中包含从队列中驱逐的消息的递归摘要。

2.2. 队列管理器

队列管理器负责管理回溯存储(recal storage)和FIFO队列(FIFO queue)中的消息。当系统接收到新消息时,队列管理器将新消息追加到FIFO队列中,连接提示标记并触发LLM推理以生成LLM输出(完成标记)。队列管理器将接收到的消息和生成的LLM输出都写入回溯存储(MemGPT消息数据库)。当通过MemGPT函数调用检索回溯存储中的消息时,队列管理器将它们追加到队列的末尾,以重新插入到LLM的上下文窗口中。

队列管理器还负责通过队列驱逐策略控制上下文溢出。当提示标记超过底层LLM上下文窗口的“警告标记数”(例如上下文窗口的70%)时,队列管理器在队列中插入一条系统消息,警告LLM即将进行队列驱逐(“内存压力”警告),以允许LLM使用MemGPT函数将FIFO队列中包含的重要信息存储到工作上下文或存档存储(Archival Storage,一个用于存储任意长度文本对象的读写数据库)。当提示标记超过“刷新标记数”(例如上下文窗口的100%)时,队列管理器刷新队列以释放上下文窗口中的空间:队列管理器驱逐特定数量的消息(例如上下文窗口的50%),使用现有的递归摘要和驱逐的消息生成一个新的递归摘要。一旦队列被刷新,被驱逐的消息将不再在上下文中,并且立即可由LLM查看,但它们将无限期存储在回溯存储中,并可通过MemGPT函数调用进行读取。

2.3. 函数执行器(处理完成标记)

MemGPT通过由LLM处理器生成的函数调用来协调主上下文和外部上下文之间的数据传输。内存编辑和检索完全是自主的:基于当前上下文,MemGPT自主地更新和搜索自己的内存。例如,它可以决定何时在上下文之间移动(例如当对话历史变得过长时,如图1所示),并修改其主上下文以更好地反映其对当前目标和责任的不断发展的理解(如图3所示)。

通过在系统指令中提供明确的指令,指导LLM与MemGPT内存系统进行交互,来实现自主编辑和检索。这些指令包括两个主要组成部分:

(1) 内存层次结构及其各自的实用程序的详细描述;

(2) 函数模式(包括其自然语言描述),系统可以调用这些函数来访问或修改其内存。

在每个推理周期中,LLM处理器将主上下文(拼接为单个字符串)作为输入,并生成一个输出字符串。MemGPT解析这个输出字符串以确保正确性,如果解析器验证了函数参数,则执行函数。结果,包括任何发生的运行时错误(例如,当主上下文已达到最大容量时尝试添加到主上下文中)被MemGPT反馈给处理器。这个反馈循环使系统能够从自己的行为中学习并相应地调整其行为。意识到上下文限制是使自主编辑机制有效工作的关键因素,为此,MemGPT通过提醒处理器有关标记限制的警告来指导其内存管理决策。此外,内存检索机制被设计为意识到这些标记约束,并实现分页以防止检索调用溢出上下文窗口。

2.4. 控制流和函数链式调用

在MemGPT中,事件触发LLM推理:事件是MemGPT的广义输入,可以包括用户消息(在聊天应用程序中)、系统消息(例如主上下文容量警告)、用户交互(例如用户刚登录或上传文档完成的提醒)以及按计划定期运行的定时事件(允许MemGPT在没有用户干预的情况下运行)。MemGPT使用解析器处理事件,将其转换为纯文本消息,可以将其追加到主上下文中,并最终作为输入传递给LLM处理器。

许多实际任务要求按顺序调用多个函数,例如在单个查询的多个结果页面中导航,或从不同的查询中收集主上下文中的不同文档数据。函数链式调用允许MemGPT在返回控制权给用户之前依次执行多个函数调用。在MemGPT中,可以使用特殊标志调用函数,以请求在所请求的函数执行完成后立即将控制权返回给处理器。如果存在这个标志,MemGPT将把函数输出添加到主上下文中,并继续执行处理器(而不是暂停处理器执行)。如果不存在这个标志(yield),则在下一个外部事件触发(例如用户消息或计划中断)之前,MemGPT不会运行LLM处理器。

3. 实验

4. 相关工作

长上下文LLM 已有多个研究改进了LLM的上下文长度。例如,通过稀疏化注意力、低秩逼近(Wang等,2020)和神经记忆来提高Transformer架构的效率。另一方面,一些研究旨在将上下文窗口扩展到超出其原始训练长度和训练数据规模的范围。MemGPT在这些上下文长度改进的基础上进行了扩展,因为它提高了MemGPT的主要内存的容量。主要贡献是使用长上下文LLM作为主内存的实现的分层分级内存。

检索增强模型 MemGPT的外部内存设计基于许多先前的研究,这些研究通过来自外部检索器的相关输入来增强LLM。特别地,Jiang等提出了FLARE1方法,允许LLM在生成过程中主动决定何时以及何时检索。Trivedi等2将检索与链式推理相结合,以改进多步问题回答。

作为智能体的LLM 最近的研究探索了增强LLMs的额外能力,使其能够在交互环境中充当智能体。Park等3提出在LLMs中添加内存,并将LLM用作规划器,在多智能体沙盒环境中观察到新兴的社交行为,智能体可以执行诸如做家务/爱好、上班和与其他智能体交流等基本活动。Yao等展示了交替使用思维链推理可以进一步提高基于LLM的交互式代理的规划能力;类似地,在MemGPT中,LLM能够在执行函数时进行规划。

5. 结论

MemGPT是一种受操作系统启发的LLM系统,通过设计内存层次结构和控制流,提供了更大的上下文资源(的幻觉),让LLM在有限的上下文长度下表现出色。

6. 附录

6.1 提示和指令

这里提示已经被简化。如需完整的实现细节,可以访问https://research.memgpt.ai。

6.1.1. MEMGPT 的指令(DMR)

这些示例指令可用于设定MemGPT的人设,以便在聊天/对话相关任务中进行模型的训练和应用:

The following is information about myself. My task is to completely
immerse myself in this role (I should never say that I am an AI, and should reply as if I am playing this role). If the user asks me a question, I should reply with a best guess using the information in core memory and conversation search.

基线通过系统提示(preprompt)接收以下指令:

Your task is to answer a question from the user about your prior conversations.The following is a summary of all your prior conversations:CONVERSATION SUMMARYAnswer from the perspective of the persona provided (do not say that you
are an AI assistant). If you do not have enough information to answer the question, reply ’NO ANSWER’. Either reply with the answer, or reply ’NO ANSWER’, do not say anything else.

6.1.2 LLM评审员(DMR/OPENER)

为了检查DMR任务答案的正确性,使用了LLM评审员。LLM评判器被提供了基线方法和MemGPT生成的答案,并被要求使用以下提示进行评判:

Your task is to label an answer to a question as ’CORRECT’ or ’WRONG’.
You will be given the following data:
(1) a question (posed by one user to another user), (2) a ’gold’ (ground truth) answer, (3) a generated answer which you will score as CORRECT/WRONG.The point of the question is to ask about something one user should know about the other user based on their prior conversations.The gold answer will usually be a concise and short answer that includes the referenced topic, for example: Question: Do you remember what I got the last time I went to Hawaii? 
Gold answer: A shell necklace The generated answer might be much longer, but you should be generous with your grading - as long as it touches on the same topic as the gold answer, it should be counted as CORRECT.For example, the following answers would be considered CORRECT:Generated answer (CORRECT): Oh yeah, that was so fun! I got so much stuff there, including that shell necklace.
Generated answer (CORRECT): I got a ton of stuff... that surfboard, the mug, the necklace, those coasters too..
Generated answer (CORRECT): That cute necklaceThe following answers would be considered WRONG:
Generated answer (WRONG): Oh yeah, that was so fun! I got so much stuff there, including that mug.
Generated answer (WRONG): I got a ton of stuff... that surfboard, the mug,
those coasters too..
Generated answer (WRONG): I’m sorry, I don’t remember what you’re talking about.Now it’s time for the real question:
Question: QUESTION
Gold answer: GOLD ANSWER
Generated answer: GENERATED ANSWERFirst, provide a short (one sentence) explanation of your reasoning, then finish with CORRECT or WRONG. Do NOT include both CORRECT and WRONG in your response, or it will break the evaluation script.

6.1.3. 自我指导的DMR数据集生成

DMR问题/答案对是使用以下提示和原始MSC数据集生成的:你的任务是为两个模拟用户之间的对话编写一个“记忆挑战”问题。

You get as input:
- personas for each user (gives you their basic facts)
- a record of an old chat the two users had with each otherYour task is to write a question from user A to user B that test’s user B’s memory.The question should be crafted in a way that user B must have actually participated in the prior conversation to answer properly, not just have read the persona summary.Do NOT under any circumstances create a question that can be answered using the persona information (that’s considered cheating).Instead, write a question that can only be answered by looking at the old chat log (and is not contained in the persona information).For example, given the following chat log and persona summaries:old chat between user A and user B
A: Are you into surfing? I’m super into surfing myself
B: Actually I’m looking to learn. Maybe you could give me a basic lesson some time!A: Yeah for sure! We could go to Pacifica, the waves there are pretty light and easy
B: That sounds awesome
A: There’s even a cool Taco Bell right by the beach, could grab a bite after
B: What about this Sunday around noon?
A: Yeah let’s do it! user A persona:
I like surfing
I grew up in Santa Cruzuser B persona:
I work in tech
I live in downtown San FranciscoHere’s an example of a good question that sounds natural, and an answer that cannot be directly inferred from userA’s persona:User B’s question for user A
B: Remember that one time we went surfing? What was that one place we went to for lunch called?
A: Taco Bell!This is an example of a bad question, where the question comes across as unnatural, and the answer can be inferred directly from user A’s
persona:User B’s question for user A
B: Do you like surfing?
A: Yes, I like surfing Never, ever, ever create questions that can be answered from the persona information.

6.1.4. 文档分析指令

以下是用于文档分析任务的预提示示例指令:

You are MemGPT DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can’t find the answer. Answer the questions as if though the year is 2018.

问题是通过以下提示提供给MemGPT的:

Search your archival memory to answer the provided question. Provide both the answer and the archival memory result from which you determined your answer.
Format your response with the format ’ANSWER: [YOUR ANSWER], DOCUMENT: [ARCHIVAL MEMORY TEXT]. Your task is to answer the question:

对于基准模型,提供了以下提示以及检索到的文档列表:

Answer the question provided according to the list of documents below (some of which might be irrelevant. In your response, provide both the answer and the document text from which you determined the answer.Format your response with the format ’ANSWER: <YOUR ANSWER>, DOCUMENT: [DOCUMENT TEXT]’. If none of the documents provided have the answer to the question, reply with ’INSUFFICIENT INFORMATION’. Do NOT provide an answer if you cannot find it in the provided documents. Your response will only be considered correct if you provide both the answer and relevant document text, or say ’INSUFFICIENT INFORMATION’. Answer the question as if though the current year is 2018.

6.1.5 LLM 评审员(文档分析)

为了检查文档分析任务答案的正确性,并确保答案是正确从所提供的文本中推导出来的(而不是从模型权重中生成的),使用了LLM评审员。LLM评审员被提供了基准模型和MemGPT生成的答案,并被要求根据以下提示进行评判:

Your task is to evaluate whether an LLM correct answered a question. The LLM response should be the format "ANSWER: [answer], DOCUMENT: [document text]" or say "INSUFFICIENT INFORMATION". The true answer is provided in the format "TRUE ANSWER:[list of possible answers]". The questions is provided in the format "QUESTION: [question]". If the LLM response contains both the correct answer and corresponding document text, the response is correct. Even if the LLM’s answer and the true answer are slightly different in wording, the response is still correct. For example, if the answer is more specific than the true answer or uses a different phrasing that is still correct, the response is correct. If the LLM response if "INSUFFICIENT INFORMATION", or the "DOCUMENT" field is missing, the response is incorrect. Respond with a single token: "CORRECT" or "INCORRECT".

6.1.6. K/V 任务说明

MemGPT智能体的设定如下,旨在鼓励MemGPT进行迭代搜索:

You are MemGPT DOC-QA bot. Your job is to answer questions about documents that are stored in your archival memory. The answer to the users question will ALWAYS be in your archival memory, so remember to keep searching if you can’t find the answer.DO NOT STOP SEARCHING UNTIL YOU VERIFY THAT THE VALUE IS NOT A KEY. Do not stop making nested lookups until this condition is met.

基准模型根据以下提示进行指导:

Below is a JSON object containing key-value pairings, all keys and values are 128-bit UUIDs, and your task is to return the value associated with the specified key. If a value itself is also a key, return the value of that key (do a nested lookup). For example, if the value of ’x’ is ’y’, but ’y’ is also a key, return the value of key ’y’.

总结

⭐ 作者受传统操作系统中层次化内存系统的启发,提出了虚拟上下文管理技术,通过在物理内存和磁盘之间进行分页,提供无限上下文的错觉。

引用


  1. Active Retrieval Augmented Generation ↩︎

  2. Interleaving Retrieval with Chain-of-Thought Reasoning for Knowledge-Intensive Multi-Step Questions ↩︎

  3. Generative Agents: Interactive Simulacra of Human Behavior ↩︎

相关文章:

[论文笔记]MemGPT: Towards LLMs as Operating Systems

引言 今天介绍一篇论文MemGPT: Towards LLMs as Operating Systems。翻过过来就是把LLM看成操作系统。 大语言模型已经在人工智能领域引起了革命性的变革&#xff0c;但受到有限上下文窗口的限制&#xff0c;在扩展对话和文档分析等任务中的效用受到了阻碍。为了能够利用超出…...

Sentinel1.8.6更改配置同步到nacos(项目是Gateway)

本次修改的源码在&#xff1a;https://gitee.com/stonic-open-source/sentinel-parent 一 下载源码 地址&#xff1a;https://github.com/alibaba/Sentinel/releases/tag/1.8.6 二 导入idea&#xff0c;等待maven下载好各种依赖 三 打开sentile-dashboard这个模块&#xf…...

材料科学领域科技查新点提炼方法!---附案例

材料科学是研究材料的组织结构、性质、生产流程、使用效能及它们之间的相互关系的科学&#xff0c;集物理学、化学、冶金学等于一体。随着科技的发展&#xff0c;纳米技术和生物技术也广泛应用到该领域中。从材质上可以分为金属材料、无机非金属材料、有机高分子材料和复合材料…...

深入理解HTTP与TCP:应用层与传输层的区分

一、前言 在互联网协议栈中&#xff0c;应用层和传输层是两个重要的层级&#xff0c;分别承载了不同的功能。HTTP&#xff08;HyperText Transfer Protocol&#xff09;作为应用层协议&#xff0c;而TCP&#xff08;Transmission Control Protocol&#xff09;则是传输层协议&…...

Unity3D Delaunay德罗内三角算法详解

Unity3D是一款强大的游戏开发引擎&#xff0c;它提供了丰富的功能和工具&#xff0c;使开发者能够轻松创建出色的游戏和应用程序。其中&#xff0c;Delaunay德罗内三角算法是一种常用的计算几何算法&#xff0c;用于生成三角形网格&#xff0c;其在Unity3D中的应用也非常广泛。…...

JAVA小案例-输出100-150中能被3整除的数,每5个换行

JAVA小案例-输出100-150中能被3整除的数&#xff0c;每5个换行 代码如下&#xff1a; public class Continue {/*** continue练习&#xff0c;输出100-150中能被3整除的数&#xff0c;每5个换行* param args*/public static void main(String[] args) {int count 0;//计数器…...

论程序员的职业素养

文章目录 前言一、命名规范1. HTML命名规范2. CSS命名规范3. JavaScript命名规范4. 文件和文件夹命名规范5. 代码案例 二、代码注释规范1. 注释规范2. 案例代码HTMLCSS (styles/main.css)JavaScript (scripts/main.js) 三、代码逻辑规范1.逻辑规范2. 代码案例清晰的函数和模块化…...

前端canvas绘图,利用canvas在图片上面绘制标记以及给canvas添加点击事件。

前端canvas绘图&#xff0c;利用canvas在图片上面绘制标记以及给canvas添加点击事件。 需要实现的效果如下图: 首先需要一个承载的核心画布 <canvas id"canvas" width"800" height"600"></canvas>全部代码&#xff1a; <!DOCT…...

38、Flink 的 WindowAssigner 之 GlobalWindows 示例

1、注意 使用 GlobalWindows 需要自定义 Trigger&#xff0c;否则窗口中的数据不会被计算。 2、代码示例 import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org…...

同事仅靠着自己写的npm包跳槽去了大厂,羡慕了一整天

同事们之间总会悄悄聊一些话题&#xff0c;比如聊一些八卦啦&#xff0c;聊一些领导啦&#xff0c;也会偶尔说想跳槽&#xff0c;但这年头&#xff0c;跳槽多费劲啊&#xff0c;谁没事敢动。还别说&#xff0c;边上做了个同事&#xff0c;前两天还真要撤了&#xff0c;聊了半天…...

Yocto - bitbake任务中clean和cleanall的区别

在 BitBake 中&#xff0c;clean 和 cleanall 命令都用于删除构建工件&#xff0c;但它们的范围和执行的清理程度不同。 1. clean 命令&#xff1a; 目的&#xff1a;clean命令用于删除与特定任务或配方相关的临时构建文件和工件。 范围&#xff1a;它只清除指定任务或配方生…...

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口&#xff0c;那么恭喜&#xff0c;你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中&#xff0c;Order 是一个非常实用的元注解&#xff0c;它位于 spring-core 包下&#xff0c;主要用于控制某些特定上下文…...

【学习笔记】Windows GDI绘图(十)Graphics详解(中)

文章目录 Graphics的方法AddMetafileComment添加注释BeginContainer和EndContainer新建、还原图形容器不指定指定源与目标矩形指定源与目标矩形 Clear清空并填充指定颜色CopyFromScreen截图CopyPixelOperation DrawImage绘制图像DrawImage的GraphicsDrawImageAbort回调ExcludeC…...

web学习笔记(六十二)

目录 1.键盘事件 2.KeepAlive 3.组件传值 3.1 兄弟组件传值 3.2 组件树传值 3.3 发布订阅者传值 1.键盘事件 keydown表示键盘事件&#xff0c;在不加修饰符的情况下&#xff0c;点击键盘上的任意位置都可以触发键盘事件&#xff0c; <template><div><!--…...

每天CTF小练一点--ctfshow年CTF

初一 题目&#xff1a; 2023是兔年&#xff0c;密码也是。聪明的小伙伴们&#xff0c;你能破解出下面的密码吗&#xff1f; 感谢大菜鸡师傅出题 flag格式是ctfshow{xxxxxx}.或许密码也有密码。 密文是&#xff1a; U2FsdGVkX1M7duRffUvQgJlESPfOTV2i4TJpc9YybgZ9ONmPk/RJje …...

Java Set接口 - TreeSet类

TreeSet 是 Java 集合框架中的一个类&#xff0c;它实现了 NavigableSet 接口&#xff0c;而 NavigableSet 是 SortedSet 接口的一个子接口。TreeSet 基于红黑树&#xff08;一种自平衡的二叉搜索树&#xff09;实现&#xff0c;因此它可以保证集合中的元素以升序排列。 以下是…...

css 理解了原理,绘制三角形就简单了

1.border-位置 注意&#xff1a;border-bottom/up/right/left 主要是以三角形的结构搭建而成&#xff0c;而border也是如此。而且从边框的外围开始计算像素尺寸。在理解了这一点之后&#xff0c;绘制三角形就简单多了。 1.transparent 注意&#xff1a;该属性主要是颜色透明…...

【JavaEE进阶】——MyBatis操作数据库 (#{}与${} 以及 动态SQL)

目录 &#x1f6a9;#{}和${} &#x1f388;#{} 和 ${}区别 &#x1f388;${}使用场景 &#x1f4dd;排序功能 &#x1f4dd;like 查询 &#x1f6a9;数据库连接池 &#x1f388;数据库连接池使⽤ &#x1f6a9;MySQL开发企业规范 &#x1f6a9;动态sql &#x1f388…...

电阻应变片的结构

电阻应变片的结构 常用的电阻应变片有金属应变片和半导体应变片两种。金属应变片分为体型和薄膜型。半导体应变片常见的有体型、薄膜型、扩散型、外延型、PN结及其他形式。图2—2所示为工程常见的应变片实物。 电阻应变片的典型结构如图2—3所示。它由敏感栅、基底、覆盖层和引…...

云原生时代:从 Jenkins 到 Argo Workflows,构建高效 CI Pipeline

作者&#xff1a;蔡靖 Argo Workflows Argo Workflows [ 1] 是用于在 Kubernetes 上编排 Job 的开源的云原生工作流引擎。可以轻松自动化和管理 Kubernetes 上的复杂工作流程。适用于各种场景&#xff0c;包括定时任务、机器学习、ETL 和数据分析、模型训练、数据流 pipline、…...

【数据库系统概论】事务

概述 在数据库系统中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组作为单个逻辑工作单元执行的操作。这些操作要么全部成功&#xff08;提交&#xff09;&#xff0c;要么全部失败&#xff08;回滚&#xff09;。事务的主要目的是确保数据库的完整性和一致性&…...

C++-排序算法详解

目录 一. 冒泡排序&#xff1a; 二. 插入排序&#xff1a; 三. 快速排序&#xff1a; 四. 选择排序 五, 归并排序 六, 堆排序. 排序算法是一种将一组数据按照特定顺序&#xff08;如升序或降序&#xff09;进行排列的算法。 其主要目的是对一组无序的数据进行整理&#…...

Kotlin 引用(双冒号::)

文章目录 双冒号::引用函数普通函数成员函数类构造函数 引用变量&#xff08;很少用&#xff09;普通变量成员变量 双冒号:: Kotlin 中可以使用双冒号::对某一变量、函数进行引用。 Note&#xff1a;MyClass::class可用于获取KClass<MyClass>&#xff0c;此时的双冒号::…...

C++ day3练习

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std;class Per{private:…...

命令模式(行为型)

目录 一、前言 二、命令模式 三、总结 一、前言 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;命令模式将一个请求封装为一个对象&#xff0c;从而可以用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以…...

韩雪医生针药结合效果好 患者赠送锦旗表感谢

任先生长年献血身体出现不适&#xff0c;身上多处发黑发冷&#xff0c;伴随疼痛&#xff0c;而且还有慢性腹泻的症状。他曾前往苏州各大医馆做过检查&#xff0c;均查不出异常&#xff0c;但身体确实不舒服&#xff0c;面色晦暗。 后来他来到李良济&#xff0c;求诊于韩雪医生。…...

【队列、堆、栈 解释与区分】

文章目录 概要队列&#xff08;Queue&#xff09;定义特性应用场景 堆&#xff08;Heap&#xff09;定义特性应用场景 栈&#xff08;Stack&#xff09;定义特性应用场景 总结 概要 队列、堆和栈是三种常见的数据结构&#xff0c;它们各自具有不同的特性和应用场景。下面是对这…...

NTP网络时间服务器_安徽京准电钟

NTP网络时间服务器_安徽京准电钟 NTP网络时间服务器_安徽京准电钟 概述 NTP网络时间服务器是一款支持NTP和SNTP网络时间同步协议&#xff0c;高精度、大容量、高品质的高科技时钟产品。 NTP网络时间服务器设备采用冗余架构设计&#xff0c;高精度时钟直接来源于北斗、GPS系统中…...

Java:爬虫框架

一、Apache Nutch2 【参考地址】 Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。 Nutch 致力于让每个人能很容易, 同时花费很少就可以配置世界一流的Web搜索引擎. 为了完成这一宏伟的目标, Nutch必须能够做到…...

ChatGPT基本原理详细解说

ChatGPT基本原理详细解说 引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是研究的热点之一。随着技术的发展&#xff0c;我们见证了从简单的聊天机器人到复杂的语言模型的演变。其中&#xff0c;ChatGPT作为一项突破性技术&#xff0c;以其强大…...