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

SYSTEMUSERASSISTANT 之间存在密切的相互关系。USERSYSTEM 发送请求,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类实现了多个接口,这些接口提供了不同的方式创建提示词。

  1. 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
  1. 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
  1. 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 创建有效提示词

在创建提示词时,几个关键要素保证清晰和有效至关重要:

  1. 指令:向 AI 提供清晰直接的指令,类似与人交流的方式。这种清晰度对于帮助 AI“理解”预期内容至关重要。
  2. 上下文背景:添加相关背景信息或人工智能响应的具体指导。这些External Context构成了Prompt的框架,并帮助人工智能掌握整体情况。
  3. 用户输入:用户的直接请求或问题构成了提示词的核心。
  4. 输出指示器:指定人工智能回复所需的格式,比如 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个标记,而像Claude2Meta Llama2等其他模型的限制是10万个Tokens,一些研究模型最多可以处理100万个Tokens

上下文窗口:模型的Tokens限制决定了其上下文窗口。超过此限制的输入将不会被模型处理。发送仅够处理的最少有效信息集至关重要。例如,当询问关于《哈姆雷特》的问题时,无需包含莎士比亚其他所有作品的Tokens

回复元数据:人工智能模型回复的元数据包括使用的Tokens数量,这是管理使用情况和成本的关键信息。

7.总结

本文围绕与大模型进行有效沟通的提示词(Prompt)技术全面展开,涵盖基础概念、Spring AI 中的应用、核心接口、提示词模板、提示词工程以及 Tokens 相关知识,为利用提示词优化大模型应用提供了系统性指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3577.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张&#xff1a;A4→页边距&#xff1a;上下左右边距→文档网格&#xff1a;只指定行网格→版式&#xff1a;页眉和页脚&#xff1a;页脚距边界&#xff1a;1.4cm居中设置论文页码&#xff1a;插入…

MyBatisPlus学习笔记

To be continue… 文章目录 介绍快速入门入门案例常用注解常用配置 核心功能条件构造器自定义SQLService接口 介绍 MyBatisPlus只做增强不做改变&#xff0c;引入它不会对现有工程产生影响。只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。…

Python根据图片生成学生excel成绩表

学习笔记&#xff1a; 上完整代码 import os import re from openpyxl import Workbook, load_workbook from openpyxl.drawing.image import Image as ExcelImage from PIL import Image as PilImage# 定义图片路径和Excel文件路径 image_dir ./resources/stupics # 图片所…

DPIN与CESS Network达成全球战略合作,推动DePIN与AI领域创新突破

2025年1月13日, DPIN电竞酒店首次亮相&#xff0c;并于马来西亚马六甲和新加坡成功举办《A*STAR前沿考察盛典》。DPIN基金会透露&#xff0c;过去两个月&#xff0c;DPIN成功验证了去中心化GPU算力的首个应用&#xff0c;证明电竞酒店可成为快速落地的创新场景。 活动期间&…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

K8S开启/关闭审计日志

K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置&#xff0c;可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器&#xff0c;开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

计算机网络-物理层

重点内容 物理层的任务几种常用的信道复用技术几种常用的宽带接入技术&#xff0c;重点是FTTx 目录 重点内容 一.物理层的基本概念 二.数据通信基础知识 2.1通信系统模型 2.2信道 2.2.1调制 调制的两大类及其特点 1. 基带调制&#xff08;Baseband Modulation / Coding…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得&#xff0c;大家都提到一个很“神秘”的服务&#xff1a;它基于 O1 Pro 模型&#xff0c;能够在对话里一直保持相对高水平的理解和回复&#xff0c;不会突然变得“降智”。同时&#xff0c;整体使用还做了免折腾的网络设置——简单一点…

如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?

Google Cloud Shell 是一个基于浏览器的命令行界面&#xff0c;它提供了一个临时的虚拟机环境&#xff0c;允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…

语义检索效果差?深度学习rerank VS 统计rerank选哪个

前段时间我开发了一个用白话文搜索语义相近的古诗词的应用&#xff08;详见&#xff1a;《朋友圈装腔指南&#xff1a;如何用向量数据库把大白话变成古诗词》&#xff09;&#xff0c;但是有时候搜索结果却不让人满意&#xff0c;排名靠前的结果和查询的语义没啥关系&#xff0…

vue 学习笔记 - 创建第一个项目 idea

1、安装Vue CLI 查看npm版本号 &#xff08;可跳过&#xff09; % npm -v 11.0.0安装Vue CLI % npm install -g vue/cli2、创建项目 进入工程文件目录 % cd /Users/ruizhifeng/work/aina-client查看vue 版本号 &#xff08;可跳过&#xff09; % vue --version vue/cli 5…

Unity HybridCLR Settings热更设置

需要热更的程序集放到 热更新Assembly Definitions中。 记得补充元数据AOT dlls 打包完成后遇到TypeLoadException: could not load type 时 可能需要在Assets/link.xml中增加对应的设置 <assembly fullname"your assembly" preserve"all"/> link…

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点&#xff0c;一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的&#xff0c;所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接&#xff01; sudo apt update sudo apt in…

CSS:语法、样式表、选择器

目录 一、语法 二、创建 外部样式表 内部样式表 内联样式 三、选择器 ID选择器 类选择器 伪类选择器 :hover a:link a:active a:visited 属性选择器 伪元素选择器 ::first-letter ::first-line ::selection ::placeholder ::before 和::after 通配选择器 标…

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (三、影视搜索页功能实现)

在HarmonyOS NEXT开发环境中&#xff0c;可以使用nutpi/axios库来简化网络请求的操作。本文将展示如何使用HarmonyOS NEXT框架和nutpi/axios库&#xff0c;从零开始实现一个简单的影视APP&#xff0c;主要关注影视搜索页的功能实现。 为什么选择nutpi/axios&#xff1f; nutpi…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程&#xff0c;它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信&#xff0c;本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信&#xff0c;需要借助网络协议栈中的各层协议&#x…