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

记忆模块概述

文章目录

    • 记忆模块概述
      • 记忆组件的定义
      • 记忆组件、链组件和Agent组件的关系
      • 设置第一个记忆组件
      • 内置记忆组件
      • 自定义记忆组件

    本文将LangChain框架内所有与记忆功能有关的组件统一称为“记忆模块”。简而言之,记忆模块是一个集合体,由多个不同的记忆组件构成。每个记忆组件都负责某一特定方面的记忆功能。在记忆模块(langchain.memory)下,有多种不同的类,每一个类都可以看作一个“记忆组件”。记忆组件是记忆模块的子元素,用于执行更具体的记忆任务。例如,如果你从记忆模块中导人ConversationBufferMemory类并对其进行实例化,你将得到一个名为ConversationBufferMemory的记忆组件。

记忆模块概述

    想一想,为什么需要记忆模块?大语言模型本质上是无记忆的。当与其交互时,它仅根据提供的提示生成相应的输出,而无法存储或记住过去的交互内容。因为是无记忆的,意味着它不能“学习”或“记住”用户的偏好、以前的错误或其他个性化信息,难以满足人们的期望。

    人们期待聊天机器人具有人的品质和回应能力。在现实的聊天环境中,人们的对话中充满了缩写和含蓄表达,他们会引用过去的对话内容,并期待对方能够理解和回应。例如,如果在聊天一开始时提到了某人的名字,随后仅用代词指代,那么人们就期望聊天机器人能够理解和记住这个指代关系。

    对聊天机器人的期待并不仅仅是它需要具备基础的回答功能,人们更希望聊天机器人能够在整个对话过程中,理解对话,记住交流内容,甚至理解情绪和需求。为了实现这个目标,需要赋予大语言模型一种“记忆”能力。记忆是一种基础的人类特性,是理解世界和与世界交流的基础。这是需要记忆模块的原因,将这种记忆能力赋予机器人,使机器人具备人类般的记忆能力。

    最后,需要强调,为什么在实际的大语言模型应用开发中,需要记忆能力。简单来说,同样作为提示词模板的外部数据,通过“记忆”能力形成的外部数据,与检索到的外部文档内容起到一样的作用。同样地,它可以确保大语言模型在处理信息时始终能够获取到最新、最准确的上下文数据。通过提供聊天信息,可以让大语言模型的输出更有据可查,多了一份“证据”,这也是一种低成本应用大语言模型的策略,不需要做参数训练等额外工作。

记忆组件的定义

    记忆组件是什么?记忆组件,实际上是一个聊天备忘录对象,像苹果手机备忘录程序一样,可以用它记录与大语言模型的聊天对话内容。那么,备忘录的作用是什么呢?试想在一个会议上,你有一位秘书在边上为你做备忘录。当你发言时,你可能会忘记先前的发言者都说过什么,这时你可以让秘书展示备忘录,通过查阅这些信息,你就能够清楚地整理自己的发言,从而赢得全场的赞许。而当你发言结束后,秘书又要做什么呢?他需要把你刚刚的精彩发言记录下来。

    这就是记忆组件的两大功能:读取和写人。因此,记忆组件的基本操作包括读取和写人。在链组件的每次运行中,都会有两次与记忆组件的交互:在链组件运行之前,记忆组件首先会从其存储空间中读取相关信息。这些信息可能包括先前的对话历史、用户设置或其他与即将执行的任务相关的数据。完成运行后,生成的输出或其他重要信息会被写人记忆组件中。这样,这些信息就可以在以后的运行或会话中被重新读取和使用。

    记忆组件的设计,旨在解决两个核心问题:一是如何写人,也就是存储状态;二是如何读取,即查询状态。存储状态一般通过程序的运行内存存储历史聊天记录实现。查询状态则依赖于在聊天记录上构建的数据结构和算法,它们提供了对历史信息的高效检索和解析。类似于一个聊天备忘录,记忆组件既可以帮助记录下聊天的每一条信息,也可以依据需求,搜索出相关的历史聊天记录。

    最难理解的是,如何在聊天记录上构建数据结构和算法?简单来说,数据结构和算法就是用来整理和检索聊天记录的。记忆组件会将处理过的聊天信息数据注人提示词模板中,最终通过模型平台的API接口获取大语言模型的响应,这样可以使响应更加准确。因为要决定哪些聊天记录需要保留,哪些聊天记录需要进一步处理,所以需要在聊天记录上构建数据结构和算法。

    主要采取以下两种方法整理和检索聊天记录。第一种方法是将聊天记录全部放人提示词模板中,这是一种比较简单的方法。具体是将聊天窗口中的上下文信息直接放在提示词中,作为外部数据注入提示词模板中,再提供给大语言模型。这种方法简单易行,但是因为结合信息的方式较为粗糙,所以可能无法达到精准控制的目的。而且由于模型平台的Max Tokens限制,这种方法要考虑如何截取聊天记录,如何压缩聊天记录,以适应模型平台底层的API要求。

    第二种方法是先压缩聊天记录,然后放入提示词模板中。这种方法的思路是利用LLM的总结和提取实体信息的能力压缩聊天记录,或者从数据库中提取相关的聊天记录、实体知识等,然后将这些文本拼接在提示词中,再提供给大语言模型,进行下一轮对话。

    在这个过程中,可以使用类似于图像压缩算法的方式对聊天记录进行压缩。比如,可以参考PEG图像压缩算法的原理,将原始的聊天记录(类比为图像的原始数据)进行压缩。PEG图像压缩算法在压缩过程中会舍弃一些人眼难以察觉的高频细节信息,从而达到压缩的效果,同时大部分重要信息被保留。这样,就可以将压缩后的聊天记录(类比为压缩后的图像)放入提示词模板中,用于生成下一轮对话。虽然这种压缩方式可能会丢失一些细节信息,但是由于这些信息对于聊天记录的总体含义影响较小,因此可以接受。通过这种方式,不仅可以在保证聊天记录的总体含义的同时,缩短提示词的长度,而且还可以提高大语言模型的运行效率和响应速度。

记忆组件、链组件和Agent组件的关系

    首先探讨记忆组件和链组件的关系。LangChain的记忆模块提供了各种类型的记忆组件,这些记忆组件可以独立使用,也可以集成到链组件中。换句话说,记忆组件可以作为链组件的一部分,是一个内部组件,用于保存状态和历史信息,以便链组件在处理输人和生成输出时使用。所以记忆组件和链组件的关系是,链组件是与大语言模型交互的主体,而记忆组件则是在这个过程中提供支持的角色。通过引人记忆组件,链组件调用大语言模型就能得到过去的对话,从而理解并确定当前谈论的主题和对象。这使得聊天机器人更接近人类的交流方式,从而更好地满足用户的期望。

    接下来探讨记忆组件和Agent组件的关系。将记忆组件放人Agent组件中,这使得Aget组件不仅能够处理和响应请求,而且还能够记住交流内容。这就是所谓的“让Agent拥有记忆”。Agent是一个更高级别的组件,它可能包含一个或多个链组件,以及与这些链组件交互的记忆组件。Agent通常代表一个完整的对话系统或应用,负责管理和协调其内部组件(包括链组件和记忆组件)以响应用户输人。

    具体来说,Aget组件在处理用户输人时,可能会使用其内部的链组件来执行各种逻辑,同时使用记忆组件来存储当前的交互信息和检索过去的交互信息。例如,聊天机器人可能会使用记忆组件中保存的聊天记录信息来增强模型响应。因此,可以说记忆组件是Agent组件的一个重要部分,帮助Agent组件维护状态和历史信息,使其能够处理复杂的对话任务。在构建Aget组件时,通常需要考虑如何选择和配置内存,以满足特定的应用需求和性能目标。以上就是记忆组件、链组件和Agent组件的关系。

设置第一个记忆组件

    下面使用代码演示如何实例化一个记忆组件,以及如何使用记忆组件的保存和加载方法来管理聊天记录。这是记忆组件通常的使用方式,但是在具体的实现细节上可能组件与组件之间会有所不同。首先,要引入ConversationTokenBufferMemory类,并创建一个OpenAI类的实例作为其参数。ConversationTokenBufferMemory是一个记忆组件,它将最近的交互信息保存在内存中,并使用最大标记(Token)数量来决定何时清除交互信息。使用一个OpenAI实例和一个max_token_limit参数来创建ConversationTokenBufferMemory的实例memory。max_token_limit=-l000指定了记忆组件中可以存储的最大标记数量为1000。这是一个上限数字,如果数字设置得过于小的话,可能最后打印的对象是空字符串,可以手动设置为10,再设置为100查看效果。memory key参数用于设置记忆组件存储对象的键名,默认是history,这里设置为session_chat。

from langchain.memory import ConversationTokenBufferMemory
from langchain.llms import OpenAI
openai_api_key="填人你的OpenAI密钥"
llm = OpenAI(openai_api_key=openai_api_key)
memory=ConversationTokenBufferMemory (llm=llm,max_token_limit=1000,memory_key="session chat")

    接下来,可以使用save context方法将聊天记录保存到记忆组件中。每次调用save context方法,都会将一次交互(包括用户输人和聊天机器人的回答)记录添加到记忆组件的缓冲区中。需要先后保存两次交互记录。在第一次交互中,用户输入的是“你好!我是李特丽,这是人类的第一个消息”;在第二次交互中,用户输人的是“今天心情怎么样”,大语言模型的输出是:“我很开心认识你”。

memory.save_context(("input":"你好!我是李特丽,这是人类的第一个消息"),
("output":"你好!我是AI助理的第一个消息")
memory.save_context(("input":"今天心情怎么样"),{"output":"我很开心认识你"))

    最后,可以使用load memory variables方法来加载记忆组件中的聊天记录。这个方法会返回一个字典,其中包含了记忆组件当前保存的所有聊天记录。

memory.load memory_variables(())
('session chat':'Human:你好!我是李特丽,这是人类的第一个消息\nAI:你好!我是AI助理的第一个消息\nHuman:今天心情怎么样nAI:我很开心认识你')

    以上就是如何使用ConversationTokenBufferMemory记忆组件的示例。

内置记忆组件

    LangChain的记忆模块提供了多种内置的记忆组件类,这些类的使用方法和ConversationTokenBufferMemory类基本一致,都提供了保存(save context)和加载(load_memory_variables)聊天记录的方法,只是在具体的实现和应用场景上有所不同。例如,ConversationBufferMemory ConversationBuffer WindowMemoryConversationTokenBufferMemory等类都是用于保存和加载聊天记录的记忆组件,但它们在保存聊天记录时所使用的数据结构和算法有所不同。ConversationBufferMemory类使用一个缓冲区来保存最近的聊天记录,而ConversationTokenBufferMemory类则使用Max Tokens长度来决定何时清除聊天记录。

    此外,有些记忆组件类还提供了额外的功能,如ConversationEntityMemory和ConversationKGMemory类可以用于保存和查询实体信息,CombinedMemory类可以用于组合多个记忆组件,而ReadOnlySharedMemory类则提供了一种只读的共享记忆模式。对于需要将聊天记录持久化保存的应用场景,LangChain的记忆模块还提供了多种与数据库集成的记忆组件类,如SQLChatMessageHistory、MongoDBChatMessageHistory、DynamoDBChatMessageHistory等。这些类在保存和加载聊天记录时,会将聊天记录保存在对应的数据库中。

    在选择记忆组件时,需要根据自己的应用需求来选择合适的记忆组件。例如,如果你需要处理大量的聊天记录,或者需要在多个会话中共享聊天记录,那么你需要选择一个与数据库集成的记忆组件。而如果你主要处理实体信息,那么你需要选择ConversationEntityMemory或ConversationKGMemory这样的记忆组件。无论选择哪种记忆组件,都需要理解其工作原理和使用方法,以便正确地使用它来管理你的聊天记录。

自定义记忆组件

    在上一节中,我们了解了LangChain的内置记忆组件。尽管这些记忆组件能够满足许多通用的需求,但每个具体的应用场景都有其独特的要求和复杂性。例如,某些应用可能需要使用特定的数据结构来优化查询性能,或者需要使用特别的存储方式来满足数据安全或隐私要求。在这些情况下,内置的记忆组件可能无法完全满足需求。

    LangChain通过允许开发者添加自定义的记忆类型,来提供更高的灵活性和扩展性,这使得开发者能够根据自己的需求定制和优化记忆组件。这对于高级的使用场景,如大规模的生产环境或特定的业务需求尤为重要。内置组件往往是框架开发者根据通用需求预先设计和封装好的,我们可以直接拿来使用,无须关心其内部实现细节。这无疑大大降低了使用组件的门槛,提高了开发效率。然而,这也意味着用户很可能对这些组件的内部构造和工作原理一无所知。

    而当你试图创建自定义组件时,需要深人理解和分析自己的特定需求,然后再在此基础上设计和实现符合需求的组件。这个过程迫使你深人了解内置组件的构造和工作原理,从而可以更好地理解框架的设计逻辑和工作方式。因此,尽管创建自定义组件的过程可能会有些复杂,但这无疑是深人理解和掌握框架的有效方式。下面向ConversationChain添加一个自定义的记忆组件。请注意,这个自定义的记忆组件相当简单且脆弱,可能在生产环境中并不实用。这里的目的是展示如何添加自定义记忆组件。

from langchain import OpenAI,ConversationChain
from langchain.schema import BaseMemory
from pydantic import BaseModel
from typing import List,Dict,Any

    然后编写一个SpacyEntityMemory类,它使用spacy方法来提取实体信息,并将提取到的信息保存在一个简单的哈希表中。然后,在对话中,检查用户输人,并提取实体信息,且将实体信息放人提示词的上下文中。

!pip install spacy
python -m spacy download en core web_1g
import spacy
nlp spacy.load("en core web 1g")
class SpacyEntityMemory(BaseMemory,BaseModel):"""Memory class for storing information about entities."""# Define dictionary to store information about entities.entities:dict ={}# Define key to pass information about entities into prompt.memory_key:str "entities"def clear(self):self.entities ={}@propertydef memory variables(self)->List(str]:"""Define the variables we are providing to the prompt."""return [self.memory_key]def load_memory_variables(self,inputs:Dict[str,Any])->Dict[str,str]:"""Load the memory variables,in this case the entity key."""# Get the input text and run through spacydoc = nlp(inputs[list (inputs.keys())[0]])# Extract known information about entities,if they exist.entities=[self.entities[str(ent)]for ent in doc.ents if str(ent)in self.entities]# Return combined information about entities to put into context.return (self.memory_key:"\n".join (entities))
def save_context (self,inputs:Dict[str,Any],outputs:Dict[str,str])->None:
"""Save context from this conversation to buffer."""# Get the input text and run through spacytext= inputs[list (inputs.keys())[0]]doc =nlp(text)# For each entity that was mentioned,save this information to thedictionary.for ent in doc.ents:ent str str(ent)if ent str in self.entities:self.entities[ent str]+=f"\n(text)"else:self.entities[ent_str]text

    下面定义一个提示词模板,它接受实体信息以及用户输人的信息。

from langchain.prompts.prompt import PromptTemplate
template="""
The following is a friendly conversation between a human and an AI.
The AI is talkative and provides lots of specific details from its
context.If the AI does not know the answer to a question,it truthfully
says it does not know.You are provided with information about entities
the Human mentions,if relevant.
Relevant entity information:
(entities)
Conversation:
Human:(input}
AI:
"""prompt=PromptTemplate (input variables=["entities","input"],template=template)

    然后把记忆组件和链组件组合在一起,放在ConversationChain链上运行,与模型交互。

llm =OpenAI(temperature=0)
conversation =ConversationChain(llm=llm,prompt=prompt,verbose=True,memory=SpacyEntityMemory ())

    第一次用户的输人是“Harrison likes machine learning”。由于对话中没有关于Harrison的先验知识,所以提示词模板中“Relevant entity information”(相关实体信息)部分是空的。

conversation.predict (input="Harrison likes machine learning")

    运行的结果是:

Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI.The
AI is talkative and provides lots of specific details from its context.If the
AI does not know the answer to a question,it truthfully says it does not know.
You are provided with information about entities the Human mentions,if relevant.
Relevant entity information:
Conversation:
Human:Harrison likes machine learning
AI:
> Finished ConversationChain chain.
"That's great to hear!Machine learning is a fascinating field of study.
It involves using algorithms to analyze data and make predictions.Have you ever
studied machine learning,Harrison?"

    对于第二次用户输人,可以看到聊天机器人回答了关于Harrison的信息,提示词模板中“Relevant entity information’”部分是“Harrison likes machine learning”。

conversation.predict(input="What do you think Harrison's favorite subject in college was?")

    运行的结果是:

Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI.The
AI is talkative and provides lots of specific details from its context.If the
AI does not know the answer to a question,it truthfully says it does not know.
You are provided with information about entities the Human mentions,if relevant.
Relevant entity information:
Harrison likes machine learning Conversation:
Human:What do you think Harrison's favorite subject in college was?
AI:
Finished ConversationChain chain.
'From what I know about Harrison,I believe his favorite subject in college
was machine learning.He has expressed a strong interest in the subject and has
mentioned it often.'

相关文章:

记忆模块概述

文章目录 记忆模块概述记忆组件的定义记忆组件、链组件和Agent组件的关系设置第一个记忆组件内置记忆组件自定义记忆组件 本文将LangChain框架内所有与记忆功能有关的组件统一称为“记忆模块”。简而言之,记忆模块是一个集合体,由多个不同的记忆组件构成…...

计算机网络结课设计:通过思科Cisco进行中小型校园网搭建

上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网,当时花了几天时间查阅相关博客总算是做出来了,在验收后一直没管,在寒假想起来了简单分享一下,希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…...

算法之 数论

文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义:除了本身和1,不能被其他小于它的数整除,最小的质数是 2 求解质数的几种方法 法1,根…...

【论文阅读】Revisiting the Assumption of Latent Separability for Backdoor Defenses

https://github.com/Unispac/Circumventing-Backdoor-Defenses 摘要和介绍 在各种后门毒化攻击中,来自目标类别的毒化样本和干净样本通常在潜在空间中形成两个分离的簇。 这种潜在的分离性非常普遍,甚至在防御研究中成为了一种默认假设,我…...

【深入探讨 ResNet:解决深度神经网络训练问题的革命性架构】

深入探讨 ResNet:解决深度神经网络训练问题的革命性架构 随着深度学习的快速发展,卷积神经网络(CNN)已经成为图像识别、目标检测等计算机视觉任务的主力军。然而,随着网络层数的增加,训练深层网络变得愈加…...

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到…...

设备智能化无线通信,ESP32-C2物联网方案,小尺寸芯片实现大功能

在科技飞速发展的当下,我们的生活正被各类智能设备悄然改变,它们如同一位位无声的助手,渗透到我们生活的每一个角落,让生活变得更加便捷和丰富多彩。 智能插座、智能照明和简单家电设备在家居领域的应用,为我们的生活…...

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…...

从 X86 到 ARM :工控机迁移中的核心问题剖析

在工业控制领域,技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而,这一过程并非一帆风顺,面临着诸多关键挑战。 首先,软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…...

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…...

android设置添加设备QR码信息

摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...

进程状态

目录 1.进程排队 硬件的队列 进程排队 2.进程的三大状态 什么是状态 运行状态 阻塞状态 挂起状态 3.Linux系统中的进程状态 4.僵尸状态 5.孤儿进程 1.进程排队 硬件的队列 计算机是由很多硬件组成的,操作系统为了管理这些硬件,通常需要为这…...

【linux学习指南】模拟线程封装与智能指针shared_ptr

文章目录 📝线程封装🌉 Thread.hpp🌉 Makefile 🌠线程封装第一版🌉 Makefile:🌉Main.cc🌉 Thread.hpp: 🌠线程封装第二版🌉 Thread.hpp:🌉 Main.cc &#x1f…...

智慧物流新引擎:ARM架构工控机在自动化生产线中的应用

工业自动化程度的不断提升,对高性能、低功耗和高可靠性的计算设备需求日益增长。ARM架构工控机因其独特的优势,在多个工业领域得到了广泛应用。本文将深入探讨ARM架构工控机的特点及其在具体工业场景中的应用。 ARM架构工控机的主要优势 高效能与低功耗…...

OpenGL的基础光照知识

光照模型 常见的光照模型:ADS模型 A:环境光反射(ambient reflection):模拟低级光照,影响场景中的所有物体。D:漫反射(diffuse reflection):根据光线的入射角…...

centos 10 离线安装dnf 和 设置dnf镜像源

离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…...

redis 缓存击穿问题与解决方案

前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…...

Linux下的进程切换与调度

目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候,通常会启动多个程序,这些程序最后都会变成进程,但是我们的硬…...

开源模型应用落地-Qwen1.5-MoE-A2.7B-Chat与vllm实现推理加速的正确姿势(一)

一、前言 在人工智能技术蓬勃发展的当下,大语言模型的性能与应用不断突破边界,为我们带来前所未有的体验。Qwen1.5-MoE-A2.7B-Chat 作为一款备受瞩目的大语言模型,以其独特的架构和强大的能力,在自然语言处理领域崭露头角。而 vllm 作为高效的推理库,为模型的部署与推理提…...

阿里云IOT设备管理

本文主要介绍了阿里云IOT设备管理的基本概念、功能特点以及应用场景。阐述了如何利用阿里云IOT平台实现设备的连接、监控和控制,以及如何借助其丰富的数据分析功能提升设备管理效率。 一、IOT工作原理 二、创建模拟设备 1.创建产品 2.物模型 3.设备 4.设备数据上报…...

图像处理技术和应用

图像处理技术是一种依托计算机和相关算法,对图像进行深度处理、分析及改变的技术。主要包括图像数字化、图像增强和复原、图像数据编码、图像分割和图像识别等。它不仅能够从静态图像中提取关键信息,还能改变图像的外观或特征,并进一步检测、…...

格式化字符串漏洞详解

一、漏洞原理 格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printf、sprintf 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:…...

java项目之基于web的中国古诗词的设计与实现源码(ssm+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于web的中国古诗词的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于web的中国…...

网络初识-

网络的相关概念 一、局域网和广域网 将各种计算机、外部设备等相互连接起来,实现在这个范围内数据通信和资源共享的计算机网络。它的覆盖范围通常在几百米到几公里之内。例如,一个小型企业的办公室,通过交换机将多台电脑连接在一起&#xf…...

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 卸…...

vue学习8

1.pinia(更优) 是vue最新的状态管理工具,是vuex的替代品 pinia: state actions(支持异步,可以直接修改state) getters 优点: 提供更加简单的API(去掉了mutation)提供符合,组合式的API语法(和v…...

【竞技宝】电竞世界杯:无畏契约首次入选正式项目!

北京时间2月12日,电竞世界杯基金会(EWCF)与知名游戏开发商拳头游戏(Riot Games)在近日共同宣布达成三年合作伙伴关系。同时,三大顶级电竞项目——《英雄联盟》《英雄联盟:云顶之弈》&#xff08…...

Bigemap Pro地图配置文件包

配置文件获取 配置文件下载后,直接拖入软件中自动识别导入图源,一键完成加载。...

有哪些免费的SEO软件优化工具

随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…...

分享在职同时准备系统分析师和教资考试的时间安排

(在职、时间有限、同时备考系统分析师考试和小学信息技术教资面试),以下是详细的备考计划,确保计划的可行性和通过性。 一、总体安排 时间分配: 每周周末(2天)用于系统分析师考试备考。工作日晚…...

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入,运行对应的宏即可;会先MSGBOX提示一下,然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…...

3.2 > Bash

概览 在上一节中我们了解了关于 Shell 的执行流程,知道了在 Linux 环境中一般有哪些常用的 Shell。而在本节中,将会学习到 Linux 中最常见的一个 Shell —— Bash,了解到 bash 的相关知识和用法。 本节目录 概览相关知识bash 命令提示符bas…...

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天,我们开始了反射和环境贴图的工作,成功地根据法线显示了反射效果。然而,我们还没有实现反射向量的计算,导致反射交点的代…...

新一代SCADA: 宏集Panorama Suite 2025 正式发布,提供更灵活、符合人体工学且安全的应用体验

宏集科技宣布正式推出全新Panorama Suite 2025 SCADA软件!全新版本标志着 Panorama Suite的一个重要里程碑,代表了从 Panorama Suite 2022 开始并跨越三个版本(2022、2023、2025)的开发过程的顶峰。 此次重大发布集中在六个核心主…...

Visual Studio 进行单元测试【入门】

摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...

Notepad++ 中删除所有以 “pdf“ 结尾的行

Notepad 中删除所有以 “pdf” 结尾的行 操作步骤 1.打开文件: 在 Notepad 中打开你需要处理的文本文件。 2.打开查找和替换对话框: 按快捷键 Ctrl F,打开“查找和替换”对话框。 3.启用正则表达式模式: 在对话框的底部&#xf…...

Java 使用腾讯翻译 API 实现含 HTML 标签文本,json值,精准翻译工具

注意:需搭配标题二的腾讯翻译工具使用 一-1、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationFor…...

DeepSeek R1+Open WebUI +SearXNG 本地化部署与联网功能

GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker....

数据科学之数据管理|NumPy数据管

一、Numpy介绍 (一) 什么是numpy NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运…...

零基础玩转 DeepSeek API实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

【GPIO】5.理解保护二极管在GPIO过电压保护中的作用

在电子电路设计中,保护二极管是常见的保护元件,用于防止过电压对敏感电路的损害。本文将探讨当GPIO输入电压大于3.3V时,保护二极管如何工作,并解释为什么大部分过电压引起的电流会通过二极管流向VDD而不是流入内部电路。 1.背景 …...

2.5 模块化迁移策略:从传统项目到模块化系统

模块化迁移策略:从传统项目到模块化系统 将传统 Java 项目迁移至 JDK 9 模块化系统是一项系统性工程,需分阶段实施以降低风险。以下是详细的迁移策略、工具使用和实战示例。 1. 迁移阶段划分 阶段目标关键操作阶段1:兼容性验证确保项目能在…...

Tortoise Git

TortoiseGit 是一个 Windows Shell 与 Git 的接口,它提供了文件状态的覆盖图标,强大的 Git 上下文菜单等。你可以在官方网站 (tortoisegit.org) 轻松使用安装程序进行下载。TortoiseGit 的当前稳定版本是 2.14.0 ,根据你的机器配置&#xff0…...

Maven Spring框架依赖包

Maven中添加Spring框架依赖包 Spring核心工具包SpringJDBCSpring配置文件头信息 Spring核心工具包 在pom.xml文件中添加 <!-- Spring的核心工具包--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spr…...

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…...

Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】

目录 一.什么是库 二.静态库 2.1创建静态库 我们在之前的路径下新建lib使用我们自己的库 2.2 使用makefile生成静态库 三.动态库 3.1动态库生成 3.2动态库使用 3.3库运行搜索路径 四.目标文件 五.ELF文件 六.ELF从形成到加载轮廓 6.1ELF形成可执行 6.2 ELF可执行文…...

中间件-redis-(ubantu)

1、安装依赖包 sudo apt-get update sudo apt-get install redis 一旦安装完成&#xff0c;Redis 服务将会自动启动。想要检查服务的状态&#xff0c;输入下面的命令&#xff1a; rootvims:/etc/redis# sudo systemctl status redis-server ● redis-server.service - Adva…...

ubuntu20.04+ROS+Gazebo+px4+QGC+MAVROS

目录 前言 一、安装ROS 二、安装PX4 编译 三、QGC安装 四、安装MAVROS 命令记得加sudo&#xff01; 前言 在安装ubuntu20.04ROSGazebopx4QGCMAVROS时&#xff0c;参考了很多网上的资料&#xff0c;总结一个较为顺利的流程。 官方指南PX4 自动驾驶仪用户指南 | PX4 Gui…...

基于 openEuler 构建 LVS-DR 群集(同网段)。

一、LVS相关原理 1.LVS简介 LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目&#xff0c;它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分&#xff0c;在 Linux2.4内核以前&…...