【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
目录
- 摘要
- Abstract
- 用于检索-增强大语言模型的查询与重写
- 研究背景
- 方法论
- 基于冻结LLM的重写方案
- 基于可训练重写器的方案
- 重写器预热训练(Rewriter Warm-up)
- 强化学习(Reinforcement Learning)
- 创新性
- 实验结果
- 局限性
- 总结
摘要
这篇论文提出了一种名为"Rewrite-Retrieve-Read"的新型检索增强框架,旨在改进大型语言模型(LLMs)在知识密集型任务中的表现。传统方法采用"检索-读取"的两步流程,而本文创新性地在检索前增加了查询重写步骤,形成"重写-检索-读取"的三步流程。核心思想是通过优化检索查询本身来弥合输入文本与所需知识之间的差距,而非像以往研究那样专注于调整检索器或读取器。工作流程分为三个关键阶段:首先利用LLM或可训练的小型语言模型(称为"重写器")对原始查询进行重写;然后使用网络搜索引擎检索相关文档;最后将重写后的查询和检索到的文档一起输入冻结的LLM读取器生成最终答案。为进一步优化流程,作者提出了一种可训练方案,采用T5-large作为重写器,通过强化学习根据LLM读取器的反馈进行训练。实验在开放域问答(HotpotQA、AmbigNQ、PopQA)和多项选择问答(MMLU)任务上进行,使用ChatGPT和Vicuna-13B作为读取器,结果显示查询重写能持续提升性能,验证了该框架的有效性和可扩展性。
Abstract
This paper introduces a new retrieval-enhanced framework called “Rewrite-Retrieve-Read,” aimed at improving the performance of large language models (LLMs) in knowledge-intensive tasks. Traditional methods use a two-step “retrieve-read” process, but this paper innovatively adds a query rewriting step before retrieval, forming a three-step “rewrite-retrieve-read” process. The core idea is to bridge the gap between the input text and the required knowledge by optimizing the retrieval query itself, rather than focusing on adjusting the retriever or reader as previous studies have done. The workflow consists of three key stages: first, using an LLM or a trainable small language model (called the “rewriter”) to rewrite the original query; then using a web search engine to retrieve relevant documents; and finally feeding the rewritten query and retrieved documents into a frozen LLM reader to generate the final answer. To further optimize the process, the authors propose a trainable approach, using T5-large as the rewriter and training it through reinforcement learning based on feedback from the LLM reader. Experiments were conducted on open-domain question answering (HotpotQA, AmbigNQ, PopQA) and multiple-choice question answering (MMLU) tasks, using ChatGPT and Vicuna-13B as readers. The results show that query rewriting consistently improves performance, validating the effectiveness and scalability of the framework.
用于检索-增强大语言模型的查询与重写
Title: Query Rewriting for Retrieval-Augmented Large Language Models
Author: Xinbei Ma, Yeyun Gong, Pengcheng He, Hai Zhao, Nan Duan
Source: Proceedings of the 2023 Conference on Empirical Methods in Natural Language Processing
Arxiv: https://arxiv.org/abs/2305.14283
研究背景
大型语言模型虽然在自然语言处理方面展现出惊人能力,但仍面临幻觉和时间错位等问题,这主要源于其对大规模高质量语料库的依赖而缺乏对现实世界的直接感知。检索增强方法通过结合外部知识(非参数知识)和内部知识(参数知识)来缓解这些问题,已成为提高LLM事实性的标准解决方案。传统的"检索-读取"框架中,检索器首先搜索与问题相关的文档,然后LLM接收问题和文档并预测答案。
然而,现有方法存在明显局限。大多数LLM只能通过推理API访问,在流程中充当黑盒冻结读取器的角色,这使得需要完全访问模型参数的早期检索增强方法不再可行。近期研究多集中于LLM导向的适配,如训练密集检索模型以适应冻结的语言模型,或设计检索器与读取器之间的交互方式。但这些方法都忽视了查询本身的适配问题——检索查询要么直接来自数据集,要么由黑盒生成决定,始终固定不变,导致输入文本与真正需要查询的知识之间存在不可避免的差距。
黑盒API的限制
现在很多强大的LLM(如ChatGPT)只提供"输入-输出"的API接口,研究者无法直接调整模型内部参数。这导致早期那些需要修改LLM参数的检索增强方法(比如让LLM在训练时学习如何利用检索结果)无法继续使用——因为现在LLM对我们来说是个"黑盒子",只能调用不能修改。
对于现有解决方案的局限性,研究者们最近主要尝试两种替代方案:
训练专用检索器:专门训练一个检索模型,让它学会为特定LLM提供最合适的外部文档
优化交互方式:设计更聪明的提示词(prompt)让LLM更好地使用检索结果
但现有方法都忽略了一个根本问题:检索查询本身的质量。
目前要么:直接使用原始问题作为检索词(比如把"量子纠缠是什么?"直接扔给搜索引擎)或者让黑盒LLM自己决定检索词(但无法优化这个过程)
这会导致"你说的话"和"系统真正需要查的内容"之间存在偏差。就像你想问"如何预防感冒",但直接搜索这句话可能不如搜索"增强免疫力 维生素C 临床研究"来得有效。
举个具体例子:
假设问题是:“《星际穿越》中那个后来成为科学家的女孩最后怎样了?”直接检索可能效果差,因为包含太多电影细节。
理想的重写可能是:“星际穿越 Murph角色结局 NASA科学家”
但现有系统缺乏主动优化查询的这个环节。
这种"问题表达"与"实际需要查找的知识"之间的不匹配,就是作者指出的"不可避免的差距"。而本文的创新点正是通过增加"查询重写"步骤来填补这个空白。
这一研究空白正是本文工作的出发点。作者观察到,现有检索增强方法过分关注检索器或读取器的调整,而忽略了查询优化这一关键环节。特别是在处理复杂查询(如多跳问题)时,直接使用原始问题作为检索查询往往效果不佳,因为这些问题可能包含冗余信息或缺乏关键检索词。此外,随着LLM规模不断扩大,如何高效地将小型可训练模块与黑盒LLM集成也成为一个重要研究问题。
方法论
上图直观对比了传统的 retrieve-then-read 方法和本文提出的 rewrite-retrieve-read 框架,并展示了可训练重写器的方案。
(a)标准 Retrieve-Then-Read 流程
流程步骤:
输入(Input):原始问题或文本(如 “What is the capital of France?”)。
检索(Retrieve):直接使用原始输入作为查询,从外部知识库(如维基百科)或搜索引擎(如Bing)检索相关文档。
读取(Read):将检索到的文档 + 原始问题一起输入LLM(如ChatGPT),生成最终答案(如 “Paris”)。 核心问题:
查询未优化:直接使用原始输入检索,可能效果不佳(例如,复杂问题、模糊表述或包含冗余信息)。
(b) LLM作为冻结重写器的 Rewrite-Retrieve-Read
流程步骤:
输入(Input):原始问题。
重写(Rewrite):使用一个冻结的LLM(如ChatGPT)对原始问题重写,生成更适合检索的查询。
检索(Retrieve):用重写后的查询检索文档。
读取(Read):将检索结果 + 原始问题输入LLM生成答案。
改进点: 查询适配性增强,重写后的查询更精准,检索效果更好,直接利用现成LLM的重写能力。
局限性: 依赖LLM的提示工程(prompt design),重写质量不稳定,并且黑盒LLM无法针对性优化。
(c)可训练重写器的 Rewrite-Retrieve-Read
流程步骤:
输入(Input):原始问题。
重写(Rewrite):使用一个可训练的小型LM(如T5)作为重写器,生成优化查询。
训练方法:
预热训练(Warm-up):用LLM生成的伪数据(如正确重写样本)监督训练。
强化学习(RL):以LLM的答案质量作为奖励,进一步优化重写器(PPO算法)。
检索(Retrieve):用训练后的重写器生成查询并检索。
读取(Read):LLM生成最终答案。
改进点: 通过强化学习,使重写器适配特定任务和LLM;小型重写器比直接调用LLM更轻量。
关键设计: 奖励函数(Reward)基于LLM输出的答案质量(如EM、F1分数)和检索命中率; KL散度正则化防止重写器偏离初始语言模型太远。
本文提出的"重写-检索-读取"框架包含三个核心组成部分:查询重写、检索和读取。在技术实现上,作者探索了两种主要方案:基于冻结LLM的重写方案和基于可训练重写器的方案。
基于冻结LLM的重写方案
基于冻结LLM的重写方案采用少量示例提示(few-shot prompting)的方式,引导LLM对原始查询进行重写。具体而言,提示模板包含指令、示范和输入三部分,指令简明扼要,示范则来自训练集中的1-3个随机示例,主要用于说明任务特定的输出格式。这种方法无需额外训练,直接利用LLM的推理能力生成更适合检索的查询。例如,对于开放域问答任务,提示LLM逐步思考并生成所需知识的搜索引擎查询;对于多项选择任务,则提示生成能更好回答给定问题的网页搜索查询。
基于可训练重写器的方案
更具创新性的是可训练重写器方案。作者采用T5-large(770M参数)作为基础模型,通过两阶段过程进行训练:预热训练和强化学习。
重写器预热训练(Rewriter Warm-up)
在预热阶段,首先构建伪数据集——使用LLM重写训练集中的原始问题,并筛选那些能使LLM读取器做出正确预测的样本作为训练数据。重写器通过标准对数似然目标进行监督训练,使其初步掌握查询重写的基本模式。
目标:让重写器初步学会生成合理的查询。
-
伪数据生成:
- 用LLM(如ChatGPT)重写训练集中的原始问题 x x x,生成候选查询 x ~ \tilde{x} x~。
- 筛选能使LLM读者输出正确答案的样本,构成预热数据集:
D T r a i n = { ( x , x ~ ) ∣ y ^ = y } D_{Train} = \{(x, \tilde{x}) \mid \hat{y} = y\} DTrain={(x,x~)∣y^=y}
-
训练目标(最大似然估计):
L w a r m = − ∑ t log p θ ( x ~ t ∣ x ~ < t , x ) \mathcal{L}_{warm} = -\sum_{t} \log p_{\theta}(\tilde{x}_t \mid \tilde{x}_{<t}, x) Lwarm=−t∑logpθ(x~t∣x~<t,x)- x ~ t \tilde{x}_t x~t:查询的第 t t t个token
- x ~ < t \tilde{x}_{<t} x~<t:已生成的前 t − 1 t-1 t−1个token
- θ \theta θ:重写器参数
每一项 log p θ ( x ~ t ∣ x ~ < t , x ) \log p_{\theta}(\tilde{x}_t \mid \tilde{x}_{<t}, x) logpθ(x~t∣x~<t,x) 表示在给定原始问题 x x x 和已生成部分 x ~ < t \tilde{x}_{<t} x~<t 的条件下,模型对下一个正确token x ~ t \tilde{x}_t x~t 的预测概率。最小化NLL等价于让模型对真实token分配更高概率。
查询重写器模块:
class QueryRewriter:def __init__(self, model_name="t5-large"):self.model = T5ForConditionalGeneration.from_pretrained(model_name)self.tokenizer = T5Tokenizer.from_pretrained(model_name)def warm_up_train(self, dataset):# dataset: List[{"original": str, "rewritten": str}]optimizer = torch.optim.Adam(self.model.parameters(), lr=3e-5)for batch in dataloader:inputs = self.tokenizer(batch["original"], return_tensors="pt",padding=True)labels = self.tokenizer(batch["rewritten"], return_tensors="pt",padding=True).input_idsoutputs = self.model(input_ids=inputs.input_ids,attention_mask=inputs.attention_mask,labels=labels)loss = outputs.lossloss.backward()optimizer.step()def rewrite(self, query):inputs = self.tokenizer(query, return_tensors="pt")outputs = self.model.generate(**inputs)return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
强化学习(Reinforcement Learning)
强化学习阶段则采用近端策略优化(PPO)算法进一步调整重写器。将重写器优化问题建模为马尔可夫决策过程,其中状态空间由词汇表和序列长度限定,动作空间等同于词汇表,转移概率由策略网络(即重写器模型)决定。奖励函数基于LLM读取器的预测质量设计,包含精确匹配(EM)、F1分数和命中指示器等指标,同时加入KL散度正则化防止模型偏离初始策略太远。价值网络从策略网络初始化,采用广义优势估计(GAE)计算优势函数。通过这种设计,重写器能够学习生成那些能引导检索器找到更有用文档、进而帮助LLM读取器做出更准确预测的查询。
目标:通过LLM读者的反馈进一步优化重写器。
-
马尔可夫决策过程(MDP)建模:
- 状态 s t s_t st:当前生成的部分查询 [ x , x ~ ^ < t ] [x, \hat{\tilde{x}}_{<t}] [x,x~^<t]
- 动作 a t a_t at:选择下一个token x ~ ^ t \hat{\tilde{x}}_t x~^t
- 策略 π θ \pi_{\theta} πθ:重写器模型 G θ G_{\theta} Gθ
- 奖励 R R R:基于LLM读者的答案质量
-
奖励函数设计:
R ( s t , a t ) = R l m ( x ~ ^ , y ) − β KL ( π θ ∥ π 0 ) R(s_t, a_t) = R_{lm}(\hat{\tilde{x}}, y) - \beta \text{KL}(\pi_{\theta} \| \pi_{0}) R(st,at)=Rlm(x~^,y)−βKL(πθ∥π0)- R l m R_{lm} Rlm:LLM读者的表现(如EM/F1分数)
- KL \text{KL} KL项:防止重写器偏离初始策略 π 0 \pi_{0} π0(预热后的模型)
- β \beta β:平衡系数(动态调整)
-
策略优化(PPO算法):
- 优化目标:
max θ E x ~ ^ ∼ p θ ( ⋅ ∣ x ) [ R ( x , x ~ ^ ) ] \max_{\theta} \mathbb{E}_{\hat{\tilde{x}} \sim p_{\theta}(\cdot|x)}[R(x, \hat{\tilde{x}})] θmaxEx~^∼pθ(⋅∣x)[R(x,x~^)] - 具体损失函数:
L θ = − 1 ∣ S ∣ T ∑ τ ∈ S ∑ t = 0 T min ( k t , θ A θ ′ , clip ( k t , θ , 1 − ϵ , 1 + ϵ ) A θ ′ ) \mathcal{L}_{\theta} = -\frac{1}{|\mathcal{S}|T} \sum_{\tau \in \mathcal{S}} \sum_{t=0}^{T} \min(k_{t,\theta} A^{\theta'}, \text{clip}(k_{t,\theta}, 1-\epsilon,1+\epsilon) A^{\theta'}) Lθ=−∣S∣T1τ∈S∑t=0∑Tmin(kt,θAθ′,clip(kt,θ,1−ϵ,1+ϵ)Aθ′)
k t , θ = p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) k_{t,\theta} = \frac{p_{\theta}(a_t \mid s_t)}{p_{\theta'}(a_t \mid s_t)} kt,θ=pθ′(at∣st)pθ(at∣st)- A θ ′ A^{\theta'} Aθ′:优势函数(GAE估计)
- θ ′ \theta' θ′:旧策略参数(采样时固定)
- clip \text{clip} clip:防止策略更新过大
- 优化目标:
-
价值函数训练:
L ϕ = 1 ∣ S ∣ T ∑ τ ∈ S ∑ t = 0 T ( V ϕ ( s t ) − R t ) 2 \mathcal{L}_{\phi} = \frac{1}{|\mathcal{S}|T} \sum_{\tau \in \mathcal{S}} \sum_{t=0}^{T} (V_{\phi}(s_t) - R_t)^2 Lϕ=∣S∣T1τ∈S∑t=0∑T(Vϕ(st)−Rt)2- V ϕ V_{\phi} Vϕ:价值网络(从策略网络初始化)
- R t R_t Rt:累计奖励
-
总损失函数:
L p p o = L θ + λ v L ϕ \mathcal{L}_{ppo} = \mathcal{L}_{\theta} + \lambda_v \mathcal{L}_{\phi} Lppo=Lθ+λvLϕ- λ v \lambda_v λv:价值损失权重
核心创新点:
- 两阶段训练:预热(模仿学习)→ RL(精细优化)
- KL正则化:避免重写器生成不合理查询
- 轻量化设计:小型重写器(T5-large)适配黑盒LLM
class RLTraining:def __init__(self, rewriter, llm_reader):self.rewriter = rewriterself.llm_reader = llm_reader # Black-box LLM (e.g. ChatGPT API)ppo_config = PPOConfig(batch_size=16,learning_rate=2e-6,kl_divergence_coeff=0.2)self.ppo_trainer = PPOTrainer(model=self.rewriter.model,config=ppo_config)def compute_reward(self, queries, answers, gold_answers):# 实现论文中的奖励函数 em_reward = exact_match(answers, gold_answers)f1_reward = f1_score(answers, gold_answers)hit_reward = 1 if answer_in_retrieved_docs() else -1return em_reward + 1.0*f1_reward + 1.0*hit_rewarddef train_step(self, queries, gold_answers):# 生成重写查询rewritten_queries = [self.rewriter.rewrite(q) for q in queries]# 检索文档 retrieved_docs = bing_search(rewritten_queries)# LLM生成答案llm_inputs = [f"{doc} {q}" for doc,q in zip(retrieved_docs, queries)]answers = chatgpt_api(llm_inputs)# 计算奖励rewards = self.compute_reward(rewritten_queries, answers, gold_answers)# PPO更新self.ppo_trainer.step(queries, rewritten_queries, rewards)
在检索环节,作者使用Bing搜索引擎作为检索器,避免了构建和维护搜索索引的开销,并能访问最新知识。检索采用两种方式:一是拼接搜索引擎返回的相关片段;二是获取网页URL并解析全部文本,然后使用BM25算法保留与查询相关性较高的部分以减少文档长度。读取环节则采用冻结的LLM(如ChatGPT或Vicuna-13B)进行阅读理解,同样使用少量示例提示的方式进行预测。
创新性
本文的核心创新点在于首次提出了从查询重写角度改进检索增强LLM的框架,具有多重理论和方法创新价值。
最显著的贡献是突破了传统"检索-读取"范式的局限,开创性地增加了查询重写环节,形成了"重写-检索-读取"的新范式。这一创新源于对检索过程中"查询-知识"差距的深刻洞察——原始输入往往不是最优的检索查询,特别是在处理复杂、模糊或专业性强的任务时。通过引入重写环节,系统能够主动调整查询形式,更精准地表达信息需求,从而显著提升后续检索和读取的效果。
在技术层面,作者提出了一个精巧的可训练方案,将小型语言模型作为重写器与黑盒LLM读取器协同工作。这一设计既保持了LLM的强大能力,又通过小型可训练模块实现了流程优化,计算效率高且实用性强。特别是采用强化学习将重写器与LLM读取器的表现直接关联,创造性地解决了黑盒模型难以端到端训练的挑战。这种"小模型引导大模型"的思路为整合可训练模块与商业LLM API提供了新范式。
实验设计上也体现了创新性。作者不仅比较了传统检索与查询重写的效果,还深入分析了不同配置下的性能差异,包括使用不同检索方法(片段vs BM25)、不同读取器(ChatGPT vs Vicuna)等。特别有价值的是对重写查询的案例分析,直观展示了查询优化如何影响检索结果和最终答案质量。例如,在多跳问题中,好的重写能够聚焦关键实体和关系;在模糊问题中,重写可以添加明确的约束条件;在专业性问题中,重写可以突出术语和背景。
此外,使用网络搜索引擎作为检索器也是一个务实而创新的选择。相比专业构建的知识库,这种方法知识覆盖面广、实时性强,能够缓解LLM的时间错位问题。作者也坦诚讨论了这一选择的利弊,为后续研究提供了宝贵经验。
实验结果
论文在开放域问答和多项选择问答两大类任务上进行了全面实验验证,涵盖了多种难度和类型的问题。
在开放域问答任务中,HotpotQA包含需要多跳推理的复杂问题,AmbigNQ提供自然问题的消歧版本,PopQA则包含更多长尾分布知识。实验结果显示,查询重写在所有数据集上均带来性能提升。特别值得注意的是,在HotpotQA上标准检索反而损害了读取器性能,说明复杂问题直接作为查询会引入噪声;而增加重写步骤后性能显著提高,证明重写能有效优化多跳问题的检索效果。在AmbigNQ和PopQA上,标准检索已有所帮助,而查询重写能进一步提升性能,其中LLM重写器表现最佳,训练后的T5重写器次之但优于标准检索。
多项选择问答任务使用MMLU数据集,涵盖人文、STEM、社会科学和其他四大类考试题目。实验发现,使用ChatGPT作为读取器时,查询重写在大多数类别上提高了分数(社会科学除外);使用Vicuna作为读取器时,查询重写在所有类别上都获得了更大提升。这表明更强大的读取器拥有更多参数记忆,更需要通过优化检索来补充外部知识。
作者还对训练过程和检索结果进行了深入分析。强化学习曲线显示,随着训练迭代,所有数据集的指标总体呈上升趋势,说明RL阶段能够弥补预热训练的不足。检索分析则表明,查询重写显著提高了检索命中率(AmbigNQ上从76.4%提升到82.2%),且检索效果的改善幅度大于读取器的提升幅度,这与相关研究发现一致。
案例研究生动展示了查询重写如何改变检索结果和预测性能。一个好的重写能够:(1)重组问题结构,将关键信息前置;(2)消除歧义,避免错误解读;(3)简化复杂背景,突出核心概念。例如,在多跳问题中,好的重写会聚焦关键人物关系;在模糊问题中,重写可以修正时间表述;在专业问题中,重写会强调术语和背景。
局限性
尽管取得了显著成果,作者也坦诚指出了工作的几点局限性。
首先是通用性与专用性之间的权衡问题。增加训练过程虽然提高了特定任务性能,但相比少量示例提示的直接迁移能力有所下降。这意味着该方法在需要快速适应新任务的场景中可能不如纯提示方法灵活。
其次,与新兴的"LLM智能体"研究方向相比,本文框架采用单轮检索策略,而智能体方法通常需要多次调用LLM进行多轮检索和交互。虽然单轮设计效率更高,但在处理极其复杂的问题时可能不如多轮方法全面。作者明确表示其动机是改进单轮检索-读取框架,而非探索更复杂的交互模式。
第三,使用网络搜索引擎作为检索器虽然便利,但也带来一些挑战。商业API需要订阅,且网络知识难以控制,可能返回不一致、冗余甚至有害内容,影响LLM读取器。相比之下,基于专业筛选知识库的神经密集检索器可能获得更可控的检索结果。
此外,还有一些潜在限制未在文中明确讨论但值得思考。例如,查询重写质量高度依赖预热阶段生成的伪数据质量;强化学习训练过程计算成本较高;不同领域和任务可能需要设计特定的奖励函数;框架对搜索引擎API的依赖可能影响可复现性等。
总结
《Query Rewriting for Retrieval-Augmented Large Language Models》这篇论文提出了一种创新且实用的检索增强框架,通过引入查询重写步骤显著提升了大型语言模型在知识密集型任务中的表现。其核心价值在于突破了传统方法仅关注检索器或读取器优化的局限,开创性地从查询适配角度解决问题,为检索增强LLM研究提供了新视角。方法论上,论文的亮点在于巧妙结合了冻结LLM的强大能力和小型可训练模块的灵活性,特别是通过强化学习将重写器与黑盒LLM的反馈相连接,为解决类似集成问题提供了范例。实验设计全面,结果分析深入,不仅验证了框架的有效性,还揭示了不同配置下的性能特点,为后续研究提供了丰富参考。从更广的视角看,这项工作反映了LLM研究的一个重要趋势:如何在保持商业LLM黑盒特性的同时,通过可训练模块和外部工具扩展其能力边界。查询重写的思想不仅适用于检索增强场景,也可推广到其他工具使用场景,如代码解释器、专业模型调用等,具有广泛的应用潜力。当然,如同作者指出的,该方法仍有改进空间,特别是在平衡通用性与专用性、处理复杂多轮交互、提高检索结果可控性等方面。未来研究可以探索更智能的多轮重写策略、结合专业知识库的混合检索方式,以及更高效的训练算法等方向。总的来说,这篇论文在检索增强语言模型领域做出了实质性贡献,提出的"重写-检索-读取"框架和可训练方案既有理论创新又具实用价值,为提升LLM的事实性和可靠性提供了有效工具,对相关研究和应用都具有重要启发意义。
相关文章:
【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练(Rewriter Warm-up)强化学习(Reinforcement Learning) 创新性实验结果局限性总结 摘要 这篇论文…...
Istio常用命令
Istio常用命令 1. 安装和配置2. Sidecar 注入3. 验证和状态4. 升级和卸载5. 故障排除6. 配置管理 istioctl 的常用命令及其详细说明: 1. 安装和配置 安装 Istio # 使用指定的配置文件(如 demo)安装 Istio 到 Kubernetes 集群。 istioctl m…...
Linux基础15
一、网络模型 二、eNSP模拟器 拖拽操作建立模拟网络环境 交换机视图操作: <> 用户视图 [] 系统视图 接口视图 协议视图 display version #显示版本和设备型号 display current-configuration #查看设备配置(查错) …...
FISCO BCOS群组扩容实战指南:从原理到操作全解析
引言:为什么需要群组扩容? 在区块链技术迅猛发展的今天,企业级应用对区块链平台提出了更高的要求。"如何在不影响现有业务的情况下扩展区块链处理能力?"、"能否实现不同业务数据的物理隔离?"、&qu…...
【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据:MNIST、其他数字与字母识别(1)数据加载(2)查看数据的特征和标…...
从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全
安科瑞顾强 近年来,老旧小区电气火灾事故频发,成为威胁居民生命财产安全的重要隐患。据统计,我国居住场所火灾伤亡人数远超其他场所,仅今年一季度就发生8.3万起住宅火灾,造成503人遇难。这些建筑多建于上世纪&#x…...
2.1 全栈运维管理:Proxmox VE单节点配置桥接、VLAN和Bonding的详细实验指南
本文是Proxmox VE 全栈管理体系的系列文章之一,如果对 Proxmox VE 全栈管理感兴趣,可以关注“Proxmox VE 全栈管理”专栏,后续文章将围绕该体系,从多个维度深入展开。 概要:本文介绍 Proxmox VE 单节点网络配置。桥接基…...
docker面试题
1.docker网络 Docker网络是Docker容器之间进行通信的关键功能。Docker提供了多种网络模式和驱动,以满足不同的网络需求。以下是Docker网络的详细介绍: 1.Docker网络模式 Docker提供了以下几种网络模式,每种模式适用于不同的场景:…...
计算机视觉——基于YOLOV8 的人体姿态估计训练与推理
概述 自 Ultralytics 发布 YOLOV5 之后,YOLO 的应用方向和使用方式变得更加多样化且简单易用。从图像分类、目标检测、图像分割、目标跟踪到关键点检测,YOLO 几乎涵盖了计算机视觉的各个领域,似乎已经成为计算机视觉领域的“万能工具”。 Y…...
【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…...
【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
监控docker中的java应用
1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...
Android游戏辅助工具开发详解
文章目录 第一部分:概述与基础准备1.1 游戏辅助工具的定义与用途1.2 开发环境准备1.3 项目创建与配置 第二部分:核心功能实现2.1 屏幕点击功能实现2.1.1 基础点击功能2.1.2 多点触控实现 2.2 滑动功能实现2.2.1 基础滑动功能2.2.2 曲线滑动实现 2.3 屏幕…...
重生之外卖配送时被投诉后的反思
重生之外卖配送时被投诉后的反思 写苍穹外卖时 我们发现在每一次调用sql语句时 insert update语句总会需要在service的实现类里加入例如create_time,create_user , update_time , update_user的填充 每次赋值都要重新编写代码,会造成代码冗余 ; 序号字…...
计算机基础复习资料整理
计算机基础复习资料整理 一、操作系统 (一)定义 操作系统(Operating System,OS)是介于计算机硬件和用户(程序或人)之间的接口。作为通用管理程序,它管理计算机系统中每个部件的活动…...
Profibus DP主站网关数据映射全解析!
Profibus DP主站网关数据映射全解析! 在工业自动化领域,Profibus DP主站网关作为一种关键的通讯设备,其数据映射的精准度和效率对整个控制系统的性能有着至关重要的影响。本文旨在深入探讨Profibus DP主站网关的数据映射过程,揭示…...
ocr-不动产权识别
目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验:房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…...
leetcode 198. House Robber
本题是动态规划问题。 第一步,明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,具体怎么偷这里不考虑,第i1号及之后的房间也不考虑。换句话说,dp[i]也就是只考虑[0,i]号…...
【2025软考高级架构师】——软件架构设计(4)
摘要 本文主要介绍了几种软件架构设计相关的概念和方法。包括C2架构风格的规则,模型驱动架构(MDA)的起源、目标、核心模型及各模型之间的关系;软件架构复用的概念、历史发展、维度、类型及相关过程;特定领域架构&…...
分发饼干问题——用贪心算法解决
目录 一:问题描述 二:解决思路 贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客 三:代码实现 四:复杂度分析 一:问题描述 分发饼干问题是一个经典的可以使用贪心算法解决的问题…...
深入详解MYSQL的MVCC机制
参考资料: 参考视频(注意第二个视频关于幻读的讲解是错误的,详情见本文) redoLog的结构详解 参考资料 学习内容: 1. MVCC要解决的问题 MVCC要解决的问题是,在不产生脏读等数据库问题的前提下,数据库的查询语句和更改语句不相互阻塞的情况; 在InnoDB中,MVCC仅仅存…...
DNS域名解析
目录 一.DNS 1.1DNS的简介 1.2DNS的背景 1.3DNS的架构 1.4实现DNS的方式 1.5DNS的查询类型 1.6DNS解析的基本流程 二.主从复制 2.1定义 2.2优缺点 三.DNS服务软件 3.1bind 3.1.1定义 3.1.2bind相关文件 3.2DNS服务器的核心文件 3.2.1主配置文件 3.2.2域名文件 …...
Java基础:一文讲清多线程和线程池和线程同步
01-概述 02-线程创建 继承Thread 实现Runnable(任务对象) 实现Callable接口 public class ThreadDemo3 {public static void main(String[] args) throws ExecutionException, InterruptedException {// 目标:线程创建3// 需求:求1-100的和Callable<…...
ubuntu 20.04 连不上蓝牙耳机/蓝牙鼠标
sudo gedit /etc/bluetooth/main.conf改为 ControllerMode dual然后重启蓝牙服务 sudo service bluetooth restart...
SaaS、Paas、IaaS、MaaS、BaaS五大云计算服务模式
科普版:通俗理解五大云计算服务模式 1. SaaS(软件即服务) 一句话解释:像“租用公寓”,直接使用现成的软件,无需操心维护。 案例:使用钉钉办公、在网页版WPS编辑文档。服务提供商负责软件更新和…...
【深拷贝、浅拷贝】golang函数参数传递,变量复制后,操作变量参数,是否影响原有数据?全面解析
Golang中深拷贝与浅拷贝的详细解析,以及变量复制、函数参数传递等场景下对新旧变量影响的总结: 一拷贝与浅拷贝的核心区别 1. 浅拷贝(Shallow Copy) • 定义:仅复制数据的顶层结构,对引用类型字段&#x…...
c语言编程经典习题详解3
21. 求给定正整数 n 以内的素数之积 定义:找出小于给定正整数n的所有素数,并将它们相乘。要点:使用双层for循环,外层循环遍历小于n的数,内层循环判断是否为素数,若是则累乘。应用:在数论研究、密码学等领域有应用。c #include <stdio.h>int isPrime(int num) {if…...
【HD-RK3576-PI】Docker搭建与使用
硬件:HD-RK3576-PI 软件:Linux6.1Ubuntu22.04 1. 安装Docker Docker安装脚本下载: roothd-rk3576-pi:~ $ curl -fsSL https://test.docker.com -o test-docker.sh 可以直接执行安装 roothd-rk3576-pi:~ $ sh test-docker.sh 2. 配置国内镜…...
C++进阶——异常
目录 1、异常的概念及使用 1.1 异常的概念 1.2 异常的抛出和捕获 1.3 栈展开 1.4 查找匹配的处理代码 1.5 异常的重新抛出 1.6 异常的安全问题 1.7 异常的规范 2、标准库的异常(了解) 1、异常的概念及使用 1.1 异常的概念 C语言,出错了,就报错…...
Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程
零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html...
C++ 编程指南36 - 使用Pimpl模式实现稳定的ABI接口
一:概述 C 的类布局(尤其是私有成员变量)直接影响它的 ABI(应用二进制接口)。如果你在类中添加或修改了私有成员,即使接口不变,编译器生成的二进制布局也会变,从而导致 ABI 不兼容。…...
笔记本电脑突然无法开机电源灯亮但是屏幕无法点亮
现象 按电源键,电源灯点亮,屏幕没动静 风扇开始运转,然后一会儿就不转了;屏幕一直没动静,屏幕没有任何反应(没有系统启动画面,没有徽标显示,就一点反应也没用) 这个问…...
mongodb 4.0+多文档事务的实现原理
1. 副本集事务实现(4.0) 非严格依赖二阶段提交 MongoDB 4.0 在副本集环境中通过 全局逻辑时钟(Logical Clock) 和 快照隔离(Snapshot Isolation) 实现多文档事务,事务提交时通过…...
decompiled.class file bytecode version50(java 6)
idea运行项目报错,跳到具体的.class中,idea会给出提示下载源码,点击下载报错,具体报错信息我没记录了(反正就是无法看到源码) 解决方式: 1、网上说下载scala插件,重启idea即可 但是…...
CSS 列表样式学习笔记
CSS 列表样式提供了强大的功能,用于定制 HTML 列表的外观。通过 CSS,可以轻松地改变列表项的标记类型、位置,甚至使用图像作为列表项标记。以下是对 CSS 列表样式的详细学习笔记。 一、HTML 列表类型 在 HTML 中,主要有两种类型…...
linux网络设置
ifconfig 查看ip地址 查看当前的liunx系统的网络参数ip地址 Ubuntu需要安装 Apt install -y net-tools 查看网络信息 Ifconfig 只能看到开启的网卡 Ifconfig -a 看到所有的网卡包括开启和关闭的 Ifconfig 网卡名称 up 开启网卡 Ifconfig 网卡名称 down 关闭网卡 If…...
抗干扰CAN总线通信技术在分布式电力系统中的应用
摘要:随着分布式电力系统的广泛应用,其通信系统的可靠性与稳定性受到了前所未有的挑战。CAN总线通信技术以其卓越的抗干扰性能和可靠性,在众多通信技术中脱颖而出,成为解决分布式电力系统通信问题的关键。本文深入剖析了CAN总线通…...
Maven工具学习使用(十二)——extension和depency的区别
在 Maven 中,extensions 和 dependencies 是两个不同的概念,它们在项目构建和依赖管理中扮演着不同的角色。 1、Dependencies dependencies 是 Maven 项目中用于管理项目所需的库和模块的部分。这些依赖可以是本地仓库中的,也可以是远程仓库…...
Python学生信息查询
利用字典设置学生信息,将这些信息放入列表中进行存储,根据输入的姓名查询展示对应的学生信息。 Student1{no:202001,name:zyt,score:87} Student2Student1.copy() Student3Student2.copy()Student2[no]202002 Student3[no]202003Student2[name]zwh Stud…...
一天时间,我用AI(deepseek)做了一个配色网站
前言 最近在开发颜色搭配主题的相关H5和小程序,想到需要补充一个web网站,因此有了这篇文章。 一、确定需求 向AI要答案之前,一定要清楚自己想要做什么。如果你没有100%了解自己的需求,可以先让AI帮你理清逻辑和思路,…...
MQ(消息队列)体系详解
消息队列(MQ,Message Queue) 是一种基于消息传递的异步通信机制,用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者,提供高可用、高吞吐量和可靠的消息传递。 一、消息队列用途 1.系统解耦 …...
【GESP真题解析】第 3 集 GESP一级样题卷编程题 2:闰年求和
大家好,我是莫小特。 这篇文章给大家分享 GESP 一级样题卷编程题第 2 题:闰年求和。 题目链接 洛谷链接:B3846 闰年求和 一、完成输入 根据题目要求,我们需要输入两个整数,分别表示起始年份和终止年份。 要求计算…...
Windows Server 2019 安装 Docker 完整指南
博主本人使用的是离线安装 1. 安装前准备 系统要求 操作系统:Windows Server 2019(或 2016/2022)权限:管理员权限的 PowerShell网络:可访问互联网(或离线安装包) 启用容器功能 Install-Win…...
JetBrains PhpStorm v2024.3.1 Mac PHP开发工具
JetBrains PhpStorm v2024.3.1 Mac PHP开发工具 一、介绍 JetBrains PhpStorm 2024 mac,是一款PHP开发工具,直接开始编码,无需安装和配置大量插件。PhpStorm 从一开始就已包含 PHP、JavaScript 和 TypeScript 开发所需的一切,还…...
机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。
机器学习(ML)在AI驱动测试中扮演着 核心引擎 的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。以下是机器学习在测试各环节的具体作用及实现方案: 一、机器学习在测试生命周期中的作用 #mermaid-svg-u4vgPE6O2jugiZFB {font-family:"trebuchet ms&qu…...
0x06.Redis 中常见的数据类型有哪些?
回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...
本地缓存方案Guava Cache
Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案,适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...
A Causal Inference Look at Unsupervised Video Anomaly Detection
标题:无监督视频异常检测的因果推断视角 原文链接:https://ojs.aaai.org/index.php/AAAI/article/view/20053 发表:AAAI-2022 文章目录 摘要引言相关工作无监督视频异常检测因果推断 方法问题公式化一般设置强基线模型 无监督视频异常检测的因…...
MQ(RabbitMQ.1)
MQ的含义及面试题 MQMQ的含义MQ之间的调用的方式MQ的作用MQ的几种产品RabbitMQRabbitMQ的安装RabbitMQ的使用RabbitMQ⼯作流程 AMQPWeb界面操作用户相关操作虚拟主机相关操作 RabbitMQ的代码应用编写生产者代码编写消费者代码 生产者代码消费者代码 MQ MQ的含义 MQ࿰…...
cursor+高德MCP:制作一份旅游攻略
高德开放平台 | 高德地图API (amap.com) 1.注册成为开发者 2.进入控制台选择应用管理----->我的应用 3.新建应用 4.点击添加Key 5.在高德开发平台找到MCP的文档 6.按照快速接入的步骤,进行操作 一定要按照最新版的cursor, 如果之前已经安装旧的版本卸载掉重新安…...