大模型本地部署教程 | 搭建本地AI问答系统

前言

大家好,因为对AI大模型很感兴趣,相信很多兄弟们跟我一样,所以最近花时间了解了一些,有一些总结,分享给大家,希望对各位有所帮助。 本文将讲解如何在本地搭建一个简易的AI问答系统,主要用java来实现,也有一些简单的python知识;网上很多例子都是以 ChatGPT来讲解的,但因为它对国内访问有限制,OpeAi连接太麻烦,又要虚拟账号注册账号啥的,第一步就劝退了,所以选择了 llama和qwen替代,但是原理都是一样的。

01

相关概念了解

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将

(一)大语言模型 LLM

大型语言模型(LLM,Large Language Models),是近年来自然语言处理(NLP)领域的重要进展。这些模型由于其庞大的规模和复杂性,在处理和生成自然语言方面展现了前所未有的能力。

关于LLM的一些关键点:

1.定义:

◦大模型通常指的是拥有大量参数的深度学习模型,这些模型可能包含数十亿至数万亿的参数。

◦LLM是大模型的一个子类,专门设计用于处理和理解自然语言,它们能够模仿人类语言的生成和理解过程。

2.架构:

◦LLM通常基于Transformer架构,这是一种使用自注意力机制(self-attention mechanism)的序列模型,它由多个编码器和解码器层组成,每个层包含多头自注意力机制和前馈神经网络。

3.训练:

◦这些模型在大规模文本数据集上进行训练,这使得它们能够学习到语言的复杂结构,包括语法、语义、上下文关系等。

◦训练过程通常涉及大量的计算资源,包括GPU集群和海量的数据存储。

4.应用:

◦LLM可以应用于各种自然语言处理任务,包括但不限于文本生成、问答、翻译、摘要、对话系统等。

◦它们还展示了在few-shot和zero-shot学习场景下的能力,即在少量或没有额外训练数据的情况下,模型能够理解和执行新任务。

5.发展趋势:

◦学术研究和工业界都在探索LLM的边界,包括如何更有效地训练这些模型,以及如何使它们在不同领域和任务中更具适应性。

◦开源和闭源模型的竞争也在加剧,推动了模型的持续创新和改进。

6.学习路径:

◦对于那些希望深入了解LLM的人来说,可以从学习基本的Transformer模型开始,然后逐渐深入到更复杂的模型,如GPT系列、BERT、LLaMA、Alpaca等,国内的有 qwen(通义千问)、文心一言、星火、盘古、言犀大模型(chatrhino)等 。

7.社区资源:

◦Hugging Face等平台提供了大量的开源模型和工具,可以帮助研究人员和开发者快速上手和应用LLM。

LLM的出现标志着NLP领域的一个新时代,它们不仅在学术研究中产生了深远的影响,也在商业应用中展现出了巨大的潜力。

(二)Embedding

在自然语言处理(NLP)和机器学习领域中,“embedding” 是一种将文本数据转换成数值向量的技术。这种技术将单词、短语、句子甚至文档映射到多维空间中的点,使得这些点在数学上能够表示它们在语义上的相似性或差异。

Embeddings 可以由预训练模型生成,也可以在特定任务中训练得到。常见的 embedding 方法包括:

1.Word2Vec:由 Google 提出,通过上下文预测目标词(CBOW)或通过目标词预测上下文(Skip-gram)来训练词向量。

2.GloVe:全球向量(Global Vectors for Word Representation),通过统计词共现矩阵来优化词向量。

3.FastText:Facebook 研究院提出的一种方法,它基于词 n-gram 来构建词向量,适用于稀少词和未见过的词。

4.BERT:基于 Transformer 架构的预训练模型,可以生成上下文相关的词嵌入,即“动态”词嵌入。

5.ELMo:利用双向 LSTM 语言模型生成的词嵌入,同样考虑了上下文信息。

6.Sentence Transformers:这是 BERT 的一种变体,专门设计用于生成句子级别的嵌入。

Embeddings 的主要优点在于它们能够捕捉词汇之间的复杂关系,如同义词、反义词以及词义的细微差别。此外,它们还能够处理多义词问题,即一个词在不同上下文中可能有不同的含义。

在实际应用中,embeddings 被广泛用于多种 NLP 任务,如文本分类、情感分析、命名实体识别、机器翻译、问答系统等。通过使用 embeddings,机器学习模型能够理解和处理自然语言数据,从而做出更加准确和有意义的预测或决策。

(三)向量数据库

向量数据库是一种专门设计用于存储和查询高维向量数据的数据库系统。这种类型的数据库在处理非结构化数据,如图像、文本、音频和视频的高效查询和相似性搜索方面表现出色。与传统的数据库管理系统(DBMS)不同,向量数据库优化了对高维空间中向量的存储、索引和检索操作。

以下是向量数据库的一些关键特点和功能:

1.高维向量存储:向量数据库能够高效地存储和管理大量的高维向量数据,这些向量通常是由深度学习模型(如BERT、ResNet等)从原始数据中提取的特征。

2.相似性搜索:它们提供了快速的近似最近邻(Approximate Nearest Neighbor, ANN)搜索,能够在高维空间中找到与查询向量最相似的向量集合。

3.向量索引:使用特殊的数据结构,如树形结构(如KD树)、哈希表、图结构或量化方法,以加速向量的检索过程。

4.混合查询能力:许多向量数据库还支持结合向量查询和结构化数据查询,这意味着除了向量相似性搜索之外,还可以进行SQL风格的查询来筛选结构化属性。

5.扩展性和容错性:高效的数据分布和复制策略,使得向量数据库可以水平扩展,以处理海量数据,并且具备数据冗余和故障恢复能力。

6.实时更新:允许动态添加和删除向量数据,支持实时更新,这对于不断变化的数据集尤其重要。

7.云原生设计:许多现代向量数据库采用云原生架构,可以轻松部署在云端,利用云服务的弹性计算资源。

向量数据库在多个领域得到应用,包括推荐系统、图像和视频检索、自然语言处理(NLP)以及生物信息学。一些知名的向量数据库项目包括FAISS(由Facebook AI Research开发)、Pinecone、Weaviate、Qdrant、Milvus等。

(四)RAG

文章题目中的 “智能问答” 其实专业术语叫RAG;

在大模型(尤其是大型语言模型,LLMs)中,RAG 指的是“Retrieval-Augmented Generation”,即检索增强生成。这是一种结合了 检索(Retrieval)和生成(Generation)技术的人工智能方法, 主要用于增强语言模型在处理需要外部知识或实时信息的任务时的表现;

RAG 是 “Retrieval-Augmented Generation” 的缩写,即检索增强生成。这是一种结合了检索(Retrieval)和生成(Generation)两种技术的人工智能模型架构。RAG 最初由 Facebook AI 在 2020 年提出,其核心思想是在生成式模型中加入一个检索组件,以便在生成过程中利用外部知识库中的相关文档或片段。

在传统的生成模型中,如基于Transformer的模型,输出完全依赖于模型的内部知识,这通常是在大规模语料库上进行预训练得到的。然而,这些模型可能无法包含所有特定领域或最新更新的信息,尤其是在处理专业性较强或时效性较高的问题时。

RAG 架构通过从外部知识源检索相关信息来增强生成过程。当模型需要生成响应时,它会首先查询一个文档集合或知识图谱,找到与输入相关的上下文信息,然后将这些信息与原始输入一起送入生成模型,从而产生更加准确和丰富的内容。

工作原理

1.检索(Retrieval):

  • 当模型接收到一个输入或查询时,RAG 首先从外部知识库或数据源中检索相关信息。这通常涉及到使用向量数据库和近似最近邻搜索算法来找到与输入最相关的文档片段或知识条目。

2.生成(Generation):

  • 一旦检索到相关的信息,这些信息会被整合到生成模型的输入中,作为上下文或提示(prompt)。这样,当模型生成输出时,它就能利用这些额外的信息来提供更准确、更详细和更相关的响应。

基本流程

img

RAG的优势:

1.减少知识局限性:LLMs 通常受限于其训练数据,而 RAG 可以让模型访问实时或最新的信息,从而克服这一限制。

2.减少幻觉:幻觉是指模型生成不存在于其训练数据中的不真实信息。RAG 通过提供事实依据,可以减少这种现象。

3.提高安全性:RAG 可以通过控制检索的范围和类型,避免模型生成潜在的有害或敏感信息。

4.增强领域专业性:对于特定领域的查询,RAG 可以从专业的知识库中检索信息,从而使模型的回答更具专业性

RAG 可以应用于多种场景,包括但不限于:

  • 问答系统:RAG 能够检索到与问题最相关的答案片段,然后基于这些片段生成最终的回答。
  • 对话系统:在对话中,RAG 可以帮助模型引用历史对话或外部知识来生成更自然、更有信息量的回复。
  • 文档摘要:RAG 能够从大量文档中提取关键信息,生成总结或概述。
  • 文本补全:在文本补全任务中,RAG 可以参考相关文档来提供更准确的建议。

RAG 架构的一个重要组成部分是检索组件,它通常使用向量相似度搜索技术,如倒排索引或基于神经网络的嵌入空间搜索。这使得模型能够在大规模文档集合中快速找到最相关的部分。

02

AI应用开发框架

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将

(一)Langchain

官网:https://www.langchain.com/langchain

LangChain不是一个大数据模型,而是一款可以用于开发类似AutoGPT的AI应用的开发工具,LangChain简化了LLM应用程序生命周期的各个阶段,且提供了 开发协议、开发范式,并 拥有相应的平台和生态;

LangChain 是一个由 Harrison Chase 创立的框架,专注于帮助开发者使用语言模型构建端到端的应用程序。它特别设计来简化与大型语言模型(LLMs)的集成,使得创建由这些模型支持的应用程序变得更加容易。LangChain 提供了一系列工具、组件和接口,可以用于构建聊天机器人、生成式问答系统、摘要工具以及其他基于语言的AI应用。

LangChain 的核心特性包括:

1.链式思维(Chains):LangChain 引入了“链”(Chain)的概念,这是一系列可组合的操作,可以按顺序执行,比如从获取输入、处理数据到生成输出。链条可以嵌套和组合,形成复杂的逻辑流。

2.代理(Agents):代理是更高级别的抽象,它们可以自主地决定如何使用不同的链条来完成任务。代理可以根据输入动态选择最佳行动方案。

3.记忆(Memory):LangChain 支持不同类型的内存,允许模型保留历史对话或操作的上下文,这对于构建有状态的对话系统至关重要。

4.加载器和拆分器(Loaders and Splitters):这些工具帮助读取和处理各种格式的文档,如PDF、网页、文本文件等,为模型提供输入数据。

5.提示工程(Prompt Engineering):LangChain 提供了创建和管理提示模板的工具,帮助引导模型生成特定类型的内容。

6.Hub:LangChain Hub 是一个社区驱动的资源库,其中包含了许多预构建的链条、代理和提示,可以作为构建块来加速开发过程。

7.与外部系统的集成:LangChain 支持与外部数据源和API的集成,如数据库查询、知识图谱、搜索引擎等,以便模型能够访问更广泛的信息。

8.监控和调试工具:为了更好地理解和优化应用程序,LangChain 提供了日志记录和分析功能,帮助开发者追踪模型的行为和性能。

(二)LangChain4J

上面说的 LangChain 是基于python 开发的,而 LangChain4J 是一个旨在为 Java 开发者提供构建语言模型应用的框架。受到 Python 社区中 LangChain 库的启发,LangChain4J 致力于提供相似的功能,但针对 Java 生态系统进行了优化。它允许开发者轻松地构建、部署和维护基于大型语言模型的应用程序,如聊天机器人、文本生成器和其他自然语言处理(NLP)任务。

主要特点:

1.模块化设计:LangChain4J 提供了一系列可组合的模块,包括语言模型、记忆、工具和链,使得开发者可以构建复杂的语言处理流水线。

2.支持多种语言模型:LangChain4J 支持与各种语言模型提供商集成,如 Hugging Face、OpenAI、Google PaLM 等,使得开发者可以根据项目需求选择最合适的模型。

3.记忆机制:它提供了记忆组件,允许模型记住先前的对话历史,从而支持上下文感知的对话。

4.工具集成:LangChain4J 支持集成外部工具,如搜索API、数据库查询等,使得模型能够访问实时数据或执行特定任务。

5.链式执行:通过链式执行,可以将多个语言处理步骤链接在一起,形成复杂的处理流程,例如先分析用户意图,再查询数据库,最后生成回复。

主要功能:

1.LLM 适配器:允许你连接到各种语言模型,如 OpenAI 的 GPT-3 和 GPT-4,Anthropic 的 Claude 等。

2.Chains 构建:提供一种机制来定义和执行一系列操作,这些操作可以包括调用模型、数据检索、转换等,以完成特定的任务。

3.Agent 实现:支持创建代理(agents),它们可以自主地执行任务,如回答问题、完成指令等。

4.Prompt 模板:提供模板化的提示,帮助指导模型生成更具体和有用的回答。

5.工具和记忆:允许模型访问外部数据源或存储之前的交互记录,以便在会话中保持上下文。

6.模块化和可扩展性:使开发者能够扩展框架,添加自己的组件和功能。

03

本地问答系统搭建环境准备

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将

(一)用 Ollama 启动一个本地大模型

\1. 下载安装 Ollma

ollama 是一个命令行工具,用于方便地在本地运行 LLaMA 系列模型和其他类似的 transformer 基础的大型语言模型。该工具简化了模型的下载、配置和推理过程,使得个人用户能够在自己的机器上直接与这些模型交互,而不需要直接接触复杂的模型加载和推理代码;

下载地址:https://ollama.com/,下载完成后,打开 Ollma,其默认端口为11334,浏览器访问:http://localhost:11434 ,会返回:Ollama is running,电脑右上角展示图标;

img

\2. 下载大模型

安装完成后,通过命令行下载大模型,命令行格式:ollma pull modelName,如:ollma pull llama3;

大模型一般要几个G,需要等一会;个人建议至少下载两个, llama3、 qwen,这两个都是开源免费的,英文场景 用 llama3,中文场景用 qwen;

下载完成后,通过 ollma list 可以查看 已下载的大模型;

img

\3. 启动大模型

确认下载完成后,用命令行 :ollma run 模型名称,来启动大模型;启动后,可以立即输入内容与大模型进行对话,如下:

img

(二)启动 本地向量数据库 chromadb

Chroma 是一款 AI 原生开源矢量数据库,它内置了入门所需的一切,可在本地运行,是一款很好的入门级向量数据库。

\1. 安装:pip install chromadb ;

\2. 启动:chroma run :

img

04

用java实现 本地AI问答功能

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将

(一)核心maven依赖:

在这里插入图片描述在这里插入图片描述

(二)代码编写:

\1. 加载本地文件作为本地知识库:

public static void main(String[] args) throws ApiException {
    //======================= 加载文件=======================    
    Document document = getDocument("笑话.txt");

}

private static Document getDocument(String fileName) {
        URL docUrl = LangChainMainTest.class.getClassLoader().getResource(fileName);        
        if (docUrl == null) {        
            log.error("未获取到文件");        
        }        
        
        Document document = null;        
        try {       
            Path path = Paths.get(docUrl.toURI());            
            document = FileSystemDocumentLoader.loadDocument(path);       
        } catch (URISyntaxException e) {       
            log.error("加载文件发生异常", e);        
        }        
        return document;    
    }

\2. 拆分文件内容:

//======================= 拆分文件内容=======================
//参数:分段大小(一个分段中最大包含多少个token)、重叠度(段与段之前重叠的token数)、分词器(将一段文本进行分词,得到token)
DocumentByLineSplitter lineSplitter = new DocumentByLineSplitter(200, 0, new OpenAiTokenizer());
List<TextSegment> segments = lineSplitter.split(document);
log.info("segment的数量是: {}", segments.size());

//查看分段后的信息
segments.forEach(segment -> log.info("========================segment: {}", segment.text()));

3. 文本向量化 并存储到向量数据库:

//提前定义两个静态变量
private static final String CHROMA_DB_DEFAULT_COLLECTION_NAME = "java-langChain-database-demo";
private static final String CHROMA_URL = "http://localhost:8000";


//======================= 文本向量化=======================
OllamaEmbeddingModel embeddingModel = OllamaEmbeddingModel.builder()
        .baseUrl("http://localhost:11434")        
        .modelName("llama3")        
        .build();


//======================= 向量库存储=======================
Client client = new Client(CHROMA_URL);

//创建向量数据库
EmbeddingStore<TextSegment> embeddingStore = ChromaEmbeddingStore.builder()
        .baseUrl(CHROMA_URL)        
        .collectionName(CHROMA_DB_DEFAULT_COLLECTION_NAME)        
        .build();

segments.forEach(segment -> {
    Embedding e = embeddingModel.embed(segment).content();    
    embeddingStore.add(e, segment);
});

\4. 向量库检索:

//======================= 向量库检索=======================
String qryText = "北极熊";
Embedding queryEmbedding = embeddingModel.embed(qryText).content();

EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder().queryEmbedding(queryEmbedding).maxResults(1).build();
EmbeddingSearchResult<TextSegment> embeddedEmbeddingSearchResult = embeddingStore.search(embeddingSearchRequest);
List<EmbeddingMatch<TextSegment>> embeddingMatcheList = embeddedEmbeddingSearchResult.matches();
EmbeddingMatch<TextSegment> embeddingMatch = embeddingMatcheList.get(0);
TextSegment textSegment = embeddingMatch.embedded();
log.info("查询结果: {}", textSegment.text());

\5. 与LLM交互

//======================= 与LLM交互=======================
PromptTemplate promptTemplate = PromptTemplate.from("基于如下信息用中文回答:\n" +
        "{{context}}\n" +        
        "提问:\n" +        
        "{{question}}");
Map<String, Object> variables = new HashMap<>();
//以向量库检索到的结果作为LLM的信息输入
variables.put("context", textSegment.text());
variables.put("question", "北极熊干了什么");
Prompt prompt = promptTemplate.apply(variables);

//连接大模型
OllamaChatModel ollamaChatModel = OllamaChatModel.builder()
        .baseUrl("http://localhost:11434")        
        .modelName("llama3")        
        .build();UserMessage 

userMessage = prompt.toUserMessage();
Response<AiMessage> aiMessageResponse = ollamaChatModel.generate(userMessage);
AiMessage response = aiMessageResponse.content();
log.info("大模型回答: {}", response.text());

(三)功能测试

代码中用到 “笑话.txt” 是我随便从网上找的一段内容,大家可以随便输入点内容,为了给大家展示测试结果,我贴一下我 文本内容:

在这里插入图片描述

当我输入问题:“北极熊干了什么”,程序打印如下结果:

根据故事,北极熊把自己的身上的毛一根一根地拔了下来

05

结语

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将

1.以上便是完成了一个超简易的AI问答功能,如果想搭一个问答系统,可以用Springboot搞一个Web应用,把上面的代码放到 业务逻辑中即可;

2.langchain 还有其他很多很强大的能力,prompt Fomat、output Fomat、工具调用、memory存储等;

3.早点认识和学习ai,不至于被它取代的时候,连对手是谁都不知道。

参考资料:

1.langchain 官网(https://www.langchain.com/)

2.langchain 入门教程https://www.bilibili.com/video/BV1XC411n72m/)

3.langchain4j github(https://github.com/langchain4j/langchain4j)

4.langchain4j 视频介绍(https://www.bilibili.com/video/BV1mm421M7ag/)

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络】【Linux】多路转接技术

多路转接技术 文章目录 1.select1.1select系统调用及参数介绍1.2select基本工作流程1.3select技术实现echo服务器1.4select优缺点1.5select的适用场景 2.poll&#xff08;了解&#xff09;2.1poll系统调用及参数介绍2.2poll技术实现echo服务器2.3poll优缺点 3.epoll3.1epoll系…

探索 ES6 生成器 ( Generator ) 的异步编程应用

一. 前言 在之前的文章中&#xff0c;我们介绍了生成器函数的基本概念和常见应用&#xff0c;包括异步操作的顺序执行、控制异步流程等&#xff0c;同时也了解到 Promise 和生成器结合的应用可以帮助我们更方便地处理异步操作。详细了解请参考之前的文章&#xff1a; 学习 ES…

前端Vue3字体优化三部曲(webFont、font-spider、spa-font-spider-webpack-plugin)

前端Vue字体优化三部曲&#xff08;webFont、font-spider、spa-font-spider-webpack-plugin&#xff09; 引言 最近前端引入了UI给的思源黑体字体文件&#xff0c;但是字体文件过于庞大&#xff0c;会降低页面首次加载的速度&#xff0c;目前我的项目中需要用到如下三个字体文…

Java 8 的内存结构

Java8内存结构图 虚拟机内存与本地内存的区别 Java虚拟机在执行的时候会把管理的内存分配成不同的区域&#xff0c;这些区域被称为虚拟机内存&#xff0c;同时&#xff0c;对于虚拟机没有直接管理的物理内存&#xff0c;也有一定的利用&#xff0c;这些被利用却不在虚拟机内存…

每天3分钟,彻底弄懂神经网络的优化器(十)Nadam

1. Nadam算法的提出 Nadam&#xff08;Nesterov-accelerated Adaptive Moment Estimation&#xff09;算法是由Tim Salimans et al. 在2016年提出的。这一算法结合了Adam算法和Nesterov Accelerated Gradient&#xff08;NAG&#xff09;算法的优点&#xff0c;旨在提高优化算…

[运维]6.github 本地powershell登录及设置ssh连接

当我在本地的git hub 进行修改后&#xff0c;需要推送到远程github仓库。 当我运行了git add . git commit -m "ingress-controller image" 以后&#xff0c;运行git push origin main&#xff0c;发现由于网络原因无法连接到远程github仓库。 此时开始设置ssh连…

MySQL中表的约束

1&#xff0c;概念 表中一定要有各种约束&#xff0c;通过约束&#xff0c;让我们来插入数据库中的数据是符合预期的。 约束本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据&#xff1b;反过来&#xff0c;站在MySQL的角度来单&#xff0c;内部已经插进来的数据&…

即插即用hilo注意力机制,捕获低频高频特征

题目&#xff1a;Fast Vision Transformers with HiLo Attention 论文地址: https://arxiv.org/abs/2205.13213 创新点 HiLo自注意力机制&#xff1a;作者提出了一种新的自注意力机制&#xff0c;称为HiLo注意力&#xff0c;旨在同时捕捉图像中的高频和低频信息。该方法通过…

通信工程学习:什么是SPI串行外设接口

SPI&#xff1a;串行外设接口 SPI&#xff0c;即串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种由Motorola公司首先在其MC68HCXX系列处理器上定义的同步串行接口技术。SPI接口主要用于微控制器&#xff08;MCU&#xff09;与外部设备之间…

1. 到底什么是架构

1. 什么是架构 定义&#xff1a;架构&#xff0c;又名软件架构&#xff0c;是有关软件整体结构与组件的抽象描述&#xff0c;用于指导大型软件系统各个方面的设计优秀架构的特点&#xff1a;优秀的性能、超强的TPS/QPS的承载能力、高可用决定了你能够支撑多少PV的流量 2. 什么…

【Linux修炼进程之权限篇】探讨Linux权限问题

【Linux修炼】——权限问题 目录 一&#xff1a;认识Linux下用户的分类 1.1&#xff1a;如何添加新用户【使用root用户创建添加】 1.2&#xff1a;su指令用法 二&#xff1a;Linux下权限是什么&#xff1f; 2.1&#xff1a;权限所认证的是身份(人身份角色) 2.2&#xff…

【WPF】04 Http消息处理类

这里引入微软官方提供的HttpClient类来实现我们的目的。 首先&#xff0c;介绍一下官方HttpClient类的内容。 HttpClient 类 定义 命名空间: System.Net.Http 程序集: System.Net.Http.dll Source: HttpClient.cs 提供一个类&#xff0c;用于从 URI 标识的资源发送 HTTP 请…

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…

Gitxray:一款基于GitHub REST API的网络安全工具

关于Gitxray Gitxray是一款基于GitHub REST API的网络安全工具&#xff0c;支持利用公共 GitHub REST API 进行OSINT、信息安全取证和安全检测等任务。 Gitxray&#xff08;Git X-Ray 的缩写&#xff09;是一款多功能安全工具&#xff0c;专为 GitHub 存储库而设计。它可以用于…

STM32CUBEIDE的使用【三】RTC

于正点原子潘多拉开发板&#xff0c;使用stm32官方免费软件进行开发 CubeMx 配置 使用CubeMx 配置RTC 勾选RTC 设置日期和时间 配置LCD的引脚用来显示 STM32CUBEIDE 在usbd_cdc_if.c中重定向printf函数用于打印 #include <stdarg.h>void usb_printf(const char *f…

第十六章 RabbitMQ延迟消息之延迟插件优化

目录 一、引言 二、优化方案 三、核心代码实现 3.1. 生产者代码 3.2. 消息处理器 3.3. 自定义多延迟消息封装类 3.4. 订单实体类 3.5. 消费者代码 四、运行效果 一、引言 上一章节我们提到&#xff0c;直接使用延迟插件&#xff0c;创建一个延迟指定时间的消息&…

【C++算法】双指针

目录 一、快乐数&#xff1a; 二、有效三角形的个数&#xff1a; 三、盛最多水的容器&#xff1a; 四、复写0&#xff1a; 五、三数之和&#xff1a; 总结&#xff1a; 一、快乐数&#xff1a; 题目出处&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09…

ROS2 通信三大件之动作 -- Action

通信最后一个&#xff0c;也是不太容易理解的方式action&#xff0c;复杂且重要 1、创建action数据结构 创建工作空间和模块就不多说了 在模块 src/action_moudle/action/Counter.action 下创建文件 Counter.action int32 target # Goal: 目标 --- int32 current_value…

智能健康顾问:基于SpringBoot的系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Qt:图片文字转base64程序

目录 一.Base64 1.编码原理 2.应用场景 3.优点 4.限制 5.变种 二.文字与Base64互转 1.ui设计 2.文字转Base64 3.Base64转文字 三.图片与Base64互转 1.ui设计 2.选择图片与图片路径 3.图片转Base64 4.Base64转图片 四.清空设置 五.效果 六.代码 base64conver…