Spring AI教程(十六):检索增强生成(RAG)与函数调用 | Spring AI教程(十七):实现RAG技术与评估AI响应

Spring AI教程(十六):检索增强生成(RAG)与函数调用 在前面的文章中,我们讨论了Prompt模板、嵌入技术和Token管理。这篇文章将进一步探讨检索增强生成(Retrieval Augmented Generation, RAG)和函数调用技术,帮助你将Spring AI的功能发挥到极致。 检索增强生成(RAG) 检索增强生成(RAG)是一种结合信息检索和生成模型的技术,用于将相关数据嵌入到Prompts中,以提高AI模型的响应准确性。该方法包括一个批处理风格的编程模型,读取未结构化的数据,将其转换,然后写入向量数据库。总体上,这是一个ETL(Extract, Transform, Load)管道。向量数据库在RAG技术中用于检索部分。 RAG的关键步骤 分割文档 将原始文档分割成较小的部分,同时保持内容的语义边界。例如,对于包含段落和表格的文档,避免在段落或表格中间进行分割。对于代码,避免在方法实现中间进行分割。 调整部分大小 将文档的部分进一步分割成更小的部分,其大小应为AI模型Token限制的一小部分。 示例:实现RAG 创建分割服务 创建一个服务类,用于分割文档并保持语义边界: import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class DocumentSplitService { public List<String> splitDocument(String document, int tokenLimit) { List<String> parts = new ArrayList<>(); // 假设每个段落作为一个独立部分 String[] paragraphs = document.split("\n\n"); StringBuilder currentPart = new StringBuilder(); for (String paragraph : paragraphs) { if (currentPart.length() + paragraph.length() <= tokenLimit) { currentPart.append(paragraph).append("\n\n"); } else { parts.

【人工智能】一文教会你使用和创建智能体

目录 前言 一、什么是智能体平台? 1、智能体能做什么 2、平台的优势 3、智能体类型 二、如何使用智能体? 1、零代码开发:一句话创建智能体 2、资深研发专家一对一辅导智能体介绍 总结 前言 在当今这个快节奏且高度竞争的技术环境中,持续学习和适应新技术无疑成为了每个互联网专业人士必须去勇敢面对的重大挑战。为了能切实地帮助广大技术人员有效地解决他们在研发过程中所遭遇的各类问题,并助力其快速提升自身技术水平,我特意精心推出了“资深研发专家一对一辅导”智能体。此智能体乃是基于百度智能体平台而开发的一项极具创新性的服务。 一、什么是智能体平台? 智能体平台是由百度全力推出的一款具有开创性意义的智能体开发平台,它是构建在强大的大模型基础之上的。支持开发者依据自身所处的行业特性以及具体的应用场景需求,去灵活选择不同类型的开发方式,进而打造出完全符合大模型时代要求的产品能力。 通过极为简便的 prompt 编排模式,开发者能够以较低的成本、极高的效率成功开发出智能体。此外,该平台还专门为智能体开发者精心打造了流量分发路径,这有助于顺利完成商业闭环,成功实现智能体的广泛应用以及商业价值的有效转化。 1、智能体能做什么 开放多种主体类型:智能体平台秉持着人人可 AI 的先进理念,积极支持企业、媒体、政府等各类组织以及个人开发者顺利入驻。开放多种行业类型:智能体平台大力支持各类垂直行业的开发者踊跃入驻,共同构建基于大模型的行业矩阵生态。多样能力的开发者:智能体平台热情欢迎拥有不同能力的开发者纷纷入驻。 2、平台的优势 强大的大模型能力:紧密依托一言大模型,在内容创作、数理逻辑推算、中文理解、多模态生成等众多方面均展现出了极为卓越的表现。多样化的方式链接用户:开发者可以精心选取不同类型的开发方式、模板组件等进行高效接入,其中包括零代码/低代码智能体、数据类/能力类插件等,从而能够为 C 端用户提供更为优质的服务。多场景触达用户:具备传统搜索和 AI 搜索双引擎分发的强大功能;内部可调用插件;智能体与插件都可以进入体验中心,在对 C 端用户进行分发的同时,也能够面向企业级开发者。 3、智能体类型 零代码智能体:通过 prompt 编辑的独特方式,清晰表达意图、提供详尽的行为说明,适时引入数据集、工具等强大能力,成功创建智能体。低代码智能体:借助拖拽的便捷方式迅速搭建业务流,紧密结合大模型、数据集、工具等关键组件,圆满完成智能体开发。 二、如何使用智能体? 操作极为简便,您只需轻松设置您的问题或需求,我的智能体便会迅速为您提供专业的回答和极具价值的建议。无论您是不巧遇到了编程难题,还是急切需要技术路线的精心指导,亦或是渴望了解最新的技术趋势,都可以随时进行提问。 1、教你零代码开发智能体 点击零代码创建后会顺利进入到快速创建智能体页面。在这个页面上,您可以直接清晰地表达想要创建智能体的具体设定,其中涵盖但不限于角色、可帮用户解决的问题等。 创建助手将会依据您的描述,为智能体巧妙生成名称、简介、开场白、指令、引导示例等。 2、我创建的智能体介绍 我的智能体专注于提供一对一的专业辅导,作为一位经验极为丰富的互联网研发专家,帮助用户解决在互联网研发过程中所遇到的各种技术问题。 无论是编程语言方面的困惑、数据结构的棘手难题、算法的艰难挑战,还是系统架构的精心设计,我都将为您提供最为专业的解答和细致的指导。 总结 智能体为我们打开了一扇通往无限可能的技术之门。它不仅提供了强大的工具和资源,还为开发者和用户创造了一个互动与合作的良好环境。 通过利用智能体平台的各种优势和功能,我们能够不断探索创新,推动技术的进步与发展,为我们的数字世界注入更多的智慧和活力。让我们携手共进,一同在这个充满机遇与挑战的智能体时代中创造出更加辉煌的成就。

网络调试和分析工具 Proxyman Premium

Proxyman Premium是一款功能强大的网络调试和分析工具,专为开发人员和测试人员设计。它支持MacOS、iOS和iPadOS等操作系统,提供丰富的功能,如查看和编辑HTTP/HTTPS请求和响应、设置断点、过滤请求等。Proxyman Premium还支持WebSocket、GraphQL和gRPC等现代网络协议调试,并通过直观且图形化的操作界面,使用户能高效地监控和操纵网络数据流。此外,它还具备多种高级功能,如WebSocket支持、DNS欺骗、自定义SSL证书等,为开发人员提供极大的便利。总之,Proxyman Premium是网络开发和调试过程中的得力助手。 Proxyman Premium激活安装包 使用教程: 前置准备: 确保您有一台macOS系统的电脑,因为Proxyman Premium是专为macOS设计的。准备一个手机(安卓或iOS皆可),并确保手机和电脑连接在同一个局域网内(通常是通过连接同一个Wi-Fi实现)。软件安装与证书配置: (下载并安装Proxyman Premium软件。在mac电脑上安装HelperTool并配置证书。您可能需要按照软件内的指引或参考官方文档来完成这一步骤。在手机上,通过浏览器访问http://proxy.man/ssl来下载并安装Proxyman的证书。确保在手机上信任并安装这个证书。配置代理: 在手机上,进入Wi-Fi设置,选择当前连接的Wi-Fi,并设置代理为手动。在手动代理设置中,输入您在电脑上获取的IP地址和端口号(这些信息可以在Proxyman软件中找到)。开始抓包: 打开Proxyman Premium软件,您应该能够在软件界面中看到手机的IP地址,表示连接成功。现在,您可以打开您想要抓包的应用(例如小红书),并在Proxyman软件中看到与该应用相关的网络请求和响应。分析数据: 在Proxyman软件中,您可以查看每个请求和响应的详细信息,包括请求头、请求体、响应头等。您还可以使用Proxyman提供的过滤和搜索功能来快速定位特定的请求或响应。高级功能: Proxyman Premium还支持一些高级功能,如设置断点、修改请求/响应、模拟慢速网络等,这些功能可以帮助您更深入地分析和调试网络问题。 请注意,由于Proxyman Premium是一款专业的网络调试工具,对于初学者来说可能有一定的学习成本。但参考官方文档和社区资源,您应该能够迅速掌握其使用方法。同时,由于软件版本更新和界面调整,上述步骤可能会有所变化,建议您参考最新版本的官方文档进行操作。

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后,Gradle Sync和Build都很慢,因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts //[DEFAULT]settings.gradle.kts pluginManagement { repositories { google { content { includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.google.*") includeGroupByRegex("androidx.*") } } mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } gradle-wrapper.properties 原本是gradle官网的 #Thu May 23 21:59:57 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists 解决方案 1、首先把gradle的地址替换成国内镜像源,会很快下载完gradle gradle ->wrapper-> gradle-wrapper.properties配置文件 原始:https\://services.gradle.org/distributions/gradle-8.6-bin.zip替换成 https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.6-bin.zip #Thu May 23 21:59:57 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists 阿里云镜像 Gradle下载地址(新):macports-distfiles-gradle安装包下载_开源镜像站-阿里云 可以在上述网站复制对应版本的链接,替换到settings.gradle中的distributionUrl。 但还是存在maven很慢的问题,是因为settings.gradle中仓库源配置问题。 2、修改settings.gradle.kts仓库 添加maven在前面

【机器学习】Python与深度学习的完美结合——深度学习在医学影像诊断中的惊人表现

🔥 个人主页:空白诗 文章目录 一、引言二、深度学习在医学影像诊断中的突破1. 技术原理2. 实际应用3. 性能表现 三、深度学习在医学影像诊断中的惊人表现1. 提高疾病诊断准确率2. 辅助制定治疗方案 四、深度学习对医疗行业的影响和推动作用 一、引言 随着人工智能技术的不断发展,深度学习在医学影像诊断领域的应用日益广泛,其强大的特征提取能力和高效的学习机制为医学影像诊断带来了革命性的突破。 本文将深入探讨深度学习在医学影像诊断中的实际应用、技术原理、性能表现等方面,并结合实际案例展示其对医疗行业的影响和推动作用。 二、深度学习在医学影像诊断中的突破 1. 技术原理 深度学习,作为机器学习的一个重要分支,深受人工智能研究者的青睐。它通过模拟人脑神经网络的工作原理,构建复杂的神经网络模型来处理数据。在医学影像诊断领域,深度学习通过构建深层神经网络,如卷积神经网络(CNN),能够从海量的医学影像数据中自动学习并抽取出关键的特征信息。这些特征可能包括肿瘤的形状、边缘的模糊程度、灰度分布等,对于疾病的早期发现和精确诊断至关重要。 例如,在卷积神经网络中,每一层都通过学习特定的卷积核来提取输入数据中的局部特征,随着网络层数的加深,模型能够捕捉到更加抽象和全局的特征。最终,通过这些特征的组合和判断,模型可以实现高精度的医学影像分类和识别。 2. 实际应用 深度学习在医学影像诊断中的应用已经渗透到多个方面,包括但不限于X光片、CT扫描、MRI等多种影像检查技术。以CT扫描为例,深度学习模型可以用于肺结节、肝癌等疾病的自动检测和识别。通过对大量带有标注的医学影像数据进行训练,模型能够学习到病变组织的特征表现,并在新的影像上自动标注出疑似病变区域,从而辅助医生进行快速而准确的诊断。 此外,深度学习还可以应用于医学影像的分割任务,即将医学影像中的不同组织或器官进行精确划分。这对于手术导航、放射治疗计划等后续治疗流程至关重要。 3. 性能表现 深度学习在医学影像诊断中的性能表现令人瞩目。多项独立研究显示,经过适当训练的深度学习模型在疾病检测和诊断方面的准确性已经接近甚至超过了经验丰富的放射科医生。这不仅体现在对已知病例的准确分类上,更在于其对微小病变和早期病变的敏锐捕捉能力。 以肺结节检测为例,一项研究表明,使用深度学习技术的计算机辅助诊断系统(CAD)在检测肺结节方面的敏感性达到了90%以上,特异性也超过了80%。这意味着系统能够准确地识别出大部分真实的肺结节,并且误报率相对较低。 以下是一个简单的深度学习模型训练示例,用于展示如何使用Python和Keras框架来训练一个用于医学影像分类的卷积神经网络(CNN)。 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.optimizers import Adam # 假设我们已经有了一些预处理过的医学影像数据和对应的标签 # X_train, X_test 是训练集和测试集的影像数据 # y_train, y_test 是训练集和测试集的标签 # 构建一个简单的CNN模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(img_height, img_width, 1))) # 卷积层 model.

Spring AI教程(三):如何使用Spring AI进行实际项目开发

Spring AI教程(三):如何使用Spring AI进行实际项目开发 在前两篇文章中,我们介绍了Spring AI的基本概念和核心功能。这篇文章将重点介绍如何在实际项目中使用Spring AI,并提供详细的代码示例,帮助你快速上手。 准备工作 在开始之前,请确保你已经设置好了Spring Boot项目,并添加了Spring AI相关的依赖。你可以在pom.xml文件中添加以下依赖: <dependency> <groupId>com.example</groupId> <artifactId>spring-ai</artifactId> <version>1.0.0</version> </dependency> 配置Spring AI 首先,我们需要配置Spring AI,以便连接到我们选择的AI模型提供商和向量数据库。在application.properties文件中添加以下配置: spring.ai.provider=openai spring.ai.api-key=YOUR_OPENAI_API_KEY spring.ai.vector-database.provider=redis spring.ai.vector-database.url=redis://localhost:6379 创建AI服务 接下来,我们将创建一个服务类,用于与AI模型进行交互。以下是一个简单的聊天服务示例: import org.springframework.stereotype.Service; import com.example.springai.OpenAiChatService; @Service public class ChatService { private final OpenAiChatService openAiChatService; public ChatService(OpenAiChatService openAiChatService) { this.openAiChatService = openAiChatService; } public String chat(String prompt) { return openAiChatService.chat(prompt); } } 创建控制器 我们还需要创建一个控制器,用于处理HTTP请求并调用我们的服务。以下是一个简单的控制器示例: import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class ChatController { private final ChatService chatService; public ChatController(ChatService chatService) { this.

在PS上绘画时会用到的快捷键

目前处于控线和抓型阶段,但是对于快捷键的整理是持续更新的。 工具 笔:B橡皮擦:E索套工具:非规则形状的选取区间,L矩形选择工具:M鼠标工具(雾):V对象选择工具(魔棒):W取色:Alt + 用笔长按某个地方放大镜:Z或者Ctrl + space 操作 拖动画布:space + 笔按下进行移动放大画布和缩小画布:Ctrl + space + 笔左右移动撤销:Ctrl + Z反撤销:Ctrl + shift + Z创建图层:Ctrl + shift + N拖动图层:Ctrl + 笔按下移动

2024年四川省国家大学科技园申报条件对象和支持政策

2024年四川省国家大学科技园申报对象 国家大学科技园是以具有较强科研实力的大学为依托,将大学的综合智力资源优势与其它社会优势资源相结合,为高等学校(以下简称为高校)科技成果转化、高新技术企业孵化、创新创业人才培养、产学研结合提供支撑的平台和服务的机构。 2024年四川省国家大学科技园申报条件 申请认定国家大学科技园,应具备以下条件: 1. 具有完整的发展规划,发展方向明确,实际运营时间在2年以上,经营状况良好。 2. 必须有具备独立法人资格的专业化管理机构。 3. 具有边界清晰、相对集中、法律关系明确、可自主支配的园区建筑面积15000平方米以上,其中孵化场地面积10000平方米以上。 4. 地方政府和依托高校应有支持大学科技园发展的具体政策,高校资源向大学科技园开放。 5. 大学科技园50%以上的企业在技术、成果、人才方面与依托高校有实质性关联。 6. 机构设置合理,有专门的经营管理团队,管理人员中本科以上学历占85%以上。 7. 服务设施齐备,功能完善,可为企业提供商务、融资、信息、咨询、市场、交流、国际合作等多方面的服务。 8. 管理规范,具有严格的财务管理制度,自身及在孵、在园企业的统计数据齐全。 9. 园内的在孵企业达50家以上。 10. 为社会提供1000个以上的就业机会。 11.与创业投资、风险投资、担保机构等建立合作关系。 国家大学科技园的孵化企业应具备以下条件: 1. 企业注册地及工作场所必须在大学科技园的工作场地内。 2. 属新注册企业或申请进入大学科技园前企业成立时间一般不超过3年。 3. 企业在大学科技园孵化的时间一般不超过3年。 4. 企业注册资金一般不超过500万元。 5. 迁入的企业,上年营业收入一般不超过200万元。 6. 企业租用大学科技园孵化场地面积不高于1000平方米。 7. 企业负责人应熟悉本企业产品的研究、开发。 2024年四川省国家大学科技园申报支持措施 国务院科技和教育行政管理部门负责宏观管理和指导国家大学科技园的建设、运行和发展,组织制定支持国家大学科技园建设与发展的方针、政策,编制国家大学科技园发展规划,把国家大学科技园的工作纳入国家科技和教育发展计划。根据建设发展绩效统计报表等对国家大学科技园进行年度绩效评价,对成绩突出的国家大学科技园给予支持。 各省、自治区、直辖市和计划单列市人民政府应贯彻执行支持国家大学科技园建设和发展的各项方针和政策,将国家大学科技园工作纳入当地科技和教育发展规划,为国家大学科技园建设和发展提供必要的支持,并将国家有关优惠政策落实到国家大学科技园管理机构及其在孵、在园企业。

ffmplay 源码解读

stream_open 讲解 // 定义一个静态函数用于初始化并返回VideoState结构体指针,用于管理播放状态 static VideoState* stream_open(const char* filename, AVInputFormat* iformat) { VideoState* is; // 创建VideoState结构体指针 // 分配内存并初始化VideoState结构体,若分配失败则直接返回NULL is = av_mallocz(sizeof(VideoState)); if (!is) return NULL; // 复制输入文件名到VideoState结构体中,失败则跳转到fail标签释放资源 is->filename = av_strdup(filename);//这是FFmpeg提供的一个便捷函数,用于创建一个字符串的副本,并且自动管理内存分配。它的行为类似于C标准库中的 strdup 函数,但它是FFmpeg专为视频处理等多媒体应用设计的,可能在内部做了某些特定于库的优化或错误处理。该函数接受一个字符串指针作为参数,返回一个新的分配的内存空间中的字符串副本。如果内存分配失败,它将返回 NULL。 if (!is->filename) goto fail; // 设置输入格式和视频初始显示位置 is->iformat = iformat; is->ytop = 0; is->xleft = 0; // 初始化帧队列,分别为视频帧、字幕帧、音频样本队列,失败则跳转到fail if (frame_queue_init(&is->pictq, &is->videoq, VIDEO_PICTURE_QUEUE_SIZE, 1) < 0) goto fail; if (frame_queue_init(&is->subpq, &is->subtitleq, SUBPICTURE_QUEUE_SIZE, 0) < 0) goto fail; if (frame_queue_init(&is->sampq, &is->audioq, SAMPLE_QUEUE_SIZE, 1) < 0) goto fail; // 初始化数据包队列,包括视频、音频、字幕数据包队列,任一失败则跳转到fail if (packet_queue_init(&is->videoq) < 0 || packet_queue_init(&is->audioq) < 0 || packet_queue_init(&is->subtitleq) < 0) goto fail; // 创建条件变量,用于线程同步,失败则记录错误并跳转到fail if (!

基于Spark的电商推荐系统(高分毕设)

今天分享的是一套基于SSM技术+spark技术的电影推荐系统 包含了爬虫、电影网站(前端和后端)、后台管理系统以及推荐系统(Spark)。 🔥🔥🔥🔥🔥🔥 推荐系统源码+部署文档下载🔥🔥🔥🔥🔥🔥 基于 Spark 的电影推荐系统 本次项目是基于大数据过滤引擎的电影推荐系统–“懂你”电影网站,包含了爬虫、电影网站(前端和后端)、后台管理系统以及推荐系统(Spark)。 一、爬虫 开发环境: pycharm + python3.6 软件架构: MySQL + scrapy 运行环境: 本次爬取的内容在外网,所以需先翻墙后才能成功运行。 项目架构: 二、电影网站 开发环境: IntelliJ IDEA + maven + Git + Linux + powerdesigner 软件架构: MySQL + MyBatis + Spring + SpringMVC 项目描述: 懂你电影推荐网站是一个基于 SSM 框架的 Web 项目,类似当前比较流行的豆瓣。用户可以在网站上浏览电影信息和查询电影,并且网站会根据用户的浏览记录给用户进行实时的电影推荐。现已将网站部署在 http://115.159.204.68 网站上,感兴趣的朋友可以自行查看。Git 的安装与 IDEA 和 GitHub 的集成可以参考博客。 项目架构: 三、后台管理系统 开发环境: IntelliJ IDEA + maven + Git + Linux + powerdesigner 软件架构: MySQL + MyBatis + Spring + SpringMVC + easyui

【超长好文】Redis在项目中的17种使用场景

Redis 是一个开源的高性能键值对数据库,它以其内存中数据存储、键过期策略、持久化、事务、丰富的数据类型支持以及原子操作等特性,在许多项目中扮演着关键角色。以下是V哥整理的17个Redis在项目中常见的使用场景: 缓存:Redis 可以作为应用程序的缓存层,减少数据库的读取压力,提高数据访问速度。 会话存储:在 Web 应用中,Redis 可以用来存储用户的会话信息,如登录状态、购物车内容等。 排行榜和计数器:Redis 支持原子操作,非常适合实现实时排行榜、点赞数、访问计数等功能。 消息队列:Redis 可以作为消息队列系统,用于处理异步任务,例如邮件发送、后台任务处理等。 实时分析:Redis 可以用于实时分析,如用户行为分析、实时统计信息等。 分布式锁:在分布式系统中,Redis 可以用于实现分布式锁,确保在多个节点之间共享资源的一致性。 发布/订阅:Redis 提供了发布/订阅模式,可以用于实现消息广播,例如实时通知系统。 限流:Redis 可以用于实现限流功能,防止系统过载,如 API 调用频率限制。 数据过期:Redis 支持设置数据的过期时间,自动清理过期数据,适用于临时数据存储。 全页缓存:Redis 可以缓存整个页面的输出,减少数据库查询和页面渲染时间。 社交功能:在社交网络应用中,Redis 可以用于存储好友关系、用户状态更新等。 实时推荐系统:Redis 可以用于存储用户的行为数据和偏好,实现实时推荐。 地理位置信息:Redis 支持 Geospatial 索引,可以用于实现地理位置相关的查询和推荐。 时间序列数据:Redis 可以存储时间序列数据,用于监控和分析。 任务调度:Redis 可以用于任务调度,例如定时任务的执行。 数据共享:在微服务架构中,Redis 可以作为服务间共享数据的媒介。 持久化:虽然 Redis 是内存数据库,但它也支持数据持久化,可以在系统故障后恢复数据。 Redis 的使用场景非常广泛,可以根据项目的具体需求来选择合适的应用方式。 下面V哥依次对17种业务场景举例说明和解释: 1. 缓存 针对Redis作为缓存层的使用场景,我将提供一个简单的Java Spring Boot应用案例,该应用使用Redis缓存来提高数据库查询的效率。 场景描述 假设我们有一个在线书店,用户可以查看书籍的详细信息。每次用户请求书籍详情时,后端需要查询数据库以获取书籍信息。为了提高性能,我们可以使用Redis缓存来存储热门书籍的信息,以减少对数据库的查询次数。 环境准备 安装Java开发环境。安装Redis并确保其运行。创建一个Spring Boot项目,并添加以下依赖: Spring WebSpring Data RedisRedis客户端驱动,如lettuce或jedis 创建Spring Boot项目 使用Spring Initializr (https://start.spring.io/) 创建一个项目,并添加所需的依赖。 配置Redis连接 在src/main/resources/application.properties中配置Redis服务器的连接信息: spring.redis.host=localhost spring.

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要:本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇,主要分为以下四个部分: 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级存储后端Gemini 特点补充介绍 前篇:Flink⼤状态作业调优实践指南:Datastream 作业篇 中篇:Flink⼤状态作业调优实践指南:Flink SQL 作业篇 Tips:点击「阅读原文」跳转阿里云实时计算 Flink~ 检查点和快照超时的诊断与调优 6.1 运行原理 Flink 的状态管理核心机制依赖于 Chandy-Lamport 算法,以确保数据的一致性和可靠性。在此框架下,检查点和快照的执行过程可以概括为两个主要阶段: (1)同步阶段:此阶段的关键在于 Barrier 的对齐和同步资源的维护。Barrier 作为一种特殊的数据记录,在算子之间传递时,其对齐的时间与数据记录的延迟成正相关关系。 (2)异步阶段:在这一阶段,算子将本地状态信息上传至远程的持久化存储系统。上传时间的长短与状态数据的大小直接相关。 当 Flink 作业面临反压问题时,同步阶段的执行可能会变得缓慢,从而导致检查点和快照超时。因此,在遇到检查点和快照超时问题,并且监测到作业存在反压时,首先应当参考 Flink 的“运行时性能调优策略”,优先解决反压问题,以提高作业的整体效率和稳定性。 6.2 问题诊断方法 在解决反压问题后,若检查点与快照仍出现超时现象,首先应分析同步阶段的对齐时间是否过长,随后考虑是否由庞大的状态数据引起。 ■ Checkpoint UI 通过这个UI,用户可以详细分析检查点和快照超时原因,具体操作如下: 在 “作业探查 - Checkpoints - Checkpoints 历史” 页面,可以在不同级别(作业、算子、单并发)观察 Checkpoint 指标,我们着重观察超时的 Checkpoint 的异常算子或正在进行的 Checkpoint 的算子: (1)其 “Sync Duration” 和 “Alignment Duration” 是否较长,如是,则基本判定有瓶颈在同步阶段上,需要优先解决同步阶段问题 (2)其 “Async Duration” 是否较长,以及其 “Checkpointed Data Size” 是否较大,如是,则可基本判定其瓶颈在异步阶段状态上传上 ■ Checkpoint 指标 用户通过查看监控指标中 lastCheckpointDuration 和 lastCheckpointSize 来粗粒度分析历史 Checkpoint 的耗时和大小。

【02数据库与小模型篇】0到1打造基于文心大模型和飞桨小模型的智能在线编辑器

三、数据库 1、简介 数据库简称 DB,是按照数据结构来组织、存储和管理数据的仓库,用户可以对文件的数据进行增加、删除、修改、查找等操作。 区分一下,数据库管理系统简称DBMS,是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库(DB)。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。 2、为什么要用数据库 数据库可以存储大量的数据信息,方便用户进行有效的访问。数据库还可以对数据进行分类保存,并且能够提供快速的查询。数据库可以满足应用的共享和安全方面的要求,把数据放在数据库中在很多情况下也是出于安全的考虑。数据库技术能够方便智能化地分析,产生新的有用信息。 3、数据库的分类 ①、关系型数据库 采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。下面是常见的一些关系型数据库: MySQL: 免费的数据库系统。被广泛用于中小型应用系统。体积小、速度快、总体拥有成本低,开放源代码。 SQL Server : 是由微软公司开发的一种关系型数据库管理系统(RDBMS),用于存储和检索数据。它提供了一个可扩展的、安全的和可靠的数据存储和管理解决方案。 Oracle: 是目前比较成功的关系型数据库管理系统。运行稳定、功能齐全、性能超群、技术领先。主要应用在大型的企业数据库领域。 4、MySQL基本操作详解 上一篇教程已经安装好了MySQL还有phpMyAdmin,直接在这里进行操作。 右上角点击数据库工具->打开->选择phpMyAdmin,打开网页,账号和密码都是root,登录进去。 直接选择SQL,就可以在这里编写SQL语句进行测试了。 4.1、数据库操作 ①、查看MySQL服务器下所有数据库 SHOW DATABASES; information_schema数据库是MySQL服务器的数据字典(保存所有数据表和库的结构信息) performance_schema数据库是MySQL服务器的性能字典(保存全局变量等的设置) mysql 主要负责MySQL服务器自己需要使用的控制和管理信息(用户的权限关系等) sys是系统数据库,包括了存储过程,自定义函数等信息 这4个数据库是MySQL安装时自动创建的,建议不要随意的删除和修改这些数据库,避免造成服务器故障。 ②、查看指定数据库的创建信息 SHOW CREATE DATABASE 数据库名称; 显示sys数据库的SQL语句,以及数据库的默认字符集 ③、选择数据库并查看当前数据库 切记:在输入当前数据库查询的SQL语句前,必须先选择数据库。 先选择editdata数据库,执行如下语句: USE EditData 接着查看当前数据库: SELECT DATABASE(); ④、创建数据库 CREATE DATABASE IF NOT EXISTS userinfo; ⑤、选择数据库 USE userinfo; 也可以点击左侧的数据库列表进行数据库的选择。 ⑥、删除数据库 DROP DATABASE IF EXISTS userinfo; 删除数据库,清除数据库中的所有数据,回收为分配的存储空间。在执行DROP DATABASE 删除数据库时,若待删除的数据库不存在,MySQL服务器会报错。若想避免上述的情况,在进行删除数据库操作时,使用IF EXISTS来进行规避待删除的数据库不存在报错情况。 4.2、数据表操作 ①、创建数据表

【C++】初识C++

【C++】初识C++ 文章概括关键字(C++98)命名空间命名空间的定义命名空间的特性 输入与输出C++中的输入输出输入输出的命名空间 缺省参数函数重载引用引用的概念引用的特性引用地使用场景引用做参数引用做返回值 常引用常引用的俩个例子 引用与指针的区别 内联函数 文章概括 谈谈C++在学习前的认知,C++是在C的基础上,容纳进去了面向对象的编程思想,并增加了许多有用的库,以及编程范式等等。所以学习C++之前一定对C有一定的认知,一个好的C++程序员一定会是一个优秀的C语言程序员。 本章主要介绍:补充C语言语法的不足,以及C++是如何对C语言程序设计不合理地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等等;同时也为后续学习类和对象做了铺垫。 关键字(C++98) C++有63个关键字,C语言有32个关键字。 关键字关键字关键字关键字关键字asmautoboolbreakcasecatchcharclassconstconst_castdeletedodoubledynamic_castelseenumexplicitexportexternfalsefloatgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedreinterpret_castreturnshortsignedsizeofstaticstatic_casestructswitchtemplatethistrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilecontinueforpublicthrowwchar_tdefaultfriendregistertruewhile 后续逐渐了解 命名空间 命名空间的定义 先以C语言举例: 假设需要定义一个全局变量随机数random为10 #include<stdio.h> int rand = 10; int main(void) { printf("%d\n", rand); return 0; } 这是可以编译成功的,但是我们之前有了解过rand是一个头文件stdlib.h的一个库函数,如果我们包含stdlib.h这个头文件会发生什么? #include<stdio.h> #include<stdlib.h> int rand = 10; int main(void) { printf("%d\n", rand); return 0; } 发生报错,这里可以明显突出一个C语言的库命名冲突问题。 有时在一个大的工程中有多个项目,每个项目会由不同的人负责,这时也会难免遇到项目之间的命名问题。 总之,C语言命名冲突的问题有: 1.库命名冲突问题 2.项目相互之间命名的冲突 在C++中,存在命名空间namespace可以解决这类型的问题。 在讲解命名空间前,需要先了解域的概念:域可以看作是一个作用区域,域包含类域、命名空间域、局部域、全局域等等 在一般情况下访问时,会先访问局部域,在局部域中未发现变量,会进而访问全局域。 假设在全局域中存在全局变量,同时在局部域中也存在一个局部变量,但是想要跳过局部域直接访问全局域,应该如何操作? int a = 1; int main(void) { int a = 0; printf("%d\n", ::a); return 0; } 这里需要介绍一个操作符"

mysql之如何获知版本

你可以通过在 MySQL 命令行客户端执行简单的 SQL 查询来获取 MySQL 的版本信息。以下是获取 MySQL 版本的常见方法: 使用 SELECT VERSION(); 查询: SELECT VERSION(); 执行这个查询后,MySQL 会返回一个字符串,其中包含了 MySQL 服务器的版本号。 使用 SHOW VARIABLES 查询: SHOW VARIABLES LIKE 'version'; 这个查询会返回所有包含 'version' 的系统变量,包括 MySQL 服务器的版本号。 如果你正在使用命令行界面,你也可以在登录到 MySQL 服务器之前就检查版本。在命令行中输入 mysql --version 或 mysql -V 来获取客户端的版本信息: mysql --version 或者 mysql -V 这将返回你安装的 MySQL 客户端的版本信息,通常客户端和服务器的版本是匹配的,但也可能不同,特别是在使用远程服务器或者当你的系统上安装了多个 MySQL 版本的情况下。 请注意,如果你没有直接访问命令行客户端,你可能需要通过你使用的数据库管理工具(如 phpMyAdmin, Workbench 等)来获取版本信息。大多数数据库管理工具在登录后都会显示服务器的版本信息。

在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! 在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan等)https://myweb.myskillstree.cn/123.html 1、更新于2024/5/13,新增Veth Pair配置 2、更新于2024/5/19,修复NetworkManager接管网络配置无效的错误 3、更新于2024/5/20,新增Ubuntu两种版本下NetworkManager接管网络的配置 目录 一、配置NetworkManager接管网络(选) 安装Network-Manager并启动 netplan管理网络的系统 ifupdown管理网络的系统 二、nmcli的相关配置(后置参数均可缩写) 有线网络配置 使用nmcli添加一个网卡并配置静态ip地址 激活/关闭网卡 使用nmcli修改一个网卡的地址 使用nmcli添加一个网卡配置使其获取动态ip地址 使用nmcli将已有的静态网卡配置修改为动态网卡配置 使用nmcli将已有的动态网卡配置修改为静态网卡配置 使用nmcli删除一个网卡配置信息 使用nmcli为一张网卡配置多个ip地址(从地址) 使用nmcli修改网卡设备的连接名称 无线网络配置(需要有无线网卡) 打开/关闭无线网络开关 查看无线网络开关状态: 连接无线网络 扫描可用的无线网络 连接到无线网络 查看连接状态 查看连接的详细信息 开启无线热点(AP模式) 查看当前无线网卡是否支持AP模式: 为无线网卡接口配置地址 安装dhcp服务 进行源地址转换SNAT 开启路由转发 重启DHCP服务和新建WiFi热点 其他设置: VLAN相关配置 创建vlan 网桥Bridge配置 创建名为br-vxlan的网桥 VXLAN配置 单播模式(点对点) 多播模式(点对多点) 在host1配置,使用多播模式 在host2配置,使用多播模式 互ping测试 VXLAN+网桥网络(Bridge)+组播 host1创建vxlan+bridge+组播网络: host2创建vxlan+bridge+组播网络: Veth Pair配置 静态路由相关配置 三、总结 💡💡💡 你是否会遇到在不同的Linux系统中配置网络时,修改的配置文件和语法都不一样的烦恼呢? 各种不同的文件路径和语法,甚至Ubuntu系统中每隔几代网络配置文件就会变换位置和语法,这种情况非常不利于我们日常对系统的维护和管理。 对于这种情况,我们可以使用NetworkManager工具在不同的系统上进行统一语法的配置与管理 现阶段所发行的Linux版本基本都支持NetworkManager工具进行统一管理 如果配置时发生语法错误,该工具将会暂停修改该网络,不会造成配置文件错误而导致的一系列问题 甚至当你将原网络配置文件删除后,只要使用命令创建一个和原先参数一样的网络接口,该配置文件就会自动的重新生成 使用该工具配置的所有网络配置文件会存于/etc/NetworkManager/system-connections/目录下 PS:network-manager接管网络后使用nmcli命令修改网卡的相关配置后都会永久生效(重启网卡后依旧生效) 一、配置NetworkManager接管网络(选) 如果系统默认自带了NetworkManager工具就不用做此步,如果是后期手动安装的就需要配置接管网络 安装Network-Manager并启动 apt install network-manager -y systemctl restart NetworkManager systemctl enable NetworkManager 配置NetworkManager接管网络

【Python】文件处理的魔法之旅

目录 引言 文件处理的重要性 基本概念 主体部分 读取文件 写入文件 修改文件 处理不同类型的文件 文本文件 CSV文件 JSON文件 示例代码 代码解释 案例研究 结论 参考文献 引言 你是否曾经面对一堆杂乱无章的文件,感到束手无策?是否曾梦想过拥有一种能力,能够轻松地读取、修改和存储数据?Python文件处理,或许就是你梦寐以求的魔法。 文件处理的重要性 文件处理对于以下方面至关重要: 数据持久化:将数据保存到磁盘,供后续使用。配置管理:读取和写入配置文件,以控制程序行为。日志记录:记录程序运行时的信息,便于调试和监控。 基本概念 在深入文件处理之前,我们需要了解一些基本概念: 文件对象:Python中用于表示文件的抽象。文件句柄:操作系统用来访问文件的内部表示。打开和关闭文件:使用open()函数打开文件,并在操作完成后关闭文件。读写模式:文件可以以读('r')、写('w')、追加('a')等模式打开。 主体部分 读取文件 在Python中,读取文件通常涉及以下几个步骤: 使用open()函数以读取模式打开文件。使用文件对象的read()或readline()方法读取内容。关闭文件以释放系统资源。 with open('example.txt', 'r') as file: content = file.read() print(content) 写入文件 写入文件与读取类似,但需要以写入模式打开: 使用open()函数以写入模式打开文件。 2.使用文件对象的write()方法写入内容。关闭文件。 with open('output.txt', 'w') as file: file.write('Hello, World!') 修改文件 修改文件通常涉及读取现有内容,进行更改,然后写回文件: with open('example.txt', 'r') as file: lines = file.readlines() # 修改内容 lines[0] = 'Modified line\n' with open('example.txt', 'w') as file: file.

统信UOS安装MySQL

统信UOS安装MySQL 1.下载对应版本的mysql 下载链接:MySQL :: Download MySQL Community Server 2.上传压缩包至服务器进行解压 [root@localhost packages]# tar -xvf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 3.对解压文件进行重命名 [root@localhost packages]# mv mysql-8.0.19-linux-glibc2.12-x86_64 mysql 创建用户组 [root@localhost ]# groupadd mysql 添加用户 [root@localhost ]# useradd -r -g mysql mysql 创建MySQL数据目录 [root@localhost ]# mkdir /usr/local/data/ [root@localhost ]# mkdir /usr/local/data/mysql 修改拥有者 [root@localhost ]# chown mysql:mysql -R /usr/local/data/ 生成编辑配置文件 [root@localhost ]# vim /etc/my.cnf或sudo vim /etc/my.cnf 或者nano /etc/my.cnf -------------如果没有my.cnf就自己创建文件 --------my.cnf 内容如下: [mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/usr/local/mysql #解压上传的目录 datadir=/usr/local/data/mysql #创建的文件目录

【C语言】学生管理系统:完整模拟与实现

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C++笔记专栏: C++笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 🔥引言 本篇文章为修改了在校期间实训报告,使用C语言实现学生成绩管理系统。对此,其中步骤没有详细写出,如果有问题可以私信我,感谢你的支持。 文章目录 一、背景描述二、任务需求三、总体设计3.1开放平台3.2 总体思路 四、功能模板设计:4.1 模拟实现顺序表4.1.1 顺序表的基本结构4.1.2 顺序表的初始化4.1.3 顺序表的销毁4.1.4顺序表的扩容(为插入数据提供保障)4.1.5 顺序表的尾插4.1.6 顺序表的判空4.1.7 顺序表的任意位置删除(pos是下标) 4.2 实现学生成绩管理系统4.2.1 学生成绩管理系统需要实现的接口4.2.2 typedef重定义类型的名字 4.3 实现学生成绩管理系统接口(主要是对顺序表接口的复用)4.3.1学生信息的初始化4.3.2 学生信息的销毁4.3.3 添加学生信息4.3.4 查找指定学生的下标4.3.5 删除学生信息4.3.6 查看学生成绩信息4.3.7 修改学生信息4.3.8 查找指定学生信息4.3.9 按照名字或者成绩排序4.3.10 比较函数的接口 4.4 菜单界面 五、以下是系统测试情况 一、背景描述 学生成绩管理系统是用于存储学生个人信息,对于学生信息进行系统的管理。关于学生成绩管理系统,不单单只能适用于学生信息,该系统的底层逻辑,同样适用于需要多个对对象复杂信息进行存储和管理的场景。 二、任务需求 对于学生成绩管理系统,需要设计以下接口功能,才能保证系统的基本运行和提高系统的可维护性。接口:学生信息录入、输出、查询、修改,排序等功能。包括系统的控制面板,通过输入控制对应接口的调用。 三、总体设计 3.1开放平台 本次学生成绩管理系统在DEV-C++轻量级编译器下实现,并且通过C语言编写该程序。 3.2 总体思路 我们将通过该系统的底层逻辑针对性的实现接口。学生信息是具有复杂的信息,需要使用结构体(类)进行封装这些信息,而对于多个学生对象需要使用数组进行存储,但是数组的大小在编译阶段就被确定,属于静态数组。对于数组的大小无法合理的分配,大小给大了导致浪费,开小了又不够使用。对此,需要使用动态开辟内存的数据结构来存在我们学生的数据,这种数据结构称为顺序表。 对于,实现学生成绩管理系统就需要借用顺序表的结构和接口。对此我们将学生成绩管理系统分为两大过程:模拟实现顺序表,以管理系统为目标对顺序表进行应用 学生成绩管理系统是基于顺序表的应用,对此需要先实现顺序表或者使用STL,根据管理系统的要求进行处理。 四、功能模板设计: 功能模板根据两个大过程:模拟实现顺序表,顺序表的应用实现管理系统。 4.1 模拟实现顺序表 4.1.1 顺序表的基本结构 #include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h> #include <Windows.h> typedef struct AchievementInfo SLDataType; //顺序表的基本结构 typedef struct SeqList { SLDataType* _a; int _size; //顺序表中有效元素 int _capacity; //顺序表当前容量 }SL; 4.

Java 数据库连接(JDBC)的使用,包括连接数据库、执行SQL语句等

一、简介 Java Database Connectivity(JDBC)是Java应用程序与关系数据库进行交互的一种API。它提供了一组用于访问和操作数据库的标准接口,使开发人员能够使用Java代码执行数据库操作,如查询、插入、更新和删除等。 二、JDBC架构 JDBC由两部分组成: JDBC API:由Java SE平台提供的接口和类集合,用于定义与数据库交互的标准。JDBC Driver API:由数据库供应商提供的具体实现,用于实际连接和操作数据库。 三、JDBC的核心组件 DriverManager:管理一组数据库驱动程序的基本服务。Connection:表示与特定数据库的连接。Statement:用于执行SQL语句的对象,分为Statement、PreparedStatement、CallableStatement。ResultSet:保存由Statement对象执行SQL查询返回的结果集。SQLException:处理数据库访问出错或其他错误的异常。 四、使用JDBC的步骤 加载驱动程序建立数据库连接创建SQL语句执行SQL语句处理结果集关闭连接 五、具体实现 1. 加载驱动程序 在JDBC 4.0之后,驱动程序通常会自动加载,但为了兼容性,手动加载仍然常见。 try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } 2. 建立数据库连接 使用DriverManager获取数据库连接。 String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "password"; Connection connection = null; try { connection = DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); } 3. 创建SQL语句 使用Statement或PreparedStatement对象创建SQL语句。 Statement statement = connection.