什么是Vector Database(向量数据库)? 向量数据库是向量嵌入的有组织的集合,可以随时创建、读取、更新和删除。向量嵌入将文本或图像等数据块表示为数值。
文章目录 什么是Vector Database(向量数据库)?什么是嵌入模型(Embedding Model)?嵌入模型如何与向量数据库一起使用?什么是向量数据库中的相似性搜索?向量搜索中的聚类算法是什么?索引在向量数据库中的作用是什么?什么是向量数据库中的查询处理?什么影响向量数据库的可扩展性?什么是向量数据库中的数据规范化?哈希在向量数据库中是如何使用的?什么是向量数据库中的降噪?查询扩展如何在向量数据库中发挥作用?如何对向量数据库进行数据可视化?如何在向量数据库中处理数据稀疏性?如何确保向量数据库中的数据完整性? 什么是嵌入模型(Embedding Model)? 嵌入模型将各种数据(例如文本、图像、图表和视频)转换为数字向量,从而在多维向量空间中捕捉其含义和细微差别。嵌入技术的选择取决于应用需求,平衡语义深度、计算效率、要编码的数据类型和维数等因素。
将向量映射到多维空间可以对向量的语义相似性进行细致入微的分析,从而显著提高搜索和数据分类的准确性。嵌入模型在使用 AI 聊天机器人、大型语言模型 (LLM) 和带有向量数据库的检索增强生成 (RAG) 的 AI 应用中起着至关重要的作用,以及搜索引擎和许多其他用例。
嵌入模型如何与向量数据库一起使用? 当私有企业数据被提取时,它会被分块,创建一个向量来表示它,并且数据块及其对应的向量与可选元数据一起存储在向量数据库中以供以后检索。
在收到来自用户、聊天机器人或 AI 应用程序的查询后,系统会对其进行解析并使用嵌入模型来获取表示提示部分内容的向量嵌入。然后使用提示的向量在向量数据库中进行语义搜索,以找到完全匹配或前 K 个最相似的向量及其相应的数据块,这些数据块在发送到 LLM 之前会放入提示的上下文中。LangChain 或 LlamaIndex 是流行的开源框架,用于支持创建 AI 聊天机器人和 LLM 解决方案。流行的 LLM 包括 OpenAI GPT 和 Meta LlaMA。流行的向量数据库包括 Pinecone 和 Milvus 等。两种最流行的编程语言是 Python 和 TypeScript。
什么是向量数据库中的相似性搜索? 相似性搜索,也称为向量搜索、向量相似性或语义搜索,是指 AI 应用程序根据指定的相似性度量从数据库中有效检索与给定查询的向量嵌入在语义上相似的向量的过程,例如:
欧几里得距离(Euclidean distance):测量点之间的直接距离。适用于聚类或对整体差异很重要的密集特征集进行分类。余弦相似性(Cosine similarity):关注向量之间的角度。非常适合文本处理和信息检索,根据方向而不是传统距离捕获语义相似性。曼哈顿距离(Manhattan distance):计算笛卡尔坐标中绝对差异的总和。适用于网格结构中的寻路和优化问题。适用于稀疏数据。 相似性测量指标可以高效检索 AI 聊天机器人、推荐系统和文档检索中的相关项目,通过利用数据中的语义关系来通知生成 AI 过程并执行自然语言处理 (NLP),从而增强用户体验。
向量搜索中的聚类算法是什么? 聚类算法根据共同特征将向量组织成有凝聚力的组,从而促进向量数据库中的模式识别和异常检测。
此过程不仅有助于通过减小数据集大小来压缩数据,而且还揭示了潜在的模式,为各个领域提供了宝贵的见解。
K 均值:根据质心接近度将数据拆分为 K 个簇。适用于大型数据集。需要预定义簇数。DBSCAN 和 HDBSCAN:根据密度形成簇,区分异常值。适应复杂形状而无需指定簇数。层次聚类:通过聚集合并或分割数据点来创建簇树。适用于层次数据可视化。谱聚类:利用相似矩阵特征值进行降维。适用于非线性可分数据。均值漂移:通过查找密度函数最大值来识别簇。可灵活处理簇形状和大小。无需预定义簇数。 算法方法的多样性适用于不同的数据类型和聚类目标,强调了聚类在从 RAG 架构中的向量数据中提取有意义信息方面的多功能性和关键重要性。
“20k!明天就来上班吧!”
听到这句话,你会不会两眼放光,激动得差点跳起来?
朋友媳妇小丽,最近就经历了这样一场“梦幻面试”。然而,事情的发展却远没有想象中那么美好……
“这公司也太好了吧!” 小丽兴奋地宣布喜讯 那天,小丽下班回家,一进门就难掩兴奋地宣布:“我找到新工作啦!20k一个月呢!”
朋友老王听了也很高兴,追问道:“这么厉害?是什么公司啊?面试都问了些什么?”
小丽却轻描淡写地说:“没问什么,就简单聊了几句,他们就说让我明天去上班。”
老王心里咯噔一下,隐隐觉得有些不对劲,但看到小丽如此开心,也不好泼冷水。
20k背后,疑点重重,老王决定“盘问”清楚 晚上,老王旁敲侧击地打听起这家公司的情况:公司规模、主营业务、岗位职责……
然而,小丽却一问三不知,只是反复强调:“公司可好了,老板特别大方,工资给得高,福利还好……”
老王越听越觉得蹊跷,这“馅饼”怎么看怎么像是陷阱啊!
于是,他严肃地对小丽说:“你明天打电话问问清楚,这20k到底是底薪,还是包含了绩效、提成什么的?”
真相大白!20k的“美丽谎言”被戳破 第二天,小丽忐忑地拨通了公司电话。
不问不知道,一问吓一跳!
原来,这20k月薪是由基本工资、绩效、提成、奖金、全勤等多个部分组成的。而基本工资,只有区区1800元!
也就是说,想要拿到20k,需要完成几乎不可能的任务量!
小丽顿时傻眼了,这哪是什么“高薪”,分明就是“画饼充饥”啊!
幸亏老王及时提醒,否则小丽就掉进“陷阱”里了!
“求职陷阱”防不胜防,我们要擦亮双眼! 小丽的经历,给所有求职者敲响了警钟:
“高薪”背后,往往暗藏玄机。 面对“高薪诱惑”,我们要保持冷静,不要被表面的数字冲昏头脑。
面试过于草率,就要提高警惕。 正规公司招聘,都会有严格的面试流程,如果面试过于简单,就要多留个心眼。
入职前,一定要问清楚薪资构成。 不要怕麻烦,也不要不好意思,这是维护自身权益的关键一步。
求职路上,陷阱重重,我们要擦亮双眼,谨慎选择,才能找到真正适合自己的好工作!
系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研
AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研
AI大模型探索之路-实战篇6:掌握Function Calling的详细流程
AI大模型探索之路-实战篇7:Function Calling技术实战自动生成函数
AI大模型探索之路-实战篇8:多轮对话与Function Calling技术应用
AI大模型探索之路-实战篇9:探究Agent智能数据分析平台的架构与功能
AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础
AI大模型探索之路-实战篇11: Function Calling技术整合:强化Agent智能数据分析平台功能
AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制
AI大模型探索之路-实战篇13: 从对话到报告:打造能记录和分析的Agent智能数据分析平台
目录 系列篇章💥一、前言二、实现本地Python代码解释器1、定义数据提取函数2、数据查询汲取测试3、变量数据查看4、数据汲取函数信息生成5、大模型调用测试6、定义python代码执行函数7、自动生成python代码执行函数的信息8、第一次大模型调用测试(python代码执行函数调用测试)9、第二次大模型调用测试10、第三次大模型调用测试 三、可视化展示数据1、获取数据2、可视化展示 四、把可视化图片存入云盘文档1、图形绘制测试2、定义图片存储服务 五、 实现把图片变为fig对象的代码逻辑1、获取数据2、查看代码3、执行代码(可视化展示)4、定义insert_fig_objec函数,插入matplotlib图形对象5、insert_fig_objec函数测试6、可视化展示gender字段取值分布17、可视化展示gender字段取值分布28、提取代码格式化输出9、重新定义python代码执行函数10、查看fg对象 六、多轮对话增加Python代码解释器效果1、定义Python代码提取函数2、大模型两次调用封装3、多轮对话函数定义4、定义工具列表5、多轮对话测试 七、结语 一、前言 在之前的文章里,我们展示了如何利用大型模型的推理能力和Function Calling技术实现从自然语言到数据查询分析处理的转变。然而,除了依赖大模型自身的能力之外,有时我们还需要处理一些超出大模型能力范围的任务,例如调用本地代码库进行数据的可视化展示。因此,本文将介绍如何通过为Agent智能数据分析平台增添新外挂——Python代码解释器,来进一步增强其能力。
二、实现本地Python代码解释器 1、定义数据提取函数 定义一个数据提取服务,用于读取数据库表信息,放入到df变量中,并设置成全局变量
def extract_data(sql_query,df_name): """ 用于借助pymysql,将MySQL中的iquery数据库中的表读取并保存到本地Python环境中。 :param sql_query: 字符串形式的SQL查询语句,用于提取MySQL中iquery数据库中的某张表。 :param df_name: 将MySQL数据库中提取的表格进行本地保存时的变量名,以字符串形式表示。 :return:表格读取和保存结果 """ mysql_pw = "iquery_agent" connection = pymysql.connect( host='localhost', # 数据库地址 user='iquery_agent', # 数据库用户名 passwd=mysql_pw, # 数据库密码 db='iquery', # 数据库名 charset='utf8' # 字符集选择utf8 ) # 使用pandas的read_sql方法,根据SQL查询语句从数据库中读取数据,并将结果保存到本地变量中 globals()[df_name] = pd.
如何在iPad的iOS 17系统下安装UTM虚拟机运行Windows 11 前言 随着iPad性能的提升,越来越多的用户希望在iPad上运行完整的桌面操作系统,如Windows 11。本文将详细介绍如何在iPad的iOS 17系统下安装UTM虚拟机,并成功运行Windows 11。
准备工作 确保你的设备和系统版本 设备:iPad Pro 2021或更新型号,Macbook。系统:iOS 17。 工具下载 UTM:在官方GitHub页面下载最新版本的IPA文件。AltStore:用于在iPad上安装UTM。 安装AltStore 在Mac上安装AltServer:从AltStore官网下载并安装。连接iPad到Mac:通过USB连接。安装AltStore到iPad:启动AltServer,并在菜单栏中选择“安装AltStore”到你的iPad。 具体步骤 1. 启用JIT 确保AltStore的JIT已启用以支持UTM运行虚拟机。
2. 安装UTM 打开AltStore,在“我的应用”中点击“+”号并选择下载好的UTM IPA文件进行安装。安装完成后,UTM图标将出现在你的主屏幕上。 3. 创建Windows 11虚拟机 打开UTM应用,点击“创建虚拟机”。选择“Windows”作为操作系统,并上传Windows 11的ISO镜像文件。设置虚拟机配置: 内存:建议设置为4GB或更多。CPU核心:建议设置为2个或更多。硬盘:设置至少64GB或更多。 4. 启动并安装Windows 11 启动虚拟机,按照提示完成Windows 11的安装。安装过程中可能需要数次重启,请耐心等待。 调试常见问题 启用调试服务器 确认SIP已禁用:
重启Mac,按住 Command (⌘) + R 进入恢复模式。打开终端,输入以下命令:csrutil disable reboot 启用开发者模式:
sudo /usr/sbin/DevToolsSecurity --enable 重新加载调试服务器:
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.debugserver.plist 添加用户到开发者组:sudo dscl . create /Groups/_developer sudo dscl . create /Users/$(whoami) sudo dscl .
文章目录 前言一、绑定相关数据1.小程序绑定公众号2.小程序和公众号关联微信开放平台 二、公众号操作回调1.服务器配置2.回调接口(URL) 三、获取微信公众号用户是否已关注标识1.获取公众号accessToken2.feign远程调用微信公众号获取用户基本信息(UnionID机制)3.回调接口补充更新用户关注标识 总结 前言 如果公众号不是认证的服务号就无需看这篇文章,需要先认证,可以参考这篇文章五分钟!手把手教你快速完成微信公众号认证!
你们是否经常在小程序看到这种关注标识
实现的方法很简单,后端只需要返回给前端给前端当前用户是否有关注公众号就行了,整个逻辑很简单,微信官方也有对应的API,但实际上整个流程就很复杂
一、绑定相关数据 微信官方有很多限制,咱们需要做好一些关联
1.小程序绑定公众号 根据微信官方文档,微信小程序需要关联对应的公众号才能够引导关注公众号
咱们先登录微信公众平台,扫码登录公众号
然后点击【广告与服务】->【小程序管理】添加关联小程序,这步很简单只需要后台管理员扫码一下就行了。
2.小程序和公众号关联微信开放平台 这一步比较重要,这是为了获取unionId,关于unionId介绍可以看一下官方说明,UnionID 机制说明,简单来说就是同一个微信开放平台用户的unionId都是唯一的
先注册微信开放平台,然后关联小程序和公众号,关联流程参考文章微信开放平台绑定公众号,小程序也同理,这个时候你们需要改造原来的微信登录接口,会发现登录接口返回的参数多了unionId,把对应用户的unionId存到数据库里,后面会用得上。
二、公众号操作回调 这个是公众号的相关操作会有回调,相当强大,咱们服务器能立马得知用户做了什么操作,这里咱们只需要配公众号关注和取消关注的回调。
1.服务器配置 同样登录微信公众平台,选择公众号账号登录,进入【服务与配置】->【基本配置】,会看到有一个服务器配置
点击修改配置
这个URL实际上就是咱们要给微信的回调地址,需要外网可访问;
Token咱们随意填写,只要跟服务器对得上;
EncodingAESKey随机生成就好,然后消息加解密选择用明文模式,安全模式可以看看别人写的加解密方式;
2.回调接口(URL) RequestMethodEnum枚举类是为了判断什么请求方式,如果是get请求实际上就是验证token合法性
public enum RequestMethodEnum { /** * get */ GET(1,"GET"), /** * post */ POST(2,"POST"); private final Integer code; private final String desc; RequestMethodEnum(Integer id, String name){ this.code = id; this.desc = name; } public Integer getCode() { return code; } public String getDesc() { return desc; } } MsgTypeEnum枚举类是为了判断微信公众号执行了什么操作
IT人的工作和生活难平衡这事,到底要怎么解决呢,让我们从神经网络的“剪枝策略”中找点灵感吧!
剪枝策略是指训练和优化深度神经网络时采取的一种技术,从名字就知道,它就像修剪树木一样,去除不必要的枝叶,让主干更加清晰,更有利于模型的健康成长。它旨在减少模型中的参数数量和计算量,从而提高模型的效率和性能。剪枝策略的核心思想是通过删除不必要的神经元或连接来简化网络结构,同时尽量保持模型的性能不受影响。下面,让我们来简单了解下剪枝策略。
剪枝策略的原理: 冗余神经元和连接:在深度神经网络中,存在着大量的冗余神经元和连接,它们对最终的模型性能贡献不大。剪枝策略的原理就是通过识别和删除这些冗余神经元和连接,从而减少模型的参数数量和计算量。
稀疏性和泛化能力:神经网络中的稀疏性(sparsity)可以提高模型的泛化能力,即对未见过的数据的适应能力。剪枝策略通过创建稀疏模型,即删除部分参数和连接,从而提高模型的泛化能力,并减少过拟合的风险。
精简模型结构:剪枝策略可以将复杂的模型结构精简化,使其更加简洁和高效。这有助于减少模型的存储空间和计算资源的消耗,并提高模型的部署效率。
剪枝策略的步骤: 初始化:首先,需要对深度神经网络进行训练,以获得一个初始的模型。这个模型可以是在标准数据集上进行训练得到的,也可以是已经存在的预训练模型。
重要性评估:接下来,需要对模型中的参数和连接进行重要性评估。通常使用的方法包括基于梯度的方法、敏感性分析等。这些方法可以帮助确定哪些参数和连接对模型的性能贡献最小,从而成为剪枝的候选对象。
剪枝决策:根据重要性评估的结果,制定剪枝决策,即决定哪些参数和连接需要被剪掉。通常,可以设置一个阈值来确定剪枝的策略,将那些重要性低于阈值的参数和连接删除。
剪枝操作:根据剪枝决策,对模型进行剪枝操作,删除那些不必要的神经元和连接。
微调和重训练:在剪枝操作之后,需要对剪枝后的模型进行微调和重训练,以恢复模型的性能。这一步骤通常需要在原始数据集上进行进一步的训练,以确保模型在剪枝后仍然具有良好的泛化能力和性能。
剪枝策略的分类:
预剪枝:通常基于一些预设的规则或阈值,在构建决策树或神经网络的过程中,提前停止节点的进一步分裂或权重的学习。如限制树的最大深度、节点所需的样本数等。
后剪枝:先完全构建决策树或神经网络模型,之后从底部向上检查每个子树,如果某个子树被替换为单个节点后,整体性能(如交叉验证误差)没有明显下降,则执行剪枝操作,即用该节点代表整个子树。
由以上的原理、步骤和分类,我们可以看出”剪枝策略”的基础是“有冗余”、“删除冗余连接”以提升整体“效率”,同时它有“重要性评估”的步骤,加上”预剪枝“和”后剪枝”两种方法有策略性地实现了“剪枝”。那我们的这难以平衡的生活,是否也可以运用这一策略来找回那不知道去哪的时间呢?
首先,我们需要整理出自己生活中哪些事情是"冗余“的,比如某个时间段的闲聊,比如某些没有效率的沟通方式,又或者是对部分娱乐八卦的追踪等,每个人的情况不一样,冗余的标准也不一样,需自行根据自己的标准来整理冗余有哪些。
然后,看哪些冗余是可以删减的,哪些是可以减少发生频率的,哪些是可以缩短时间的。能删除连接的,就删除掉连接。实在删不掉或不忍删掉的,就赋予它一个“重要性”分数,给它设定具体的启动标准,比如什么场景下,什么时间可以启动,启动后赋予的最大时长是多少。假设,追八卦有个启动标准,那可以设定每天下班劳累一天后的时间,自己的精力也处于低峰期了,又是下班的坐车的路上,这时就是追八卦的时间,到家后就停止追八卦了。(只是举例,大家举一反三啊)。
接着,对于剪枝的两个分类方法,可以类比我们在时间管理中经常会用到的“优先级矩阵”和“回顾与调整”
优先级矩阵(预剪枝):这是一种预先确定任务重要性和紧急性的方法,把我们日常的任务分为四类:重要且紧急、重要但不紧急、不重要但紧急、不重要且不紧急。通过这种分类,可以“剪除”那些不重要或低优先级的任务,优先聚焦于真正有价值的工作,避免时间浪费在琐碎或无关紧要的事情上。
回顾与调整(后剪枝):类似于Sprint开发中,Sprint回顾会通过定期回顾已完成的Sprint中遇到的问题或做的很好的地方,以此来帮助我们后续的Sprint能够及时的发挥好的地方,避免做的不好的地方。这种“回顾并调整的方式”就类似于后剪枝。通过分析哪些计划被执行得高效、哪些活动占用了过多时间却收效甚微,你可以“剪掉”那些低效的习惯、会议或日常活动,调整未来的时间规划,以实现更优的时间利用。比如每天早上回顾下昨天做的事情和今天要做的事情,梳理下哪些事情以后可以避免,哪些事情应该投入更多的精力等等。这种回顾可以是每日、每周或每月进行,依据个人的具体情况而定。
此外,在执行过程中,我们还要根据任务的实际难易程度和进度来适时调整时间分配,比如发现某任务耗时远超预期,及时重新规划后续任务。
通过以上这样的类比,我们可以看到,虽然时间管理和机器学习是两个截然不同的领域,但在优化资源分配、提升效率的目标下,两者采用了类似的策略思路:既有事前的策略规划以预防无效劳动(预剪枝),也有事后反馈和调整机制以不断优化(后剪枝)。具体的实际操作或许千差万别,但是指导着具体操作的思维方式可能很类似哦!如果你也知道有哪些机器学习的思维可以应用到我们的日常生活中,欢迎交流分享。
毕 业 设 计(论 文)
基于大数据的租房数据爬虫与推荐分析系统
姓 名
学 院
专 业
班 级
指导教师
摘 要 本设计是一个基于爬虫技术的房地产数据采集与可视化分析应用程序。该程序首先通过爬虫采集网上所有房地产的房源数据,并对采集到的数据进行清洗;将这些房源大致分类,以对所有数据的概括总结。通过上述分析,可以了解到目前市面上房地产各项基本特征及房源分布情况,为众多的购房者进行购房决策提供了参考。
本系统主要是由大数据系统、可视化前端系统、web后台管理系统、租房推荐系统、租房小程序/APP端组成。大屏统计端使用hadoop+spark完成,数据采集使用java离线分析端、网页用户端以及后台管理使用Springboot+mybatis框架开发,在可视化阶段采用Echarts来提供可交互的直观数据可视化图表。本系统采用的数据库是MySQL数据库,其目的是用来存储利用爬虫爬取到的大量租房信息数据集和数据处理之后的分析结果,在通过Spark并行计算进行数据抽取,多维分析,查询统计等操作来完成数据分析部分。完整基于大数据的租房数据分析推荐可视化与管理一体的系统开发。
关键词: 租房数据分析、大数据开发、java开发
Abstract This design is a real estate data acquisition and visualization analysis application based on crawler technology. Firstly, the program collects all the housing data of real estate on the Internet through crawler, and cleans the collected data. These listings are roughly categorized to provide a summary of all the data.
前言: • MATLAB是美国Math Works公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。
• MATLAB将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案。
• MATLAB作为线性系统的一种分析和仿真工具,是理工科大学生应该掌握的技术工具,它作为一种编程语言和可视化工具,可解决工程、科学计算和数学学科中许多问题.
• MATLAB建立在向量、数组和矩阵的基础上,使用方便,人机界面直观,输出结果可视化.
• 矩阵是MATLAB的核心(Matrix Laboratory)
一、变量与函数 1、变量 MATLAB的命名规则:
(1)变量名必须是不含空格的单个词;
(2)变量名区分大小写;
(3)变量名最多不超过63个字符(6.5之前19个)
(4)变量名必须以字母打头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号。
特殊变量取值ans用于计算结果缺少变量名pi圆周率eps计算机的最小数,和1相加时产生一个比1大的数flops浮点运算数inf无穷大,比如1/0NaN不定量,比如0/0i,j虚数单位nargin所用函数的输入变量数目nargout所用函数的输出变量数目realmin最小可用正实数realmax最大可用正实数 注意:尽量避免给系统预定义的变量重新赋值! 变量的查询:
• 显示工作空间中的所有变量 ----who
• 查看工作空间中变量的详细属性 ---whos
2、数学运算符号及标点符号 +加法运算,适用于两个数或两个同阶矩阵相加-减法运算*乘法运算.*点乘运算/除法运算./点除运算^乘幂运算.^点乘幂运算\反斜杠表示左除 (1)MATLAB的每条命令后,若为逗号或无标点符号,则显示命令结果;若命令后为分号,则不显示结果。
(2)“%”后面的文字为注释。
(3)“...”表示续行。
3、数学函数 函数名称函数名称sin(x)正弦函数asin(x)反正弦函数cos(x)余弦函数acos(x)反余弦函数tan(x)正切函数atan(x)反正切函数abs(x)绝对值max(x)最大值min(x)最小值sum(x)元素的总和sqrt(x)开平方exp(x)以e为底的指数log(x)自然对数以10为底的对数sign(x)符号函数fix(x)取整 4、M文件 MATLAB的内部函数是有限的,有时为了研究某个函数的各种形态,需要为MATLAB定义新函数,为此必须编写函数文件。函数文件的后缀名为M的文件,这类文件的第一行必须是以特殊字符function开始,格式为:
function 因变量名=函数名(自变量名)
函数值的获得必须通过具体的运算实现,并赋给因变量。 M文件建立方法:1.在MATLAB中,点:File->New->M-file
2.在编辑窗口输入程序内容
3.点File->Save,存盘,M文件必须与函数名一致 function f=fun(x) f=100*(x(2)-x(1)^2)^2+(1-x(1))^2 二、数组 1、创建简单的数组 x=[a b c d e f]创建包含指定元素的行向量.
x=first:last
创建从first开始,加1计数,到last结束的行向量。
x=first:increment:last
创建从first开始,到increment计数,到last结束的行向量
x=linspace(first,last,n)
创建从first开始,到last结束,有n个元素的行向量
x=logspace(first,last,n)
创建从first开始,到last结束,有n个元素的对数分割行向量
2、数组元素的访问 (1)访问一个元素:x(i)表示访问数组x的第i个元素。
(2)访问一块元素:x(a:b:c)表示访问数组x的第a个元素开始,以步长b到第c个元素(但不超过c),b可以为负数,b缺省时为1.
(3)直接使用元素编址序号。x([a b c d])表示提取数组x的第a、b、c、d个元素构成一个新的数组[x(a) x(b) x(c) x(d)].
JWT令牌 JSON Web Token JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).https://jwt.io/JSON Web Token(JWT)是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全地传输信息。以下是对JWT进行详细介绍:
JWT的工作原理:JWT的工作原理基于令牌(Token)的生成和验证两个主要过程。一旦用户通过身份验证,服务器会生成一个包含用户信息的JWT。这个令牌由三部分组成:标头(Header)、有效载荷(Payload)以及签名(Signature)。标头通常包含令牌的类型和所使用的签名算法;有效载荷则包含了实际的数据声明,如发行人、到期时间、主题、用户等信息;签名是为了确保令牌在传输过程中不被篡改。JWT的优点:JWT提供了无状态、可扩展且安全的认证解决方案,特别适用于分布式环境和移动应用。由于JWT自包含所有用户信息,服务端不需要存储session信息,从而减轻了服务器的压力。同时,JWT可以跨域使用,支持单点登录(SSO),并且不依赖于Cookie,因此也避免了CSRF攻击的风险。JWT的缺点:尽管JWT具有许多优点,但它也存在一些缺点。例如,一旦JWT被窃取,攻击者就可以访问所有的用户资源,直到令牌过期。此外,如果JWT未加密,通过某些手段可能会被解码并修改其内容。 在考虑使用JWT时,还需要注意以下几个方面:
安全性:虽然JWT可以加密并签名以保证数据的安全性和完整性,但默认情况下JWT是不加密的。因此,在使用JWT传输敏感信息时,应采取额外的安全措施,如使用HTTPS协议进行传输。有效期:为了减少被盗用的风险,JWT的有效期不宜设置过长。对于一些重要操作,应要求用户频繁进行身份验证。存储:虽然JWT通常存储在客户端,但也可以选择存储在服务器端,这取决于特定的应用场景和安全需求。 综上所述,JSON Web Token(JWT)是一个功能强大的工具,它提供了一种轻量级的解决方案,用于在现代Web应用程序中安全地处理身份验证和信息交换。通过了解JWT的工作原理、优缺点以及正确的使用方法,开发者可以有效地利用这一技术来提高应用的安全性和用户体验。
依赖配置 pom.xml引入JWT依赖
<!-- JWT依赖--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> 生成JWT令牌 public void genJwt(){ Map<String,Object> claims = new HashMap<>(); claims.
实验项目名称:学生选课管理系统的开发 1. 需求分析 1.1 选课工作流程分析 新的学年,系统管理人员首先对学生进行基本的信息录入,然后安排老师和所开的课程,系统默认生成的学生和教师登陆系统密码为123456。学生登陆系统后自身实际情况,查看教师信息,查看课程信息,选择课程。每举行一次考试后由任课老师对成绩录入,任课老师根据实际情况对录入的成绩进行维护,各位同学对以上录入的信息可以根据自己的需要进行适当的查询。
1.2 系统具体需求分析 系统的具体需求如下:
系统管理员 学校全体学生的信息管理,对教师和课程信息进行录入和必要的维护。教师 查看选课学生和成绩录入等。学生 查询课程、选课、退课和成绩查询等。 1.3 系统设计分析 本系统的功能主要分为如下几类
课程管理 用于对各学期课程的开设和修改教师信息管理添加、修改和删除教师信息等。学生信息管理 添加、修改和删除学生信息等。成绩管理 用于对成绩的输入、修改。选课管理 用于学生对课程的查询和选课、退课等。 2. 用户角色及功能结构 本系统用户角色主要有三类:系统管理员、老师和学生。
系统管理员 可进行老师信息管理、学生信息管理和课程信息管理等工作。教师 可以进行学生信息查询、选课查询和成绩录入等工作。学生可以进行选课信息查询、选课、退课和成绩查询等工作。 3 . 系统功能模块设计 本系统从功能上可以分为三大模块:学生模块、教师模块和系统管理员模块。以下对各模块进行说明。
学生模块:学生登录、查看选课信息、选课、查看成绩和修改密码等。教师模块:教师登录、查询选课学生、成绩管理和修改密码等。系统管理员模块:管理员登录、教师信息管理、学生信息管理、课程信息管理和修改密码。系统模块图如下图所示。 4. 数据库概念设计 以上是实验报告要求,下面将展示实验结果。
5. 实验结果 5.1 登录界面 登录界面还可以添加一下图形验证码之类的,由于时间问题这里没有添加;
5.2后台管理界面 5.2.1 课程管理页面 5.2.2 学生选课管理页面 5.2.3 学生信息管理页面 5.2.4 教师信息管理页面 5.3学生选课系统 5.3.1选课页面 5.3.2选课记录页面 5.4学生成绩管理系统 5.5个人信息页面 以上是实验结果图,实验内容主要是增删改查这里不再赘述,如果想要自学的话下面有我学习过的b站视频教程感觉讲的挺好的对新手很友好,以及视频中需要的脚手架也在下方链接里。完整的实验代码在最下方链接;
以上实验的主要内容根据这个视频学的:https://www.bilibili.com/video/BV1QC4y1j7x5/?share_source=copy_web&vd_source=3d9c1659d1ee6f6db942fd368dae7b16
实验脚手架:https://pan.baidu.com/s/1o6tlhHk-e-fYt9XrxtMBsw?pwd=1234 实验完整代码:https://pan.baidu.com/s/1XjIUvSiqsI330zzT7QQfTQ?pwd=1234 数据库Sql文件: https://pan.baidu.com/s/1j_0qXbV78Qj4P3uR271aLQ?pwd=1234
家人们,上链接了:https://download.csdn.net/download/jasonhongcn/89387887
横屏模式:
竖屏模式: 操作说明:
1. 手势滑动模拟鼠标移动
2. 界面如果有滚动条,右手指按紧,通过左手指移动实现左右滚动,当然单手用两根手指也可以做到
3. 单击为左键确定,长按显示右键功能 4.支持横竖屏切换
注意:
1.确保蓝牙已经配对好要操作的终端,如果连接不上,可关闭蓝牙重新选择终端连接。
使用 DALLE-3 模型生成的图像
目录
一、说明
二、为什么校准对 LLM 模型至关重要
三、校准 LLM 概率的挑战
四、LLM 的高级校准方法
4.1 语言置信度
4.2 增强语言自信的先进技术
4.3 基于自一致性的置信度
4.4 基于 Logit 的方法
五、代理模型或微调方法
5.1 使用代理模型进行置信度评估
5.2 识别不确定性:R-tuning
5.3 LITCAB:小改变,大影响
5.4 ASPIRE:更智能的模型响应
六、结论
一、说明 语言模型,尤其是大型语言模型 (LLM),凭借其理解和生成类人语言的能力,彻底改变了人工智能领域。这些模型不仅能够在零样本设置下或通过定制提示执行各种任务,而且它们的灵活性和多样性也使它们在多个领域中非常有用。
然而,尽管它们很有效,但一个经常面临挑战的关键方面是这些模型的校准——确保它们提供的关于各种输出的概率真实反映这些输出正确的真实可能性。
本文探讨了 LLM 校准的必要性,确定了围绕其概率评估的核心问题,并探讨了实现更好模型校准的当代方法。
二、为什么校准对 LLM 模型至关重要 LLM 的本质是围绕处理和生成基于语言的输出,这些输出不仅准确,而且被分配了正确的置信水平。校准(或使模型的置信度与其准确性保持一致的过程)是必不可少的,因为:
- 值得信赖的 AI 决策:正确校准的置信度分数使用户能够信任和依赖 AI 做出的决策,了解模型何时可能正确或不正确。
- 风险管理:在医疗诊断或自动驾驶等安全关键应用中,过度自信但不正确的预测可能会导致灾难性后果。
- 模型调试和改进: 校准可以帮助开发人员了解模型的弱点并相应地对其进行优化。
三、校准 LLM 概率的挑战 大型语言模型通常面临几个影响其概率校准的障碍:
- 封闭模型约束:许多 LLM 以黑匣子的形式运行,直接访问对数概率的访问受到限制,使理解和调整置信度分数的过程变得复杂。
- 训练中的错位:使用人类反馈强化学习 (RLHF) 等技术改进的模型可能会变得天真地校准错误。根据论文[1],使用最广泛的LLMs是通过人类反馈的强化学习(RLHF-LLMs)进行微调的。一些研究表明,RLHF-LLMs产生的条件概率校准非常差。研究结果表明,RLHF-LLMs可能会优先考虑严格遵守用户偏好,而不是产生校准良好的预测,这可能导致校准不良。这显示了一个关键挑战,即使用 RLHF 训练的模型可能缺乏准确可靠输出所需的必要概率校准。
目录
一、前言
二、工具
Android studio
SQLiteStudio 或 Navicat
SQLiteStudio
Navicat
三、导出
四、查看
五、参考
一、前言 SQLite是一种轻量级的嵌入式数据库引擎,它是一个零配置的、无服务器的、自给自足的、事务性的SQL数据库引擎。SQLite的设计目标是尽可能地轻便、快速、高效,并且不需要配置或管理。它以单一的、独立的文件形式存储整个数据库,因此非常适合于嵌入式设备、移动应用和小型应用程序。虽然SQLite不支持客户端-服务器架构,但它支持大部分标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE等,同时也支持事务和复杂的查询语句。由于其易用性和灵活性,SQLite在许多应用中被广泛使用。
关注微信公众号--星之援工作室 发送关键字(项目清单) 可获取项目清单资料 ➡️🫡🫡🫡🫡🫡🫡🫡🫡➡️
⚠️⚠️(本文章仅提供思路和实现方法,并不包含代码,需要代码的同学请自行联系博主)
⚠️⚠️(有疑问或需要定制或者技术支持等,也请自行联系博主)⚠️⚠️
二、工具 Android studio 首先我们需要安装好Android studio,然后导入我们用到了数据的项目,再根据下面的内容就可以导出数据库数据
官网链接https://developer.android.google.cn/studio?hl=zh-cn
SQLiteStudio 或 Navicat 任意安装其中一个即可
SQLiteStudio 链接:安装包链接https://pan.baidu.com/s/1rqsaClu-_uZBiS_O-wynzg?pwd=XZY0
提取码:XZY0
Navicat Mysql8.0安装教程MySQL是一个开放源码的小型关联式数据库管理系统,MySQL优化了SQL查询算法,有效地提高查询速度;支持多线程,充分利用CPU资源,支持多用户;提供用于管理、检查、优化数据库操作的管理工具。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,目前被广泛地应用在Internet上的中小型网站中。http://www.rjgxgj.com/10988.html
三、导出 首先导入我们的 Androidstudio 项目,这里展示使用模拟器去导出和查看
首先找到安装了软件的模拟器或者真机,找到文件夹框
找到 data 文件夹,然后展开
再次找到 data 文件夹,继续展开
然后在 data 文件夹下继续 找项目文件,找到与左侧项目名一样的的就打开
将 my.db 导出出来 ,这个文件也就我们的数据库文件了
四、查看 使用 我们第二步安装的软件讲db文件打开,即可看到我们的数据库格式和数据了
五、参考 Android Sqlite数据库详解https://blog.csdn.net/u012553125/article/details/110574498?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171733402216800225562344%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171733402216800225562344&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-6-110574498-null-null.nonecase&utm_term=Android%20Sqlite%E6%95%B0%E6%8D%AE%E5%BA%93&spm=1018.2226.3001.4450
一文带你了解三大开源关系型数据库:SQLite、MySQL和PostgreSQLhttps://blog.csdn.net/chenlycly/article/details/133690239?ops_request_misc=&request_id=&biz_id=102&utm_term=Sqlite%E6%95%B0%E6%8D%AE%E5%BA%93&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-133690239.142%5Ev100%5Epc_search_result_base4&spm=1018.2226.3001.4187
感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步
个人主页:LaNzikinh-CSDN博客
文章目录
前言一.引用二.内联函数三.类和对象总结 前言 之前讲c++的命令空间和第一个程序的运行,继续讲解一下c++的语法,然后开始进入类和对象的学习
一.引用 引用变量,是c++区别与c语言的语法,引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
引用:可以看作一个已定义变量的别名
引用变量的创建 Type&name=var;
int main() { int a = 10; int& b = a; cout << b << endl; return 0; } 意思就是说初始化了一个A的变量,在创建一个引用变量B,然后把A赋给B,那我现在操控B就是在操控A
但是引用在使用的时候还远一些注意的事项
注意:
1.&不是取地址,而是起标识作用
2.必须在声明引用变量时进行初始化
3.引用初始化之后,不能再引用其他的变量了
4.不能有NULL引用
引用变量的本质 有人会说引用到底是什么东西,为什么可以这样赋值,引用到底有什么用?
引用的本质:是一个常量指针,引用所占用空间大小与指针相同
int main() { int b = 0; int& a = b;//==int *const a=&b; a = 20;//*a=20; return 0; } 引用作为函数的参数(不需要进行初始化) 引用的作用比较经典的就是可以作为函数的参数
typedef struct Teacher { int age; }Te; void Print(Te& t) { t.
MySQL-基础命令 DDL 1、DDL-数据库操作: 查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE();
创建数据库
CREATE DATABASE 数据库名;
CREATE DABATASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
删除数据库
DROP DATABASE 数据库名;
使用数据库
USE 数据库名;
2、DDL-表操作-查询: 查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询指定表的建表语句
SHOW CREATE TABLE 表名;
3、DDL-表操作-创建 CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
字段3 字段3类型 [COMMENT 字段3注释],
.......
字段n 字段n类型 [COMMENT 字段1注释]
)[COMMENT 标注释];
4、DDL-表操作-数据类型
数值类型、字符串、日期时间类型 5、DDL-表操作-修改 添加字段
点击查看最新IDE流行度最新排名(每月更新) 2024年06月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends
如果您相信集体智慧,Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE
排名IDE占比占比改变1Visual Studio28.06%-0.10%2Visual Studio Code13.69%-0.20%3Eclipse11.75%+0.20%4pyCharm10.76%+2.10%5Android Studio9.69%+0.50%6IntelliJ7.60%+0.60%7NetBeans4.07%-0.20%8Xcode2.95%-0.10%9RStudio2.91%-0.30%10Sublime Text2.52%-0.60%11Atom2.33%-0.90%12Code::Blocks1.57%+0.00%13Vim0.88%+0.00%14PhpStorm0.36%-0.10%15Qt Creator0.30%+0.10%16geany0.16%+0.00%17Emacs0.12%-0.10%18Komodo0.11%-0.10%19Xamarin0.09%-0.20%20Light Table0.05%+0.00%21JDeveloper0.02%-0.10%22SharpDevelop0.01%+0.00%23RAD Studio0.01%-0.10%24Eric Python0.00%+0.00%25RubyMine0.00%+0.00%26Monkey Studio0.00%+0.00%27Aptana0.00%+0.00%28JCreator0.00%+0.00%29MonoDevelop0.00%+0.00%30DrJava0.00%+0.00%31SlickEdit0.00%+0.00%32Coda 20.00%+0.00%33Zend Studio0.00%+0.00%34Julia Studio0.00%+0.00% 点击查看最新IDE流行度最新排名(每月更新)
目录
一.JDBC概念&使用条件:
二.mysql-connector驱动包的下载与导入:
三.JDBC编程:
使用JDBC编程的主要五个步骤:
完整流程1(更新update):
完整流程2(查询query): 一.JDBC概念&使用条件: JDBC基本概念: 🧐JDBC:即JAVA Database Connectivity,Java数据库连接。是一种用于执行SQL语句的JavaAPI,它是Java中的数据库连接规范。这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
JDBC使用条件: 1).编程语言,如Java,C、C++、Python等
2).数据库,如Oracle,MySQL,SQL Server等(本文主要演示MySQL数据库)
3).数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提 供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
mysql-connector驱动包: 由于每个数据库,本身已经有一套API了,比如MySQL,本身的API,就是C语言的API,这时就需要我们把原生的C的API转换成为兼容JDBC的Java的API。MySQL官方提供了一个mysql-connector-->这个驱动包就可以帮助我们完成上述操作.mysql-connector不是mysql自带的,也不是java自带的,需要通过第三方途径,把这个驱动包下载下来并导入到自己的项目中(第三方库),主要由三个途径进行下载:
去Oracle官网进行下载去github去maven中央仓库(这种方法最为简便,下面例子以这个为主) maven中央仓库网址:Maven Repository: Search/Browse/Explore (mvnrepository.com)
JDBC优势:
Java语言访问数据库操作完全面向抽象接口编程开发数据库应用不用限定在特定数据库厂商的API程序的可移植性大大增强 二.mysql-connector驱动包的下载与导入: 进入上述网址后,直接搜索mysql就行了,你会看到一下两个主要版本: 进入后选择适合自己的版本进行下载: 接下来我们在已经创建号的项目中,选中项目,右击鼠标新建一个目录,名字随便取,不要包含中文/特殊字符~ 复制我们刚才下载好的.jar文件,将其粘贴到刚才创建的lib目录中 : 右击刚才的lib目录,add as library(意在告诉IDEA,这个lib目录是一个"库"目录): 直接点🆗就行了: 此时你会看到lib目录下多了以下内容,就说明驱动包导入成功了: 完成上述操作后,我们就可以进行JDBC编程了
三.JDBC编程: 使用JDBC编程的主要五个步骤: 1. 创建数据源对象: DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/itcast?characterEncoding=utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root");//用户名 ((MysqlDataSource) dataSource).setPassword("2222");//密码 url参数说明:
2. 和数据库服务器建立网络连接.: Connection connection = dataSource.getConnection(); 3. 构造 SQL 语句: String sql = "
文章目录 前言日期类Date的接口设计构造函数和打印函数获取日期并判断日期是否合法日期类的大小比较关系<运算符重载 判断小于==运算符重载 判断相等<=运算符重载 判断小于等于>运算符重载 判断大于>= 运算符重载 判断大于等于!= 运算符重载 不等于 日期类计算日期+=天数日期+天数日期-=天数日期-天数前置++后置++前置--后置--日期-日期 完整代码Date.hDate.cppTest.cpp 前言 日期类Date的接口设计 我们把函数的声明放到类中,定义在类的外边,实现声明与定义分离
以下是日期类中所包含的成员函数和成员变量
🗨️Date.h
class Date { public: // 判断日期是否合法 bool CheckInvalid() const; // 构造函数 Date(int year = 1, int month = 1, int day = 1); // 日期类的大小关系比较 bool operator<(const Date& d) const; bool operator<=(const Date& d) const; bool operator>(const Date& d) const; bool operator>=(const Date& d) const; bool operator==(const Date& d) const; bool operator!=(const Date& d) const; // d1 + 100 Date& operator+=(int day); Date operator+(int day) const; // d1 - 100 Date operator-(int day) const; Date& operator-=(int day); // ++d1 Date& operator++(); // 特殊处理:解决语法逻辑不自洽,自相矛盾的问题 // d1++ // 为了跟前置++区分,强行增加一个int形参,够成重载区分 Date operator++(int); Date operator--(int); Date& operator--(); // d1 - d2 int operator-(const Date& d) const; // 本质就是inline int GetMonthDay(int year, int month) const { assert(month > 0 && month < 13); static int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && ((year % 4 == 0 && year % 100 !
还是大二的时候就开始用这个,但居然是为了用PB,-_-||
用了段时间换成了C#,依稀还记得大佬们纠正我的读法,别读C井,应该读C夏普。。。
安装过程其实也没啥,就是关键Key得花时间找,我好不容易搞定了,留个记号(从这里默默拿走,低调使用 ,
关键信息都在这里 https://kdocs.cn/l/cixbRhgzh1pv)
界面也和原来不太一样。
在软件开发过程中,一般要先实现功能方面的需求,功能方面的需求开发完毕之后,往往会考虑性能方面的优化。在业务发展的初期,性能往往能满足使用的需求,这时性能优化不是必不可少的。随着业务的发展,软件复杂度的提高,性能有时会成为瓶颈,这时性能优化是必须要做的工作。
1 性能优化的一些概念 (1)性能优化的两个方面:软件和硬件
从广义上来说,性能可以从硬件和软件两个方面来优化。比如网络方面的性能优化,网卡带宽从 10M、100M 到现在的 1G、10G 甚至 100G 的网卡,同样软件的情况下,网卡硬件性能的提高可以带来整体性能的提高。内存,磁盘,cpu 等硬件,在过去的发展中,性能都得到了很大的提升。另一方面是通过优化软件来做性能优化,在实际开发中,性能优化的工作大多都是在硬件不改变前提下,通过优化软件的方式来达到提高性能的目的。
(2)性能优化的指标
性能优化的指标是评价性能高低的,可量化的指标。性能优化的指标有一些是通用的指标,有一些是和业务场景强相关的指标。
① 基础通用指标
通用的指标,包括资源的使用率,比如软件占用的 cpu、内存、磁盘的多少,这些指标是最基础的,往往也是最重要的。
② QPS
在互联网服务中经常关注这个指标, QPS(Queries Per Second),即服务每秒钟可以响应的查询次数。
③ 延时和吞吐率
在网络应用中,经常关注这两个指标。延时是指通信的双方一发一收的时间为一次通信延时,多次统计的平均值是平均延时。吞吐率指的是单位时间内处理的网络报文的个数。延时越低,性能越好;吞吐率越高,性能越好。
在硬件条件不变的情况下,延时和吞吐率往往是此消彼长的两个方面,延时降低之后,吞吐率往往会降低;吞吐率提升之后,延时往往会增长。之所以说硬件条件不变的前提,是因为从硬件方面来优化的话,延时和吞吐率可以同时优化,比如网卡从 10M 升级到 100G,那么延时和吞吐率都会提升。类似于马路上的车流量,如果正常情况下,马路上没有专用车辆(警车,救护车等),都是普通的家用车,这时候车辆可以随便开,每辆车都可以自由变道,这种情况下马路的吞吐量是最大化的。而如果这个时候马路上出现了一辆救护车,普通的家用车要给救护车让出一条专用道出来,那么普通家用车可用的车道数量就变少了,救护车的延时降低了,普通车的延时增大了,总体的吞吐率也降低了。
延时也不仅仅局限于网络性能指标,在我们开发的很多应用中,延时都是很重要很关键的一个指标。特别是现在服务器内存和磁盘相对充裕的情况下,多用一点内存或者磁盘,不是那么的严重,这时延时是最能体现业务性能的指标。
(3)平均值还是单次的最值
以延时为例,有些情况下考虑的是延时的平均值,比如路由器产品中,往往关注平均延时。互联网服务中,很多时候也关注平均延时。而有些情况下,关注的是每一次的延时,这种使用场景,吞吐量往往不是很大。比如智能驾驶系统中,业务处理时,从传感器获取到环境信息到感知模块处理,到规划、控制模块处理,到最后下发车辆的实际控制信号(减速,绕行等),整个流程的时间是有最大要求的,比如每一次的时间都不能大于 10ms,智能驾驶系统对安全性的要求非常高,要求每次都要满足这样的要求。如果有两个系统,一个系统的平均延时能到 5ms,但是偶尔的延时会达到 15ms;另一个系统的平均延时是 9ms,最大延时不会超过 10ms。那么第二种系统是满足要求的。
(4)性能测试工具
在性能优化过程中,性能测试工具是必不可少的。只有用性能测试工具对比测试出优化前后的性能指标,才能知道我们的优化是不是有效。性能测试工具,比如 linux 中的 ftrace,perf,是 linux 中自带的测试工具;还有现在比较热的 ebpf,也可以用来做性能测试;用于网络性能测试的 iperf 等。很多时候,性能测试也需要我们在代码中打桩,自己开发工具进行测试。
(5)软件架构和实现细节
在做软件性能优化时,不仅要优化软件的实现细节,有时候也需要优化架构方案。当然改变架构比改变细节的工作量要大一些。架构设计和方案的选择要尽量在架构和方案评审时做充分的验证与讨论,争取选择一个最优的架构,以防到后边再做大的修改。
2 epoll epoll 作为一种多路复用技术,相比于 select 和 poll 来说,在很多场景下都是有性能提升的。
[linux][epoll] 带着 6 个问题深入理解 epoll
epoll 相对于 select 和 poll 的优化,相当于在架构上做了优化。有时候,对架构进行优化,不是在旧的架构上进行优化,而是新定义了一种机制。比如这里的 epoll 和 select 与 poll;比如开发语言中的 c 和 c++,c++ 在 c 的基础上增加了面向对象的编程,但是支持之后的语言已经不是 c 语言了,而是成为了 c++。