大语言模型应用--AI工程化落地

近几年AI的飞速发展,着实带来了很大的冲击,但是其实现在AI并没有完全的跨界,仍然只是在小圈子内“自嗨”。不过相对于之前已经有了很大的不同了
本文就针对当前的大模型现状,来说一下工程化落地的相关事情,也是随感而发和总结一下

这里不对AI本身做过多的深入,更多聚焦于上层应用

大语言模型概述

当我们谈论大型语言模型时,我们指的是一种能够以类似人类语言的方式”说话”的软件。这些模型非常惊人–它们能够获取上下文并生成不仅连贯而且感觉像是来自真实人类的回复
这些语言模型通过分析大量的文本数据并学习语言使用的模式来工作。它们利用这些模式生成的文本几乎无法与人类所说或写的内容区分开来
如果您曾与虚拟助手进行聊天或与人工智能客户服务代理进行互动,您可能会在不知不觉中与大型语言模型互动过!这些模型有广泛的应用,从聊天机器人到语言翻译到内容创作等

什么是大语言模型

  • 定义:大语言模型(Large Language Model, LLM)是一种预训练的自然语言处理(NLP)模型,通常具有数十亿甚至数千亿的参数,能够理解和生成自然语言文本。一个成熟大语言模型的训练数据是海量的
  • 功能:大语言模型能够执行多种语言任务,如文本分类、情感分析、机器翻译、文本摘要、问答系统等
  • 技术基础:基于变换器(Transformer)架构,利用自注意力机制(Self-Attention)处理序列数据
  • 发展:从早期的RNN、LSTM到现在的BERT、GPT等模型,参数数量和性能不断提升

什么是机器学习

  • 定义:机器学习是人工智能的一个分支,它使计算机系统能够从数据中学习并做出决策或预测,而无需明确编程
  • 类型:包括监督学习、无监督学习、半监督学习和强化学习
  • 应用:广泛应用于图像识别、语音识别、推荐系统、预测分析等领域
  • 关键概念:特征选择、模型训练、过拟合与欠拟合、模型评估等。

什么是深度学习

  • 定义:深度学习是机器学习的一个子集,它使用类似于人脑的神经网络结构,通过多层(深层)的非线性变换来学习数据的复杂模式。
  • 核心组件:神经网络层、激活函数、损失函数、优化算法。
  • 架构:包括卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)和变换器(Transformer)等。
  • 应用:在图像和语音识别、自然语言处理、自动驾驶等领域取得了革命性的进展

理解大语言模型

为什么在上面有了大语言模型概述之后,我还需要单独开一个章节来说“理解”大语言模型呢,因为这能让你更好的知道大语言模型是什么东西, 理解它的上限,也能方便我们更好的做应用层
首先可以笼统的讲,机械学习就是找到一个特殊的复杂的“函数”,能够将我们的输入转为期望的输出。比如我们期望输入1,输出5;输入2,输出10,那么这个函数可能就是y=2*x。或者如果我们输入一张猫的图片,我希望它输出“猫”这个字,又或者我输入“hi”它会输出“hello”等等
这其实本质可以看做是一个数学问题,当然实际会比上面的举例复杂很多

历史沿革

1、早期人们总是希望让机器和人一样思考,当时人们主推“鸟飞派”,基于仿生学,就是人们看到鸟飞,就学习它扑棱翅膀能飞起来,那么就希望能让机器也和人一样思考。但是这个效果不是很好,没有“世界知识”(世界知识就是你大脑里默认的众所周知的不用思考的本能认知的内容),比如“水往低处流”,这一类世界知识是海量的,并且难以解决一词多意的问题。总体来说模仿人类的大脑神经过于复杂,单纯用代码和函数很难实现

2、人工智能2.0时代:数据驱动实现“基于统计的人工智能”。为什么在GPT3的横空出世之后,各种大模型如雨后春笋一样的冒出来了?其实大部分公司很早就在研究AI了,但是早期大家都是摸着石头过河,虽然有很多方案和思考,但是都不敢加大投入到梭哈的地步,都是在一个限定的范围内去研究。GPT3的出现让大家看到了某一种方式是可行的,就是使用海量的数据去计算统计,用量变引起质变,于是有了成功案例,大家才知道哦原来这种方式是可行的,于是都开始加大投入走这条路

3、大数据可以让机器智能水平得到飞跃;大量数据的使用,最大意义在于让计算机完成一些过去只有人类才能完成的事情

  • 核心思想:基于大量数据中的统计信息,“训练参数”以拟合结果(本质是“统计”而非“仿生”)
  • 主要优势:随着数据量的积累,系统会持续提升,变的越来越好;
  • 核心要素:“大数据”,大量、多维度、全面的大数据
  • 基于大量、多维度、全面的大数据下的“死记硬背”;
    通过统计人工智能,将“智能问题”转变成了“数据问题”,使得计算
    机得以通过对大数据的学习,解决“不确定问题”

关键

所以问题的关键变成了一个概率问题。当前大模型都是从海量的数据中统计出一个概率,来判断下一个文字或者中间某一段文字最大的概率是什么,然后输出出来。其实本质也并不是生成新的东西,而是推理

比如问他中国的首都是哪里?通过算法提取到关键字是中国的首都是
那么大模型根据海量的数据中计算出 中国的首都是 后面紧跟着的字是北京出现的概率最大,所以就会输出正确的结果

所以训练大模型的数据质量也是非常关键的,同时我们也能差不多联想到大模型的上限

AIGC系统

AIGC,即人工智能生成内容(Artificial Intelligence Generated Content),是一种利用机器学习算法自动生成各种类型内容的技术,包括文本、图像、音频和视频等。AIGC系统通过分析大量数据,学习语言、视觉和音频模式,进而能够创造出新的、与人类创作内容相似甚至无法区分的内容
所有的数字化工作,很可能被“大模型”颠覆
而我们目前的应用层工作,大部分都属于AIGC系统
GPT3.5之后已经大模型已经可以使用工具
• 插件和联网:弥补大模型自身记忆不足,标志着LLM正式开始学习使用工具
• 函数功能: LLM学会调用API来完成复杂任务,这是后端工程师主要工作(给Gorilla指令,会自动调用diffusion等模型,实现画图、对话等多模态任务)
• 让模型“思考”:引导大模型具有逻辑能力,核心在于:“计划 + 记忆 + 工具”

AI工程化项目的落地

其实AI项目的落地也和普通项目一样,一开始的立项核心肯定是要清楚这个项目是为了解决什么核心问题,然后再去扩展思考,再然后才是需求分析,技术选型等。我们针对应用层就不太会设计大模型的研究,一般都是直接调用API或者部署本地开源的大模型

落地的方法

Prompt工程(第一阶段)

稍微接触过AI的可能都知道prompt,在2022-2023年,对AI的初期研究还是以这个为基础,就是怎么样提问能让AI更理解你的意思,注意你的关键点然后给出质量更高的回答
门槛相对来说较低,大部分的大模型应用都是在设计Prompt。能满足一部分需求,取决于基础模型的能力

RAG检索(第二阶段)

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了检索模型和生成模型的人工智能技术。它通过从知识库或数据库中检索相关信息,并将其与用户查询结合,来增强大型语言模型(LLM)的回答能力。RAG技术可以提高AI应用的准确性和相关性,尤其是在处理特定领域知识或需要最新信息的场景中
RAG的工作原理主要包括两个步骤:

  1. 检索(Retrieval):根据用户的查询,RAG使用检索模型在知识库中搜索并提取最相关的信息或文档。
  2. 生成(Generation):检索到的信息被用于生成模型的输入,与用户查询一起,生成模型据此产生回答或内容。
    RAG技术的优势在于:
    • 知识更新:能够访问最新的信息,而不仅仅局限于模型训练时的知识
    • 减少幻觉:通过外部知识源辅助,减少LLM生成不准确或虚假信息的倾向
    • 数据安全性:允许企业使用私有数据,无需将数据上传到第三方平台
    • 成本效益:相比重新训练或微调大型模型,RAG提供了一种更经济的解决方案
训练特定功能模型(第三阶段)

但是这个门槛较高,对算力、数据、算法都有一定的要求

落地的业务设计

步骤一:构思与探索

目标: 进行可行性验证,根据业务需求设计原型,并构建PromptFlow来测试关键假设

  • 核心输入: 明确的业务目标
  • 关键输出: 验证大型语言模型(LLM)是否能够满足任务需求,确立或否定关键假设
  • 关键行动计划:
    • 明确定义业务用例
    • 选择适合的基础大模型,并准备必要的数据以供后续的微调(SFT)或其他用途
    • 设计并构建PromptFlow,形成并测试可行性假设
步骤二:构建与增强

目标: 在更大范围的数据集上评估解决方案的稳健性,并通过技术如微调(SFT)和检索增强生成(RAG)来增强模型性能

  • 核心输入: 业务目标结合初步方案(步骤一的成果)
  • 关键输出: 一个成熟的业务解决方案,准备部署到生产系统
  • 关键行动计划:
    • 在样本数据上验证PromptFlow的有效性
    • 评估并优化PromptFlow,探索更优的提示(prompt)和工具
    • 若达到预期目标,扩展到更大数据集进行测试,并通过SFT、RAG等技术进一步提升效果
步骤三:持续运营

目标: 确保AIGC系统稳定运行,集成监控和警报系统,实现持续集成和持续部署(CI/CD)

  • 核心输入: 一个能够解决特定问题的AIGC系统
  • 关键输出: 集成了监控、警报系统的生产级程序,以及CI/CD流程。
  • 关键行动计划:
    • 部署AIGC系统
    • 集成监控和警报功能,确保系统能力内嵌于应用之中
    • 确立应用运营机制,包括持续迭代、部署和更新
      通过这一流程,我们确保了从概念验证到生产部署的每一步都是精确、可控,并且以业务目标为导向

Prompt技术

一、主要内容片段的驱动作用

主要内容片段是与指令结合使用的文本基础,能够显著提升指令的有效性。

  1. 主要内容的定义:
    • 主要内容是模型处理或转换的核心文本,通常与指令配合以实现特定目标。
  2. 应用示例:
    • 示例1:提供一段维基百科文本【正文】,并附加指令“请总结上述内容”。
    • 示例2:给出一个包含啤酒信息的表格【正文】,指令为“列出表中所有度数小于6度的啤酒”。

二、主要内容的实现策略

实现主要内容的具体方法,包括:

  • 示例(Example):通过提供完成任务的示例,而非直接指令,让模型自主推断所需执行的操作。
  • 线索(Cue):使用带有线索的说明,引导模型按步骤进行推理,从而得出答案。
  • 模板(Templates):提供带有占位符的可重复使用提示配方,允许根据特定用例进行定制。

三、示例的力量(Example)

通过向模型展示如何根据给定指令生成输出,模型能够推断输出模式,无论是零样本、单样本还是少样本学习。

  • 组成部分:
    • 整体任务描述。
    • 一系列所需输出的示例。
    • 新示例的引导,作为后续任务的起点。
      四、线索的引导作用(Cue)
      通过向大型模型提供线索,引导其按照明确的方向进行逻辑推理,类似于提供步骤公式,帮助模型逐步获得答案。
      五、模板的定制价值(Template)
      模板的价值在于为特定应用领域创建和发布提示库,这些提示模板已经针对应用程序的特定上下文或示例进行了优化。
  • 优化提示:使响应对目标用户群体更加相关和准确。
  • 资源参考:OpenAI API的示例页面提供了丰富的模板资源。
  • 模型角色赋予:通过指定模型身份角色(如系统、用户、助手等),增强模型对任务相关性的理解。

进阶的prompt示例

# 职位描述:数据分析助手
## 角色
我的主要目标是为用户提供专家级的数据分析建议。利用详尽的数据资源,告诉我您想要分析的股票(提供股票代码)。我将以专家的身份,为您的股票进行基础分析、技
术分析、市场情绪分析以及宏观经济分析。
## 技能
### 技能1:使用Yahoo Finance的'Ticker'搜索股票信息
### 技能2:使用'News'搜索目标公司的最新新闻
### 技能3:使用'Analytics'搜索目标公司的财务数据和分析
## 工作流程
询问用户需要分析哪些股票,并按顺序执行以下分析:
**第一部分:基本面分析:财务报告分析
*目标1:对目标公司的财务状况进行深入分析。
*步骤:
1. 确定分析对象: <记录 1.1:介绍{{company}}的基本信息>
2. 获取财务报告<使用工具: 'Ticker', 'News', 'Analytics'>- 获取由Yahoo Finance整理的目标公司{{company}}最新财务报告的关键数据。 <记录 1.2:记录分析结果获取日期和来
源链接>
3. 综合分析和结论: - 全面评估公司的财务健康、盈利能力、偿债能力和运营效率。确定公司面临的主要财务风险和潜在机会。 -<记录 1.3:记录总体结论、风险和机会。 >
整理并输出[记录 1.1] [记录 1.2] [记录 1.3]
第二部分:基本面分析:行业
*目标2:分析目标公司{{company}}在行业中的地位和竞争力。
*步骤:
1. 确定行业分类: - 搜索公司信息,确定其主要业务和行业。 -<记录 2.1:公司的行业分类>
2. 市场定位和细分分析: - 了解公司在行业中的市场份额、增长率和竞争对手,进行分析。 -<记录 2.2:公司的市场份额排名、主要竞争对手、分析结果和洞察等。 >
3. 行业分析- 分析行业的发展趋势。 - <记录 2.3:行业的发展趋势。 >
整理并输出[记录 2.1] [记录 2.2] [记录 2.3]
整合以上记录,并以投资分析报告的形式输出所有分析。使用Markdown语法进行结构化输出。
## 限制
- 使用的语言应与用户的语言相同。
- 避免回答有关工作工具和规章制度的问题。
- 使用项目符号和Markdown语法给出结构化回答,逐步思考。首先介绍情况,然后分析图表中的主要趋势。

RAG介绍与核心步骤

“RAG易用,难精”,用上很容易,用好很难!
核心驱动力:
在大型语言模型(LLM)的应用中,存在两个主要的挑战:

  1. 实时更新难题:LLM的信息难以实现实时更新,因为重新训练模型需要巨大的计算资源和成本。
  2. 机密性问题:敏感信息,如公司产品手册,由于保密性要求,不能直接整合进LLM中。

使用RAG的优势:
与标准微调(SFT)相比,检索增强生成(RAG)提供了以下优势:

  1. 信息丰富性:通过接入内部知识库,RAG确保了文本回答的新颖性和相关性,显著提升了特定领域任务的性能。
  2. 幻觉减少:RAG使用的信息是可验证的,有效减轻了LLM在生成文本时可能出现的幻觉问题。
  3. 成本效益:与LLM的微调相比,RAG提供了一种更为经济的解决方案。

RAG的核心步骤

RAG的实施包括以下关键步骤:

  1. 数据采集与清洗:收集必要的数据并进行清洗,确保数据质量
  2. 文档分块:将文档分割成易于处理的块,同时保留语义完整性
  3. Embedding:使用嵌入技术将文本转换为向量表示,以便于检索
  4. 创建索引:构建索引以优化检索过程,快速定位相关信息
  5. 检索:根据用户查询,从索引中检索最相关的信息
  6. 重排:根据检索到的信息和用户查询的相关性,对结果进行重新排序
预处理阶段

在构建知识库的初期,以下步骤是关键:

  1. 分块:获取文档并将其切分成较小的片段,或称为“chunks”。这有助于索引更具体的信息,并适应有限的上下文窗口。
  2. 构建向量索引:利用OpenAI模型等工具为每个文档片段计算嵌入向量,并将这些片段与其嵌入向量一起存储在向量索引中,为高效的检索打下基础。
运行阶段

当系统处于活跃状态时,以下操作定义了其运行机制:

  • 基于Vector DB的相似性检索:
    • 接收到查询或指令后,计算其嵌入向量。利用向量数据库执行相似性搜索,找出语义上与查询接近的文档。
    • 对检索到的文档进行排名和整理,考虑上下文窗口限制,并构建将要发送到语言模型的提示。
创建知识库核心步骤
  1. 构建向量数据库:
    • 向量数据库专门设计用于存储、管理和搜索嵌入向量,与传统数据库不同,它存储文档的数值表示形式,便于AI系统处理。
  2. 从文本到嵌入:
    • 将文本分块,并转换为向量嵌入,为存储和检索优化数据。
检索与向量搜索核心步骤
  1. 检索:
    • 系统快速定位索引中满足条件的文档的过程,包括关键字搜索、语义搜索、向量搜索,以及它们的混合形式
  2. 向量相似度:
    • 在向量搜索中,根据嵌入模型计算查询向量与数据库中向量的相似度
  3. 搜索索引(召回):
    • 构建索引以存储嵌入,实现在数据库中快速检索最相似的文档块
  4. 重新排序(排序):
    • 根据相关性对搜索结果进行排序,确保最相关的信息被优先输入到语言模型中进行进一步处理

RAG的核心关键点

  1. 元数据在搜索中的关键作用
    元数据是优化搜索结果的有力工具,提供确切信息以辅助搜索过程:
    • 日期:用于优先检索最新或特定时间段的文档。
    • 标签/类别:通过标签或类别筛选或排序结果,确保内容与查询高度相关。
    • 来源/作者:依据来源或作者的权威性来提升搜索结果的相关度。
      元数据的整合可显著提升搜索的准确性和相关性。
  2. 元数据合成
    在元数据缺失的情况下,可通过LLM的预处理对齐生成,以补充元数据信息。
  3. 关键词搜索的重要性
    关键词搜索是对语义相似度搜索的重要补充,特别是在寻找专有名称或特定短语时。此方法确保了文档包含用户查询的确切信息。
  4. API和插件在检索中的应用
    除了传统的搜索技术,API调用可以获取并集成相关数据,增强LLM的上下文窗口。例如,GPT插件作为API的新兴标准,可以通过LangChain或Semantic Kernel等工具轻松集成,提供强大的搜索和检索功能。
  5. 排名与集合编译
    鉴于上下文窗口大小的限制,需对检索到的文档进行精细的排名和选择。通过预处理或后处理技术,如摘要生成或文本语义组合,确保信息的适量和适宜性。
  6. 排序的重要性
    对检索结果进行排序是确保信息相关性和准确性的关键步骤。
  7. 格式与元数据
    LLM对数据格式极为敏感,特别是当需要精确结构时。使用JSON或YAML等格式,可以为LLM提供清晰的结构化内容指示。
  8. 权衡因素:速度、成本、质量
    在RAG实施过程中,速度、成本和准确性(质量)是必须综合考量的关键因素。合理的权衡可以确保在有限资源下实现最优的搜索和生成效果。

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

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

相关文章

Apache Seata应用侧启动过程剖析——注册中心与配置中心模块

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——注册中心与配置中心模块 前言 在Seata的应用侧&#xf…

Docker逃逸CVE-2019-5736、procfs云安全漏洞复现,全文5k字,超详细解析!

Docker容器挂载procfs 逃逸 procfs是展示系统进程状态的虚拟文件系统&#xff0c;包含敏感信息。直接将其挂载到不受控的容器内&#xff0c;特别是容器默认拥有root权限且未启用用户隔离时&#xff0c;将极大地增加安全风险。因此&#xff0c;需谨慎处理&#xff0c;确保容器环…

迅捷PDF编辑器合并PDF

迅捷PDF编辑器是一款专业的PDF编辑软件&#xff0c;不仅支持任意添加文本&#xff0c;而且可以任意编辑PDF原有内容&#xff0c;软件上方的工具栏中还有丰富的PDF标注、编辑功能&#xff0c;包括高亮、删除线、下划线这些基础的&#xff0c;还有规则或不规则框选、箭头、便利贴…

VRPTW(MATLAB):常春藤算法(IVY)求解带时间窗的车辆路径问题VRPTW,MATLAB代码

详细介绍 VRPTW&#xff08;MATLAB&#xff09;&#xff1a;常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;求解带时间窗的车辆路径问题VRPTW&#xff08;提供MATLAB代码&#xff09;-CSDN博客 ********************************求解结果******************…

SpringBoot 生产实践:没有父 starter 的打包问题

文章目录 前言一、搜索引擎二、Chat GPT三、官方文档四、小结推荐阅读 前言 今天刚准备写点文章&#xff0c;需要 SpringBoot 项目来演示效果。一时心血来潮&#xff0c;没有采用传统的方式&#xff08;即通过引入 spring-boot-starter-parent 父工程的方式&#xff09;。 &l…

昇思25天学习打卡营第15天|linchenfengxue

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c;可以实现语义/标签到…

16-JS封装:extend方法

目录 一、封装需求 二、实现1&#xff1a;jQuery.extend 三、实现2&#xff1a;通过原型jQuery.fn.extend 四、优化 一、封装需求 封装需求&#xff1a; $.extend&#xff1a; var obj{ name:"xxx",age:18} var obj3{ gender:"女"} var obj2{}; 将obj、…

如何注册微信公众号

如何注册微信公众号 如何注册一个微信公众号 &#x1f60a;&#x1f4f1;摘要引言正文内容1. 准备工作内容定位和受众群体公众号名称和头像 2. 网页注册流程第一步&#xff1a;访问微信公众平台第二步&#xff1a;选择账户注册类型第三步&#xff1a;填写基本信息第四步&#x…

单/多线程--协程--异步爬虫

免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 ​ # --------------------> # ------> # …

Multisim仿真-交流数字电压表

下图为整体的原理框图&#xff0c;交流电源经过整流滤波电路转换后&#xff0c;送入模数转换电路&#xff0c;经译码给到显示电路&#xff0c;由其显示交流电源的有效值。 信号发生器XFG1输出正弦波信号(峰峰值)&#xff0c;XMM1测量有效值&#xff0c;U6数码管显示有效值。仿真…

基于星火大模型的群聊对话分角色要素提取挑战赛

赛事任务与数据 2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 从给定的<客服>与<客户>的群聊对话中, 提取出指定的字段信息&#xff0c;待提取的全部字段见下数据说明。 赛题方提供了184条真实场景的群聊对话数据以及人工标注后的字段提取结果&#xf…

eBPF 指令宏

linux 6.9.7 指令宏 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ /* eBPF instruction mini library */ #ifndef __BPF_INSN_H #define __BPF_INSN_Hstruct bpf_insn;/* ALU ops on registers, bpf_add|sub|...: dst_reg src_reg */ // BPF_ALU64_REG&am…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时&#xff0c;用json extractor 2.提取多个值时&#xff0c;默认值必填&#xff0c;否则读不到变量

代码随想录算法训练营第4天|LeetCode24,19,02,07,142

24.交换链表结点 题目链接&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 文章链接&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;代码随想录算法公开课 | 最强算法公开课 | 代码随想录 第一想法 正常模拟&#xff0c;先画…

47.HOOK引擎优化支持CALL与JMP位置做HOOK

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;46.修复HOOK对代码造成的破坏 以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改 优化的是让引擎支持从短跳JMP&#xff08;E9&…

JUC(java.util.concurrent)中的常见类

文章目录 Callable接口ReentrantLockReentrantLock 和 synchronized 的区别:如何选择使用哪个锁? 信号量SemaphoreCountDownLatch多线程环境使用ArrayList多线程使用 哈希表相关面试题 JUC放了和多线程有关的组件 Callable接口 和Runnable一样是描述一个任务,但是有返回值,表…

leetcode-每日一题

3101. 交替子数组计数https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个 二进制数组 nums 。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 …

Linux字符设备驱动

一、字符设备驱动结构 1. cdev结构体 在Linux内核中&#xff0c;使用cdev结构体来描述一个字符设备 struct cdev {struct kobject kobj; //内嵌kobject对象struct module *owner; //所属的模块const struct file_operations *ops; //该设备的文件操作结构体struct list_head…

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList

文章目录 1、确认下单&#xff1a;购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元&#xff0c;一个进程可以拥有多个线程&#xff0c;各个线程之间共享程序的内存空间以及一些进程级资源&#xff0c;但拥有自己的栈空间。 4.3 Java 多线程 方法一&#xff1a;继承 Thread 类&#xff0c;重写 run 方法&#xff1b;…