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

Java + LangChain 实战入门,开发大语言模型应用!

在 Baeldung 上看到了一篇介绍基于 Java + LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。

  • 原文地址:https://www.baeldung.com/java-langchain-basics
  • 翻译: JavaGuide(转载请注明)

1. 简介

在本教程中,我们将详细探讨 LangChain,一个用于开发基于语言模型的应用程序的框架。我们将首先了解语言模型的基础概念,这些知识将对本教程有所帮助。

尽管 LangChain 主要提供 Python 和 JavaScript/TypeScript 版本,但也可以在 Java 中使用 LangChain。我们会讨论 LangChain 作为框架的构建模块,然后尝试在 Java 中进行实验。

2. 背景

在深入探讨为什么需要一个用于构建基于语言模型的应用程序的框架之前,我们需要弄清楚语言模型是什么,并了解使用语言模型时可能遇到的一些典型复杂性。

2.1. 大型语言模型

语言模型是自然语言的概率模型,可以生成一系列单词的概率。大型语言模型(LLM)则是以其规模庞大而著称,通常包含数十亿参数的人工神经网络。

大型语言模型通常通过在大量未标记数据上进行预训练,使用自监督学习和弱监督学习技术。之后,通过微调提示词工程等技术将预训练模型适配于特定任务:

大型语言模型

大型语言模型可以执行多种自然语言处理任务,如语言翻译、内容摘要等。此外,它们还具备生成内容的能力,因此在回答问题等应用场景中非常有用。

几乎所有主流云服务提供商都在其服务中引入了大型语言模型。例如,Microsoft Azure 提供了 Llama 2 和 OpenAI GPT-4,Amazon Bedrock 提供了 AI21 Labs、Anthropic、Cohere、Meta 和 Stability AI 的模型。

2.2. 提示词工程

大型语言模型是一种基础模型,经过大规模文本数据的训练后,可以捕捉人类语言的语法和语义。然而,为了让模型执行特定任务,它们需要进一步调整。

提示词工程(Prompt engineering)是让语言模型完成特定任务的最快捷方法之一。它通过结构化文本向模型描述任务目标,使其能够理解并执行任务:

提示词工程

提示词帮助大型语言模型执行上下文学习,这种学习是暂时的。通过提示词工程,我们可以促进大型语言模型的安全使用,并构建新的功能,比如将领域知识和外部工具整合到模型中。

这一领域目前是一个活跃的研究方向,不断涌现新的技术。然而,诸如 链式思维提示 等技术已经变得颇为流行。这种方法的核心是让大型语言模型在给出最终答案之前,将问题分解为一系列中间步骤。

2.3. 词向量

如前所述,大型语言模型能够高效处理自然语言。如果我们将自然语言中的单词表示为词向量(Word Embeddings ),模型的性能将显著提升。词向量是能够编码单词语义的实值向量

词向量通常通过算法生成,例如 Word2vec 或 GloVe。

GloVe 是一种无监督学习算法,在语料库的全局词共现统计上进行训练:

Word Embedding Illustration

在提示词工程中,我们将提示转换成词向量,这使得模型更容易理解和响应提示。此外,它也对增强我们提供给模型的上下文非常有帮助,从而使模型能够给出更具上下文意义的回答。

例如,我们可以从现有数据集中生成词向量并将其存储在向量数据库中。然后,我们可以使用用户提供的输入在向量数据库中执行语义搜索,并将搜索结果作为附加上下文提供给模型。

3. 使用 LangChain 构建 LLM 技术栈

正如我们已经了解的那样,创建有效的提示词是成功利用 LLM 的关键元素。这包括使与语言模型的交互具有上下文感知能力,并依赖语言模型进行推理。

为此,我们需要执行多项任务,例如为提示词创建模板、调用语言模型,以及从多种来源提供用户特定数据。为了简化这些任务,我们需要一个像 LangChain 这样的框架作为 LLM 技术栈的一部分:

使用 LangChain 构建 LLM 技术栈

该框架还帮助开发需要链式调用多个语言模型的应用程序,并能够回忆起过去与语言模型过去交互的信息。此外,还有更复杂的用例,例如将语言模型用作推理引擎。

最后,我们可以执行日志记录、监控、流式处理以及其他重要的维护和故障排除任务。LLM 技术栈正在快速发展以应对许多此类问题,而 LangChain 正迅速成为 LLM 技术栈的宝贵组成部分。

4. 面向 Java 的 LangChain

LangChain 于 2022 年作为开源项目推出,凭借社区支持迅速发展壮大。最初是由 Harrison Chase 开发的 Python 项目,后来成为 AI 领域增长最快的初创企业之一。

随后,JavaScript/TypeScript 版本的 LangChain 于 2023 年初推出,并迅速流行起来,支持多个 JavaScript 环境,如 Node.js、浏览器、CloudFlare workers、Vercel/Next.js、Deno 和 Supabase Edge functions。

然而,目前没有官方的 Java 版本 LangChain 可供 Java 或 Spring 应用使用。不过,社区开发了 Java 版本 LangChain,称为 LangChain4j ,支持 Java 8 或更高版本,并兼容 Spring Boot 2 和 3。

LangChain 的各种依赖项可以在 Maven Central 上找到。根据我们使用的功能,可能需要在应用程序中添加一个或多个依赖项

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>0.23.0</version>
</dependency>

5. LangChain 的构建模块

LangChain 为我们的应用程序提供了多种价值主张,这些功能以模块化组件的形式提供。模块化组件不仅提供了有用的抽象,还包含了一系列操作语言模型的实现。接下来,我们将通过 Java 示例来讨论其中的一些模块。

5.1. 模型输入/输出(Models I/O)

在使用任何语言模型时,我们需要具备与其交互的能力。LangChain 提供了必要的构建模块,例如模板化提示的能力,以及动态选择和管理模型输入的能力。此外,我们还可以使用输出解析器从模型输出中提取信息:

LangChain 模型

提示模板(Prompt Templates)是用于生成语言模型提示的预定义配方,可以包括指令、少样本示例和特定上下文:

PromptTemplate promptTemplate = PromptTemplate.from("Tell me a {{adjective}} joke about {{content}}..");
Map<String, Object> variables = new HashMap<>();
variables.put("adjective", "funny");
variables.put("content", "computers");
Prompt prompt = promptTemplate.apply(variables);

5.2. 内存

通常,一个利用大型语言模型(LLM)的应用程序会有一个对话界面。对话的一个重要方面是能够引用对话中先前的信息。这种存储过去交互信息的能力称为内存

LangChain 内存

LangChain 提供了一些关键功能,可以为应用程序添加内存。例如,我们需要能够从内存中读取信息以增强用户输入,同时还需要将当前运行的输入和输出写入内存:

ChatMemory chatMemory = TokenWindowChatMemory.withMaxTokens(300, new OpenAiTokenizer(GPT_3_5_TURBO));
chatMemory.add(userMessage("你好,我叫 Kumar"));
AiMessage answer = model.generate(chatMemory.messages()).content();
System.out.println(answer.text()); // 你好 Kumar!今天我能为您做些什么?
chatMemory.add(answer);
chatMemory.add(userMessage("我叫什么名字?"));
AiMessage answerWithName = model.generate(chatMemory.messages()).content();
System.out.println(answerWithName.text()); // 您的名字是 Kumar。
chatMemory.add(answerWithName);

在这里,我们使用 TokenWindowChatMemory 实现了固定窗口聊天内存,它允许我们读取和写入与语言模型交换的聊天消息。

LangChain 还提供更复杂的数据结构和算法,以便从内存中返回选定的消息, 而不是返回所有内容。例如,它支持返回过去几条消息的摘要,或者仅返回与当前运行相关的消息。

5.3. 检索(Retrieval)

大型语言模型通常是在大量的文本语料库上进行训练的。因此,它们在处理通用任务时表现得非常高效,但在处理特定领域任务时可能效果不佳。为了解决这一问题,我们需要在生成阶段检索相关的外部数据,并将其传递给语言模型

这个过程被称为检索增强生成(Retrieval Augmented Generation,RAG)。RAG 有助于将模型的生成过程与相关且准确的信息结合,同时也让我们更深入地了解模型的生成过程。LangChain 提供了构建 RAG 应用程序所需的核心组件:

LangChain Retrieval

首先,LangChain 提供了文档加载器 FileSystemDocumentLoader,用于从存储位置检索文档。然后,LangChain 还提供了转换器,用于进一步处理文档,例如将大型文档分割成更小的块:

Document document = FileSystemDocumentLoader.loadDocument("simpson's_adventures.txt");
DocumentSplitter splitter = DocumentSplitters.recursive(100, 0,new OpenAiTokenizer(GPT_3_5_TURBO));
List<TextSegment> segments = splitter.split(document);

在这里,我们使用 FileSystemDocumentLoader 从文件系统中加载文档。然后使用 OpenAiTokenizer 将文档分割成更小的段落。

为了提高检索效率,这些文档通常会被转换成嵌入(embeddings),并存储在向量数据库中。LangChain 支持多种嵌入提供商和方法,并与几乎所有主流的向量存储集成:

EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
embeddingStore.addAll(embeddings, segments);

在这里,我们使用 AllMiniLmL6V2EmbeddingModel 为文档段落创建嵌入,然后将嵌入存储在内存中的向量存储中。

现在,我们的外部数据已经以嵌入的形式存储在向量存储中,可以从中进行检索。LangChain 支持多种检索算法,例如简单的语义搜索和更复杂的集成检索器(ensemble retriever):

String question = "Who is Simpson?";
// 假设该问题的答案包含在我们之前处理的文档中。
Embedding questionEmbedding = embeddingModel.embed(question).content();
int maxResults = 3;
double minScore = 0.7;
List<EmbeddingMatch<TextSegment>> relevantEmbeddings = embeddingStore.findRelevant(questionEmbedding, maxResults, minScore);

我们为用户的问题生成嵌入,然后使用该问题的嵌入从向量存储中检索相关的匹配项。现在,我们可以将检索到的相关内容作为上下文,添加到我们打算发送给模型的提示中。

6. LangChain 的复杂应用

到目前为止,我们已经了解了如何使用单个组件来创建一个基于语言模型的应用程序。LangChain 还提供了构建更复杂应用程序的组件。例如,我们可以使用链(Chains)和代理(Agents)来构建更加自适应、功能增强的应用程序。

6.1. 链(Chains)

通常,一个应用程序需要按特定顺序调用多个组件。在 LangChain 中,这被称为链(Chain)。链简化了开发更复杂应用程序的过程,并使调试、维护和改进更加容易。

链还可以组合多个链来构建更复杂的应用程序,这些应用程序可能需要与多个语言模型交互。LangChain 提供了创建此类链的便捷方式,并内置了许多预构建链:

ConversationalRetrievalChain chain = ConversationalRetrievalChain.builder().chatLanguageModel(chatModel).retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel)).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).promptTemplate(PromptTemplate.from("Answer the following question to the best of your ability: {{question}}\n\nBase your answer on the following information:\n{{information}}")).build();

在这里,我们使用了预构建的链 ConversationalRetrievalChain,它允许我们将聊天模型与检索器、内存和提示模板结合使用。现在,我们可以简单地使用该链来执行用户查询:

String answer = chain.execute("Who is Simpson?");

该链提供了默认的内存和提示模板,我们可以根据需要进行覆盖。创建自定义链也非常容易。链的能力使我们能够更轻松地实现复杂应用程序的模块化实现。

6.2. 代理(Agents)

LangChain 还提供了更强大的结构,例如代理(Agent)。与链不同,代理将语言模型用作推理引擎,以确定应该采取哪些操作以及操作的顺序。我们还可以为代理提供访问合适工具的权限,以执行必要的操作。

在 LangChain4j 中,代理作为 AI 服务(AI Services)提供,用于声明性地定义复杂的 AI 行为。让我们看看如何通过提供一个计算器工具,为 AI 服务赋能,从而使语言模型能够执行计算。

首先,我们定义一个包含一些基本计算功能的类,并用自然语言描述每个函数,这样模型可以理解:

public class AIServiceWithCalculator {static class Calculator {@Tool("Calculates the length of a string")int stringLength(String s) {return s.length();}@Tool("Calculates the sum of two numbers")int add(int a, int b) {return a + b;}}

接下来,我们定义一个接口,用于构建我们的 AI 服务。这里的接口相对简单,但也可以描述更复杂的行为:

interface Assistant {String chat(String userMessage);
}

然后,我们使用 LangChain4j 提供的构建器工厂,通过定义的接口和工具创建一个 AI 服务:

Assistant assistant = AiServices.builder(Assistant.class).chatLanguageModel(OpenAiChatModel.withApiKey(<OPENAI_API_KEY>)).tools(new Calculator()).chatMemory(MessageWindowChatMemory.withMaxMessages(10)).build();

完成了!现在,我们可以向语言模型发送包含计算任务的问题:

String question = "What is the sum of the numbers of letters in the words \"language\" and \"model\"?";
String answer = assistant.chat(question);
System.out.println(answer); // The sum of the numbers of letters in the words "language" and "model" is 13.

运行这段代码后,我们会发现语言模型现在能够执行计算。

需要注意的是,语言模型在执行某些任务时可能会遇到困难,例如需要时间和空间概念的任务或复杂的算术操作。然而,我们可以通过为模型提供必要的工具来解决这些问题。

7. 总结

在本教程中,我们探讨了创建基于大型语言模型的应用程序的一些基本元素。此外,我们讨论了将 LangChain 作为技术栈的一部分对开发此类应用程序的重要价值。

这使得我们能够探索 LangChain 的 Java 版本 —— LangChain4j 的一些核心组件 。这些库未来将快速发展,它们会让开发由语言模型驱动的应用程序的过程变得更成熟和有趣!

相关文章:

Java + LangChain 实战入门,开发大语言模型应用!

在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章&#xff0c;写的非常不错&#xff0c;非常适合初学者。于是&#xff0c;我抽空翻译了一下。 原文地址&#xff1a;https://www.baeldung.com/java-langchain-basics翻译&#xff1a; Java…...

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...

软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维

硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有&#xff1a; (1)自然…...

SQL 视图

SQL 视图 引言 SQL&#xff08;结构化查询语言&#xff09;视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表&#xff0c;该表由一个或多个基本表的数据组成&#xff0c;用户可以通过视图查询数据&#xff0c;而不需要直接操作基本表。本文将详细介绍SQL视图的定…...

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS&#xff1f; 在前后端开发过程中&#xff0c;我们经常会遇到 跨域请求被浏览器拦截 的问题。例如&#xff0c;你在 http://localhost:3000 调用 https://api.example.com 时&#xff0c;可能会…...

数值稳定性 + 模型初始化和激活函数

数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft​(ht−1)andyℓ∘fd​∘…∘…...

【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka

1. 消息队列 几个组件&#xff1a; Redis Stream&#xff1a;适用于对性能要求高、可靠性要求不高的场景Rocket MQ&#xff1a;可靠性高&#xff0c;性能优秀&#xff0c;但官方对 go 不太友好&#xff0c;sdk 缺少很多功能支持Rabbit MQ&#xff1a;性能适中&#xff0c;使用…...

TCP协议与wireshark抓包分析

一、tcp协议格式 1. 源端口号 &#xff1a; 发送方使用的端口号 2. 目的端口号 &#xff1a; 接收方使用的端口号 3. 序号: 数据包编号 &#xff0c; tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包&#xff0c…...

深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述

目录 &#x1f4c2; 深度学习四大核心架构 &#x1f330; 知识点概述 &#x1f9e0; 核心区别对比表 ⚡ 生活化案例理解 &#x1f511; 选型指南 &#x1f4c2; 深度学习四大核心架构 第一篇&#xff1a; 神经网络基础&#xff08;NN&#xff09; &#x1f330; 知识点概述…...

springcloud 整合 Redis_Redisson

springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...

Windows模仿Mac大小写切换, 中英文切换

CapsLock 功能优化脚本部署指南 部署步骤 第一步&#xff1a;安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步&#xff1a;部署脚本 直接运行 (调试推荐) 新建文本文件&#xff0c;粘贴…...

基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...

网络原理-TCP/IP

网络原理学习笔记&#xff1a;TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记&#xff0c;主要涵盖传输层、网络层和数据链路层的核心协议和概念&#xff0c;特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端&#xff08;进程到进…...

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…...

AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述&#xff1a; AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务&#xff0c;本地硬件配置不高的情况&#xff0c;建议使用云服务商的ASR 解决方案&#xff1a; 1.登…...

Dify 0.15.3版本 本地部署指南

目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...

全书测试:《C++性能优化指南》

以下20道多选题和10道设计题&#xff0c; 用于本书的测试。 以下哪些是C性能优化的核心策略&#xff1f;&#xff08;多选&#xff09; A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化&#xff0c;正确的措施包括&#xff…...

Oracle数据库数据编程SQL<递归函数详解>

递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...

Burp Suite从入门到实战之配置启动

目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK&#xff0c;JDK包含JRE&#xff08;Java运行时环境&#xff09; 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME​编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...

【力扣hot100题】(016)缺失的第一个正数

题目里这么多条条框框……先不按条条框框做了两下。 第一个思路&#xff1a;你不仁我不义&#xff0c;先排序后遍历&#xff08;时间不符题意&#xff09; class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...

(undone) MIT6.824 Lecture 02 - RPC and Threads

知乎专栏&#xff1a;https://zhuanlan.zhihu.com/p/641105196 原视频&#xff1a;https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go&#xff1f…...

红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)

红宝书第二十一讲&#xff1a;详解JavaScript的模块化&#xff08;CommonJS与ES Modules&#xff09; 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、模块化的意义&#xff1a;分而治之 模块化解决代码依赖混…...

输入百分比校验(数字非负数保留2位不四舍五入)

场景用于输入百分比&#xff0c;限制只能输入非负数&#xff0c;保留2位小数&#xff0c;且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...

Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)

一、KNN算法简介 1.1、定义 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是一种基于实例的学习方法&#xff0c;通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术&#xff0c;依赖于距离最近的邻居来推断数据点的类别或数值&#xff0c;为许…...

SpringBoot 3+ Lombok日志框架从logback改为Log4j2

r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2&#xff0c;并配置按日期滚动文件和控制台输出&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;排除Logback并添加Log4j2依赖 在pom.xml中修改依赖&#xff1a; <dependencies><!-- 排除默…...

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…...

c++-函数增强

一、编译器对函数名的处理 1. C与C的差异 C编译器&#xff1a;保留原始函数名&#xff0c;无额外处理。例如&#xff1a; int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器&#xff1a;通过name mangling&#xff08;名称修饰&#xff09;生成唯一函数…...

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09; 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...

css基础之浮动相关学习

一、浮动基本介绍 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…...

1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯

动态规划解最小花费爬楼梯问题&#xff1a;LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求&#xff1a;给定一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...

8.4考研408简单选择排序与堆排序知识点深度解析

考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序&#xff08;Selection Sort&#xff09;是一种选择排序算法&#xff0c;其核心思想是&#xff1a; 每趟选择&#xff1a;从待排序序列中选择最小&#xff08;或最大&#x…...

【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis

基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码&#xff0c;通过ArithmeticCaptcha生成一张验证码图片&#xff0c;通过text()函数得到验证码的答案保存到变量code&#xff0c;然后把图…...

LiteDB 数据存储与检索效率优化的最佳实践指导

一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...

WEB安全--RCE--RCE的绕过

一、回调函数的绕过&#xff08;PHP&#xff09; 1.1、回调函数 1.1.1、原理&#xff1a; 回调函数&#xff08;Callback Function&#xff09;指的是将函数名或匿名函数作为参数传递给另一个函数&#xff0c;从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...

uni-app:指引蒙层

组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...

什么是CMS?常用CMS有哪些?

一、内容管理系统&#xff08;Content Management System&#xff09;‌ ‌什么是CMS‌&#xff1a;位于 Web 前端&#xff08;服务器&#xff09;和后端办公系统之间的软件系统&#xff0c;用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...

【Es】基础入门:开启全文搜索的大门

文章目录 一、Elasticsearch 是什么​二、核心概念解读​索引&#xff08;Index&#xff09;​文档&#xff08;Document&#xff09;​映射&#xff08;Mapping&#xff09;​分片&#xff08;Shard&#xff09;​副本&#xff08;Replica&#xff09;​ 三、基本操作入门​安…...

74. Linux设备树详解

一、什么是设备树 1、uboot启动内核用到zImage&#xff0c;imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000. 80800000 —zImage 83000000—dtb 2、设备树&#xff1a;设备和树。 设备树(Device Tree)&#xff0c;将这个词分开就是“设备”和“树”&#xff0c;描述设…...

从责任链模式聊到aware接口

从责任链模式聊到aware接口 责任链是什么&#xff1f; 责任链模式是一种行为型设计模式&#xff0c;将多个对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;让多个对象都有机会处理这个请求&#xff0c;请求会顺着链传递&#xff0c;直到某个对象处理它为止。…...

在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装

在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长&#xff0c;这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…...

考研408-数据结构完整代码 线性表的链式存储结构 - 单链表

单链表操作详解&#xff08;C实现&#xff09; 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...

使用Python爬虫获取淘宝App商品详情

在电商领域&#xff0c;获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台&#xff0c;提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂&#xff0c;但通过Python爬虫技术&#xff0c;我们可以高效地获取淘宝App商品的详细信息…...

在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式

在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式时&#xff0c;通常是由于 网络配置错误、桥接适配器选择不当或主机网络环境限制 导致。以下是详细的排查和解决方法&#xff1a;我采用第一步就解决了问题 1. 检查 VMware 桥接模式配置 步骤 1&#xff1a;…...

2025前端八股文终极指南:从高频考点到降维打击的面试突围战

2025前端八股文终极指南&#xff1a;从高频考点到降维打击的面试突围战 一、2025前端八股文核心考点重构 1.1 新型响应式系统三连问 Vue3信号式响应性&#xff1a; // 信号式响应性底层实现 const [count, setCount] createSignal(0) effect(() > {console.log("当…...

MIPS-32架构(寄存器堆,指令系统,运算器)

文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本&#xff0c;本文介绍32位版本 寄存器 正如笔者曾说…...

MySQL数据库和表的操作之SQL语句

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 MySQL数据库和表的操作 关系型数据库&#xff0c;都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL&#xff1a;结构化查询语言(Structured Query Language)&…...

Ubuntu在VMware中无法全屏

Ubuntu在VMware中无法全屏 方法&#xff1a;安装open-vm-tools 在Ubuntu打开终端&#xff1a; 1.输入&#xff1a; sudo apt-get install open-vm-tools2.安装依赖&#xff1a; sudo apt-get install open-vm*3.重启Ubuntu reboot...

[C++面试] 智能指针面试点(重点)续3

[C面试] RAII资源获取即初始化&#xff08;重点&#xff09;-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;续1-CSDN博客 [C面试] 智能指针面试点&#xff08;重点&#xff09;续2-CSDN博客 …...