大模型系列:RAG技术深度解析

文末有福利!

RAG 是2023年最流行的基于 LLM 的应用系统架构。有许多产品几乎完全建立在 RAG 之上,覆盖了结合网络搜索引擎和 LLM 的问答服务,到成千上万个数据聊天的应用程序。很多人将RAG和Agent 作为大模型应用的两种主流架构,但什么是RAG呢?RAG又涉及了哪些具体的技术呢?

1. 什么是RAG

RAG即检索增强生成,为 LLM 提供了从某些数据源检索到的信息,并基于此修正生成的答案。RAG 基本上是 Search + LLM 提示,可以通过大模型回答查询,并将搜索算法所找到的信息作为大模型的上下文。查询和检索到的上下文都会被注入到发送到 LLM 的提示语中。

嵌入式搜索引擎可以通过 Faiss 来实现,向量搜索领域成为了RAG的一个助力。像pinecone 这样的向量数据库可以构建开源搜索索引,为输入文本增加了额外的存储空间,还增加了一些其他工具。关于向量数据库,可以参考解读向量数据库。

面向RAG的开发框架,对于基于 LLM 的流水线和应用程序,有两个最著名的开源工具—— LangChain 和 LlamaIndex,分别是在2022年10月和11月创建的,随着 ChatGPT 爆发,也在2023年获得了大量采用。LlamaIndex 和 LangChain 都是令人惊叹的开源项目,它们的发展速度非常快。

2. 基础的 RAG 技术

RAG 系统的起点一般是一个文本文档的语料库,简单看起来是这样的: 把文本分割成块,然后把这些分块嵌入到向量与transformer编码器模型,把所有这些向量建立索引,最后创建一个 LLM 提示语,告诉模型回答用户的查询,给出在搜索步骤中找到的上下文。在运行时,我们用相同的编码器模型完成用户查询的向量化,然后执行这个查询向量的索引搜索,找到top-k 的结果,从数据库中检索到相应的文本块,并提供给 LLM 提示语Prompt作为上下文。

在OpenAI 平台上,提示词Prompt可以是这样的:

代码语言:javascript

**复制

def question_answering(context, query):prompt = f""" my query text...                """response = get_completion(instruction, prompt, model="gpt-3.5-turbo")answer = response.choices[0].message["content"]return answer

关于提示词和提示词工程的更多介绍可以参考OpenAI 的提示词工程手册以及解读提示工程(Prompt Engineering)。

显然,尽管 OpenAI 在LLM 市场上处于领先地位,但还是有很多替代方案,比如 Anthroic 的 Claude,还有最近流行的更小但功能强大的模型,比如 Mistral,微软的 Phi-2 以及许多开源选项,比如 Llama2,OpenLLaMA,Falcon等都可以用来开发面向RAG的大模型产品。
在这里插入图片描述

3. RAG中的高级技术

尽管并不是所有RAG系统中的高级技术都可以轻松地在一张图中可视化,但给出一个描述核心步骤和算法的方案还是有意义的。

3.1. 分块和矢量化

首先,要创建一个向量索引表示我们的文档内容,然后在运行时搜索所有这些向量和查询向量之间最小距离对应的最接近语义。

由于transformer模型有固定的输入序列长度,即使输入上下文的窗口很大,一个或几个句子的向量也比一个在几页文本上取平均值的向量更能代表它们的语义意义 ,所以数据分块是一个有意义的技术。把初始文档分成一定大小的块,同时又不失去它们的意义,也就是把文本分成句子或段落,而不是把一个句子分成两部分。而且,已经有了各种能够执行此任务的文本分割器实现。例如,在 LlamaIndex 中,NodeParser 就提供了一些高级选项,如定义自己的文本分割器、元数据、节点/块关系等。

数据块的大小是一个需要考虑的参数,它取决于使用的嵌入模型及其token容量,标准的transformer编码模型,如BERT 的句子转换器,最多只能使用512个token,OpenAI ada-002能够处理更长的序列,如8191个token,但这里的折衷是足够的上下文,让 LLM 能够推理以及特定的足够文本嵌入,以便有效地执行搜索。

下一步是选择一个模型来生产所选块的嵌入,同样有很多方法,例如搜索优化的模型( bge-large 或者E5 系列),MTEB 排行榜可以得到最新的一些方法信息。

2. 搜索的索引

面向RAG的大模型应用的关键部分是用于搜索的索引,它存储前面得到的向量化内容。当然,查询总是首先向量化,对于 top k 分块也是一样的。最简单的实现使用一个平铺的索引,在查询向量和所有块向量之间进行距离计算并遍历。

一个合适的搜索索引,为了在一万多个元素的尺度上有效地检索而优化,需要一个向量索引, faiss,nmslib 或 annoy等使用一些近似最近邻方式实现,如聚类,树或 HNSW 算法。还有一些受管理的解决方案,比如 ElasticSearch以及向量数据库,它们负责处理数据摄取的流水线。

根据索引的选择,数据和搜索需求还可以将元数据与向量一起存储,然后使用元数据过滤器在某些日期或数据源中搜索信息。LlamaIndex 支持许多向量存储索引,也支持其他更简单的索引实现,如列表索引、树索引和关键字表索引。

如果有许多文档,就需要能够有效地在其中进行搜索,找到相关信息,并将其聚合在一个带有源引用的答案中。对于大型数据库,一个有效的方法是创建两个索引,一个由摘要组成,另一个由文档块组成,然后分两个步骤进行搜索,首先通过摘要过滤掉相关文档,然后再通过相关组进行搜索。

另一种方法是要求 LLM 为每个块生成一个问题,并将这些问题嵌入到向量中,在运行时对这个问题的向量索引执行查询搜索(在索引中用问题向量替换块向量) ,然后路由到原始文本块并将它们作为 LLM 获得答案的上下文发送。这种方法提高了搜索质量,因为与实际块相比,查询和假设问题之间具有更高的语义相似性。还有一种被称为 HyDE 的反向逻辑方法, 要求一个 LLM 生成一个假设的给定查询的响应,然后使用它的向量和查询向量来提高搜索质量。

为了获得更好的搜索质量而检索更小的块,就要为 LLM 添加周围的上下文。有两种选择,一个是句子窗口检索,即在检索到的较小块周围按句子展开上下文,另一个是父文档检索,即递归地将文档分割成若干较大的父块,其中包含较小的子块。

在句子窗口检索方案中,文档中的每个句子都是单独嵌入,这为上下文余弦距离搜索提供了很高的准确性。在获取最相关的单个句子之后,为了更好地推理找到的上下文,在检索到的句子之前和之后将上下文窗口扩展为k个句子,然后将这个扩展的上下文发送给 LLM。

父文档检索与句子窗口检索非常相似,都是搜索更细粒度的信息,然后在将上下文提供给 LLM 进行推理之前扩展过的上下文窗口。文档被拆分成引用较大父块中的较小子块。具体而言,文档被分割成块的层次结构,然后最小的叶子块被发送到索引。在检索期间,获取较小的块,然后如果在top-k 检索的块中有超过 n 个块链接到同一个父节点(较大的块) ,就用这个父节点替换提供给 LLM 的上下文。需要注意的是,搜索仅在子节点索引中执行。

还有一个相对较老的思路,可以像 tf-idf 或BM25这样的稀疏检索算法那样从现代语义或向量搜索中获取最佳结果,并将其结合在一个检索结果中。这里唯一的技巧是将检索到的结果与不同的相似度得分恰当地结合起来,这个问题通常借助于Reciprocal Rank 融合算法(RRF)来解决,对检索到的结果重新排序以得到最终的输出。

在 LangChain中,这是在集成检索器类中实现的,例如,一个 Faiss 矢量索引和一个基于 BM25的检索器,并使用 RRF 进行重新排序。在 LlamaIndex 中,也是以一种非常类似的方式完成的。

混合或融合搜索通常在考虑查询和存储文档之间有语义相似性和关键字匹配的情况下,将两种互补的搜索算法结合起来,提供更好的检索结果。

3.3. Rerank和过滤

在得到了检索结果后,需要通过过滤来重新排序。LlamaIndex 提供了多种可用的后处理程序,根据相似度评分、关键词、元数据过滤掉结果,或者用其他模型对结果进行重新排序,比如基于句子transformer的交叉编码器、 根据元数据(比如日期最近性)内聚重新排序等等。这是将检索到的上下文提供给 LLM 以获得结果答案之前的最后一步。

3.4. query变换

查询转换是一系列使用 LLM 作为推理引擎来修改用户输入以提高检索质量的技术,有很多不同的技术选择。

如果查询很复杂,LLM 可以将其分解为几个子查询。例如,如果问“ 在Github上Langchain 或 LlamaIndex 上哪个有更多颗星?”,不太可能在语料库中找到直接的对比,将这个问题分解为两个子查询是有意义的,前提是要有更简单和更具体的信息检索,例如 “ Langchain 在 Github 上有多少颗星?”“Llamaindex 在 Github 上有多少颗星?”它们将并行执行,然后将检索到的上下文组合在一个提示语中,以便 LLM 合成对初始查询的最终答案。在 Langchain 作为多查询检索器,在 Llamaindex 作为子问题查询引擎。

后退提示(Step-back prompting)使用 LLM 生成一个更一般的查询,为此检索获得一个更一般或更高级别的上下文,以便将原始查询的答案建立在这个上下文上。此外,还将执行对原始查询的检索,并在最后的应答生成步骤中将两个上下文提供给 LLM。LangChain 有一个参考实现https://github.com/langchain-ai/langchain/blob/master/cookbook/stepback-qa.ipynb。query重写使用 LLM 重新制定初始查询,以提高检索效率。LangChain 和 LlamaIndex 都有实现,但 LlamaIndex 参考实现更强大https://llamahub.ai/l/llama_packs-fusion_retriever-query_rewrite。

如果使用多个来源来生成一个答案,要么是由于初始查询的复杂性,需要必须执行多个子查询,然后将检索到的上下文合并到一个答案中,要么是在多个文档中发现了单个查询的相关上下文,能够准确地反向引用。可以将这个引用任务插入到提示语中,并要求 LLM 提供所使用源的 id,然后将生成的响应部分与索引中的原始文本块匹配,Llamaindex 为这种情况提供了一种有效的基于模糊匹配的解决方案。

3.5. 聊天引擎

构建一个可以在单个查询中多次运行RAG系统的一个重要特性是聊天逻辑,考虑到对话上下文,就像在 LLM 时代之前的经典聊天机器人一样。这是支持后续问题,重复指代,或任意用户命令相关的以前对话上下文所必需的。查询压缩技术可以同时考虑聊天上下文和用户查询。有几种方法可以实现上下文压缩,一种流行且相对简单的 ContextChatEngine,首先检索与用户查询相关的上下文,然后将其连同聊天历史从存缓发送给 LLM,让 LLM 在生成下一个答案时能够意识到前一个上下文。

更复杂的实现是 CondensePlusContextMode,在每次交互中,聊天历史记录和最后一条消息被压缩成一个新的查询,然后这个查询进入索引,检索到的上下文被传递给 LLM连同原始用户消息来生成一个答案。

3.6. query 路由

Query路由是由 LLM 驱动的决策步骤,在给定用户查询的情况下,决定接下来做什么。这些选项通常是总结、针对某些数据索引执行搜索或尝试多种不同的路由,然后在一个答案中综合它们的输出。

Query路由还可以用于选择索引,或者更广泛的数据存储,将用户查询发送到何处,例如,经典的向量存储和图形数据库或关系数据库。对于多文档存储来说,一个非常经典的情况是一个摘要索引和另一个文档块向量索引。

定义Query路由包括设置它可以做出的选择。路由选择是通过一个 LLM 调用来执行的,它以预定义的格式返回结果,用于将查询路由到给定的索引。如果采用了代理的方式,则将查询路由到子链甚至其他代理,如下面的多文档代理方案所示。LlamaIndex 和 LangChain 都支持Query路由。

3.7. RAG中的智能体Agent

智能体Agent几乎自第一个 LLM API 发布以来就一直存在,其想法是为一个能够推理的 LLM 提供一套工具以及需要完成的任务。这些工具可能包括一些确定性函数,比如任何代码函数或外部 API,甚至包括其他代理,这种 LLM 链接思想就是 LangChain 来源。

代理本身就是一个巨大的话题,OpenAI 助手基本上已经实现了很多围绕 LLM 所需的工具,也许最重要的是函数调用 API。后者提供了将自然语言转换为对外部工具或数据库查询的 API 调用的功能。在 LlamaIndex 中,有一个 OpenAIAgent 类将这种高级逻辑与 ChatEngine 和 QueryEngine 结合在一起,提供基于知识和上下文感知的聊天功能,以及一次性调用多个 OpenAI 函数的能力,这确实带来了智能代理的使用方式。

以多文档代理为例,在每个文档上会初始化一个代理(OpenAIAgent) ,能够进行文档摘要和经典的 QA 机制,以及一个顶级总代理,负责将查询路由到文档代理和最终答案合成。每个文档代理都有两个工具ーー向量存储索引和摘要索引,并根据路由查询决定使用哪个工具。该体系结构由每个相关代理做出大量的路由决策。这种方法的好处是能够比较不同的解决方案或实体,这些解决方案或实体在不同的文档及其摘要以及经典的单一文档摘要和QA 机制中进行了描述,这基本上涵盖了最常见的与文档集聊天的使用场景。

该方案由于在内部使用 LLM 进行了多次来回迭代,因此速度有点慢。为了防万一,LLM 调用通过 RAG 流水线中最长的搜索操作来优化速度。因此,对于大型多文档存储,可以对该方案进行一些简化,使其具有可伸缩性。

3.8. 响应合成

响应合成是任何 RAG 流水线的最后一步,根据检索的所有上下文和初始用户查询生成一个答案。最简单的方法是将所有获取的上下文(高于某个相关性阈值)与查询一起连接并提供给 LLM。但是,还有其他更复杂的选项涉及多个 LLM 调用,以细化检索到的上下文并生成更好的答案。响应合成的主要方法有:

  1. 通过逐块向LLM发送检索到的上下文来迭代地细化答案;
  2. 总结检索到的上下文以适应提示;
  3. 根据不同的上下文块生成多个答案,然后将其连接或总结。

有关响应合成的更多信息,可以参考文档中的示例https://docs.llamaindex.ai/en/stable/module_guides/querying/response_synthesizers/root.html。

4. 面向RAG的编码器和大模型微调

对 RAG 流水线中涉及的深度学习模型进行一些微调,一个是负责嵌入质量从而提高上下文检索质量的 Transformer Encoder,另一个负责利用提供的上下文来回答用户查询的 LLM。可以使用 GPT-4这样的高端 LLM 来生成高质量的合成数据集。但是应该始终注意到,采用一个大型数据集进行训练的开源模型,并使用小型合成数据集进行快速调优,可能会削弱模型的总体能力。

较新版本的transformer编码器优化搜索是相当有效的,bge-large-en-v1.5即便在笔记本电脑环境中仍能够有较大的检索质量提升。

4.1编码器微调

一个很好的老选择是有一个交叉编码器。如果不完全信任基本编码器,交叉编码器可以对检索到的结果重新排序。它的工作原理是把查询和每个最高k个检索到的文本块传递给交叉编码器,用一个标记分隔,然后对它进行微调,相关的块输出为1,不相关的块输出为0。这种调整过程可以参考https://docs.llamaindex.ai/en/latest/examples/finetuning/cross_encoder_finetuning/cross_encoder_finetuning.html#。

4.2 大模型微调

最近 OpenAI 开始提供 LLM 微调 API,LlamaIndex 有一个关于在 RAG 设置中微调 GPT-3.5-turbo 以“提取”一些 GPT-4知识的教程。基本思路是获取一个文档,使用 GPT-3.5-turbo 生成一系列问题,然后使用 GPT-4根据文档内容生成这些问题的答案即构建一个基于 GPT4的 RAG 流水线 ,然后在问答对的数据集上对 GPT-3.5-turbo 进行微调。通过对 RAG 流水线的评估,可以初步确定经过微调的 GPT 3.5-turbo 模型比原始模型能够更好地利用所提供的上下文来生成其答案。

在论文 RA-DIT: Meta AI Research 的检索增强双指令优化中,有一种更为复杂的方法,提出了一种在查询、上下文和答案这个三元组上同时优化 LLM 和检索器(原论文中的双重编码器)的技术。这种技术被用于通过微调 API 和 Llama2开源模型来微调 OpenAI LLM (在原论文中) ,导致知识密集型任务指标增加约5% (与使用 RAG 的 Llama265B 相比) ,并且常识推理任务增加了几个百分点。有关实施细节,可以参考https://docs.llamaindex.ai/en/stable/examples/finetuning/knowledge/finetune_retrieval_aug.html#fine-tuning-with-retrieval-augmentation。

5. 面向RAG的性能评估

有几个框架都可以应用于RAG 系统的性能评估,指标包括总体答案相关性、答案溯源性、可信度和检索到的上下文相关性等等。

Ragas框架,使用可信度和答案相关性作为 RAG 检索部分生成答案的质量指标和经典的上下文准召率。评估框架 Truelens 建议采用检索与查询的上下文相关性、答案溯源性以及与查询的答案相关性,将这三个指标作为 RAG 系统的性能评估三元组。其中,关键且最可控的指标是检索到的上下文相关性,其次是答案相关性和溯源性。

LangChain 有一个非常先进的评估框架 LangSmith,可以实现自定义的评估器,还可以跟踪 RAG 流水线的运行状态,以使系统更加透明。而在LlamaIndex 中有一个rag_evaluator的包,提供了一个简便工具使用公共数据集来评估RAG系统。

6. 小结

RAG 系统的主要挑战除了答案的相关性和可信度之外,还有就是速度。然而,还有很多其他事情需要考虑,比如基于网络搜索的 RAG,与Agent架构的深度融合,以及关于 LLM 长期记忆的一些方式方法。即便如此,RAG 仍然有着广泛的应用范围,我们在使用RAG落地应用的时候, 希望本文中提到的这些技术能够对大家有所帮助。

那么,如何系统的去学习大模型LLM?

苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~ , 【保证100%免费

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTFHUB技能树之HTTP协议——响应包源代码

开启靶场,打开链接: 是个贪吃蛇小游戏,看不出来有什么特别的地方 用burp抓包看看情况: 嗯?点击“开始”没有抓取到报文,先看看网页源代码是什么情况 居然直接给出flag了,不知道这题的意义何在 …

pip离线下载和安装第三方库

pip离线下载和安装第三方库 离线下载离线安装 离线下载 下载依赖库(.whl文件),比如下载polars库,并指定重清华源下载,会自动下载依赖的库,并保存到当前目录中,下载命令如下: # 下载…

Intel 新独显 Arc Battlemage 或于10月29日揭晓

原文转载修改自(更多互联网新闻/搞机小知识): Arc Battlemage或于10月29日揭晓 英特尔入局独显市场也好几年了,虽然开局声势和跑分都挺猛,但市场表现不会说谎,上季度趋近于0的市场份额就是答案……不过&am…

字符串及正则表达式

目录 字符串 字符串常用方法: 格格式化字符串的三种方式: 格式化字符串的详细格式: 字符串的编码: 字符串的解码: 数据的验证: 字符串拼接的几种方式: 字符串去重: 正则表达…

notepad++中实现代码整体缩进和退格

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 🎓擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号:乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

【网易云音乐】--源代码分享

最近写了一个网易云音乐的音乐实现部分,是通过JavaScript和jQuery实现的,具体效果大家可以参照下面的视频 源代码分享 - git地址: 网易云音乐源代码 下面将着重讲解一下音乐实现部分 视频有点模糊,不好意思,在b站上添加视频的时候…

CSS进阶-布局(一)

1、文本溢出 <style>.d1 {width: 400px;height: 300px;background-color: antiquewhite;/* 超出部分色设置为可见&#xff0c;默认方式 *//* overflow: visible; *//* 超出部分使用滚动条 *//* overflow: scroll; *//* 如果内容未超出元素则正常显示&#xff0c;超出元素…

免费企业邮箱哪个好:全面对比与推荐烽火!

免费企业邮箱哪个好用&#xff1f;推荐的免费企业邮箱有哪些&#xff1f; 面对市场上众多的免费企业邮箱服务&#xff0c;企业该如何选择&#xff1f;烽火将深入探讨免费企业邮箱哪个好这一问题&#xff0c;通过全面对比与推荐&#xff0c;帮助企业找到最适合自己的邮箱服务。…

OpenCV高级图形用户界面(15)注册一个回调函数来处理鼠标事件的函数setMouseCallback()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 为指定的窗口设置鼠标处理器。 setMouseCallback 是 OpenCV 中的一个功能&#xff0c;允许开发者注册一个回调函数来处理鼠标事件。当用户在窗口…

【前端】如何制作一个自己的网页(6)

接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键&#xff0c;选择【复制图片地址】&#xff0c;即可获得该图片的网络地址。 其实在HTML中&#xff0c;除了图片以外&#xff0c;我们还可以利用地址找到另一个网页。 如右图所示&#…

【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

ComfyUI一键更换服装:IP-Adapter V2 + FaceDetailer(DeepFashion)

在这篇文章中&#xff0c;我们将探索如何使用新版的IP-Adapter和ComfyUI软件为人物进行换装。 整个过程非常简单&#xff0c;仅需要两张图片&#xff1a;一张服装图片和一张人物图片。 通过一系列节点的操作&#xff0c;ComfyUI就会把这个服装换到人物身上&#xff0c;并利用…

【DS】哈希表,哈希桶的实现

目录 哈希概念哈希冲突哈希函数负载因子哈希冲突的解决闭散列开散列 哈希表闭散列的实现哈希表的结构哈希函数构造函数查找插入删除 哈希表开散列的实现哈希表的结构查找插入删除 哈希表的表长建议是素数 平衡二叉树的学习中&#xff0c;学习及模拟实现了AVL树和红黑树&#xf…

python+selenium工具UI自动化全功能介绍(包括工具本身及配合RobotFramework框架和pytest框架应用)

文章较长&#xff0c;各位志同道合的朋友们&#xff0c;感谢关注收藏。 书山有路勤为径&#xff0c;学海无涯苦作舟。 ——韩愈&#xff0c;以山川学海比喻学习的艰辛与努力的方向。 明天的我们&#xff0c;必将会感谢昨日的自己。 1 UI自动化测试 UI自动化测试&#xff08…

长三角月度10m植被指数(NDVI) 数据集(2019-2023年)

长三角月度10m植被指数&#xff08;NDVI) 数据集&#xff08;2019-2023年&#xff09; 数据介绍 植被指数数据是区域可持续研究的重要参考指标。长江三角洲地区是我国发展最快的城市群之一&#xff0c;环境容量在城市建设的过程中被挤压&#xff0c;生态压力逐年增大。归一化植…

【Java】集合中单列集合详解(一):Collection与List

目录 引言 一、Collection接口 1.1 主要方法 1.1.1 添加元素 1.1.2 删除元素 1.1.3 清空元素 1.1.4 判断元素是否存在 1.1.5 判断是否为空 1.1.6 求取元素个数 1.2 遍历方法 1.2.1 迭代器遍历 1.2.2 增强for遍历 1.2.3 Lambda表达式遍历 1.2.4 应用场景 二、…

PostgreSQL Windows系统初始化、登录、创建用户及数据库

文章目录 PostgreSQL初始化PostgreSQL登录 PostgreSQL初始化 initdb 到安装目录下&#xff0c;找到目录E:\postgresql\bin&#xff08;自己的安装目录&#xff09;&#xff0c;在该目录下使用管理员方式打开cmd窗口。 initdb.exe -D "E:\postgresql\bin" E:\postgre…

Android系統Audio hal

一.Android系統Audio hal简介 Android系统的音频硬件抽象层(HAL)是系统与硬件之间的桥梁,允许音频应用和服务访问底层音频硬件,而无需直接与硬件交互。 主要组件: 音频 HAL 接口:定义了应用和服务如何调用音频硬件的规范。典型的音频操作包括播放、录制、音量控制等。 …

【AIGC】解锁高效GPTs:ChatGPT-Builder中系统提示词Prompt的设计与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;系统提示词系统提示词的作用与重要性系统提示词在构建GPTs中的作用结论 &#x1f4af;ChatGPT-Builder系统提示词的详细解读OpenAI为Builder编写的系统提示词系统提示词对…

高质量SCI论文撰写及投稿丨论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等----AI强大功能

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从选题到投稿的全过程&#xff0c;提高论文撰写效率与…