4.Spring AI Prompt:与大模型进行有效沟通
1.什么是提示词
在人工智能领域,提示词(Prompt)扮演着至关重要的角色,它宛如一把精准的钥匙,为 AI 大模型开启理解之门。作为向模型输入的关键信息或引导性语句,提示词能够助力模型迅速洞悉问题需求,进而生成精准的回答。
具体而言,提示词功效显著。一方面,它能提升回答准确性,补充背景资料、设定限定条件,让答案更切题,削减模糊性;另一方面,可把控回答走向,限定篇幅、雕琢风格、拿捏语气。甚至还可以激发模型创意潜能,带来新颖思路与独特想法。
从类型上划分,提示词通常可归为两大类别:描述型提示词与指令型提示词。
描述型提示词恰似一位细致的画师,通过对事物全方位、多层次的刻画,如外观的勾勒、特征的描摹、功能的阐述以及用途与背景的交代等,引导模型生成贴合需求的内容。
指令型提示词则像一位果断的指挥官,以简洁有力的指令,直白地告知模型需要执行的任务,诸如撰写特定主题的文章、运用特定手法描述场景或是按照指定格式回答问题等,让模型清晰知晓行动方向。
2.Spring AI中的提示词(Prompt)
在 Spring AI 中,处理 Prompt 类似于在 Spring MVC 中管理 VIEW,需要创建动态内容占位符,这些占位符会根据用户请求或应用程序中的其他代码进行替换,从而生成完整的 Prompt 并传递给模型。也类似包含表达式占位符的 SQL 语句。
最初Prompt 只是简单的字符串,但随着技术发展,其逐渐包含了特定输入的占位符,例如 “USER:” 等,以便模型能够识别不同部分的信息。OpenAI 进一步推动了 Prompt 结构的发展,将多个消息字符串分类为不同角色,如系统角色(SYSTEM)、用户角色(USER)、助手角色(ASSISTANT)和工具 / 函数。
第三章介绍到ChatClient 对象提供了三个prompt()重载方法:
chatClient.prompt() .user(("你给我说一个笑话") .call() .content();
chatClient.prompt(new Prompt("你给我说一个笑话")) .call() .content();
chatClient.prompt("你给我说一个笑话") .call() .content();
上述三种方法实现的功能一样,向AI大模型发送用户的消息你给我说一个笑话。这就是提示词,针对这个提示词可以做进一步的优化,让大模型更清楚的明白你的需求,比如你给我说一个周星驰风格的笑话。
3.核心接口
3.1 Prompt接口
Prompt 是一个 ModelRequest表示 AI 模型请求中使用的提示词,它封装了 Message 对象列表和可选的模型请求选项。下面的例子让OpenAI讲一个笑话使用ChatModel几种调用写法。
//第一种方法chatModel.call("讲一个笑话");//第二种方法chatModel.call(new Prompt("讲一个笑话"));//第三种方法var openAiChatOptions = OpenAiChatOptions.builder().model("gpt-3.5-turbo").temperature(0.4).maxTokens(200).build();var prompt = new Prompt("讲一个笑话", openAiChatOptions);chatModel.call(prompt);//第四种方法chatModel.call(new UserMessage("讲一个笑话"));
3.2 Message接口
Message 接口封装了提示词文本、元数据属性集合以及消息分类 MessageType。每个Message在提示词中都有不同角色的作用,其内容和意图各不相同。这些角色可以涵盖各种元素,从用户查询到人工智能生成的响应,再到相关背景信息。
对话模型根据根据对话角色区分消息类别,角色与MessageType有对应映射关系:
| 角色 | MessageType | 描述 | Content |
|---|---|---|---|
| SYSTEM(系统) | SystemMessage | 引导人工智能的行为和响应风格,为人工智能如何解释和回复输入设置参数或规则。这类似于在开始对话之前向人工智能提供指令。 | Message |
| USER(用户) | UserMessage | 向人工智能提出的问题、命令或陈述。 | Message Media |
| ASSISTANT(助手) | AssistantMessage | 人工智能对用户输入的响应。 | Message Media ToolCall |
| TOOL(工具) | ToolResponseMessage | 响应工具调用AssistantMessage时返回附加信息。 | Message ToolResponse |
SYSTEM、USER 和 ASSISTANT 之间存在密切的相互关系。USER 向 SYSTEM 发送请求,SYSTEM 生成 ASSISTANT 响应用户的请求。在这个过程中,SYSTEM 需要理解用户的意图,并根据其生成合适的响应`。
@GetMapping("/ai/joke")
public String joke(@RequestParam(value = "message", defaultValue = "给我讲个笑话") String message) {SystemMessage systemMessage = new SystemMessage("你是一个会讲笑话的智能助手,可以讲各种风格的笑话,比如爆笑、冷笑话、黑色幽默等");UserMessage userMessage = new UserMessage(message);List<Message> messages = List.of(systemMessage, userMessage);String content = this.chatClient.prompt().messages(messages).call().content();return content;
}
上述例子传给大模型2个Message,一个是用户的需求UserMessage,另一个是系统消息SystemMessage。
Message接口定义如下
public interface Content {String getContent();Map<String, Object> getMetadata();
}public interface Message extends Content {MessageType getMessageType();
}
多模态消息类型还实现了 MediaContent 接口,提供了媒体内容对象的列表。
public interface MediaContent extends Content {Collection<Media> getMedia();}
media字段包含了多模态的输入输出,UserMessage AssistantMessage实现MediaContent接口。
4. PromptTemplate提示词模版
4.1 什么是提示词模板
它是一种预先设计好结构与格式的文本模板,其核心目的是引导大模型生成符合特定需求的输出。开发者通过精心构建这些模板,将任务相关的关键信息、指令以及期望的回答格式等要素融入其中,使得模型在接收到基于模板生成的提示词后,能精准理解任务意图并产出高质量的回复。
在 Spring AI 中,提示模板关键组件PromptTemplate类。这个类使用由 Terence Parr 开发的开源StringTemplate引擎来构建和管理提示。PromptTemplate类可以便捷的创建提示词,然后将这些提示词发送到人工智能模型进行处理。
例如现在需要设计一个讲笑话的智能机器人,用户只需要输入笑话的类型和主题,可以生成不同类型的笑话,adjective topic参数用户可以动态传入如下所示:
@GetMapping("/ai/joke")
public String joke(@RequestParam(value = "adjective", defaultValue = "冷笑话") String adjective,@RequestParam(value = "topic", defaultValue = "小明") String topic) {PromptTemplate promptTemplate = new PromptTemplate("给我讲一个{adjective}笑话关于{topic}");Prompt prompt = promptTemplate.create(Map.of("adjective", adjective, "topic", topic));return chatClient.prompt(prompt).call().content();
}
❯ curl http://localhost:8080/ai/joke
{ "completion": "小明走进图书馆,问图书管理员:“请问这里有没有那本《冷笑话大全》?” 管理员回答:“有的,不过这本书有点冷,你要小心别着凉了。” 小明疑惑地问:“着凉?一本书怎么会让人着凉呢?” 管理员微笑着说:“因为它是一本冷笑话大全啊!”" }
4.2核心接口

PromptTemplate类实现了多个接口,这些接口提供了不同的方式创建提示词。
PromptTemplateStringActions提供最基本的字符串提示词创建。
接口定义:
public interface PromptTemplateStringActions {
//将提示模板渲染为最终字符串格式,无需外部输入,适用于没有占位符或动态内容的模板。
String render();
//增强了渲染功能以包含动态内容。它使用 Map<String, Object>,其中映射键是提示模板中的占位符名称,
// 值是要插入的动态内容。
String render(Map<String, Object> model); }
使用方法:
//将提示模板渲染为最终字符串格式,无需外部输入,适用于没有占位符或动态内容的模板。
PromptTemplate promptTemplate = new PromptTemplate("没有占位符的提示词");
String promptStr = promptTemplate.render();
System.out.printf("promptStr=%s\n", promptStr);//增强了渲染功能以包含动态内容。它使用 Map<String, Object>,其中映射键是提示模板中的占位符名称,
// 值是要插入的动态内容。
PromptTemplate promptTemplate1 = new PromptTemplate("有占位符提示词,占位符{str}");
String promptStr1 = promptTemplate1.render(Map.of("str", "helloword"));
System.out.printf("promptStr1=%s\n", promptStr1);//结果:
promptStr=没有占位符的提示词
promptStr1=有占位符提示词,占位符helloword
PromptTemplateMessageActions生成和操作Message对象来创建提示词。
接口定义:
public interface PromptTemplateMessageActions {
//建一个没有附加数据的消息对象,用于静态或预定义的消息内容。Message createMessage();
//扩展消息创建以集成动态内容,接受 Map<String, Object>,其中每个条目代表消息模板中的占位符及其对应的动态值。Message createMessage(List<Media> mediaList);
//创建具有静态文本和媒体内容的消息对象。Message createMessage(Map<String, Object> model);}
使用方法:
//建一个没有附加数据的消息对象,用于静态或预定义的消息内容。
PromptTemplate promptTemplate2 = new PromptTemplate("messageActions createMessage静态消息");
Message message = promptTemplate2.createMessage();
System.out.printf("message=%s\n", message.getText());
//扩展消息创建以集成动态内容,接受 Map<String, Object>,其中每个条目代表消息模板中的占位符及其对应的动态值。
PromptTemplate promptTemplate3 = new PromptTemplate("messageActions createMessage,占位符{str}");
Message message1 = promptTemplate3.createMessage(Map.of("str", "helloword"));
System.out.printf("message1=%s\n", message1.getText());//创建具有静态文本和媒体内容的消息对象。
PromptTemplate promptTemplate = new PromptTemplate("静态文本和媒体内容");
List<Media> mediaList = new ArrayList<>();
mediaList.add(0, new Media(new MimeType("img"), new URL("https://docs.spring.io/spring-ai/reference/_/img/spring-logo.svg")));
UserMessage message2 = (UserMessage) promptTemplate.createMessage(mediaList);
System.out.printf("new message2=%s\n", message2.getMedia().get(0).getData());//结果:
message=messageActions createMessage静态消息
message1=messageActions createMessage,占位符helloword
new message2=https://docs.spring.io/spring-ai/reference/_/img/spring-logo.svg
PromptTemplateActions返回Prompt对象,对象可以传递给ChatModel以生成响应。
public interface PromptTemplateActions extends PromptTemplateStringActions {Prompt create();Prompt create(ChatOptions modelOptions);Prompt create(Map<String, Object> model);Prompt create(Map<String, Object> model, ChatOptions modelOptions);}
使用方法:
//无需外部数据输入即可生成提示对象,非常适合静态或预定义提示。
PromptTemplate promptTemplate1 = new PromptTemplate("静态或预定义提示");
Prompt prompt = promptTemplate1.create();
System.out.printf("prompt=%s\n", prompt.getContents());//生成一个无需外部数据输入但带有对话模型请求特定选项的 Prompt 对象。
ZhiPuAiChatOptions chatOptions = new ZhiPuAiChatOptions();
chatOptions.setModel("model");
chatOptions.setMaxTokens(1024);PromptTemplate promptTemplate4 = new PromptTemplate("带有聊天请求特定选项的 Prompt 对象。");
Prompt prompt1 = promptTemplate4.create(chatOptions);
System.out.printf("prompt1=%s\n", prompt1.getContents());//扩展提示创建功能以包含动态内容,采用 Map<String, Object>,其中每个映射条目都是提示模板中的占位符及其关联的动态值。
PromptTemplate promptTemplate5 = new PromptTemplate("PromptTemplateActions,占位符{str}");
Message message3 = promptTemplate5.createMessage(Map.of("str", "helloword"));
System.out.printf("message3=%s\n", message3.getText());//模型特定选项+动态参数
Prompt prompt2 = promptTemplate5.create(Map.of("str", "helloword"), chatOptions);
System.out.printf("prompt2=%s\n", prompt2.getContents());
4.3 多角色提示词
提示词模板也可以应用于不同类型的角色消息,比如SystemMessage。同时可以讲多个角色Message组合一起构建Prompt。
@GetMapping("/ai")
String generation() {String name = "三国百晓生";String userText = """讲一讲赤壁之战的故事""";Message userMessage = new UserMessage(userText);String systemText = """你是一个能讲历史故事的智能助手,尤其精通三国历史。你的名字是{name}。""";SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name));Prompt prompt = new Prompt(List.of(userMessage, systemMessage));String content = chatClient.prompt(prompt).advisors(new SimpleLoggerAdvisor()).call().content();return content;
}
上述例子通过使用系统提示模板(SystemPromptTemplate)创建一个带有系统角色的消息并传入占位符值来构建(Prompt)实例。然后将带有用户角色的消息与系统角色的消息相结合构建最终的提示词传给大模型。
4.4 提示词从资源文件导入
Spring AI 支持org.springframework.core.io.Resource,因此可以将提示词数据放在一个文件中,该文件可直接在PromptTemplate中使用。例如,可以 使用 @Value 注解从配置文件或环境中注入 Resource 对象。
@Value("classpath:/prompts/system-message.st")
private Resource systemResource;
在项目resource/prompts目录新建文件system-message.st内容如下:
你是一个能讲历史故事的智能助手,尤其精通三国历史。
你的名字是{name}。
完整例子:
@Value("classpath:/prompts/system-message.st")
private Resource systemResource;@GetMapping("/ai")
String ai() {SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", "智能助手"));Prompt prompt = new Prompt(List.of(systemMessage));String content = chatClient.prompt(prompt).advisors(new SimpleLoggerAdvisor()).call().content();return content;
}
5.提示词工程
在生成式人工智能领域,提示词的创建对于开发者而言是一项至关重要的任务。这些提示词的质量和结构会显著影响人工智能输出的效果。花时间和精力精心设计提示词,能大幅提升人工智能给出的结果。 在人工智能社区中,分享和讨论提示词是一种常见做法。这种协作方式不仅营造了共享的学习环境,还能发现并使用高效的提示词。 该领域的研究通常涉及分析和比较不同的提示词,以评估它们在各种情境下的有效性。例如,一项重要研究表明,以 “深呼吸,然后一步步解决这个问题” 作为提示词的开头,能显著提高解决问题的效率。这凸显了精心挑选的措辞对生成式人工智能系统性能的影响。 随着人工智能技术的迅速发展,掌握提示词的最有效用法是一项持续的挑战。你应当认识到提示工程的重要性,并考虑借鉴社区经验和研究成果,改进提示词创建策略。
5.1 创建有效提示词
在创建提示词时,几个关键要素保证清晰和有效至关重要:
- 指令:向 AI 提供清晰直接的指令,类似与人交流的方式。这种清晰度对于帮助 AI“理解”预期内容至关重要。
- 上下文背景:添加相关背景信息或人工智能响应的具体指导。这些External Context构成了
Prompt的框架,并帮助人工智能掌握整体情况。 - 用户输入:用户的直接请求或问题构成了提示词的核心。
- 输出指示器:指定人工智能回复所需的格式,比如
JSON格式。不过要注意,人工智能可能并不总是严格遵循这种格式。例如,它可能会在实际的JSON数据前加上类似“这是你的 JSON”这样的短语,或者有时生成一个类似JSON但不准确的结构。
在构思提示词时,为人工智能提供预期问答格式的示例会大有效果。这种做法有助于人工智能 “理解” 你提问的结构和意图,从而给出更精确、贴切的回复。
5.2提示词技巧
详细了解提示词工程,可以访问提示词工程指南https://www.promptingguide.ai/ 如下是一些有用的技巧资源。
5.2.1简单技术
-
文本摘要
将大量文本精简为简洁的摘要,捕捉关键点和主要思想,同时省略不太重要的细节。
-
问答
侧重于根据用户提出的问题从提供的文本中得出具体答案。它旨在针对查询精确定位和提取相关信息。
-
文本分类
系统地将文本分类到预定义的类别或组中,分析文本并根据其内容将其分配给最合适的类别。
-
对话
创建交互式对话,使人工智能能够与用户进行来回交流,模拟自然的对话流程。
-
代码生成
根据特定的用户需求或描述生成功能性代码片段,将自然语言指令转化为可执行代码。
5.2.2高级技巧
-
零样本、少样本学习
使模型能够在几乎没有或完全没有特定问题类型的先验示例的情况下做出准确预测或响应,利用所学 的通用知识来理解并处理新任务。
-
思维链
将多个人工智能回复联系起来,以创建连贯且有上下文感知的对话。它有助于人工智能保持讨论的主 线,确保相关性和连续性。
-
ReAct(推理 + 行动)
在这种方法中,人工智能首先分析输入(原因),然后确定最合适的行动或响应方案。它将理解与决策结合在一起。
6.Tokens
Tokens在人工智能模型处理文本的过程中至关重要,它就像一座桥梁,将我们所理解的单词转换为人工智能模型能够处理的格式。这种转换分两个阶段进行:输入时,单词被转换为Tokens;输出时,这些Tokens再转换回单词。
标记化(Tokenization),即将文本分解为Tokens的过程,是人工智能模型理解和处理语言的基础。人工智能模型通过这种标记化格式来理解并回应提示。
为了更好地理解Tokens,可以将它们看作是单词的片段。通常,一个标记大约代表四分之三个单词。例如,莎士比亚的全部作品大约有 90 万个单词,转换后大约为 120 万个标记。
可以使用 OpenAI Tokenizer UI进行测试,看看单词是如何转换为标记的。
Tokens除了在人工智能处理中发挥技术作用外,在计费和模型能力方面还有实际影响:
计费:人工智能模型服务通常根据Tokens使用量计费。输入(提示)和输出(回复)都会计入总Tokens数,因此较短的提示更具成本效益。
模型限制:不同的人工智能模型有不同的标记限制,这决定了它们的 “上下文窗口”,即它们一次能够处理的最大信息量。例如,GPT-3的限制是4000个标记,而像Claude2和Meta Llama2等其他模型的限制是10万个Tokens,一些研究模型最多可以处理100万个Tokens。
上下文窗口:模型的Tokens限制决定了其上下文窗口。超过此限制的输入将不会被模型处理。发送仅够处理的最少有效信息集至关重要。例如,当询问关于《哈姆雷特》的问题时,无需包含莎士比亚其他所有作品的Tokens。
回复元数据:人工智能模型回复的元数据包括使用的Tokens数量,这是管理使用情况和成本的关键信息。
7.总结
本文围绕与大模型进行有效沟通的提示词(Prompt)技术全面展开,涵盖基础概念、Spring AI 中的应用、核心接口、提示词模板、提示词工程以及 Tokens 相关知识,为利用提示词优化大模型应用提供了系统性指导。
相关文章:
4.Spring AI Prompt:与大模型进行有效沟通
1.什么是提示词 在人工智能领域,提示词(Prompt)扮演着至关重要的角色,它宛如一把精准的钥匙,为 AI 大模型开启理解之门。作为向模型输入的关键信息或引导性语句,提示词能够助力模型迅速洞悉问题需求&#…...
深入内核讲明白Android Binder【二】
深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢?2.1 Binder驱动程序为服务创建binder…...
Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
注:本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态:SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层,有个 FLAGS 字段,这个字段有…...
WXML模版语法-事件绑定
知识点1:什么是事件 事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理。 知识点2:小程序中常用的事件 类型绑定方式事件描述tapbindtap或bind:tap手指触摸后马上离开,类似于…...
楚慧杯Web
WEB1 计算器 import requests rrequests.session() data{"answer":0} url"" for i in range(30):if i0:rrequests.get(url)dr.textdd.split(":")[22][1:].split("<br>")[0]data["answer"]str(eval(d))print(eval(d)…...
工商业储能电站能量管理本地系统及多站点云平台
一、储能站就地监控 Acre1-2000MG储能能量管理系统是针对工商业储能电站研制的本地化能量管理系统,可实现了储能电站的数据采集、数据处理、数据存储、数据查询与分析、可视化监控、报警管理、统计报表、策略管理、历史曲线等功能。其中策略管理,支持多…...
HTML标签笔记
黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 标题与段落 标题 <h1>~<h6> 段落 <p…...
pthread_create函数
函数原型 pthread_create 是 POSIX 线程(pthread)库中的一个函数,用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…...
C# 并发和并行的区别--16
目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…...
Java日志配置
1.导入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupI…...
python中的RPA->playwright自动化录制脚本实战案例笔记
playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…...
Linux查看日志命令
问题排查过程: 1. 评估问题现象是否是操作问题,还是服务bug,页面出异常信息是后端,没抛异常信息有可能是前端渲染问题,F12抓包看那个字段没有数据(有时候需要前端帮忙确定是哪一个字段)&#x…...
(8)ERC20详细介绍
ERC20 是以太坊上的一种代币标准(同质化代币),由 Fabian Vogelsteller 在 2015 年提出。它定义了一组通用的接口和规则,使得开发者可以创建可互操作的代币。ERC20 代币在以太坊生态系统中非常流行,广泛应用于各种去中心…...
opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数
opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置,考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …...
springboot集成websocket实现实时大量数据,效率性能高
前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…...
游戏引擎学习第80天
Blackboard:增强碰撞循环,循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改,以便实现一些新的功能。具体来说,是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏,目标是构建一些更丰富…...
Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从…...
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
: 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中,博主将带大家去学习所谓的…...
Sentinel配置流控规则详解
前言 在微服务架构中,流量控制(Flow Control)是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库,以其丰富的应用场景和完善的监控能力,在微服务保护中扮演了重要角色。本文将详细介绍…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
