深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具
前言
在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模板、聊天记忆、LLM模型、输出解析器、RAG组件(嵌入模型和存储)等,这使得编码过程变得复杂繁琐。ChatClient的出现,如同为开发者在这片复杂的领域中开辟了一条捷径。它提供了与AI模型通信的Fluent API,支持同步和反应式编程模型,将与LLM及其他组件交互的复杂性隐藏在背后,极大地简化了开发流程,让开发者能够更专注于业务逻辑的实现。接下来,让我们深入了解ChatClient的强大功能和使用方法。
ChatClient简介
ChatClient类似于应用程序开发中的服务层,直接为应用程序提供AI服务。开发者可以利用其Fluent API快速组装一整套AI交互流程。它具有丰富的功能,涵盖基础与高级两个层面。
基础功能
- 定制和组装模型的输入(Prompt):通过灵活的设置,为模型提供精准的指令输入,引导模型生成符合预期的输出。
- 格式化解析模型的输出(Structured Output):将模型输出转化为结构化的数据,便于应用程序进一步处理和使用。
- 调整模型交互参数(ChatOptions):根据不同的需求,对模型交互的参数进行优化,提升交互效果。
高级功能
- 聊天记忆(Chat Memory):能够记录对话历史,让模型在后续交互中考虑之前的信息,实现更自然、连贯的对话体验。
- 工具/函数调用(Function Calling):允许在与模型交互时调用特定的函数,扩展模型的能力,使其能更好地处理复杂任务。
- RAG(检索增强生成):通过检索相关信息并将其融入模型输入,提升模型生成内容的准确性和相关性。
创建ChatClient
使用自动配置的ChatClient.Builder
在Spring Boot项目中,可以轻松地自动注入由Spring Boot自动配置创建的默认ChatClient.Builder实例。如下代码展示了一个简单的ChatController,通过注入该实例来构建ChatClient,并实现根据用户提问获取模型文本回答的功能:
@RestController
public class ChatController {private final ChatClient chatClient;public ChatController(ChatClient.Builder builder) {this.chatClient = builder.build();}@GetMapping("/chat")public String chat(String input) {return this.chatClient.prompt().user(input).call().content();}
}
以编程方式创建ChatClient
当需要多个聊天模型一起使用时,可以通过设置属性spring.ai.chat.client.enabled=false
来禁用ChatClient.Builder bean的自动配置,然后以编程方式创建ChatClient.Builder。例如:
ChatModel myChatModel = ... // usually autowired
ChatClient.Builder builder = ChatClient.builder(myChatModel);
// or create a ChatClient with the default builder settings:
ChatClient chatClient = ChatClient.create(myChatModel);
处理ChatClient响应
返回ChatResponse
AI模型的响应是一个由ChatResponse类型定义的丰富结构,包含响应生成相关的元数据,还可能包含多个子响应(Generation)。通过调用chatResponse()
方法可以获取这样的响应,示例如下:
ChatResponse chatResponse = chatClient.prompt().user("Tell me a joke").call().chatResponse();
返回实体类(Entity)
Spring AI框架支持自动将模型输出的字符串转换为预先定义好的实体类型。使用entity()
方法即可完成这一转换。例如,定义一个Java record(POJO):
record ActorFilms(String actor, List<String> movies) {}
通过以下代码将AI模型的输出映射到ActorFilms类型:
ActorFilms actorFilms = chatClient.prompt().user("Generate the filmography for a random actor.").call().entity(ActorFilms.class);
对于泛型类型,如List<ActorFilms>
,可以使用entity(ParameterizedTypeReference<T> type)
重载方法:
List<ActorFilms> actorFilms = chatClient.prompt().user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.").call().entity(new ParameterizedTypeReference<List<ActorFilms>>() {});
流式响应
stream
方法提供了一种异步、持续获取模型响应的方式。可以返回Flux<String>
类型的字符串流,也可以使用Flux<ChatResponse> chatResponse()
方法获得包含元数据的ChatResponse响应数据流。示例如下:
Flux<String> output = chatClient.prompt().user("Tell me a joke").stream().content();
定制ChatClient默认值
设置默认System Message
可以通过defaultSystem
方法为ChatClient设置默认的system message。例如,让ChatClient以海盗风格回答所有问题:
@Configuration
class Config {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a Pirate").build();}
}
也可以使用模板形式,在每次调用前修改请求参数,增加灵活性:
@Configuration
class Config {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}").build();}
}
@RestController
class AIController {private final ChatClient chatClient;AIController(ChatClient chatClient) {this.chatClient = chatClient;}@GetMapping("/ai")Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message, String voice) {return Map.of("completion",chatClient.prompt().system(sp -> sp.param("voice", voice)).user(message).call().content());}
}
其他默认设置
除了defaultSystem
,还可以在ChatClient.Builder级别指定其他默认提示:
- defaultOptions(ChatOptions chatOptions):传入可移植选项或特定于模型实现的选项。
- defaultFunction(String name, String description, java.util.function.Function<I, O> function):定义在用户文本中引用的函数及其相关信息。
- defaultFunctions(String… functionNames):应用程序上下文中定义的函数bean名称。
- defaultUser(String text)、defaultUser(Resource text)、defaultUser(Consumer userSpecConsumer):用于定义用户消息输入。
- defaultAdvisors(RequestResponseAdvisor… advisor)、defaultAdvisors(Consumer advisorSpecConsumer):Advisors可修改用于创建Prompt的数据,实现如Retrieval Augmented Generation模式。
并且在运行时,可以使用ChatClient提供的不带default前缀的相应方法覆盖这些默认值。
Advisors
在构建Prompt调用AI模型时,使用上下文数据扩充Prompt是常见的模式。这些上下文数据包括自己的数据(如特定领域知识、产品文档)、对话历史记录等。以检索增强生成(RAG)为例,当用户问题发送到AI模型时,QuestionAnswerAdvisor会在向量数据库中查询相关文档,并将响应附加到用户消息Prompt中。假设已将数据加载到VectorStore,可以通过以下方式执行RAG:
ChatResponse response = ChatClient.builder(chatModel).build().prompt().advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults())).user(userText).call().chatResponse();
通过SearchRequest
的FILTER_EXPRESSION
参数,还可以在运行时动态更新过滤表达式,实现对搜索结果的灵活筛选。
聊天记忆
ChatMemory接口负责存储聊天对话历史记录,提供添加、检索和清除消息的方法。目前有InMemoryChatMemory和CassandraChatMemory两种实现方式,分别提供内存存储和time - to - live类型的持久存储。例如,创建一个包含time - to - live配置的CassandraChatMemory:
CassandraChatMemory.create(CassandraChatMemoryConfig.builder().withTimeToLive(Duration.ofDays(1)).build());
同时,有多种Advisor实现利用ChatMemory接口来增强Prompt,如MessageChatMemoryAdvisor、PromptChatMemoryAdvisor和VectorStoreChatMemoryAdvisor,它们在将对话历史记录添加到Prompt的方式上各有不同。
日志记录
SimpleLoggerAdvisor用于记录ChatClient的request和response数据,对调试和监控AI交互十分有用。启用日志记录只需在创建ChatClient时将其添加到Advisor链中,并将Advisor包的日志记录级别设置为DEBUG。此外,还可以通过构造函数自定义记录数据的方式,满足特定需求。
总结
ChatClient为开发者提供了一个强大且便捷的工具,极大地简化了与AI模型的交互过程。通过其丰富的功能,包括灵活的输入定制、多样的输出处理、便捷的默认值设置以及对高级特性如聊天记忆、RAG的支持,开发者能够高效地构建出功能强大的AI应用程序。无论是处理简单的文本交互,还是实现复杂的业务逻辑,ChatClient都能发挥重要作用。在实际应用中,合理运用ChatClient的各项功能,可以显著提升开发效率,降低开发成本,为用户带来更优质的AI交互体验。随着人工智能技术的不断发展,相信ChatClient也将持续演进,为开发者提供更多的便利和可能性。让我们充分利用这一工具,在AI应用开发的道路上迈出更坚实的步伐。
相关文章:
深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具 前言 在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模…...
AI 知识库:企业知识管理的利器
在数字化转型的今天,企业每天都会产生海量的信息和数据。从客户资料到内部文档,从市场调研到项目经验,这些宝贵的知识资源构成了企业的核心竞争力。然而,你是否注意到这样一个问题:很多企业在快速发展的同时࿰…...
【STM32实物】基于STM32的RFID多卡识别语音播报系统设计
演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…...
[实战] Petalinux驱动开发以及代码框架解读
目录 Petalinux驱动开发以及代码框架解读一、引言二、步骤2.1 创建PetaLinux工程2.2 配置硬件描述文件2.3 设备树配置2.4 建立驱动框架2.5 编辑 .bb 文件2.6 编写驱动文件2.7 编写 Makefile2.8 验证配方配置2.9 集成驱动到 RootFS2.10 全系统编译与部署2.11 启动验证 三、框架解…...
ArcGIS Pro几个小知识点分享
相信熟悉ArcGIS 10.X系统的朋友接触ArcGIS Pro或者QGIS的上手难度都很低,因此向大家分享我最近才注意到的一些ArcGIS Pro小的知识点或者注意事项等,用来查缺补漏。如果是GIS新手小白,建议先去了解GIS相关理论基础,再摸索GIS相关软…...
运维仙途 第1章 灵机突现探监控
第1章 灵机突现探监控 情节梗概 凌运维本是青云门杂役弟子,负责看守藏经阁灵脉枢纽。某日子夜,护山大阵突然灵力紊乱,阁中古籍无风自动。危急时刻,他意外触发祖师留下的「混沌钟」,获得观测灵脉状态的能力… 技术映…...
深入解析Java架构师面试:从核心技术到AI应用
深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…...
Grounding DINO
论文标题: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 代码地址: GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO …...
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践 一、MCP的本质:标准化共识的协议框架 MCP(Model Context Protocol)是Anthropic于2024年提出的开放通信协议,其核心价值在于建立自然语言…...
区块链+医疗:破解数据共享困局,筑牢隐私安全防线
在医疗健康领域,数据共享与隐私保护一直是一对难以调和的矛盾。一方面,分散在不同机构的医疗数据(如电子病历、检查报告、用药记录)阻碍了诊疗效率和科研进展;另一方面,患者隐私泄露事件频发,加…...
Arduino IDE中更新esp32 3.2.0版本的办法
在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务,下载文件速度极慢。网上提供了离线的办法,提供了安装文件,但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址:通过在腾…...
关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146354088 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
毫米波通信的技术挑战与解决方案
毫米波通信的技术挑战与解决方案 随着5G技术的迅速发展,毫米波通信(Millimeter Wave, mmWave)作为一种具有巨大潜力的通信技术,正在成为实现超高速数据传输、低延迟和大规模连接的关键。然而,毫米波通信虽然在理论上具…...
软考中级-软件设计师 数据库(手写笔记)
基本概念 数据库分析设计过程 E-R模型 关系模式 关系模式相关名词和完整性约束和关系的三种类型 七种基本算法 并交查和笛卡尔积 投影选择和连接 题 规范化-函数依赖 求候选码 非规范化可能处于的问题 问题 题 关系-模型分解 事务管理 备份和恢复 数据仓库和数据挖掘...
Compose笔记(二十一)--AnimationVisibility
这一节主要了解一下Compose的AnimationVisibility,AnimatedVisibility 是 Jetpack Compose 里用于实现组件可见性动画效果的组件,借助它能让组件在显示和隐藏时带有平滑的过渡动画,从而提升用户体验。现总结如下: API 1. visible 含义:这是一…...
生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向
信息传递中的“击鼓传花” 新特性的突现 功能柱:简化节点 高级视皮层中的信息走向...
记录idea可以运行但是maven install打包却找不到问题
解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬,那么可以把相关的springboot的东西移除掉,改造成普通项⽬。如果不想改造项⽬,那就添加部分的配置,因为springboot项⽬打包的时候会⽣…...
牛客:AB5 点击消除
链接:点击消除_牛客题霸_牛客网 题解: 利用栈,遍历输入的字符串,栈为空则入栈,栈不为空则去除栈顶字符和当前遍历到的字符比较,相等则栈顶字符出栈,当前遍历的字符也不入栈,不相等…...
vue3 动态修改系统title
vue3 动态修改系统title 修改前 修改后 1、封装 useTitle 工具函数 创建组合式 API,通过 watchEffect 监听标题变化: // composables/useTitle.js import { ref, watchEffect } from vue;export function useTitle(initialTitle) {const title r…...
产品经理.产品设计.产品设计工具
一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图,面向用户调研,描述业务的流转和数据的处理要求,跟用户和业务方确认;---业务角色的泳道流程图。 系统流程图,面向产品需求设计, prd系描述各…...
kibana重建es索引
kibana如何重命名es索引名 背景 在初期设计es索引文档的时候考虑不是很周全,会多出很多无效字段。如果不删除或禁用对后续数据增量以及文档维护会有不良影响。 技术实现 使用 _reindex 1.执行Reindex # 复制旧索引数据到新索引 POST _reindex {"source&qu…...
windows系统常用快捷键(CMD常用命令,DOS常用命令)
Windows系统常用快捷键 Win E: 打开“文件资源管理器”(我的电脑)。Win S: 打开“搜索”功能,可以搜索文件、应用、设置等。Win I: 打开“设置”菜单,用于调整系统设置。Win X: 打开“快速链接”菜单,包含电源选项…...
使用 ossutil 上传文件到阿里云 OSS
在处理文件存储和传输时,阿里云的对象存储服务(OSS)是一个非常方便的选择。特别是在需要批量上传文件或通过命令行工具进行文件管理时,ossutil提供了强大的功能。本文将详细说明如何使用 ossutil 上传文件到阿里云 OSS,…...
专家访谈:从文本到视频,GEO多模态优化的实战法则
提问者:什么是生成引擎优化(GEO)?它与传统SEO的核心差异是什么? 源易GEO专家:生成引擎优化(GEO)是一种新兴策略,旨在提升内容在生成式AI引擎(如DeepSeek、…...
7.计算机网络相关术语
7. 计算机网络相关术语 ACK (Acknowledgement) 确认 ADSL (Asymmetric Digital Subscriber Line) 非对称数字用户线 AP (Access Point) 接入点 AP (Application) 应用程序 API (Application Programming Interface) 应用编程接口 APNIC (Asia Pacific Network Informatio…...
openEuler 22.03 安装 Redis 6.2.9,支持离线安装
目录 一、环境检查1.1 必要环境检查1.2 在线安装(有网络)1.3 离线安装(无网络) 二、下载Redis2.1 在线下载2.2 离线下载 三、安装Redis四、配置Redis服务五、开机自启服务六、开放防火墙端口七、常用命令 一、环境检查 1.1 必要环…...
Java架构师深度技术面试:从核心基础到分布式架构全解析
一场关于互联网大厂Java求职者的深度技术面试 在当今竞争激烈的互联网行业中,作为一名Java程序员,如何在众多候选人中脱颖而出显得尤为重要。本文通过一个完整的面试故事场景,以严肃的面试官和经验丰富的Java架构师马架构之间的问答形式&…...
你的项目有‘哇‘点吗?
你的项目有哇点吗? 刷了一下午招聘软件,发现没?大厂JD里总爱写有创新力者优先——可你们的简历,创新力还不如食堂菜单! 程序员写项目最大的误区:把创新当彩蛋藏最后!什么参与需求评审负责模块…...
RPG3.角色输入
流程: 需要创建原生的标签。 需要创建输入配置数据资产,通过这个资产,将标签映射到角色的唯一动作,通过输入的文本来识别应该做哪一个动作。需要创建自定义的输入组件。 需要绑定输入,创建不同的输入回调。 需要在…...
【python】-基础语法3
💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...
毕业论文 | 传统特征点提取算法与匹配算法对比分析
传统特征点提取算法与匹配算法对比分析 一、特征点提取算法对比二、特征匹配算法对比三、核心算法原理与公式1. **Harris角点检测**2. **SIFT描述子生成**3. **ORB描述子**四、完整Matlab代码示例1. **Harris角点检测与匹配**2. **SIFT特征匹配(需VLFeat库)**3. **ORB特征匹配…...
TM1668芯片学习心得三
一、键扫数据储存地址如下所示,先发读键命令后,开始读取按键数据BYTE1-BYTE5字节,读数据从低位开始输出,其中B6和B7位为无效位,此时芯片输出为0。芯片K和KS引脚对应的按键按下时,相对应的字节内的 BIT位为1…...
精益数据分析(34/126):深挖电商运营关键要点与指标
精益数据分析(34/126):深挖电商运营关键要点与指标 在创业和数据分析的学习之旅中,我们都在不断探寻如何让业务更上一层楼。今天,我依旧带着和大家共同进步的想法,深入解读《精益数据分析》中电商运营的关…...
Dify 获取天气数据并以echarts图表显示
Dify 获取天气数据并以echarts图表显示 1. 创建一个 Chatflow2. 创建一个 HTTP 请求节点3. 创建一个代码执行节点4. 创建一个直接回复节点5. 发布并预览 1. 创建一个 Chatflow 2. 创建一个 HTTP 请求节点 请求地址:https://weather.cma.cn/api/climate?stationid5…...
vtk 读取ply或者stl点云进行ICP配准(不可直接使用vtkPolyData)
在vtk中,读取ply或stl文件使用ICP进行点云配准时,需要注意不要直接使用vtkPolyData进行配准,这种方式会报错。 vtkPLYReader读取的文件可能仅包含点数据,而没有显式的顶点定义。例如,PLY文件可能只列出点的坐标&#x…...
ArrayList的特点及应用场景
ArrayList的特点及应用场景 一、ArrayList核心特点 基于动态数组实现 底层使用Object[]数组存储元素 默认初始容量为10 扩容机制:每次扩容为原来的1.5倍(int newCapacity oldCapacity (oldCapacity >> 1)) 快速随机访问 实现了R…...
【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题
目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 1.2 纯代码形式实现 1.3 使用 按钮 实现 1.3.1 图形化界面实现 1.3.2 纯代码形式实现 1.4 使用 编辑框 实现 1.4.1 图形化界面实现 1.4.2 纯代码形式实现 1.4.3 内存泄露 2. 认识对象模型(对象树&…...
92.一个简单的输入与显示示例 Maui例子 C#例子
一、关于项目命名的注意事项 在开发.NET MAUI项目时,项目命名是一个不可忽视的细节。如果你习惯了在C#控制台或WPF项目中使用中文项目名称,那么在.NET MAUI中,你可能会遇到一些问题。我之前就因为使用中文项目名称而导致项目无法直接运行&am…...
SpringAI实现AI应用-搭建知识库
SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 概述 想要使用SpringAI搭建知识库,就要使用SpringAI中的TikaDocumentReader,它属于ETL(提取、转换、加载)框架中的提取&…...
大连理工大学选修课——机器学习笔记(4):NBM的原理及应用
NBM的原理及应用 贝叶斯决策及相关 贝叶斯决策 对于给定数据集 X [ X 1 , X 2 , ⋯ , X d ] T X[X_1,X_2,\cdots,X_d]^T X[X1,X2,⋯,Xd]TK个类 C i , i 1 , ⋯ , K C_i,i1,\cdots,K Ci,i1,⋯,K, 满足 P ( C i ) > 0 a n d ∑ P ( C i ) 1 P(C_i)>0\ and\ …...
SQL Server 数据库重命名
通过将 SQL Server 数据库置于单用户模式,对其重命名 使用下列步骤在 SSMS 中使用 T-SQL 重命名 SQL Server 数据库。 1.为实例连接到 master 数据库。 2.打开一个查询窗口。 3.将以下示例复制并粘贴到查询窗口中,然后选择“执行”。 此示例将 MyTes…...
5W1H分析法——AI与思维模型【86】
一、定义 5W1H分析法思维模型是一种通过对问题或事件从原因(Why)、对象(What)、地点(Where)、时间(When)、人员(Who)和方法(How)六个…...
【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步
添加图片注释,不超过 140 字(可选) 更多AI前沿科技资讯,请关注我们: closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步! 大家好,我是Jimmy。前面有介绍了阶跃…...
spring中关键字Assert和jdk的assert关键字
你提出的问题非常关键,涉及到 Java 中两种不同的 assert 用法: ✅ 一、你提到的两种 assert 类型 示例 来源 特点 JDK 自带的 assert 关键字 assert str ! null; Java 原生语言特性(JDK 1.4) 可开关控制&#…...
git分支分叉强制更改为线性
git分支分叉更改为线性 远端分支情况 本地分支情况 在执行 git pull origin main 时遇到了一个提示,说明本地分支和远程分支发生了分歧(divergent branches)。 这通常是因为远程分支上有新的提交,而本地分支也有未推送的提交&a…...
从实列中学习linux shell6: 写一个 shell 脚本 过滤 恶意ip 攻击
下面是检测和过滤恶意IP攻击的Shell脚本,包含自动分析日志、封锁IP、白名单管理等功能: 第一步:过滤脚本 #!/bin/bash# 配置区域(根据需求修改) LOG_FILES(/var/log/auth.log /var/log/nginx/access.log) # 监控的日…...
代码随想录打卡|Day31动态规划(最后一块石头的重量2、目标和、一和零)
动态规划Part 04 最后一块石头的重量 II 力扣题目链接 代码随想录链接 视频讲解链接 题目描述: 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉…...
一区思路!挑战5天一篇NHANES预测模型 DAY1-5
挑战5天一篇预测模型NHANES Day1! 近期美国关闭seer数据库的信息在互联网上广泛传播,大家都在担心数据库挖掘是否还能做。这个问题其实是有答案的,数据库挖掘肯定能做,做没被关的数据库即可,同时留意一些国产数据库~…...
Stack--Queue 栈和队列
一、Stack--栈 1.1 什么是栈? 堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。 第一个模版参数T:元素的类型;第二个模版参数Container…...
Redis热key大key详解
不要阻挡我走向成功,勇者配享所有,感想敢干 hotkey热key 大量请求可能会使redis节点流量不均匀,进而导致宕机,继而打到数据库崩溃;因此需要对热key优化 引发问题: 分片服务瘫痪可能打到数据库࿰…...