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

Spring AI 第二讲 之 Chat Model API 第八节Anthropic 3 Chat

Anthropic Claude 是一系列基础人工智能模型,可用于各种应用。对于开发人员和企业来说,您可以利用 API 访问,直接在 Anthropic 的人工智能基础架构之上进行构建。

Spring AI 支持用于同步和流式文本生成的 Anthropic 消息 API。

Anthropic 的 Claude 模型也可通过 Amazon Bedrock 使用。Spring AI 还提供专用的 Amazon Bedrock Anthropic 客户端实现。

先决条件

您需要在 Anthropic 门户上创建一个 API 密钥。在Anthropic API 面板上创建账户,然后在 "获取 API 密钥 "页面上生成 API 密钥。Spring AI 项目定义了一个名为 spring.ai.anthropic.api-key 的配置属性,你应该将其设置为从 anthropic.com 获取的 API 密钥的值。导出环境变量是设置该配置属性的一种方法:

export SPRING_AI_ANTHROPIC_API_KEY=<INSERT KEY HERE>

添加资源库和 BOM

Spring AI 工件发布在 Spring Milestone 和 Snapshot 资源库中。请参阅 "资源库 "部分,将这些资源库添加到您的构建系统中。

为了帮助进行依赖性管理,Spring AI 提供了一个 BOM(物料清单),以确保在整个项目中使用一致的 Spring AI 版本。请参阅 "依赖关系管理 "部分,将 Spring AI BOM 添加到构建系统中。

自动配置

Spring AI 为 Anthropic Chat Client 提供 Spring Boot 自动配置功能。要启用该功能,请在项目的 Maven pom.xml 文件中添加以下依赖项:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
</dependency>

或 Gradle build.gradle 构建文件。

dependencies {implementation 'org.springframework.ai:spring-ai-anthropic-spring-boot-starter'
}

请参阅 "依赖关系管理 "部分,将 Spring AI BOM 添加到构建文件中。

聊天属性

重试属性

属性前缀 spring.ai.retry 用于配置 Anthropic 聊天模型的重试机制。 

PropertyDescriptionDefault

spring.ai.retry.max-attempts

重试的最大次数。

10

spring.ai.retry.backoff.initial-interval

指数后退策略的初始睡眠时间。

2 sec.

spring.ai.retry.backoff.multiplier

回退间隔倍增器。

5

spring.ai.retry.backoff.max-interval

最大回退持续时间。

3 min.

spring.ai.retry.on-client-errors

如果为假,则抛出 NonTransientAiException 异常,并且不尝试重试 4xx 客户端错误代码

false

spring.ai.retry.exclude-on-http-codes

不应触发重试(例如抛出 NonTransientAiException)的 HTTP 状态代码列表。

empty

spring.ai.retry.on-http-codes

应触发重试(例如抛出 TransientAiException)的 HTTP 状态代码列表。

empty

目前,重试策略不适用于流 API。 

连接属性

spring.ai.anthropic 前缀是用于连接 Anthropic 的属性前缀。 

PropertyDescriptionDefault

spring.ai.anthropic.base-url

要连接的 URL

api.anthropic.com

spring.ai.anthropic.version

人类应用程序接口版本

2023-06-01

spring.ai.anthropic.api-key

The API Key

-

配置属性

spring.ai.anthropic.chat 前缀是属性前缀,用于配置 Anthropic 的聊天模型实现。 

PropertyDescriptionDefault

spring.ai.anthropic.chat.enabled

启用人类聊天模式。

true

spring.ai.anthropic.chat.options.model

这是人类聊天模型。支持 claude-3-opus-20240229、claude-3-sonnet-20240229、claude-3-haiku-20240307 以及传统的 claude-2.1、claude-2.0 和 claude-instant-1.2 模型。

claude-3-opus-20240229

spring.ai.anthropic.chat.options.temperature

采样温度,用于控制生成的补间明显的创造性。取值越高,输出结果越随机,取值越低,结果越集中和确定。不建议针对同一个补全请求修改温度和 top_p,因为这两个设置之间的相互作用很难预测。

0.8

spring.ai.anthropic.chat.options.max-tokens

聊天完成时要生成的最大标记数。输入词组和生成词组的总长度受模型上下文长度的限制。

500

spring.ai.anthropic.chat.options.stop-sequence

将导致模型停止生成的自定义文本序列。我们的模型通常会在自然完成其回合后停止,这将导致响应 stop_reason 为 "end_turn"。如果您希望模型在遇到自定义文本字符串时停止生成,可以使用 stop_sequences 参数。如果模型遇到其中一个自定义序列,响应 stop_reason 值将是 "stop_sequence",响应 stop_sequence 值将包含匹配的停止序列。

-

spring.ai.anthropic.chat.options.top-p

使用核抽样在核采样中,我们会按概率递减的顺序计算每个后续标记的所有选项的累积分布,并在达到 top_p 指定的特定概率时将其切断。你应该改变 temperature 或 top_p,但不能同时改变这两个参数。建议仅用于高级用例。通常只需要使用 temperature。

-

spring.ai.anthropic.chat.options.top-k

只从每个后续标记的前 K 个选项中取样。用于去除 "长尾 "低概率回复。点击此处了解更多技术细节。建议仅用于高级用例。通常只需要使用温度。

-

spring.ai.mistralai.chat.options.functions

由函数名称标识的函数列表,用于在单个提示请求中启用函数调用。具有这些名称的函数必须存在于 functionCallbacks 注册表中。

-

spring.ai.mistralai.chat.options.functionCallbacks

MistralAI 工具功能回调,用于注册 ChatModel。

-

所有以 spring.ai.anthropic.chat.options 为前缀的属性都可以通过在提示调用中添加特定于请求的运行时选项在运行时重写。

运行时选项

AnthropicChatOptions.java 提供了模型配置,如要使用的模型、温度、最大标记数等。

启动时,可使用 AnthropicChatModel(api, options) 构造函数或 spring.ai.anthropic.chat.options.* 属性配置默认选项。

运行时,您可以通过在提示调用中添加新的、针对特定请求的选项来覆盖默认选项。例如,覆盖特定请求的默认模型和温度:

ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates.",AnthropicChatOptions.builder().withModel("claude-2.1").withTemperature(0.4).build()));

除了模型专用的 AnthropicChatOptions外,您还可以使用通过ChatOptionsBuilder#builder() 创建的便携式 ChatOptions实例。

函数调用

您可以在 AnthropicChatModel 中注册自定义 Java 函数,让 Anthropic Claude 模型智能地选择输出包含参数的 JSON 对象,以调用一个或多个注册函数。这是一种将 LLM 功能与外部工具和 API 相连接的强大技术。了解有关人类学函数调用的更多信息。

多模式

多模态是指模型能够同时理解和处理各种来源的信息,包括文本、图像、音频和其他数据格式。这种模式代表了人工智能模型的一大进步。

目前,Anthropic Claude 3 支持 base64 图像源类型,以及图像/jpeg、图像/png、图像/gif 和图像/webp 媒体类型。更多信息,请查看视觉指南。

Spring AI 的消息接口通过引入媒体类型支持多模态 AI 模型。该类型使用 Spring 的 org.springframework.util.MimeType 和用于原始媒体数据的 java.lang.Object 来包含有关消息中媒体附件的数据和信息。

下面是从 AnthropicChatModelIT.java 中提取的一个简单代码示例,演示了用户文本与图片的结合。

byte[] imageData = new ClassPathResource("/multimodal.test.png").getContentAsByteArray();var userMessage = new UserMessage("Explain what do you see on this picture?",List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));ChatResponse response = chatModel.call(new Prompt(List.of(userMessage)));logger.info(response.getResult().getOutput().getContent());

 它的输入是 multimodal.test.png 图像:

以及文本信息 "请解释一下您在这张图片上看到了什么?

图片显示的是一个铁丝水果篮的特写,里面装着几块水果。
篮子似乎是由细金属丝编织成圆形,并带有一个高高的把手。

篮子里有几根黄色的香蕉和几个红色的苹果,也可能是西红柿。
水果鲜艳的颜色与金属丝篮子的金属色调形成了鲜明的对比。

照片的景深较浅,焦点集中在前景的水果上,而向上延伸的篮子手柄则略显模糊,在背景中营造出悦目的虚化效果。

构图和光线使画面呈现出一种简洁、极简的美感,突出了这个优雅的铁丝篮中水果的自然美和新鲜感。

示例Controller

创建一个新的 Spring Boot 项目,并将 spring-ai-anthropic-spring-boot-starter 添加到你的 pom(或 gradle)依赖项中。

在 src/main/resources 目录下添加 application.properties 文件,以启用和配置 Anthropic 聊天模型:

spring.ai.anthropic.api-key=YOUR_API_KEY
spring.ai.anthropic.chat.options.model=claude-3-opus-20240229
spring.ai.anthropic.chat.options.temperature=0.7
spring.ai.anthropic.chat.options.max-tokens=450

 将 api-key 替换为您的 Anthropic 证书。

这将创建一个 AnthropicChatModel 实现,您可以将其注入到您的类中。下面是一个使用聊天模型生成文本的简单 @Controller 类的示例。

@RestController
public class ChatController {private final AnthropicChatModel chatModel;@Autowiredpublic ChatController(AnthropicChatModel chatModel) {this.chatModel = chatModel;}@GetMapping("/ai/generate")public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {return Map.of("generation", chatModel.call(message));}@GetMapping("/ai/generateStream")public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatModel.stream(prompt);}
}

手动配置

AnthropicChatModel实现了 ChatModel 和 StreamingChatModel,并使用底层 AnthropicApi客户端连接到 Anthropic 服务。

在项目的 Maven pom.xml 文件中添加 Spring-ai-anthropic 依赖关系:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-anthropic</artifactId>
</dependency>

或 Gradle build.gradle 构建文件。

dependencies {implementation 'org.springframework.ai:spring-ai-anthropic'
}

请参阅 "依赖关系管理 "部分,将 Spring AI BOM 添加到构建文件中。
接下来,创建 AnthropicChatModel 并将其用于文本生成:

var anthropicApi = new AnthropicApi(System.getenv("ANTHROPIC_API_KEY"));var chatModel = new AnthropicChatModel(anthropicApi,AnthropicChatOptions.builder().withModel("claude-3-opus-20240229").withTemperature(0.4).withMaxTokens(200).build());ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates."));// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(new Prompt("Generate the names of 5 famous pirates."));

AnthropicChatOptions 为聊天请求提供配置信息。AnthropicChatOptions.Builder 是流畅的选项生成器。

底层 AnthropicApi 客户端

AnthropicApi是 Anthropic Message API的轻量级 Java 客户端。

下面的类图说明了 AnthropicApi 聊天接口和构建模块:

下面是一个如何以编程方式使用 api 的简单片段:

 

AnthropicApi anthropicApi =new AnthropicApi(System.getenv("ANTHROPIC_API_KEY"));RequestMessage chatCompletionMessage = new RequestMessage(List.of(new MediaContent("Tell me a Joke?")), Role.USER);// Sync request
ResponseEntity<ChatCompletion> response = anthropicApi.chatCompletionEntity(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),List.of(chatCompletionMessage), null, 100, 0.8f, false));// Streaming request
Flux<StreamResponse> response = anthropicApi.chatCompletionStream(new ChatCompletionRequest(AnthropicApi.ChatModel.CLAUDE_3_OPUS.getValue(),List.of(chatCompletionMessage), null, 100, 0.8f, true));

更多信息请参阅 AnthropicApi.java 的 JavaDoc。

低级应用程序接口示例


AnthropicApiIT.java 测试提供了一些如何使用轻量级库的一般示例。


Anthropic 功能调用

您可以向 AnthropicChatModel 注册自定义 Java 函数,并让 Anthropic 模型智能地选择输出包含参数的 JSON 对象,以调用一个或多个已注册函数。这样,您就可以将 LLM 功能与外部工具和 API 相连接。claude-3-opus、claude-3-sonnet 和 claude-3-haiku 模型经过训练,可以检测函数何时应被调用,并根据函数签名响应 JSON。

Anthropic API 不会直接调用函数;相反,模型会生成 JSON,您可以用它在代码中调用函数,并将结果返回给模型以完成对话。

截至 2024 年 4 月 4 日,第三方平台(如 Vertex AI 或 AWS Bedrock)尚未支持流式函数调用和工具使用,但即将推出。

Spring AI 提供了灵活且用户友好的注册和调用自定义函数的方法。一般来说,自定义函数需要提供函数名称、描述和函数调用签名(作为 JSON 模式),以便让模型知道函数期望使用哪些参数。描述有助于模型了解何时调用该函数。

作为开发人员,您需要实现一个函数,接收人工智能模型发送的函数调用参数,并将结果反馈给模型。您的函数可以反过来调用其他第三方服务来提供结果。

Spring AI 可以轻松实现这一点,只需定义一个 @Bean 定义,返回 java.util.Function 并将 bean 名称作为调用 ChatModel 时的一个选项即可。

在引擎盖下,Spring 会用适当的适配器代码封装您的 POJO(函数),从而实现与 AI 模型的交互,使您无需编写繁琐的模板代码。底层基础架构的基础是 FunctionCallback.java 接口和配套的 FunctionCallbackWrapper.java 实用程序类,用于简化 Java 回调函数的实现和注册。

工作原理

假设我们想让人工智能模型响应它所不具备的信息,例如某个地点的当前温度。

我们可以为人工智能模型提供有关我们自身功能的元数据,让它在处理您的提示时可以用来检索这些信息。

例如,如果在处理提示时,人工智能模型确定它需要有关给定地点温度的额外信息,它就会启动服务器端生成的请求/响应交互。人工智能模型会调用客户端函数。人工智能模型以 JSON 格式提供方法调用详情,客户端负责执行该函数并返回响应。

Spring AI 大大简化了为支持函数调用而编写的代码。它为您提供函数调用对话的中介。您只需以 @Bean 的形式提供函数定义,然后在提示选项中提供函数的 Bean 名称即可。您还可以在提示中引用多个函数 Bean 名称。

 

快速入门


让我们创建一个聊天机器人,通过调用自己的函数来回答问题。为了支持聊天机器人的回答,我们将注册自己的函数,该函数接收一个地点并返回该地点的当前天气。

当需要回答诸如 "波士顿的天气如何?"这样的问题时,人工智能模型将调用客户端,提供位置值作为参数传递给函数。这种类似 RPC 的数据以 JSON 格式传递。

我们的函数可以使用基于 SaaS 的天气服务 API,并将天气响应返回给模型,以完成对话。在本示例中,我们将使用一个名为 MockWeatherService 的简单实现,对不同地点的温度进行硬编码。

下面的 MockWeatherService.java 表示天气服务 API:

public class MockWeatherService implements Function<Request, Response> {public enum Unit { C, F }public record Request(String location, Unit unit) {}public record Response(double temp, Unit unit) {}public Response apply(Request request) {return new Response(30.0, Unit.C);}
}

将函数注册为 Bean

有了 AnthropicChatModel Auto-Configuration,您就有多种方法在 Spring 上下文中将自定义函数注册为 Bean。

我们首先介绍对 POJO 最友好的选项。

普通 Java 函数
在这种方法中,您可以在应用程序上下文中定义 @Beans,就像定义任何其他 Spring 托管对象一样。

在内部,Spring AI ChatModel 将创建一个 FunctionCallbackWrapper 封装器实例,该封装器将添加通过 AI 模型调用该函数的逻辑。@Bean 的名称将作为 ChatOption 传递。

@Configuration
static class Config {@Bean@Description("Get the weather in location") // function descriptionpublic Function<MockWeatherService.Request, MockWeatherService.Response> weatherFunction1() {return new MockWeatherService();}...
}

@Description 注解是可选的,它提供了一个函数描述 (2),帮助模型理解何时调用函数。这是一个重要的属性,可以帮助人工智能模型确定要调用的客户端函数。

另一种提供函数说明的方法是在 MockWeatherService.Request 上使用 @JsonClassDescription 注解来提供函数说明:

@Configuration
static class Config {@Beanpublic Function<Request, Response> currentWeather3() { // (1) Bean 名称作为函数名称。return new MockWeatherService();}...
}@JsonClassDescription("Get the weather in location") // (2) 功能描述
public record Request(String location, Unit unit) {}

最佳做法是在请求对象中注释信息,使生成的函数 JSON 模式尽可能具有描述性,以帮助人工智能模型选择要调用的正确函数。

FunctionCallWithFunctionBeanIT.java 演示了这种方法。

函数回调封装器
注册函数的另一种方法是创建一个 FunctionCallbackWrapper 封装器,如下所示:

@Configuration
static class Config {@Beanpublic FunctionCallback weatherFunctionInfo() {return new FunctionCallbackWrapper<>("CurrentWeather", // (1) function name"Get the weather in location", // (2) function description(response) -> "" + response.temp() + response.unit(), // (3) Response Converternew MockWeatherService()); // function code}...
}

 

它封装了第三方 MockWeatherService 函数,并将其注册为 AnthropicChatModel 的 CurrentWeather 函数。它还提供了一个说明 (2) 和一个可选的响应转换器 (3),用于将响应转换成模型所期望的文本。

默认情况下,响应转换器会对响应对象进行 JSON 序列化。

FunctionCallbackWrapper 内部根据 MockWeatherService.Request 类解析函数调用签名。

在聊天选项中指定函数

要让模型知道并调用您的 CurrentWeather 功能,您需要在提示请求中启用该功能:

AnthropicChatModel chatModel = ...UserMessage userMessage = new UserMessage("What's the weather like in Paris?");ChatResponse response = chatModel.call(new Prompt(List.of(userMessage),AnthropicChatOptions.builder().withFunction("CurrentWeather").build())); // (1) Enable the functionlogger.info("Response: {}", response);

 

上述用户问题将触发对 CurrentWeather 函数的 3 次调用(每个城市一次),并产生最终回复。

使用提示选项注册/调用函数

除了自动配置外,您还可以通过 Prompt 请求动态注册回调函数:

AnthropicChatModel chatModel = ...UserMessage userMessage = new UserMessage("What's the weather like in Paris?");var promptOptions = AnthropicChatOptions.builder().withFunctionCallbacks(List.of(new FunctionCallbackWrapper<>("CurrentWeather", // name"Get the weather in location", // function descriptionnew MockWeatherService()))) // function code.build();ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), promptOptions));

在该请求的持续时间内,提示中注册的功能默认为启用。

 

这种方法可以根据用户输入动态地选择要调用的不同函数。

FunctionCallWithPromptFunctionIT.java 集成测试提供了一个完整示例,说明如何在 AnthropicChatModel 中注册函数并在提示请求中使用该函数。

相关文章:

Spring AI 第二讲 之 Chat Model API 第八节Anthropic 3 Chat

Anthropic Claude 是一系列基础人工智能模型&#xff0c;可用于各种应用。对于开发人员和企业来说&#xff0c;您可以利用 API 访问&#xff0c;直接在 Anthropic 的人工智能基础架构之上进行构建。 Spring AI 支持用于同步和流式文本生成的 Anthropic 消息 API。 Anthropic …...

【ARM 常见汇编指令学习 6.2 -- ARMv8 汇编指令 SDIV 详细介绍】

文章目录 SDIV指令格式使用示例注意事项总结 SDIV ARMv8 架构中的 SDIV 指令用于执行带符号整数除法操作。这意味着它可以处理负数除法&#xff0c;与 UDIV&#xff08;执行无符号整数除法&#xff09;形成对比。SDIV 将两个寄存器中的带符号整数相除&#xff0c;将除法结果存…...

【ArcGIS微课1000例】0113:大地测量要素概述与构建

文章目录 一、大地测量要素描述1. 大地要素的概念2. 大地要素的类型二、创建大地测量要素1. 创建要素类2. 创建大地要素一、大地测量要素描述 1. 大地要素的概念 大地测量要素的测量值考虑了投影空间的固有变形。如果要创建一个空间跨度较大的要素(例如一条横跨大洋的飞行路…...

【记录】LangChain+本地模型的文档问答(webUI)

已在notebook测试无误。 包安装 pip install langchain langchain_community transformers InstructorEmbedding sentence_transformers2.2.2 faiss-gpu PyPDF2 streamlit pyngrok gradio fitz frontend 环境变量设置 huggingface连不上无法下载模型&#xff0c;需要设置镜像。…...

Winddow系统下关于Golang使用Cgo的配置

1.配置CGO_ENABLED为1 go env -w CGO_ENABLED1 2.安装gcc环境&#xff0c;否则出现cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%错误 安装包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1sgF9lijqGeP…...

python面向过程与初始面向对象编程

让我们穿越到《龙珠》世界&#xff0c;一起揭开 面向对象编程 的神秘面纱吧。 面向过程编程与面向对象编程 天下第一武道会 选手登记 第 22 届天下第一武道会即将召开&#xff0c;各路武术高手齐聚一堂&#xff0c;其中最受瞩目的&#xff0c;当属卡卡罗特&#xff08;孙悟…...

vue3 实现自定义指令封装 --- 通俗易懂

1、局部自定义指令 1.1 在<script setup>定义组件内的指令&#xff0c;任何以v开头的驼峰式命名的变量都可以被用作一个自定义指令 <template><div><h3>使用自定义指令</h3><div>########################## start 局部自定义指令</d…...

5.31.15 使用图像到图像转换和 YOLO 技术对先前的乳房 X 光检查结果中的异常进行早期检测和分类

在本研究中&#xff0c;我们研究了基于 You-Only-Look-Once (YOLO) 架构的端到端融合模型的有效性&#xff0c;该模型可同时检测和分类数字乳房 X 光检查中的可疑乳腺病变。包括四类病例&#xff1a;肿块、钙化、结构扭曲和正常&#xff0c;这些病例来自包含 413 个病例的私人数…...

题解web

1.[LitCTF 2023]Follow me and hack me 1&#xff09;进入题目环境&#xff0c;提示get传参&#xff0c;post传参 2&#xff09;看看源码&#xff0c;也没啥 3&#xff09;直接用hackbar&#xff0c;传入对应参数即可得到FLAG 3&#xff09;但是扫描出来它后端还有东西&#x…...

在keil5中打开keil4工程的方法

文章目录 1. 打开文件 2. 安装旧版本包 3. 在keil4中打开keil5工程 1. 打开文件 在keil5 MDK的环境下&#xff0c;打开keil4的工程文件&#xff0c;会弹出下图所示的窗口&#xff1a; 参考官网的解释这两个方法分别为&#xff1a; 1. 使用MDK 版本 4 Legacy Pack时&#x…...

【代码随想录算法训练营第37期 第二十四天 | LeetCode77. 组合】

代码随想录算法训练营第37期 第二十四天 | LeetCode77. 组合 一、77. 组合 解题代码C&#xff1a; class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int startIndex){if(path.size() k){result.p…...

探索Linux中的`tree`命令:目录结构的可视化利器

探索Linux中的tree命令&#xff1a;目录结构的可视化利器 在Linux系统中&#xff0c;管理文件和目录结构是一项日常任务。当我们需要快速查看目录的层次结构时&#xff0c;tree命令无疑是一个强大而直观的工具。本文将详细介绍tree命令的功能、用法以及一些实用的选项。 一、…...

ES 面试手册

Elasticsearch是什么&#xff1f; Elasticsearch是一个基于Lucene的搜索和分析引擎&#xff0c;它提供了一个分布式、多租户能力的全文搜索引擎&#xff0c;具有HTTP Web界面和无模式JSON文档。 Elasticsearch中的倒排索引是什么&#xff1f; 倒排索引是搜索引擎的核心结构&a…...

Mybatis缓存的生命周期、使用的特殊情况

以下场景均在Spring Boot程序中&#xff0c;并非手动创建SqlSession使用。 在回答这个问题之前&#xff0c;我们先来回顾一下&#xff0c;Mybatis的一级二级缓存是啥。 一级二级缓存 是什么 一级缓存&#xff08;本地缓存&#xff09;&#xff1a;一级缓存是SqlSession级别的…...

day 37 738.单调递增的数字

738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…...

【加密与解密】【01】网络安全体系

网络通信OSI模型 物理层&#xff08;Physical&#xff09;链路层&#xff08;DataLink&#xff09;网络层&#xff08;Network&#xff09;传输层&#xff08;Transport&#xff09;会话层&#xff08;Session&#xff09;表示层&#xff08;Presentation&#xff09;应用层&a…...

nvm,node不是内部命令,npm版本不支持问题(曾经安装过nodejs)

nvm安装后nvm -v有效&#xff0c;node指令无效 环境变量配置无问题 推荐方案 下载你需要的node版本 Index of /dist/ (nodejs.org) 下载后解压到你的nvm存储版本的位置 cmd进入切换你的使用版本&#xff08;此时你的nodejs是从网上下载的&#xff0c;npm文件是存在的&…...

从入门到精通:基础IO

引言 在编程的世界里&#xff0c;文件输入输出&#xff08;IO&#xff09;是与操作系统交互的重要方式。无论你是开发应用程序、处理数据&#xff0c;还是管理系统资源&#xff0c;掌握文件IO操作都是必不可少的。本篇博客将带你深入了解C语言中的基础IO操作&#xff0c;从入门…...

网络空间安全数学基础·多项式环与有限域

5.1 多项式环&#xff08;掌握&#xff09; 5.2 多项式剩余类环&#xff08;理解&#xff09; 5.3 有限域&#xff08;熟练&#xff09; 5.1 多项式环 定义&#xff1a;设F是一个域&#xff0c;称是F上的一元多项式&#xff0e; 首项&#xff1a;如果an≠0&#xff0c;则称 a…...

路由器重启真的好吗?多久重启一次更好?

前言 小白前段时间发现自己家的OpenWRT软路由上网特别慢&#xff0c;有时候通话还有点卡顿。 然而有个朋友用的普通路由器也有类似的问题&#xff0c;而且有时候根本上不去网。 解决的办法很简单&#xff1a;重启路由器。 重启路由器&#xff1f; 但路由器重启是真的好吗&a…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...