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

检索增强生成架构详解【RAG】

生成式AI技术很强大,但它们受到知识的限制。 虽然像 ChatGPT 这样的LLM可以执行许多任务,但每个LLM的基线知识都存在基于其训练数据的差距。 如果你要求LLM写一些关于最近趋势或事件的文章,LLM不会知道你在说什么,而且回答最好是混合的,坏的情况下往往还是有问题的。

LLM基于知识的问题归结为两个关键问题:

  • LLM 训练数据往往无可救药地过时(截至撰写本文时,ChatGPT 的世界知识将于 2022 年 1 月结束,不包括使用 Bing 浏览和 GPT-4V 等提供额外上下文的功能)。
  • LLM在无法获得事实的情况下进行推断,因此当他们的知识存在差距时(称为幻觉),他们会自信地做出虚假但听起来合理的陈述。

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 

检索增强生成 (RAG:Retrieval Augmented Generation) 是一种有助于解决这两个问题的策略,它将信息检索与一组精心设计的系统提示相结合,将LLM锚定在从外部知识存储检索的精确、最新和相关信息上。 尽管LLM训练数据保持静态,但利用这种背景知识提示LLM可以创建需要对事实进行深入且不断发展的理解的特定领域应用程序。

你可以问LLM“什么是 RAG?”,根据LLM本身是否使用 RAG,可能会得到截然不同的答案:

“RAG是什么?” 有RAG的LLM响应:

RAG(检索增强生成)是 Meta AI 研究人员引入的一种方法,它将信息检索组件与文本生成器模型相结合,以解决知识密集型任务。 可以有效地修改其内部知识,而无需重新训练整个模型。 您想了解更多详细信息吗?

“RAG是什么?” 没有 RAG 的LLM响应:

根据上下文,RAG 可以指多种不同的事物。 以下是一些常见的含义:

1. 红色、琥珀色、绿色 (RAG):在项目管理和报告中,RAG 是一种颜色编码系统,用于快速传达项目或任务的状态或运行状况。
2. RAG分析:这是一种用于风险评估或决策的方法。 它涉及根据风险或选项的严重程度、影响或可取性将其分类为红色、琥珀色或绿色。 它有助于优先考虑行动或选择。
3. 随机访问生成器 (RAG):在某些技术背景下,RAG 可能指生成随机访问模式或数据的系统或算法,通常用于计算机科学或信息检索。
4.资源分配图(RAG):在操作系统和计算机科学的背景下,资源分配图用于死锁检测。 它是一个有向图,表示系统中进程之间的资源分配和请求关系。

如果你有特定的上下文或领域,请提供更多详细信息,我可以在该上下文中为你提供有关“RAG”的更准确的解释。

使用和不使用 RAG 来回答这个问题有很大区别。 特别是在涉及特定领域知识(如首字母缩略词)的情况下,RAG 可以极大地提高LLM回答的准确性。

如果你与了解最近事件、了解用户特定信息或对某个主题比正常情况有更深入了解的聊天机器人进行过交互,那么很可能在没有意识到的情况下与 RAG 进行了交互。 如果你看过有关“通过文档聊天”的教程,那么这就是 RAG 最简单的版本。 LangChain 和 LlamaIndex 等框架使快速创建简单的知识感知应用程序成为可能,从而实现了 RAG 的民主化。

我开发并实现了 Skyflow 内部的 LLM 应用程序,包括使用 RAG 的系统。 由于 RAG 几乎无处不在,并且不会很快消失,因此了解 RAG 的基础知识以及当你想要将代码转移到生产环境时如何超越这些基础知识非常重要。 我邀请你学习我在 RAG 旅程中的经验,这样你就不必经历艰难的摸索过程。

1、一个最小RAG示例

LangChain 提供了一个 RAG 最小(但不是最简单)形式的示例:

from langchain.document_loaders import WebBaseLoader
from langchain.indexes import VectorstoreIndexCreator
loader = WebBaseLoader("https://www.promptingguide.ai/techniques/rag")
index = VectorstoreIndexCreator().from_loaders([loader])
index.query("What is RAG?")

通过这五行代码,我们得到了 RAG 的描述,但代码是高度抽象的,因此很难理解实际发生的情况:我们获取网页的内容(本示例的知识库)。

  • 我们处理源内容并将它们存储在知识库(在本例中为矢量数据库)中。
  • 我们输入一个提示,LangChain从知识库中查找一些信息,并将提示和知识库结果传递给LLM。

虽然此脚本有助于原型设计和理解使用 RAG 的主要节拍,但它对于超越该阶段并不是那么有用,因为你没有太多控制权。 让我们讨论一下实际执行的内容。

2、LLM+RAG基本架构

由于完整的 LLM 应用程序架构相当大,因此我们将仅考虑启用 RAG 的组件:

  • 编排层接收用户在任何关联元数据(如对话历史记录)中的输入,与所有相关工具交互,将提示发送给 LLM,并返回结果。 编排层通常由 LangChain、Semantic Kernel 等工具组成,并使用一些本机代码(通常是 Python)将它们编织在一起。
  • 检索工具是一组返回上下文的实用程序,这些上下文通知用户提示并对用户提示进行响应。 该组包括知识库和基于 API 的检索系统。
  • LLM 是你向其发送提示的大型语言模型。 它们可能由 OpenAI 等第三方托管,也可能在你自己的基础设施中内部运行。 就本文而言,你使用的具体模型并不重要。

在典型的LLM应用程序中,你的推理处理脚本会根据需要连接到检索工具。 如果你正在构建基于 LLM 代理的应用程序,则每个检索实用程序都会作为工具向你的代理公开。 从这里开始,我们将只讨论典型的基于脚本的用法。

当用户触发你的推理流程时,编排层会将必要的工具和 LLM 结合在一起,以从你的检索工具中收集上下文并生成上下文相关的知情响应。 编排层处理所有 API 调用和特定于 RAG 的提示策略(我们很快就会谈到)。 它还执行验证,例如确保你没有超出 LLM 的令牌限制,这可能会导致 LLM 拒绝你的请求,因为你在提示中填充了太多文本。

3、知识库检索

要查询数据,你不仅需要数据,还需要应用程序可以访问的格式。 对于基于 LLM 的应用程序,这通常涉及向量存储 - 一个可以基于文本相似性而不是精确匹配进行查询的数据库。

将数据从源格式转换为矢量存储需要 ETL(提取、转换、加载)管道。

  • 汇总源文档。 你需要收集希望可用于你的应用程序的任何内容。 对于我在 Skyflow 的私有LLM方面的工作,这包括我们的产品文档、白皮书和博客文章,但这可以轻松扩展到内部记录、规划文件等。
  • 清理文档内容。 如果有任何东西不应该对LLM提供者或你的应用程序的最终用户可见,现在你有机会将其删除。 在此过程中,删除个人身份信息 (PII)、机密信息和正在开发的内容。 此步骤之后剩下的任何内容对于后续训练和推理过程的所有阶段都将是可见的。 Skyflow GPT Privacy Vault 可以帮助你对文档内容进行去标识化,以确保你的训练数据不含敏感信息。
  • 将文档内容加载到内存中。 Unstructed、LlamaIndex 和 LangChain 的文档加载器等工具可以将各种文档类型加载到你的应用程序中,特别是非结构化内容。 无论是文本文档、电子表格、网页、PDF、Git 存储库还是数百种其他内容,都可能有一个加载程序。 但要小心,因为并非所有加载器都是一样的,有些加载器比其他加载器加载更多的内容或上下文。 例如,一个加载器可能从电子表格中的多个工作表加载内容,而另一个加载器仅从第一个工作表加载内容。
  • 将内容分成块。 当你分割你的内容时,你把它分成小的、一口大小的片段,这些片段可以适应LLM提示,同时保持意义。 有多种方法可以分割内容。 LangChain 和 LlamaIndex 都有可用的文本分割器,默认情况下按空格字符和句子递归分割,但你需要使用最适合你的内容的方法。 对于我的项目,我发现用 Markdown 编写的文档即使使用 LangChain 的 Markdown 拆分器也会丢失太多上下文,因此我编写了自己的拆分器,根据 Markdown 的标题和代码块标记对内容进行分块。
  • 为文本块创建嵌入。 嵌入存储向量—一个文本块的相对位置以及与其他附近文本块的关系的数字表示。 虽然这很难想象,但庆幸的是创建嵌入很容易。 OpenAI 提供嵌入模型,LangChain 和 LlamaIndex 提供各种托管或自托管嵌入选项,或者您也可以使用 SentenceTransformers 等嵌入模型自行完成。
  • 将嵌入存储在向量存储中。 获得嵌入后,你可以将它们添加到矢量存储中,例如 Pinecone、Weaviate、FAISS、Chroma 或众多其他选项。

存储向量后,你可以查询向量存储并查找与你的查询最相似的内容。 如果您需要更新或添加源文档,大多数向量数据库都允许更新存储。 这意味着你还可以从矢量存储中删除内容,这是微调模型时无法执行的操作。

你可以再次运行管道来重新创建整个知识库,虽然这比重新训练模型成本更低,但它仍然耗时且效率低下。 如果你希望定期更新源文档,请考虑创建文档索引流程,以便仅处理管道中的新文档和最近更新的文档。

4、基于API的检索

从向量存储中检索并不是唯一的检索类型。 如果你有任何允许编程访问的数据源(客户记录数据库、内部票务系统等),请考虑让你的编排层可以访问它们。 在运行时,你的编排层可以查询基于 API 的检索系统,以提供与当前请求相关的其他上下文。

5、使用 RAG 提示

设置好检索工具后,就可以使用一些编排层魔法将它们编织在一起。

首先,我们将从提示模板开始。 提示模板包含你想要作为提示的一部分传递给 LLM 的所有信息的占位符。 系统(或基本)提示符告诉LLM如何表现以及如何处理用户的请求。 一个简单的提示模板可能如下所示:

System: You are a friendly chatbot assistant that responds in a conversational
manner to users' questions. Respond in 1-2 complete sentences, unless specifically
asked by the user to elaborate on something. Use History and Context to inform your answers.
---
History: {history}
---
Context: {context}
---
User: {request}

当你的最终用户提交请求时,你就可以开始填写变量。 如果用户提交“什么是RAG?”,你可以填写请求变量。 你可能会随请求一起获得对话历史记录,因此也可以填写该变量:

System: You are a friendly chatbot assistant that responds in a conversational
manner to user's questions. Respond in short but complete answers unless specifically
asked by the user to elaborate on something. Use History and Context to inform your answers.
---
History: [{"role": "assistant", "message": "Hi! How can I help you?"}]
---
Context: {context}
---
User: What is RAG?

接下来,调用你的检索工具,无论它们是矢量存储还是其他 API。 一旦你掌握了上下文(知识库结果、客户记录等),就可以更新上下文变量,以便在推理过程中为 LLM 提供信息和基础。

注意:如果你的 RAG 实施中包含多种类型的数据,请确保对它们进行标记,以帮助LLM区分它们。

System: You are a friendly chatbot assistant that responds in a conversational
manner to user's questions. Respond in short but complete answers unless specifically
asked by the user to elaborate on something. Use History and Context to inform your answers.
---
History: [{"role": "assistant", "message": "Hi! How can I help you?"}]
---
Context: [Document(page_content='Meta AI researchers introduced a method called [Retrieval Augmented Generation](https://ai.facebook.com/blog/retrieval-augmented-generation-streamlining-the-creation-of-intelligent-natural-language-processing-models/) (RAG) to address such knowledge-intensive tasks. RAG combines an information retrieval component with a text generator model. RAG can be fine-tuned and its internal knowledge can be modified in an efficient manner and without needing retraining of the entire model.', metadata={'source': 'https://www.promptingguide.ai/techniques/rag', 'title': 'Retrieval Augmented Generation (RAG)'})]
---
User: What is RAG?

上下文就位后,提示模板已填写,但你仍然有两个后处理任务需要完成:

  • 就像清理源数据一样,你也需要清理提示。 即使你的数据是干净的,用户也可以在其请求中输入 PII,你且您不希望用户的信息最终出现在 LLM 操作员的日志或数据存储中。 如果你没有清理源数据,这也可以作为一种保障。 除了对数据集和提示进行去识别化之外,Skyflow GPT Privacy Vault 还可以在你向用户发送响应之前重新识别 LLM 响应中的敏感值。
  • 确保你没有超出LLM的令牌数量限制,否则你的推理尝试将会失败。 在尝试推理之前,请使用令牌计算器(例如 tiktoken),以确保你处于 LLM 特定的限制范围内。 你可能必须减少包含的上下文数量以适应令牌限制。

一旦你的提示被清理并在令牌限制内,就可以通过将提示发送到你选择的LLM来执行推理。 当你收到响应时,它应该根据你提供的上下文进行通知,并且你可以将其发送回用户。

6、提高性能

现在你的应用程序中已经有了 RAG,你可能希望立即投入生产。 还不做! 或者,你可能对所得到的结果并不那么兴奋。 不用担心,你可以采取以下一些措施来提高 RAG 性能并做好生产准备:

  • 垃圾进垃圾出。 你提供的上下文质量越高,收到的结果质量就越高。 清理源数据以确保数据管道维护足够的内容(例如捕获电子表格列标题),并确保删除不必要的标记,以免干扰LLM对文本的理解。
  • 调整你的分块策略。 尝试不同的文本块大小,以确保启用 RAG 的推理保持足够的上下文。 每个数据集都是不同的。 创建不同的分割向量存储,看看哪一个最适合你的架构。
  • 调整你的系统提示。 如果LLM没有对你的上下文给予足够的重视,请更新你的系统提示,并期望如何处理和使用所提供的信息。
  • 过滤你的向量存储结果。 如果你想要或不想返回特定类型的内容,请根据元数据元素值过滤矢量存储结果。 例如,如果你需要一个流程,可以根据 docType 元数据值进行筛选,以确保你的结果来自操作文档。
  • 尝试不同的嵌入模型(并微调自己的模型)。 不同的嵌入模型有不同的编码和比较数据向量的方式。 进行实验,看看哪一种最适合你的应用。 你可以在 MTEB 排行榜上查看当前性能最佳的开源嵌入模型。 如果喜欢冒险,你还可以微调自己的嵌入模型,以便你的 LLM 更加了解特定于领域的术语,从而为你提供更好的查询结果。 是的,你绝对可以使用清理和处理的知识库数据集来微调你的模型。

7、微调

在结束之前,让我们先讨论另一个与 LLM 相关的流行语:微调。

微调和 RAG 提供了两种不同的方法来优化 LLM。 虽然 RAG 和微调都利用源数据,但它们都有独特的优势和需要考虑的挑战。

微调是一个继续使用附加数据训练模型的过程,使其在数据集详细说明的特定任务和领域上表现更好。 然而,单一模型不可能在所有方面都是最好的,并且与微调任务无关的任务通常会随着额外的训练而降低性能。 例如,微调是创建特定于代码的 LLM 的方式。 Google 的 Codey 在各种语言的代码示例精选数据集上进行了微调。 这使得 Codey 在编码任务方面的表现明显优于 Google 的 Duet 或 PaLM 2 模型,但代价是聊天性能一般。

相反,RAG 通过从外部知识库检索到的相关和当前信息来增强LLM。 这种动态增强使LLM能够克服静态知识的局限性,并生成更明智、更准确且与上下文相关的响应。 然而,外部知识的集成会增加计算复杂性、延迟和提示复杂性,可能导致推理时间更长、资源利用率更高和开发周期更长。

RAG 在一个特定领域比微调效果要好:遗忘。 当你微调模型时,训练数据将成为模型本身的一部分。 你无法隔离或删除模型的特定部分。 LLM 不能忘记。 但是,矢量存储允许你添加、更新和删除其内容,因此你可以随时轻松删除错误或过时的信息。

微调和 RAG 一起可以创建专门针对特定任务或领域并能够使用上下文知识的 LLM 支持的应用程序。 考虑 GitHub Copilot:它是一个经过微调的模型,专门从事编码,并使用你的代码和编码环境作为知识库,为你的提示提供上下文。 因此,Copilot 往往适应性强、准确且与你的代码相关。 另一方面,Copilot 基于聊天的响应据说比其他模型需要更长的时间来处理,并且 Copilot 无法协助完成与编码无关的任务。

8、结束语

RAG 代表了增强LLM能力的实用解决方案。 通过将实时外部知识集成到 LLM 响应中,RAG 解决了静态训练数据的挑战,确保所提供的信息保持最新且与上下文相关。

展望未来,将 RAG 集成到各种应用程序中有望显着改善用户体验和信息准确性。 在当今时代,及时了解最新动态至关重要,RAG 提供了一种可靠的方法来让法学硕士了解情况并保持高效。 采用 RAG 的实用性使我们能够自信而精确地应对现代人工智能应用的复杂性。


原文链接:检索增强生成架构剖析 - BimAnt

相关文章:

检索增强生成架构详解【RAG】

生成式AI技术很强大,但它们受到知识的限制。 虽然像 ChatGPT 这样的LLM可以执行许多任务,但每个LLM的基线知识都存在基于其训练数据的差距。 如果你要求LLM写一些关于最近趋势或事件的文章,LLM不会知道你在说什么,而且回答最好是混…...

高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能

Live Wallpaper & Themes 4K mac是一款提供各种高清动态壁纸和主题的应用程序。该应用程序提供了大量的动态壁纸和主题,包括自然、动物、城市、抽象等各种类别,可以满足用户不同的需求。除了壁纸和主题之外,该应用程序还提供了许多其他功…...

Kafka配置SASL认证密码登录

​​​​​​1、修改config/server.properties,添加如下内容 listenersSASL_PLAINTEXT://内网ip:9092 advertised.listenersSASL_PLAINTEXT://外网ip:9092 security.inter.broker.protocolSASL_PLAINTEXT sasl.mechanism.inter.broker.protocolPLAIN sasl.enabled.…...

两年功能五年自动化测试面试经验分享

最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时…...

大数据基础设施搭建 - Kafka(with ZooKeeper)

文章目录 一、简介二、单机部署2.1 上传压缩包2.2 解压压缩包2.3 修改配置文件(1)配置zookeeper地址(2)修改kafka运行日志(数据)存储路径 2.4 配置环境变量2.5 启动/关闭2.6 测试(1)查看当前服务器中的所有…...

[JVM] 京东一面~说一下Java 类加载过程

系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证&#xf…...

2023 年 认证杯 小美赛 ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 cs数模团队在认证杯 小美赛前为大家提供了许多资料的内容呀&am…...

N-134基于java实现捕鱼达人游戏

开发工具eclipse,jdk1.8 文档截图&#xff1a; package com.qd.fish;import java.awt.Graphics; import java.io.File; import java.util.ArrayList; import java.util.List;import javax.imageio.ImageIO;public class Fishes {//定义一个集合来管理鱼List<Fish> fish…...

MTK联发科MT6762/MT6763/MT6765安卓核心板参数规格比较

MT6762安卓核心板 MTK6762安卓核心板是一款工业级高性能、可运行 android9.0 操作系统的 4G智能模块。 CPU&#xff1a;4xCortex-A53 up to 2.0Ghz/4xCortex-A53 up to 1.5GhzGraphics&#xff1a;IMG GE8320 Up to 650MhzProcess&#xff1a;12nmMemory&#xff1a;1xLP3 9…...

仿ChatGPT对话前端页面(内含源码)

仿ChatGPT对话前端页面&#xff08;内含源码&#xff09; 前言布局样式和Js部分关键点全部源码 前言 本文主要讲解如何做出类似ChatGPT的前端页面。具体我们的效果图是长这样&#xff0c;其中除了时间是动态的之外&#xff0c;其他都是假数据。接下来让我们从布局和样式的角度…...

js粒子效果(一)

效果: 代码: <!doctype html> <html> <head><meta charset"utf-8"><title>HTML5鼠标经过粒子散开动画特效</title><style>html, body {position: absolute;overflow: hidden;margin: 0;padding: 0;width: 100%;height: 1…...

程序员必备工具篇 / 程序员必备基础:Git

前言 掌握 Git 命令是每位程序员必备的基础,之前一直是用 smartGit 工具,直到看到大佬们都是在用 Git 命令操作的,回想一下,发现有些 Git 命令我都忘记了,于是写了这篇博文,复习一下~ https://github.com/whx123/JavaHome 公众号:顺哥轻创 文章目录 Git 是什么?Git …...

MacBook使用指南

一、安装及卸载Windows系统 1、卸载Windows系统 步骤① 点击下侧任务栏中的“启动台”&#xff0c;进入程序坞&#xff0c;点击"其他",选择“启动转换助理” 步骤② 点击“继续”&#xff0c;接着点击“恢复”&#xff0c;即可卸载Windows系统 2、安装Windows系统 …...

数据库的事务的基本特性,事务的隔离级别,事务隔离级别如何在java代码中使用,使用MySQL数据库演示不同隔离级别下的并发问题

文章目录 数据库的事务的基本特性事务的四大特性(ACID)4.1、原子性&#xff08;Atomicity&#xff09;4.2、一致性&#xff08;Consistency&#xff09;4.3、隔离性&#xff08;Isolation&#xff09;4.4、持久性&#xff08;Durability&#xff09; 事务的隔离级别5.1、事务不…...

Robust taboo search for the quadratic assignment problem-二次分配问题的鲁棒禁忌搜索

文章目录 摘要关键字结论研究背景1. Introduction 常用基础理论知识2. The quadratic assignment problem3. Taboo search3.1. Moves3.2 Taboo list3.3. Aspiration function3.4. Taboo list size4. Random problems5. Parallel taboo search 研究内容、成果7. Conclusion 潜在…...

Linux:创建进程 -- fork,到底是什么?

相信大家在初学进程时&#xff0c;对fork函数创建进程一定会有很多的困惑&#xff0c;比如&#xff1a; 1.fork做了什么事情?? 2.为什么fork函数会有两个返回值?3.为什么fork的两个返回值&#xff0c;会给父进程谅回子进程pid&#xff0c;给子进程返回0?4.fork之后:父子进…...

基于SpringBoot+vue的token验证

后端&#xff1a; 1&#xff0c;写一个验证token的拦截器 import com.fasterxml.jackson.databind.ObjectMapper; import com.ffyc.news.model.CommonData; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; impor…...

Clickhouse设置多磁盘存储策略

设置多磁盘存储 clickhouse安装完成以后&#xff0c;配置了一个默认的存储空间&#xff0c; 这个只能配置一个目录&#xff0c;如果要使用多个磁盘目录&#xff0c;则需要配置磁盘组策略 查看当前的存储策略 select name, path, formatReadableSize(free_space) as free, fo…...

Python开发运维:Django 4.2.7 使用Celery 5.3.5 完成异步和定时任务

目录 一、实验 1.Django使用Celery完成异步和定时任务 二、问题 1. 如何查看Django版本 一、实验 1.Django使用Celery完成异步和定时任务 (1)安装Django (2)新建Django项目 (3)初始框架 (4)urls.py引用视图views from django.contrib import admin from django.urls imp…...

媒体增加日活量的有效策略

随着数字媒体的蓬勃发展&#xff0c;提高日活量成为媒体平台追求的重要目标之一。日活量的增加不仅意味着更广泛的影响力&#xff0c;还能为媒体平台带来更多的商业机会。以下是一些有效的策略&#xff0c;可帮助媒体提高日活量&#xff1a; admaoyan猫眼聚合 内容优质化&#…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...