论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址:Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy

摘要

        检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而,检索器很难捕捉相关性,尤其是对于具有复杂信息需求的查询。最近的工作提出通过让大型语言模型积极参与检索来改进相关性建模,即用生成来指导检索。在本文中,我们证明了通过我们称之为ITER-RETGEN的方法可以实现强大的性能,该方法以迭代的方式协同检索和生成:模型对任务输入的响应显示了完成任务可能需要的内容,因此可以作为检索更相关知识的信息上下文,从而有助于在另一次迭代中生成更好的响应。与最近在完成单个输出时将检索与生成交织在一起的工作相比,ITERRETGEN将所有检索到的知识作为一个整体进行处理,并在很大程度上保持了生成的灵活性,而没有结构约束。我们在多跳问答、事实验证和常识推理方面对ITER-RETGEN进行了评估,并表明它可以灵活地利用参数知识和非参数知识,优于或与最先进的检索增强基线竞争,同时减少了检索和生成的开销。我们可以通过生成增强检索自适应来进一步提高性能。

1 引言

        生成型大型语言模型(LLM)为许多应用程序提供了强大的功能。尽管LLM很强大,但它们缺乏在训练数据中被低估的知识,并且容易产生幻觉,尤其是在开放领域环境中(OpenAI,2023)。

        因此,检索增强LLM引起了广泛关注,因为LLM的输出可能基于外部知识。

        先前的检索增强型LMs(Izacard等人,2022b;Shi等人,2023)通常采用一次性检索,即仅使用任务输入(例如,用于开放域问答的用户问题)来检索知识。如果原始输入中明确说明了信息需求,则一次性检索应足以满足这些信息需求,这适用于事实问答(Kwiatkowski et al.,2019)和单跳事实验证(Thorne et al.,2018),但不适用于具有复杂信息需求的任务,例如多跳推理(Yang et al,2018)和长形式问答(Fan et al。2019)。

        为了满足复杂的信息需求,最近的工作建议在整个生成过程中多次收集所需的知识,使用部分生成(Trivedi等人,2022a;Press等人,2022)或前瞻性句子(Jiang等人,2023)作为搜索查询。然而,这种将检索与生成交织在一起的结构化工作流具有以下局限性:(1)由于中间生成以之前检索的知识为条件,而对之后检索的知识没有任何意识,因此在生成过程中,它们无法将所有检索的知识作为一个整体进行处理;(2) 它们需要多轮检索来收集一组全面的知识,并且可能通过更新新检索的知识来频繁地改变提示,从而增加了检索和生成的开销。

        在本文中,我们发现通过迭代检索生成协同作用来增强检索增强LLM是简单但有效的(ITER-RETGEN,图1)。ITER-RETGEN迭代检索增强生成和生成增强检索:检索增强生成基于所有检索到的知识输出对任务输入的响应(最初使用任务输入作为查询)。该输出显示了完成任务可能需要的内容,因此可以作为检索更多相关知识的信息上下文,即生成增强检索。新检索到的知识可以有利于检索增强生成的另一次迭代。我们还可以利用模型生成来调整检索,通过将知识从能够访问模型生成的重新排序器提取到仅能够访问任务输入的密集检索器,这在用户输入可以很容易地收集,但相关知识或期望输出没有注释的情况下可能是有益的。

图1:ITER-RETGEN迭代检索和生成。在每次迭代中,ITER-RETGEN利用上一次迭代的模型输出作为特定上下文,以帮助检索更多相关知识,这可能有助于改进模型生成(例如,校正该图中Hesse Hogan的高度)。为了简洁起见,我们在此图中只显示了两次迭代。实心箭头将查询连接到检索到的知识,虚线箭头表示检索增强生成。

        我们在三个任务上评估了我们的方法,包括多跳问题回答、事实验证和常识推理。我们的方法提示LLM生成一系列推理步骤,然后在少样本设置下得出最终答案。对于上下文演示,我们专注于解决问题,并遵循Wei等人(2022)对思想链进行注释,而没有明确考虑生成增强检索可能受到的影响,这使得它在概念上简单易实现。我们的方法在六个数据集中的四个数据集上实现了比以前最先进的检索增强方法高达8.6%的绝对增益,同时在其余两个数据集中具有竞争力。根据我们的实验,生成通常受益于更多的迭代,两次迭代可以获得最大的性能增益。可以通过选择适当数量的迭代来定制性能成本权衡。我们可以通过上述生成增强检索自适应来进一步提高性能并减少迭代。

        我们将研究结果总结如下:

  • 诸如精确匹配(EM)之类的自动度量可能会大大低估LLM在问答任务中的性能。此外,精确匹配的改进并不总是反映出生成的改进。使用LLM的评估可能更可靠。

  • ITER-RETGEN优于或与最先进的检索增强方法竞争,同时更简单,检索和生成的开销更少。通过生成增强检索自适应,我们可以进一步提高性能,还可以减少开销(通过减少迭代)。

  • LLM最好能有效利用参数知识和非参数知识。ITER-RETGEN在问答任务中始终优于Self Ask,无论非参数知识是否提及答案。

2 相关工作

        最近几个月,LLM驱动的应用程序激增,如ChatGPT、Bing Chat和CoPilot(Chen等人,2021)。LLM在表现出前所未有的性能水平的同时,也受到以下限制:(1)由于对计算和数据的高需求,持续高效地更新LLM仍然是一个悬而未决的研究问题(Scialom等人,2022);(2) LLM也倾向于产生幻觉(OpenAI,2023),即生成看似合理但非事实的文本。为了缓解这些问题,越来越多的趋势是使用工具(Mialon等人,2023;Gou等人,2022),例如代码解释器(Gao等人,2022b;Shao等人,2020)或搜索引擎(Nakano等人,2021)来扩充LLM,试图将子任务交给更合格的专家,或通过提供更相关的信息来丰富LLM的输入上下文。

        检索增强是LLM与外部世界连接的主流方向。先前的检索增强LMs(Izacard和Grave,2021;Shao和Huang,2022)通常以被动的方式接收检索到的知识:在没有LMs干预的情况下,基于任务输入检索知识。由于检索器很难捕捉相关性,特别是在零样本环境中,最近的工作表明,LLM积极参与检索以改进相关性建模,例如,为模型生成的检索提供特定上下文(例如,生成的搜索查询(Nakano等人,2021;Press等人,2022;Yao等人,2022)、部分生成(Trivedi等人,2022a)或前瞻性句子(Jiang等人,2023))。Khattab等人(2022)提出了一种支持各种检索增强方法的DSP编程框架。

        最近的工作在完成单个输出时将检索与生成交织在一起。这种结构化的工作流程可能会降低生成的灵活性(Yao等人,2022)。ITER-RETGEN避免了用检索来中断生成,而是迭代检索和生成,即利用上一次迭代的完整生成来检索更多相关信息,有助于改进下一次迭代中的生成。ITER-RETGEN还具有在生成过程中将所有检索到的知识作为一个整体进行处理的优势,并且在概念上更简单、更容易实现,同时在多跳问答、事实验证和常识推理方面具有较强的经验。

        一项名为GAR的密切相关的工作(Mao等人,2021)用生成的背景信息增强了查询。HyDE(Gao et al,2022a)也有类似的精神,但专注于零样本信息检索,并建议首先提示LLM生成涵盖回答给定问题所需信息的“假设”段落,然后使用生成的段落来检索真实段落。RepoCoder(Zhang et al,2023)专注于存储库级别的代码完成,并提出了一种两次迭代的检索生成范式,其中第二次迭代利用中间代码完成进行检索。相比之下,我们建议在各种自然语言任务上与ITER-RETGEN协同进行检索和生成,并探索如何进一步调整检索与模型生成。

3 迭代检索生成协同

3.1 概述

        给定问题q和检索语料库D={d},其中d是段落,ITER-RETGEN重复T次迭代的检索生成;在迭代t中,我们(1)利用上一次迭代的生成y_{t-1},与q连接,来检索前k个段落,然后(2)提示LLMM生成输出y_{t},将检索到的段落(表示为D_{y_{t-1}||q})和q集成到提示中。因此,每次迭代可以公式化如下:

        最后一个输出y_{T}将作为最终响应产生。

3.2 生成增强检索

        有许多自然语言任务具有复杂的信息需求。例如,在开放域多跳问答中,特定的信息需求只有在正确回答了一些先决条件的子问题后才能显现出来。换言之,原始问题q与其支持知识之间可能存在语义差距,这是具有表示瓶颈的检索器无法有效解决的。在第一次迭代中,我们只能用问题q来检索知识。在以后的迭代中,上一次迭代的LLM输出虽然不能保证正确性,但显示了回答问题可能需要什么,因此可以用来弥合语义差距;随着检索的改进,LLM可能会产生更好的输出。

3.3 检索增强生成

        在每次迭代中,我们使用思想链提示生成一个输出,除了我们还为问题q准备检索到的知识。尽管可能存在更先进的提示变体,例如,将前几次生成整合到提示中以实现直接改进,但我们将探索留给未来的工作,并专注于以直接的方式研究检索和生成之间的协同作用。

3.4 生成增强检索自适应

        模型生成不仅为检索提供了特定的上下文,还可以用来优化检索器,以便检索器更好地捕捉问题中的信息需求。

        密集检索器我们在实验中采用了密集检索。给定由\theta = \theta _{q},\theta _{d}参数化的稠密检索器,其中θq和θd分别表示查询编码器和段落编码器的参数,查询和段落之间的相似性得分计算为其编码向量的内积:

        重新排序器 重新排序器,参数化为\phi,输出段落与查询相关的概率;我们将概率表示为s_{\phi }=(q,d)

        蒸馏 重新排序器通常比检索器更善于捕捉查询和段落之间的相关性。因此,我们将知识从一个重新排序者提炼为一个检索者。为了帮助检索器更好地解决问题与其支持知识之间的语义差距,我们允许重新排序器访问y_{1}(其中y_{1}是第一次迭代的LLM输出)。我们使用以下训练目标仅优化检索器的查询编码器:

        其中KL(·,·)表示两个概率分布之间的KL散度。

4 实验

4.1 数据集

        我们在三个推理任务的六个数据集上进行了实验:(1)多跳问答,包括HotPotQA(Yang等人,2018)、2WikiMultiHopQA(Ho等人,2020)、MuSiQue(Trivedi等人,2022b)和Bamboogle(Press等人,2022)。

        关于MuSiQue,我们遵循Press等人(2022),仅使用2个问题;(2) 事实核查,包括Feverous(Aly等人,2021);(3) 常识推理,包括战略QA(Geva等人,2021)。示例如表1所示。

        我们分别使用2017年10月(Yang等人,2018)和2018年12月(Karpukhin等人,2020)的维基百科转储作为HotPotQA和2WikiMultiHopQA的检索语料库,并将2021年12月的维基百科转储(Izacard等人,2022b)用于其他数据集。

4.2 评估设置

        我们对Bamboogle的所有125个问题、StrategyQA训练集的前500个问题以及其他数据集开发集的前五百个问题进行了评估。

        所有方法都是在3个热点设置下进行评估的,在演示中共享相同的问题。

        评估指标是多跳问答数据集的精确匹配(EM)和F1,以及事实验证和常识推理数据集的准确性。为了进行更稳健的评估,我们还使用text-davinci-003评估模型输出的正确性,所得度量表示为Acc†。用于评估的提示如下,其中{question}、{model output}和{answer}是占位符。

表1:来自六个数据集的示例问题。

4.3 基线

        直接提示(Brown等人,2020) 提示LLM在没有解释的情况下直接生成最终答案。当用检索来增强直接提示时,我们使用问题来检索知识,这些知识将放在提示中的问题之前。

        CoT提示(Wei等人,2022)提示LLM生成自然语言推理步骤,然后是最终答案。

        ReAct(Yao et al,2022)将推理、行动和观察步骤交织在一起,直到达到最终确定答案的行动。一个操作可以是生成查询以搜索信息,也可以是最终确定答案。观察是检索到的段落的串联。

        Self-Ask(Press等人,2022)交错(i)后续问题生成,(ii)使用后续进行检索,以及(iii)以检索到的知识为条件回答后续,直到不再生成后续问题,LLM给出原始问题的答案。我们遵循(Yoran等人,2023),在原始问题的前面加上新检索到的段落。在我们评估的任务中,Self-Ask在概念上与ReAct相似,主要区别在于Self-Asc在提示中的原始问题之前积累检索到的知识,而ReAct则将检索到的信息放在其查询之后。Self-Ask和IRCoT(Trivedi等人,2022a)也共享协同推理和检索的精神。

        DSP(Khattab等人,2022)包括多跳检索阶段和答案预测阶段。对于检索阶段中的每一跳,都会提示模型生成搜索查询并总结检索知识以供后续使用。在预测阶段,DSP根据总结的知识和检索到的文档使用CoT生成答案。

4.4 实现细节

        我们使用了InstructGPT的text-davinci-003版本(欧阳等人,2022)作为后端LLM。

        我们还在附录A中介绍了使用开源Llama-2模型(Touvron等人,2023)的实验。所有实验都使用了贪婪解码。

        对照MSMARCO(Izacard等人,2022a)用于检索。我们检索了每个查询的前5个段落。对于ReAct和Self Ask,我们最多允许5次与检索交互。我们对DSP1的实现进行了调整,使其使用与其他方法相同的生成模型和检索系统。

        请注意,ITER-RETGEN的第一次迭代是CoT提示和检索增强。因此,ITER-RETGEN和CoT提示共享相同的注释上下文演示。所有提示均显示在附录中。

4.5 主要结果

        如表2所示,ITER-RETGEN(T≥2)的Acc†显著高于HotPotQA、2WikiMultiHopQA、Bamboogle和StrategyQA上的检索改进基线,同时与MuSiQue和Feverous上的最佳方法(即Self -Ask)具有竞争力。

        当增加ITER-RETGEN的迭代次数时,性能通常会提高,第二次迭代会带来最大的提升。

表2:多跳问答、事实验证和常识推理数据集的评估结果。

Acc†是用text-davinci-003评估的模型输出的准确性。对于ITER-RETGEN,我们评估了不同迭代(最多7次迭代)中的LLM输出。带下划线的度量值高于Self-Ask的度量值。

        值得注意的是,如表3所示,ITERRETGEN(T=2)优于ReAct和Self-Ask,或者与ReAct和Self-Mask竞争,使用更少的对LLM的API调用(即2)和更少的检索段落(即每次迭代5个,总共10个)。ITER-RETGEN在概念上也很简单,即迭代检索递增的CoT,而不需要复杂的处理。

表3:API调用text-davinci-003的平均次数,以及检索到的ReAct和Self-Ask段落。

请注意,ITER-RETGEN(T=2)通过更少的API调用(即2)和更少的检索段落(每次迭代5个,总共10个)实现了显著更高或具有竞争力的Acc†。

        我们还将ITER-RETGEN与DSP进行了比较,后者也基于检索到的知识使用CoT生成答案,但在信息收集和处理方面有所不同。在每次迭代中,ITERRETGEN根据(1)问题和(2)先前的模型输出检索知识,该模型输出显示了回答问题可能需要的内容。随着迭代次数的增加,我们倾向于获得更全面、更相关的知识集。此外,与DSP不同,我们不汇总检索到的文档以生成答案,因此不会引入汇总错误。

        如表2所示,ITER-RETGEN明显优于DSP。我们手动调查了10个随机问题,其中DSP失败,但ITER-RETGEN提供了正确的答案。在其中40%的案例中,DSP未能检索到包含正确答案的文件,而在其中50%的案例中所总结的知识具有误导性,例如,对于“Chris Menges和Aram Avakian共享什么职业?”的问题,DSP生成了一个错误的摘要“Chris Mengs和Aram Avakian都是美国和英国电影摄影师协会的成员。”。

        Acc†是一个可靠的度量  为了研究Acc†的可靠性,我们重点关注EM和Acc†不一致的模型输出,并手动检查哪个度量给出了更正确的标签。在四个多跳问答数据集中的每一个数据集上,我们从ITER-RETGEN的第二次迭代中随机采样了20个模型输出,总共产生了80个样本。对于98.75%的样本,EM为0,Acc†为1,而Acc†在97.5%的时间内给出了正确的标签,这表明EM严重低估了模型性能。我们还对Self-Ask进行了同样的评估,当Acc†与EM不一致时,98.75%的时间给出了正确的标签。

        Acc†提供了识别语义正确的模型输出的优势,即使它们的表面形式与注释的答案不同。例如,对于“Jan Baptist Van Rensselaer的父亲来自哪个国家?”这个问题,注释的答案是荷兰语,而模型预测是荷兰,这在Acc†方面是正确的,但受到EM的惩罚。

        值得注意的是,ITER-RETGEN(T≥2)在2WikiMultiHopQA上始终表现出比Self-Ask更低的EM,但更高的Acc†,这表明EM的增强并不一定反映生成答案质量的提高。

        生成效益检索自适应  为了研究LLM输出如何用于检索自适应,我们在HotPotQA和Feverous上进行了实验。具体来说,在每个数据集上,我们从训练集中随机抽取9000个问题进行训练,并抽取1000个问题进行验证。我们将ITER-RETGEN应用于一次迭代,并使用模型输出y1进行检索自适应,如第3.4节所示。我们使用TART(Asai等人,2022)作为重新排序器,并在不超过1000步的时间内将知识从TART提取到密集检索器。

        批量大小为32,学习率为1e-5。我们使用了蒸馏损失最低的检索器检查点。

        如表4所示,检索自适应使ITER-RETGEN能够用更少的迭代实现显著更高的Acc†。我们还展示了使用y_{1}进行适应的好处,展示了它对变体的改进,变体的不同之处在于重新排序者无法访问y_{1};该变体的训练目标可以通过去除等式3中的所有y_{1}符号来获得。

表4:使用LLM生成y1对优化密集检索器的影响。我们根据Acc†在HotPotQA和Feverous上评估了ITER-RETGEN

4.6 消融实验

4.6.1 生成增强检索

        表6显示了不同迭代中检索的答案回忆。第一次迭代只使用问题进行检索,并且存在低回答回忆的问题。在第二次迭代中,用第一次迭代的LLM输出扩充的检索,实现了显著更高的回忆,表明LLM生成可以帮助弥合复杂问题与其支持知识之间的语义差距。然而,之后的表现很快就达到了平稳期。

表6:ITER-RETGEN在不同迭代中检索到的段落的答案回忆

4.6.2 ITER-RETGEN更好地利用参数和非参数知识

        理想情况下,LLM应该灵活地利用非参数知识或参数知识,这取决于非参数知识在上下文中是否相关。表5列出了供调查的不同问题子集的绩效细分。我们考虑了CoT在不进行检索的情况下正确回答问题的能力,作为评估LLM使用其参数知识回答问题能力的代理。与Self-Ask相比,ITER-RETGEN往往在保留LLM在LLM可以使用CoT解决的问题上的性能方面明显更好,而无需检索,同时在互补子集上具有竞争力。这可能是因为Self-Ask的结构约束使LLM对后续问题生成和回答的准确性和全面性过于敏感,而且Self-Ask也无法整体处理所有检索到的知识,从而降低了LLM解决问题的灵活性。此外,无论上下文中的非参数知识是否提到了答案,ITER-RETGEN都在很大程度上始终优于Self-Ask。这表明,当上下文中的非参数知识不相关或不完整时,ITER-RETGEN比Self-Ask更好地利用参数知识。

表5:Self-Ask和ITER-RETGEN(T=2)在不同子集上的比较,以Acc†为单位。CoT✓是CoT×在没有检索的情况下正确回答的问题的子集;CoT%是补码。w/Answer Retrieved是一种方法(Self-Ask或ITER-RETGEN)成功检索提及答案的段落的问题子集;w/o Answer Retrieved是补码。ITER-RETGEN往往更善于保持LLM在使用CoT无需检索即可解决的问题上的性能,并且无论检索到的知识是否提到了答案,都始终更准确

4.7 误差分析

        在HotPotQA上,我们手动分析了ITER-RETGEN(T=2)失败的20个随机案例。25%的预测是假阴性。在10%的情况下,ITER-RETGEN检索所有必要的信息,但未能执行正确的推理。其余65%的错误案例与检索有关,其中76.9%的案例中,检索被第一次迭代的完全错误推理误导,而在其他案例中,第一次迭代中的推理是部分正确的,但检索器未能在第二次迭代中检索到缺失的部分。我们还观察到,在第一次迭代中,推理可能会受到仅使用问题作为查询检索到的嘈杂且可能分散注意力的知识的负面影响。

5 案例研究

        表7分别用HotPotQA和StrategyQA的两个例子展示了检索生成的协同作用。在第一次迭代中,由于两个问题都需要多跳推理,检索器无法仅使用问题检索所有支持知识。尽管在第一次迭代中受到分心的检索知识(HotPotQA示例中不同领域的能力)的影响,并显示出不完美的参数知识(StrategyQA示例中生成的Raclette不太可能在巴黎找到的语句),LLM在第二次迭代中生成有助于检索相关知识的短语,并成功纠正其输出。

表7:展示检索-生成协同作用的两个例子。我们在生成的短语下划线,这些短语有助于检索相关知识,并在第二次迭代中成功纠正事实错误(红色)。为简洁起见,表中未显示检索到的无关段落。

6 结论

        我们展示了ITER-RETGEN在回答具有复杂信息需求的问题方面的有效性。尽管简单,ITER-RETGEN的性能优于具有更复杂工作流程的检索增强方法,我们认为这可以作为未来检索增强生成研究的有力基线。我们还表明,生成增强检索自适应可以进一步提高ITER-RETGEN的性能,同时减少开销。

局限性

        在这项工作中,我们建议使用ITERRETGEN来增强检索增强的大型语言模型,该模型以迭代的方式协同检索和生成,并与更结构化的提示技术(如Self-Ask)相比表现出强大的性能。然而,值得注意的是,我们的实验使用了一个固定的黑匣子大型语言模型,该模型可能没有针对各种形式的提示进行同等优化。研究促进特定(基于梯度的)优化进一步突破极限的潜力将是一件有趣的事情。这可能涉及到使大型语言模型能够更灵活有效地利用参数和非参数知识。通过探索这一途径,我们可能会发现该领域的新见解和进步。此外,我们的实验没有涵盖长格式生成,这可能会比ITERRETGEN在这项工作中受益于更细粒度的检索。我们承认这一领域值得进一步探索,我们将其留给未来的工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ce学习第一天(例行性工作,chrony服务时间同步,两台服务器免密登录)

1、Linux 的例行性工作 1.1单一执行的例行性工作 at 单一执行的例行性工作:单一执行的例行性工作:仅处理执行一次就结束了,at -> atd 1.1.1 at 命令的实际工作过程 1、我们使用 at 命令来生成所要运行的工作,并将这个工作&a…

从中序与后序遍历序列构造二叉树-二叉树题型

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) right要再left前面 如下如,后序为第一行,最后一个是根; 中序为第二行,中间的为根; 通过后序的最后一个元素从中序中找到根&#xff0…

935.骑士拨号器 - 力扣

935.骑士拨号器 - 力扣 题目链接:935. 骑士拨号器 - 力扣(LeetCode) 题目: 示例 1: 输入:n 1 输出:10 解释:我们需要拨一个长度为1的数字,所以把骑士放在10个单元格中…

24/06/26(1.1129)动态内存

strtok 字符串分割函数 #include<stdio.h> int main(){ char str[] "this,a sample string."; char* sep ","; char* pch strtok(str, sep); printf("%s\n", pch); while (pch ! NULL){ printf("%s\…

Power BI 占比函数

1&#xff0c;普通层级结构占比 占比1 DIVIDE([sum_qty], CALCULATE([sum_qty],ALLSELECTED(Item[ITEM_CODE]))) //按照line为一个整理展示数据占比2 SWITCH( true(),ISINSCOPE(Item[ITEM_CODE]),DIVIDE([sum_qty], CALCULATE([sum_qty],ALLSELECTED(Item[ITEM_CODE]))), IS…

说说MQ在你项目中的应用(二)商品支付

看了不少关于MQ的文章&#xff0c;也对MQ的作用做了一些总结。通常来说MQ有三大功能&#xff1a;异步处理、系统解耦和流量削峰。但我觉得这些功能本质上都是围绕着异步这个核心来的&#xff0c;只是针对不同的业务场景做了些调整。 现在市面上常用的MQ中间件&#xff0c;如Ra…

Go语言之函数和方法

个人网站&#xff1a; http://hardyfish.top/ 免费书籍分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码&#xff1a;3899 免费专栏分享&#xff1a; 资料链接&#xff1a;https://url81.ctfile.com/d/57345181-6…

Java进阶-Lambda

Java进阶-Lambda 前言Lambda表达式什么是Lambda表达式初识Lambda表达式Lambda表达式的简单使用Lambda表达式格式分析与传统接口方法实现的比较 理解Lambda表达式函数式编程非纯函数实例纯函数示例函数式编程在Lambda表达式中的体现 闭包闭包与Lambda表达式的示例 类型推导-匿名…

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)

译注 由于 1.2.2 小节介绍 SVG 的篇幅过多&#xff0c;为了方便查阅&#xff0c;后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性&#xff0c;特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…

802.11漫游流程简单解析与笔记_Part2_02_wpa_supplicant、cfg80211、nl80211内核与驱动的关系

wpa、cfg80211、nl80211内核与驱动的关系示意图如下&#xff1a; nl80211和cfg80211都是内核定义的标准接口&#xff0c;目的是规范驱动和应用的统一调用&#xff0c;wpa中常出现nl80211就是通过内核的nl80211接口调用对应cfg80211的部分&#xff0c;进而控制驱动收发数据或切换…

实现高效写入:Schemaless 写入性能优化指南

物联网应用常常需要收集大量的数据&#xff0c;用以支持智能控制、业务分析和设备监控等功能。然而&#xff0c;应用逻辑的更新或硬件的调整可能会导致数据采集项频繁变化&#xff0c;这是时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;面临的一大挑…

排序算法之java语言实现

零、说在前面 近期打算复习java的几种排序算法&#xff0c;我会将这些排序算法的实现代码、个人心得、时间复杂度分析&#xff0c;算法间的对比做成一个系列帖子&#xff0c;这里作为那些帖子的汇总而存在。 这个系列的框架会包含&#xff1a;概念、实现、时间空间复杂度…

50、基于NARX神经网络的磁悬浮建模(matlab)

1、NARX神经网络简介 NARX&#xff08;非线性自回归外部输入&#xff09;神经网络是一种用于非线性建模和预测的神经网络结构。与传统的自回归模型不同&#xff0c;NARX网络可以接收外部输入来影响输出结果&#xff0c;从而更好地捕捉系统的复杂性和非线性特征。 NARX神经网络…

为什么计算机中的无线网络被称为“Wi-Fi”?

在当今信息化社会中&#xff0c;无线网络已经成为我们生活中不可或缺的一部分。无论是家庭、办公室还是公共场所&#xff0c;我们都能享受到便捷的无线互联网连接。而当我们谈及无线网络时&#xff0c;一个经常听到的术语就是“Wi-Fi”。那么&#xff0c;为什么计算机中的无线网…

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天要跟大家聊聊一款游戏&#xff0c;它不是那种让人眼花缭乱的大制作&#xff0c;也不是那种能让人回味无穷的艺术作品&#xff0c;但它在阿星心里&#xff0c;绝对是神作中的佼佼者。没错&#xff0c;它就是《植物大战…

【windows】win11系统跳过联网和微软账户登录,实现本地账户登录

问题原因&#xff1a;现在市面上销售的品牌笔记本和台式机基本上都预装了正版的Windows S11家族中文版操作系统&#xff0c;联网后系统会自动激活。在win11的版本中&#xff0c;隐藏了关闭跳过连接网络的按钮&#xff0c;默认强制需要注册微软账户登录才能正常使用。 一、跳过…

动态规划——123. 买卖股票的最佳时机 III

目录 1、题目链接 2、题目分析 1.状态表示 2.状态转移方程 3.初始化 4.填表 5.返回值 3、代码解析 1、题目链接 123. 买卖股票的最佳时机 III 2、题目分析 1.状态表示 由题目可知&#xff0c;我们分为两种状态&#xff0c;买入和卖出&#xff0c;又因为只能完成两次交易…

MAC 查看公钥私钥

电脑配置过公钥私钥&#xff0c;现在需要查看&#xff1a; 1、 查看本地是否存在SSH密钥 命令&#xff1a;ls -al ~/.ssh 如果在输出的文件列表中发现id_rsa和id_rsa.pub的存在&#xff0c;证明本地已经存在SSH密钥&#xff0c;请执行第3步 2、 生成SSH密钥 命令&#xff1…

我的3次软考高项通关之旅

1、缘起 初次听说软考是在2022年下半年了&#xff0c;软考的高级分为很多种&#xff0c;我起先想报考高级架构师&#xff0c;但是架构师一年才考一次&#xff0c;如果一次考不过得再准备一年&#xff0c;时间对我来说太长了&#xff0c;于是我决定报考一年考两次的高项。对于国…

【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期&#xff1a;2024年6月26日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介一、角色编辑模式1.将字段限制为只读2.创建角色&#xff08;刷角色&#xff09;3.预览所有角色4.编辑选中角色属性5.移动角色位置6.移除角色 简介…