当前位置: 首页 > news >正文

(2025)图文解锁RAG从原理到代码实操,代码保证可运行

什么是RAG

RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤:

  1. 数据预处理

    • 加载:从不同格式(PDF、Markdown等)中提取文本
    • 分块:将长文本分割成短序列(通常100-500个标记),作为检索单元
      在这里插入图片描述
  2. 检索系统构建

    • embedding:使用embedding模型为每个文本块生成向量表示
    • 存储:将这些向量索引到向量数据库中
    • 可选-重排:结合关键词搜索构建混合搜索系统,并添加重排序步骤
      在这里插入图片描述
  3. 查询处理流程

    • 接收用户查询并评估其相关性
    • 对查询进行嵌入,在向量库中查找相关块
      在这里插入图片描述
  4. 生成输出

    • 将检索到的相关内容与原始查询一起传递给LLM
    • LLM根据这些上下文信息生成更准确、更符合事实的回答
      在这里插入图片描述

RAG的核心价值在于通过非参数数据源为模型提供正确、具体且最新的信息,从而改进传统LLM的回答质量。

RAG vs 超长上下文

随着模型如Claude、GPT-4和Gemini 1.5等能够处理高达100万tokens甚至200万tokens的输入,业界开始思考一个关键问题:在如此长的上下文支持下,我们未来是否还需要检索增强生成(RAG)技术。

下表将会对比RAG与超长文本优缺点

特点超长上下文RAG技术实际影响
成本⚠️ 高✅ 低200万tokens API调用vs.数千tokens
安全性⚠️ 全部暴露✅ 按需暴露敏感信息保护程度
检索精度⚠️ 随文档长度降低,AI对更近的文本记忆力更好✅ 相对稳定问答准确率差异
容量限制⚠️ 有上限(~200万tokens)✅ 基本无限可处理知识库规模

RAG综合实操

由于本系列已经提到有关RAG的各个细节理论与代码,因此这里有些细节不再重复。

RAG入门篇

环境准备
本机Ollama需要下载了模型,若未下载使用ollama run deepseek-r1:7b

# 安装必要依赖
pip install langchain langchain-community chromadb  beautifulsoup4  sentence-transformers langchain-ollama

一个RAG分为一下5个部分

  1. 加载: 通过 document_loaders 完成数据加载
  2. 分割: text_splitter 将大型文档分割成更小的块,便于索引和模型处理
  3. 存储: 使用 vectorstores embeddings 模型存储和索引分割的内容
  4. 检索: 使用 RetrievalQA 基于用户输入,使用检索器从存储中检索相关分割
  5. 生成: llms 使用包含问题和检索数据的提示生成答案
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.llms import Ollama
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'loader = WebBaseLoader("https://blog.csdn.net/ngadminq/article/details/147687050")
documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh"
)vectorstore = Chroma.from_documents(documents=chunks,embedding=embedding_model,persist_directory="./chroma_db"
)# 创建检索器
retriever = vectorstore.as_retriever()template = """
根据以下已知信息,简洁并专业地回答用户问题。
如果无法从中得到答案,请说"我无法从已知信息中找到答案"。已知信息:
{context}用户问题:{question}回答:
"""
prompt = PromptTemplate(template=template,input_variables=["context", "question"]
)#
llm = Ollama(model="deepseek-r1:7b")  # 本地部署的模型qa_chain = RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=retriever,chain_type_kwargs={"prompt": prompt}
)question = "图灵的论文叫什么?"
result = qa_chain.invoke({"query": question})
print(result["result"])

在这里插入图片描述

RAG进阶篇

该进阶场景更贴近工业开发需求,比原本RAG增加了如下功能

不同用户的多轮对话

使用ConversationBufferMemory实现记忆功能,同时采用类用session_id来拆分独立chain从而保证用户会话隔离。

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain.llms import Ollama
import os
from typing import Dictos.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'class ConversationManager:def __init__(self):# 加载和准备数据(只需执行一次)self.retriever = self._prepare_retriever()self.llm = Ollama(model="deepseek-r1:7b")# 用于存储每个用户会话的记忆self.user_memories: Dict[str, ConversationBufferMemory] = {}# 用于存储每个用户会话的对话链self.user_chains: Dict[str, ConversationalRetrievalChain] = {}# 提示模板self.qa_prompt = PromptTemplate(template="""根据以下已知信息和对话历史,简洁并专业地回答用户当前问题。如果无法从中得到答案,请说"我无法从已知信息中找到答案"。已知信息:{context}对话历史:{chat_history}当前问题:{question}回答:""",input_variables=["context", "chat_history", "question"])def _prepare_retriever(self):"""准备检索器和向量存储"""# 加载文档loader = WebBaseLoader("https://blog.csdn.net/ngadminq/article/details/147687050")documents = loader.load()# 分割文档text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)chunks = text_splitter.split_documents(documents)# 创建嵌入模型embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")# 创建向量存储vectorstore = Chroma.from_documents(documents=chunks,embedding=embedding_model,persist_directory="./chroma_db")return vectorstore.as_retriever()def get_user_chain(self, session_id: str):"""获取或创建指定session_id的对话链"""if session_id not in self.user_chains:# 为新用户创建新的记忆组件memory = ConversationBufferMemory(memory_key="chat_history",return_messages=True)self.user_memories[session_id] = memory# 为新用户创建新的对话链chain = ConversationalRetrievalChain.from_llm(llm=self.llm,retriever=self.retriever,memory=memory,combine_docs_chain_kwargs={"prompt": self.qa_prompt})self.user_chains[session_id] = chainreturn self.user_chains[session_id]def process_query(self, session_id: str, query: str):"""处理用户查询并返回响应"""chain = self.get_user_chain(session_id)result = chain.invoke({"question": query})return result["answer"]def clear_history(self, session_id: str):"""清除指定用户的对话历史"""if session_id in self.user_memories:self.user_memories[session_id].clear()def remove_user(self, session_id: str):"""完全移除用户会话数据"""if session_id in self.user_chains:del self.user_chains[session_id]if session_id in self.user_memories:del self.user_memories[session_id]# 演示:如何在命令行中测试多用户功能
def test_multi_user():manager = ConversationManager()# 模拟两个不同用户的会话session1 = "user1"session2 = "user2"# 用户1的对话print(f"用户1问: Transformer架构都是由什么组成")print(f"回答: {manager.process_query(session1, 'Transformer架构都是由什么组成')}")# 用户2的对话print(f"用户2问: 深度学习有哪些应用")print(f"回答: {manager.process_query(session2, '深度学习有哪些应用')}")# 用户1的后续问题(应该能理解上下文)print(f"用户1问: 它的原理是什么")print(f"回答: {manager.process_query(session1, '它的原理是什么')}")# 用户2的后续问题(应该能理解不同的上下文)print(f"用户2问: 能详细说明一下这些应用吗")print(f"回答: {manager.process_query(session2, '能详细说明一下这些应用吗')}")if __name__ == "__main__":test_multi_user()

在这里插入图片描述

相关文章:

(2025)图文解锁RAG从原理到代码实操,代码保证可运行

什么是RAG RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤: 数据预处理 加载:从不同格式(PDF、Markdown等)中提取文本分块:将长文本分割成短序列(通常100-500个标记),作为检索单元…...

TWAS、GWAS、FUSION

全基因组关联研究(GWAS,Genome-Wide Association Study)是一种统计学方法,用于在全基因组水平上识别与特定性状或疾病相关的遗传变异。虽然GWAS可以识别与性状相关的遗传信号,但它并不直接揭示这些遗传变异如何影响生物…...

大模型微调终极方案:LoRA、QLoRA原理详解与LLaMA-Factory、Xtuner实战对比

文章目录 一、微调概述1.1 微调步骤1.2 微调场景 二、微调方法2.1 三种方法2.2 方法对比2.3 关键结论 三、微调技术3.1 微调依据3.2 LoRA3.2.1 原理3.2.2 示例 3.3 QLoRA3.4 适用场景 四、微调框架4.1 LLaMA-Factory4.2 Xtuner4.3 对比 一、微调概述 微调(Fine-tun…...

FHE 之 面向小白的引导(Bootstrapping)

1. 引言 FHE初学者和工程师常会讨论的一个问题是; “什么是引导(bootstrapping)?” 从理论角度看,这个问题的答案很简单: 引导就是套用 Gentry 提出的思想——在加密状态下同态地执行解密操作&#xff…...

安装:Kali2025+Docker

安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...

什么是深拷贝什么是浅拷贝,两者区别

什么是深拷贝什么是浅拷贝,两者区别 1.深拷贝 递归复制对象的所有层级,嵌套的引用类型属性,最后生成一个完全独立的新对象,与原对象无任何引用关联。 特点: 新对象和原对象的所有层级属性是独立的(修改…...

A2A大模型协议及Java示例

A2A大模型协议概述 1. 协议作用 A2A协议旨在解决以下问题: 数据交换:不同应用程序之间的数据格式可能不一致,A2A协议通过定义统一的接口和数据格式解决这一问题。模型调用:提供标准化的接口,使得外部应用可以轻松调…...

第七章 数据库编程

1 数据库编程基础 1.1 数据库系统概述 数据库系统是由数据库、数据库管理系统(DBMS)和应用程序组成的完整系统。其主要目的是高效地存储、管理和检索数据。现代数据库系统通常分为以下几类: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等&#x…...

电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!

调色详情 电影感户外哑光人像自拍摄影 Lr 调色,是借助 Lightroom 软件,针对户外环境下拍摄的人像自拍进行后期处理。旨在模拟电影画面的氛围与质感,通过调色赋予照片独特的艺术气息。强调打造哑光效果,使画面色彩不过于浓烈刺眼&a…...

C++--类的构造函数与初始化列表差异

一,引言 在类中成员函数的构造函数担任其将对象初始化的作用,而初始化列表也有着相似的作用。大部分人建议都是初始化列表进行初始化,本文主要进行讲解二者的区别。 首先看一下构造函数的初始化方式: #define _CRT_SECURE_NO…...

深入浅出之STL源码分析4_类模版

1.引言 我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么&#x…...

Lambda表达式解读

本文通过具体案例演示函数式接口Function<T,R>的三种实现方式演变过程。 一、传统匿名内部类实现 Integer resInt1 t1(new Function<String, Integer>() {Overridepublic Integer apply(String s) {int i Integer.parseInt(s);return i;} });实现特点&#xff1…...

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)

文章目录 类简介方法总览关键说明示例代码 类简介 QMarginsF 用于定义四个浮点型边距&#xff08;左、上、右、下&#xff09;&#xff0c;描述围绕矩形的边框尺寸。所有边距接近零时 isNull() 返回 True&#xff0c;支持运算符重载和数学运算。 方法总览 方法名/运算符参数返…...

Android方法耗时监控插件开发

需求&#xff1a;自定义一个Gradle插件&#xff0c;这个Gradle插件可以统计方法的耗时&#xff0c;并当方法耗时超过阈值时&#xff0c;可以通过打印Log日志在控制台&#xff0c;然后可以通过Log定位到耗时方法的位置&#xff0c;帮助我们找出耗时方法和当前线程名&#xff0c;…...

TWAS / FUSION

FUSION 是一套用于执行转录组范围和调控组范围关联研究&#xff08;TWAS 和 RWAS&#xff09;的工具。它通过构建功能/分子表型的遗传成分的预测模型&#xff0c;并使用 GWAS 汇总统计数据预测和测试该成分与疾病的关联&#xff0c;目标是识别 GWAS 表型与仅在参考数据中测量的…...

C++中的static_cast:类型转换的安全卫士

C中的static_cast&#xff1a;类型转换的安全卫士 在C编程中&#xff0c;类型转换是不可避免的操作&#xff0c;而static_cast作为C四大强制类型转换运算符之一&#xff0c;是最常用且相对安全的一种转换方式。今天我们就来深入探讨一下这个重要的类型转换工具。 一、static_…...

uniapp-商城-51-后台 商家信息(logo处理)

前面对页面基本进行了梳理和说明&#xff0c;特别是对验证规则进行了阐述&#xff0c;并对自定义规则的兼容性进行了特别补充&#xff0c;应该说是干货满满。不知道有没有小伙伴已经消化了。 下面我们继续前进&#xff0c;说说页面上的logo上传组件&#xff0c;主要就是uni-fil…...

04 mysql 修改端口和重置root密码

当我们过了一段时间&#xff0c;忘了自己当初创建的数据库密码和端口&#xff0c;或者端口被占用了&#xff0c;要怎么处理呢 首先&#xff0c;我们先停止mysql。 一、修改端口 打开my.ini文件&#xff0c;搜索port&#xff0c;默认是3306&#xff0c;根据你的需要修改为其他…...

多线程 2 - 死锁问题

死锁 死锁&#xff0c;是多线程代码中的一类经典问题。加锁能够解决线程安全问题&#xff0c;但如果加锁方式不当&#xff0c;就很可能产生死锁。 出现死锁的三种场景 1、一个线程一把锁 就像上篇文章讲过的&#xff0c;如果对同一个线程上了两把锁&#xff0c;而且上的锁是…...

网络原理(Java)

注&#xff1a;此博文为本人学习过程中的笔记 在网络初始中谈到TCP/IP五层模型&#xff0c;接下来我们将介绍这里面涉及到的网络协议。 应用层是程序员接触最多的层次&#xff0c;程序员写的代码只要涉及到网络通信都可以视为是应用层的一部分。应用层里的东西和程序员直接相…...

HDFS 常用基础命令详解——快速上手分布式文件系统

简介&#xff1a; 本文面向刚接触 Hadoop HDFS&#xff08;Hadoop 分布式文件系统&#xff09;的读者&#xff0c;结合 CSDN 博客风格&#xff0c;系统梳理最常用的 HDFS 客户端命令&#xff0c;并配以示例和注意事项&#xff0c;帮助你在开发和运维中快速掌握 HDFS 的文件管理…...

Unity Shaders and Effets Cookbook

目录 作者简介 审稿人简介 前言 我是偏偏 Unity Shaders and Effets Cookbook 第一章&#xff1a;Diffuse Shading - 漫反射着色器 第二章&#xff1a;Using Textures for Effects - 着色器纹理特效的应用 第三章&#xff1a;Making Your Game Shine with Specular - 镜…...

Markdown—LaTeX 数学公式

目录 一、字母1. 希腊大写字母2. 希腊小写字母3. 花体字母 二、上标和下标1. 上标2. 下标3. 其他 三、括号四、数学符号1. 基本数学符号1&#xff09;运算符2&#xff09;常见函数3&#xff09;分式、根号、累加/乘4&#xff09;极限5&#xff09;积分 2. 三角函数与几何符号1&…...

AI 驱动的开发工具

&#x1f527; 主流 AI 前端开发工具 1. GitHub Copilot 由 GitHub 与 OpenAI 联合开发&#xff0c;集成在 Visual Studio Code、JetBrains 等主流 IDE 中&#xff0c;提供智能代码补全、函数生成等功能&#xff0c;极大地提高了开发效率。 (CSDN博客) 2. Cursor 一款 AI 驱…...

【入门】数字走向I

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;for(int i1;i<n*n;i){cout…...

Kubernetes生产实战(十三):灰度发布与蓝绿发布实战指南

在微服务架构中&#xff0c;如何安全高效地发布新版本是每个团队必须掌握的技能。本文将深入讲解Kubernetes中两种主流发布策略的落地实践&#xff0c;附带生产环境真实案例。 一、金丝雀发布&#xff08;灰度发布&#xff09;&#xff1a;渐进式验证新版本 核心思想&#xf…...

数孪实战笔记(1)数字孪生的含义、应用及技术体系

一、含义 数字孪生&#xff08;Digital Twin&#xff09;是一种通过数字化模型在虚拟世界中实时映射和模拟物理实体、系统或过程的技术。它的核心目的是通过对现实对象的建模、感知、分析和预测&#xff0c;实现对物理世界的全面感知、智能控制和优化决策。数字孪生 实体对象 …...

深入浅出之STL源码分析5_类模版实例化与特化

在 C 中&#xff0c;​​类模板的实例化&#xff08;Instantiation&#xff09;和特化&#xff08;Specialization&#xff09;​​ 是模板编程的核心概念&#xff0c;而 ​​显式实例化&#xff08;Explicit Instantiation&#xff09;和隐式实例化&#xff08;Implicit Insta…...

JDBC演进之路:从基础操作到高效连接池

文章目录 一、JDBC 1.0&#xff1a;手动管理的起点1.1 核心特点1.2 代码示例&#xff1a;1.3 痛点分析 二、JDBC 2.0&#xff1a;配置化的升级2.1 核心改进2.2 代码示例2.3 优势与不足 三、JDBC 3.0&#xff1a;连接池的革命3.1 核心改进3.2 代码示例3.3 核心优势 四、版本对比…...

远程调试---在电脑上devtools调试运行在手机上的应用

1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…...

街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)27

目录 0、Emeditor软件1、Place Pluse 2.0数据集2、街景主观感知大框架2.1 街景主观感知&#xff1a;自建数据集2.2 街景主观感知&#xff1a;两两对比程序2.3 街景主观感知&#xff1a;Trueskill评分2.4 街景主观感知&#xff1a;训练模型&#xff0c;Resnet或EfficientNet或V…...

进阶二:基于HC-SR04和LCD1602的超声波测距

一、实验目的 掌握HC-SR04超声波测距模块的工作原理和使用方法。学会使用LCD1602液晶显示屏显示测量数据。熟悉89C51单片机与外设的接口电路设计和编程方法。二、实验原理 1. HC-SR04超声波测距模块原理 HC-SR04超声波测距模块可提供2cm - 400cm的非接触式距离感测功能,测距精…...

单因子实验 方差分析

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著傅珏生译)第3章单因子实验 方差分析python解决方案。本文尽量避免重复书中的理论&#xff0c;着于提供python解决方案&#xff0c;并与原书的运算结果进行对比。您可以从 下载实验设计与分析&#xff08;第6版&a…...

《Python星球日记》 第53天:卷积神经网络(CNN)入门

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、图像表示与通道概念1. 数字图像的本质2. RGB颜色模型3. 图像预处理 二、卷积…...

基于人工智能的个性化 MySQL 学习路径推荐研究

基于人工智能的个性化 MySQL 学习路径推荐研究 摘要: 随着信息技术的飞速发展,数据库在各行业应用广泛,MySQL 作为主流数据库之一,学习需求庞大。然而,不同学习者在知识水平、学习进度和目标上存在差异,传统统一的学习路径难以满足个性化需求。本研究通过运用人工智能技…...

阿里云OSS-服务端加签直传说明/示例(SpringBoot)

目录 概述 OSS文件上传方式 1. OSS控制台上传 2. 客户端直传 3. 后端上传 4. 加签直传 服务端加签方式 1. 服务端生成PostObject所需的签名和Post Policy 2.服务端生成STS临时访问凭证 3. 服务端生成PutObject所需的签名URL 实现1&#xff1a;生成PostObject所需的签…...

《向上生长》读书笔记day5

哎&#xff0c;好像有点坚持不下去了&#xff0c;有点松懈了 不咋想继续写读书笔记&#x1f602;&#xff0c;不过我不可能这么轻易放弃的&#xff0c;起码要做完这一本书&#xff0c;话不多说&#xff0c;开始进入的读书&#x1f4d2;笔记 今天读了两个章节&#xff0c;穷人翻…...

优选算法——队列+BFS

目录 1. N叉树的层序遍历 2. 二叉树的锯齿层序遍历 3. 二叉树最大宽度 4. 在每个树行中找最大值 1. N叉树的层序遍历 题目链接&#xff1a;429. N 叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a; 层序遍历即可~仅…...

Java MCP 实战 --> AI玩转贪吃蛇

MCP 实战 --> AI玩转贪吃蛇 MCP 更加便捷的扩展了 LLM 的能力&#xff0c;使得 AI 发展更加迅猛。本篇主要为了学习MCP的应用&#xff0c;实现了让AI去玩贪吃蛇&#xff0c;使用 Java 实现了 MCP Server 和 MCP Client 的编码。其他文章如下&#xff1a; thinking 基础版…...

Day20打卡-奇异值SVD分解

今天学习非特征筛选的方法&#xff1a; 知识点回顾&#xff1a; 线性代数概念回顾&#xff08;可不掌握&#xff09;奇异值推导&#xff08;可不掌握&#xff09;奇异值的应用 特征降维&#xff1a;对高维数据减小计算量、可视化数据重构&#xff1a;比如重构信号、重构图像&am…...

【RT-Thread Studio】nor flash配置Fal分区

前置条件&#xff1a;【RT-Thread Studio】W25Q128配置 添加 FAL软件包 配置SFUD驱动程序&#xff0c;使用FAL的设备为W25Q128 将fal_cfg.h和fal_flash_sfud_port.c提取出来&#xff0c;放到自己创建的fal_porting目录。 修改 fal_flash_sfud_port.c struct fal_flash_dev n…...

在资源受限设备上实现手势识别:基于包络EMG数据和实时测试的Tiny-ML方法

英文标题&#xff1a;Enabling Gesture on a Resource-Constrained Device: A Tiny-ML Approach with Envelope EMG Data and Real-Time Testing 中文标题&#xff1a;在资源受限设备上实现手势识别&#xff1a;基于包络EMG数据和实时测试的Tiny-ML方法 作者信息 Mohsin Ali S…...

动态规划:最长递增子序列

给定一个数组&#xff0c;求最长递增子序列的长度,就是要求我们求出一个序列中最长的上升子序列的长度&#xff0c;最长上升子序列的定义就是从原序列中按照孙旭去除一些数字&#xff0c;这些数字是逐渐增大的。 *定义dp[i]表示以第i个元素结尾的最长上升子序列的长度。 *初始…...

贪心算法专题(Part2)

目录 1. 最优除法 2. 加油站 3. 坏了的计算器 4. 可被三整除的最大和 5. 单调递增的数字 6. 合并区间 7. 无重叠区间 8. 用最少数量的箭引爆气球 1. 最优除法 题目链接&#xff1a;553. 最优除法 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分…...

4.9/Q1,GBD数据库最新文章解读

文章题目&#xff1a;The burden of diseases attributable to high body mass index in Asia from 1990 - 2019: results from the global burden of disease study 2019 DOI&#xff1a;10.1080/07853890.2025.2483977 中文标题&#xff1a;1990 年至 2019 年亚洲高体重指数导…...

API 网关核心功能解析:负载均衡、容灾、削峰降级原理与实战摘要

在微服务架构中&#xff0c;API 网关作为流量入口枢纽&#xff0c;通过负载均衡、容灾、削峰降级等核心功能保障系统稳定性与高可用性。本文结合 Spring Cloud Gateway 实战代码、原理剖析及行业最佳实践&#xff0c;深度解析网关核心能力&#xff0c;并对比当前前沿技术方案&a…...

Spring之AOP

什么是AOP AOP:Aspect 0riented Programming(面向切面编程、面向方面编程)&#xff0c;可简单理解为就是面向特定方法编程。 场景:案例中部分业务方法运行较慢&#xff0c;定位执行耗时较长的接口&#xff0c;此时需要统计每一个业务方法的 执行耗时。 优势: 1.减少重复代…...

TransmittableThreadLocal:穿透线程边界的上下文传递艺术

文章目录 前言一、如何线程上下文传递1.1 ThreadLocal单线程1.2 InheritableThreadLocal的继承困境1.3 TTL的时空折叠术 二、TTL核心设计解析2.1 时空快照机制2.2 装饰器模式2.3 采用自动清理机制 三、设计思想启示四、实践启示录结语 前言 在并发编程领域&#xff0c;线程上下…...

基于STM32的甲醛检测

一、制作目标 以正点原子的miniSTM32F103RCT6开发板为主控&#xff0c;使用甲醛传感器检测环境空气中的甲醛含量&#xff08;以mg/m^3为单位&#xff09;、C02含量&#xff08;以ppm为单位&#xff09;和总有机挥发物含量TVOC&#xff08;以mg/m^3为单位&#xff09;在OLED显示…...

人形机器人:主控芯片

目前人形机器人领域的主控芯片因厂商和应用场景不同而有所差异&#xff0c;以下是一些主要人形机器人及其可能使用的主控芯片概况&#xff0c;基于公开信息和行业趋势。由于具体型号常为商业机密&#xff0c;部分信息为推测&#xff1a; 主要人形机器人及其主控芯片 特斯拉&am…...