1st author: Eric Zelikman

paper: STaR: Bootstrapping Reasoning With Reasoning | OpenReview NeurIPS 2022

code: ezelikman/STaR: Code for STaR: Bootstrapping Reasoning With Reasoning (NeurIPS 2022)


1. 当语言模型学会自我进化

Zelikman 等人提出的 STaR (Self-Taught Reasoner),旨在解决当前大型语言模型在复杂推理任务中,高质量“思维链”(Chain-of-Thought, CoT)数据获取的困境。目前主流方法要么依赖昂贵的人工标注,要么牺牲准确性采用少样本(few-shot)推理。STaR 独辟蹊径,提出一种迭代式自学习框架,让模型能够利用少量带推理过程的样本和大量无推理过程的问答对,自我生成并筛选推理过程,从而引导自身逐步提升推理能力

1.1 问题根源与解法思路

当前,我们深知 CoT 能显著提升 LLM 在数学、常识问答等任务上的表现。然而,构建大规模、高质量的 CoT 数据集是瓶颈:

  1. 人工标注 (Manual Annotation): 成本高昂,难以覆盖所有领域。
  2. 模板化生成 (Template-based): 适用范围窄,依赖预先设计的启发式规则或已知解法。
  3. 少样本提示 (Few-shot Prompting with CoT): 虽然灵活,但通常性能远不如在完整 CoT 数据集上微调的模型。

STaR 的核心思想可以概括为一个 “生成 - 筛选 - 学习” 的迭代循环:

  1. 生成 (Generate): 利用现有的少量 CoT 样本作为提示 (prompt),引导模型为大量无 CoT 的问题生成推理过程和答案。

    • 形式化地,给定问题 x i x_i xi,模型 M M M 生成推理 r i r_i ri 和答案 y ^ i \hat{y}_i y^i ( r i , y ^ i ) ∼ M ( x i ∣ P ) (r_i, \hat{y}_i) \sim M(x_i | P) (ri,y^i)M(xiP), 其中 P P P 是少量 CoT 样本集合。
  2. 筛选 (Filter): 只保留那些最终能导出正确答案 y i y_i yi 的推理过程。

    • 构建训练集 D c o r r e c t = { ( x i , r i , y i ) ∣ y ^ i = y i } D_{correct} = \{ (x_i, r_i, y_i) | \hat{y}_i = y_i \} Dcorrect={(xi,ri,yi)y^i=yi}
  3. 学习 (Learn): 在筛选后的高质量 ( x i , r i , y i ) (x_i, r_i, y_i) (xi,ri,yi) 数据上微调 (fine-tune) 基础 LLM。

  4. 重复 (Repeat): 使用微调后的新模型,重复上述过程,期望能解决更复杂的问题,生成更高质量的推理。

1.2. 关键:“反思”与“合理化” (Rationalization)

上述循环存在一个问题:如果模型在某些问题上持续失败,它将无法从这些失败中获得新的学习信号。为了解决这个问题,STaR 引入了一个巧妙的机制—— “合理化” (Rationalization)

  • 对于模型未能正确解答的问题 ( x j , y j ) (x_j, y_j) (xj,yj),STaR 会将正确答案 y j y_j yj 作为提示的一部分,再次引导模型生成一个能够“解释”或“推导出”这个正确答案的推理过程 r j r a t r_j^{rat} rjrat
    • ( r j r a t , y ^ j r a t ) ∼ M ( x j , hint = y j ∣ P ′ ) (r_j^{rat}, \hat{y}_j^{rat}) \sim M(x_j, \text{hint}=y_j | P') (rjrat,y^jrat)M(xj,hint=yjP),其中 P ′ P' P 可能是包含答案提示格式的样本。
  • 如果这个“事后诸葛亮”式的推理 y ^ j r a t \hat{y}_j^{rat} y^jrat 确实能导出 y j y_j yj,则将 ( x j , r j r a t , y j ) (x_j, r_j^{rat}, y_j) (xj,rjrat,yj) 加入训练集。
  • 注意: 在微调时,这个“提示”信息(即正确答案 y j y_j yj)并不会包含在输入中,模型被训练得仿佛是它自己独立思考出 r j r a t r_j^{rat} rjrat 的。

这个“合理化”步骤,本质上是让模型学会 “向答案学习推理” ,从而攻克原本难以解决的难题,并扩大了有效训练数据的规模。

1.3. 数学视角的 STaR

论文指出,STaR 的过程可以视为一种对强化学习(RL)策略梯度目标的近似。

将模型 M M M 视为一个生成 ( r , y ^ ) (r, \hat{y}) (r,y^) 的策略。给定问题 x x x 和真实答案 y y y,我们可以定义一个奖励函数,例如指示函数 I ( y ^ = y ) \mathbb{I}(\hat{y} = y) I(y^=y),当模型生成的答案 y ^ \hat{y} y^ 与真实答案 y y y 相同时,奖励为 1,否则为 0。

目标是最大化期望奖励:
J ( M , X , Y ) = ∑ i E r i , y ^ i ∼ p M ( x i ) [ I ( y ^ i = y i ) ] J(M, X, Y) = \sum_i \mathbb{E}_{r_i, \hat{y}_i \sim p_M(x_i)} [\mathbb{I}(\hat{y}_i = y_i)] J(M,X,Y)=iEri,y^ipM(xi)[I(y^i=yi)]
其梯度可以写作:
∇ J ( M , X , Y ) = ∑ i E r i , y ^ i ∼ p M ( x i ) [ I ( y ^ i = y i ) ⋅ ∇ log ⁡ p M ( y ^ i , r i ∣ x i ) ] \nabla J(M, X, Y) = \sum_i \mathbb{E}_{r_i, \hat{y}_i \sim p_M(x_i)} [\mathbb{I}(\hat{y}_i = y_i) \cdot \nabla \log p_M(\hat{y}_i, r_i | x_i)] J(M,X,Y)=iEri,y^ipM(xi)[I(y^i=yi)logpM(y^i,rixi)]
STaR 的做法可以理解为:

  1. Greedy Decoding: 通过贪心解码(或低 temperature 采样)来近似采样 ( r i , y ^ i ) (r_i, \hat{y}_i) (ri,y^i),以减少方差(但可能引入偏差)。
  2. Filtering as Reward: I ( y ^ i = y i ) \mathbb{I}(\hat{y}_i = y_i) I(y^i=yi) 项使得只有导出正确答案的 ( r i , y ^ i ) (r_i, \hat{y}_i) (ri,y^i) 对梯度有贡献,这正是 STaR 中“筛选”步骤的体现。
  3. Supervised Fine-tuning: 对筛选出的样本进行微调,可以看作是在这个近似的策略梯度上进行多步优化。

“合理化”步骤则可以看作是从一个不同的、加入了提示(hint)的“教师”分布 p M ( r ∣ x , y ) p_M(r | x, y) pM(rx,y) 中采样高质量的轨迹,用于丰富训练数据,帮助模型探索更优的策略空间。

2. 算法流程

STaR 算法伪代码:

Figure 1

论文中给出了清晰的算法流程图(Figure 1)和伪代码(Algorithm 1)。我们可以将其逻辑概括如下:


Algorithm 1: STaR

输入:

  • M pretrained M_{\text{pretrained}} Mpretrained: 预训练的大语言模型
  • D = { ( x i , y i ) } i = 1 N D = \{(x_i, y_i)\}_{i=1}^N D={(xi,yi)}i=1N: 问题-答案数据集
  • P few_shot P_{\text{few\_shot}} Pfew_shot: 少量带推理过程的示例

初始化:
M 0 ← M pretrained M_0 \leftarrow M_{\text{pretrained}} M0Mpretrained // 复制原始模型

循环迭代 n = 1 n = 1 n=1 Max_Iterations \text{Max\_Iterations} Max_Iterations:

  1. 生成步骤 (Rationale Generation):

    • 初始化生成的推理集合: G e n e r a t e d _ R a t i o n a l e s ← { } Generated\_Rationales \leftarrow \{\} Generated_Rationales{}
    • 对每个样本 ( x i , y i ) ∈ D (x_i, y_i) \in D (xi,yi)D:
      • ( r gen i , y gen ^ i ) ← M n − 1 . generate ( prompt ( P few_shot , x i ) ) (r_{\text{gen}_i}, y_{\hat{\text{gen}}_i}) \leftarrow M_{n-1}.\text{generate}(\text{prompt}(P_{\text{few\_shot}}, x_i)) (rgeni,ygen^i)Mn1.generate(prompt(Pfew_shot,xi))
      • 添加 ( x i , y i , r gen i , y gen ^ i ) (x_i, y_i, r_{\text{gen}_i}, y_{\hat{\text{gen}}_i}) (xi,yi,rgeni,ygen^i) G e n e r a t e d _ R a t i o n a l e s Generated\_Rationales Generated_Rationales
  2. 生成推理过滤步骤:

    • 初始化正确推理集合: D n correct ← { } D_n^{\text{correct}} \leftarrow \{\} Dncorrect{}
    • 对每个 ( x i , y i , r gen i , y gen ^ i ) ∈ G e n e r a t e d _ R a t i o n a l e s (x_i, y_i, r_{\text{gen}_i}, y_{\hat{\text{gen}}_i}) \in Generated\_Rationales (xi,yi,rgeni,ygen^i)Generated_Rationales:
      • y gen ^ i = y i y_{\hat{\text{gen}}_i} = y_i ygen^i=yi:
        • 添加 ( x i , r gen i , y i ) (x_i, r_{\text{gen}_i}, y_i) (xi,rgeni,yi) D n correct D_n^{\text{correct}} Dncorrect
  3. 错误答案合理化步骤:

    • 初始化合理化推理集合: R a t i o n a l i z e d _ R a t i o n a l e s ← { } Rationalized\_Rationales \leftarrow \{\} Rationalized_Rationales{}
    • 对每个 ( x i , y i , r gen i , y gen ^ i ) ∈ G e n e r a t e d _ R a t i o n a l e s (x_i, y_i, r_{\text{gen}_i}, y_{\hat{\text{gen}}_i}) \in Generated\_Rationales (xi,yi,rgeni,ygen^i)Generated_Rationales:
      • y gen ^ i ≠ y i y_{\hat{\text{gen}}_i} \neq y_i ygen^i=yi:
        • ( r rat i , y rat ^ i ) ← M n − 1 . generate ( prompt ( P few_shot_with_hint , x i , hint = y i ) ) (r_{\text{rat}_i}, y_{\hat{\text{rat}}_i}) \leftarrow M_{n-1}.\text{generate}(\text{prompt}(P_{\text{few\_shot\_with\_hint}}, x_i, \text{hint}=y_i)) (rrati,yrat^i)Mn1.generate(prompt(Pfew_shot_with_hint,xi,hint=yi))
        • 添加 ( x i , y i , r rat i , y rat ^ i ) (x_i, y_i, r_{\text{rat}_i}, y_{\hat{\text{rat}}_i}) (xi,yi,rrati,yrat^i) R a t i o n a l i z e d _ R a t i o n a l e s Rationalized\_Rationales Rationalized_Rationales
  4. 合理化推理过滤步骤:

    • 初始化合理化训练集: D n rationalized ← { } D_n^{\text{rationalized}} \leftarrow \{\} Dnrationalized{}
    • 对每个 ( x i , y i , r rat i , y rat ^ i ) ∈ R a t i o n a l i z e d _ R a t i o n a l e s (x_i, y_i, r_{\text{rat}_i}, y_{\hat{\text{rat}}_i}) \in Rationalized\_Rationales (xi,yi,rrati,yrat^i)Rationalized_Rationales:
      • y rat ^ i = y i y_{\hat{\text{rat}}_i} = y_i yrat^i=yi:
        • 添加 ( x i , r rat i , y i ) (x_i, r_{\text{rat}_i}, y_i) (xi,rrati,yi) D n rationalized D_n^{\text{rationalized}} Dnrationalized
  5. 合并数据与微调:

    • 合并训练集: D n train ← D n correct ∪ D n rationalized D_n^{\text{train}} \leftarrow D_n^{\text{correct}} \cup D_n^{\text{rationalized}} DntrainDncorrectDnrationalized
    • D n train = { } D_n^{\text{train}} = \{\} Dntrain={} 或 性能达到平台期:
      • 终止迭代
    • 微调模型: M n ← fine_tune ( M pretrained , D n train ) M_n \leftarrow \text{fine\_tune}(M_{\text{pretrained}}, D_n^{\text{train}}) Mnfine_tune(Mpretrained,Dntrain)
      • 关键: 每次从预训练模型微调,而非上一轮模型,避免过拟合
    • 更新模型: M n − 1 ← M n M_{n-1} \leftarrow M_n Mn1Mn

输出: 基于验证性能选择最优模型 M n M_n Mn


3. 实验剖析

3.1. 参数与设置细节

  • 基础模型 (Base Model): GPT-J (6B 参数 )。选择 GPT-J 是因为其开源且具备一定的推理能力基础。
  • 迭代次数 (Iterations): 实验中通常运行到性能饱和为止。
  • 训练步数 (Training Steps per Iteration): 初始迭代训练步数较少(如 40 步),后续迭代中逐步增加(如每轮增加 20%)。这种渐进式增加训练强度的方法,有助于模型在早期稳定学习,后期充分利用数据。
  • Few-shot Prompts:
    • Rationale Generation: 使用少量 ( 如 10 个 ) 固定的、高质量的 CoT 示例。
    • Rationalization: 使用类似的 CoT 示例,但格式上会明确包含“正确答案提示”。例如,在 CommonsenseQA (CQA) 的例子中(Figure 2),提示是 (b) grocery cart (CORRECT)
  • 数据集 (Datasets):
    • Arithmetic ( 算术 ): n 位数加法。评估模型对符号操作和步骤记忆的能力。
    • CommonsenseQA (CQA): 常识问答选择题。评估自然语言理解和常识推理。
    • GSM8K (Grade School Math): 小学数学应用题。评估结合算术和文本理解的复杂推理。
  • 关键trick:从预训练模型重新微调: 每次迭代收集到新的训练数据后,STaR 从原始的预训练模型 M p r e t r a i n e d M_pretrained Mpretrained 开始微调,而不是在上一次迭代的模型 M n − 1 M_{n-1} Mn1 基础上继续微调。这可以有效防止灾难性遗忘和过拟合到特定迭代生成的数据噪声。

3.2. 实验结果亮点:

  1. 显著优于基线:

    • Arithmetic: STaR 能够从几乎为零的 few-shot 准确率(2 位数加法 < 1%)通过迭代学习达到很高的准确率(16 次迭代后整体 89.5%)。对比直接在无推理过程的 10,000 个样本上微调(76.3%),优势明显。
    • CommonsenseQA (CQA):
      • STaR (72.5% 准确率 ) 显著超过 few-shot CoT GPT-J (36.6%) 和直接微调 GPT-J (60.0%)。
      • STaR (GPT-J 6B) 的性能逼近了在完整数据集上微调的 GPT-3 (175B,论文中提到的是 30x 更大的模型,应指 PaLM 或类似规模,CQA 上的 GPT-3 Finetuned 结果为 73.0%)。这表明 STaR 能够有效地从小模型中“榨取”出强大的推理能力。
      • Rationalization 的作用: 在 CQA 上,加入 Rationalization 后,准确率从 68.8% (STaR without rationalization) 提升到 72.5%,证明了其在解决难题和提升上限方面的价值。
    • GSM8K: STaR (10.7%) 同样远超 few-shot CoT GPT-J (3.1%) 和直接微调 GPT-J (5.8%)。
  2. Rationalization 的加速与提升效果:

    Figure 4

    • Arithmetic ( Figure 4): 有 Rationalization 的 STaR ( Figure 4b) 相比无 Rationalization ( Figure 4a),在早期迭代中对多位数加法的学习速度更快,性能提升更平滑。无 Rationalization 的版本则呈现阶梯式提升,即模型通常在掌握 (n-1) 位数加法后才能较好地学习 n 位数加法。
    • CommonsenseQA: Rationalization 带来了约 3.7% 的绝对提升。
  3. 数据效率: STaR 通常只使用了训练集的一部分(例如 CQA 上约 86.7% 的数据,其中 8.5% 来自 Rationalization),但取得了比使用完整数据集直接微调更好的性能。这说明 STaR 生成的 CoT 数据质量较高。

  4. 推理质量的提升 (Case Study & Human Evaluation on CQA):

    • Case Study: 展示了 STaR 能够生成比 few-shot CoT 更合理、更连贯的推理过程,即使原始 few-shot 也能答对问题。(论文提到 Figure 7 展示, 但是作者可能忘了放这张图)
    • Human Evaluation: 众包评估者认为 STaR 生成的推理过程比 few-shot CoT 生成的推理过程更具说服力(30% more likely to rank STaR higher, p=0.039)。甚至,STaR 生成的推理比一些人工标注的推理更受青睐(74% more likely, p < 0.001),这可能反映了众包标注本身的质量波动,但也侧面印证了 STaR 生成推理的潜力。

3.4. 对实验结果的初步思考

  • STaR 的成功,很大程度上依赖于基础 LLM 已具备一定的“潜在”推理能力。Few-shot CoT 能够激活这种能力,而 STaR 通过迭代微调,将这种“潜在”能力强化并泛化。

  • Rationalization 机制非常精妙,它相当于给模型提供了一个 “目标导向的逆向工程” 机会,让模型思考“为了得到这个答案,我应该如何推理?”

  • “从头微调”策略是控制训练稳定性和避免过拟合的关键。

4. 挑战、局限性与未来展望

4.1. STaR 面临的挑战与局限性

  1. 对初始 Few-shot 样本的依赖与敏感性:

    • STaR 的启动依赖于少量高质量的 CoT 样本。这些样本的质量和风格可能会显著影响后续生成的推理过程的质量和多样性。
    • 如果初始样本包含偏见或不完善的推理模式,STaR 可能会放大这些问题。
  2. “正确答案但错误推理”的问题 (Filtering Imperfection):

    • STaR 的核心筛选机制是基于最终答案的正确性。这意味着,如果模型通过一个错误的、不相关的或者仅仅是“碰巧”正确的推理过程得到了正确答案,这样的样本依然会被用于微调。
    • 在多项选择题(如 CQA)中,随机猜对的概率不低 (20%),这使得该问题尤为突出。虽然论文提到一些简单启发式方法(如语义相似度)可以将随机猜测提升到约 30%,但 STaR 的目标是学习真正的推理。
    • 这种“噪声”数据可能会污染训练集,限制模型学习到真正鲁棒和泛化的推理能力。
  3. Rationalization 的提示工程:

    • 如何设计“合理化”步骤中的提示(即如何将正确答案作为 hint 融入问题)可能并非易事,尤其对于更复杂的任务结构。
    • 论文中对算术和 CQA 的提示方式相对直接,但其普适性有待验证。
  4. 计算成本:

    • 迭代生成、筛选和微调的过程计算成本较高。尽管比标注大规模 CoT 数据集便宜,但对于资源受限的研究者而言仍是一个考量。
    • 每次都从预训练模型重新微调,虽然能避免过拟合,但也增加了训练时间。
  5. 温度参数 (Temperature) 的影响:

    • 论文提到,尝试使用更高的温度进行采样以增加数据多样性,结果适得其反,导致模型性能下降,尤其是在结构化任务(如算术)中,生成的“思维链”会变得无意义。
    • 这表明 STaR 依赖于模型在低温度下生成相对“自信”且连贯的推理。如何平衡探索(高温度)和利用(低温度)仍然是一个开放问题。
  6. 可解释性与忠实度 (Faithfulness):

    • 虽然 STaR 生成的推理看起来更合理,但我们无法保证这些推理过程真正反映了模型内部的“思考”过程。模型可能只是学会了生成“看起来像那么回事”的文本。
    • 这是所有基于生成 CoT 方法的共同挑战。
  7. 偏见放大 (Bias Amplification):

    • 如果原始数据集或 few-shot 样本中存在偏见(例如,CQA 中的性别偏见),STaR 的迭代学习过程可能会放大这些偏见,因为它倾向于强化那些能“成功”解决训练集问题的模式,即使这些模式是基于偏见的。
    • 论文提到了一些初步的积极迹象(如模型在性别无关问题中似乎忽略了性别信息),但这需要更深入的研究。
  8. 对小模型和简单任务的适用性:

    • STaR 的成功依赖于基础模型具备一定的 few-shot 推理能力。对于非常小的模型或无法通过 few-shot 激活推理能力的简单任务,STaR 可能难以启动。论文提到 GPT-2 在算术任务上无法通过 STaR 自举。
    • 对于正确率本身就很高(例如二元决策)的任务,错误答案的样本过少,Rationalization 的作用会减弱。

4.2. STaR 的深远意义与未来展望

  1. 迈向模型自我改进的重要一步: STaR 最核心的贡献在于展示了一种让 LLM 通过自身的生成和推理来学习和改进自身推理能力的有效途径。这为实现更自主、更少依赖人工监督的 AI 系统提供了新的思路。

  2. 数据高效的推理能力获取: STaR 证明了可以利用大量无标注数据和少量有标注数据,以一种自举的方式生成高质量的推理训练数据,这对于解决许多领域标注数据稀缺的问题具有重要价值。

  3. 对“思维链”研究的推动: STaR 强调了推理过程本身作为学习信号的重要性。未来的研究可以探索更精细化的推理过程评估方法(超越最终答案的正确性),例如引入 token 级验证器(如论文 [9] Cobbe et al. 中用于数学问题的验证器)。

  4. 结合强化学习的潜力: 论文中已将 STaR 与 RL 的策略梯度联系起来。未来可以探索更直接的 RL 方法,例如使用模型自身生成的推理作为轨迹,并设计更复杂的奖励函数来指导学习,或者结合基于模型的 RL 来规划推理步骤。

  5. 探索更优的 Rationalization 机制:

    • 如何更有效地从“失败”中学习?除了提供正确答案,是否可以提供更细致的反馈或引导?
    • 研究不同类型的“提示”对 Rationalization 效果的影响。
  6. 处理“正确答案但错误推理”:

    • 开发自动检测或过滤不合理推理的方法。
    • 引入“负面样本”学习,即明确告诉模型哪些推理是错误的。
  7. 跨任务和跨领域泛化: STaR 在特定任务上学习到的推理能力,能否更好地泛化到新的、未见过的任务或领域?

  8. 与人类反馈的结合: STaR 的迭代过程可以与人类反馈回路(Human-in-the-loop)相结合,让人类专家在关键的筛选或 Rationalization 步骤提供指导,进一步提升学习效率和推理质量。

4.3. 总结

STaR 是一项具有开创性的工作,它巧妙地利用了大型语言模型自身的生成能力,通过迭代式的“生成 - 筛选(含合理化)- 学习”循环,实现了在复杂推理任务上显著的性能提升,并且在某些任务上逼近了远大于自身规模的模型。它不仅为解决 CoT 数据获取难题提供了有效方案,更为重要的是,它展示了语言模型 “自我教育”和“自我进化” 的巨大潜力。尽管存在一些挑战和局限,STaR 无疑为 LLM 的能力边界探索和未来发展开辟了新的道路。

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

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

相关文章

大语言模型 19 - MCP FastAPI-MCP 实现自己的MCP服务 快速接入API

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…

用Matlab对单目相机参数的标定步骤(保姆级教程)

前言 在图像测量及机器视觉应用中&#xff0c;为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系&#xff0c;必须建立相机成像的几何模型&#xff0c;这些几何模型参数就是相机参数。   在大多数条件下这些参数必须通过实验与计算才能得到&#xff…

【后端高阶面经:架构篇】46、分布式架构:如何应对高并发的用户请求

一、架构设计原则:构建可扩展的系统基石 在分布式系统中,高并发场景对架构设计提出了极高要求。 分层解耦与模块化是应对复杂业务的核心策略,通过将系统划分为客户端、CDN/边缘节点、API网关、微服务集群、缓存层和数据库层等多个层次,实现各模块的独立演进与维护。 1.1 …

SQL每日一题(5)

前言&#xff1a;五更&#xff01;五更琉璃&#xff01;不对&#xff01;是&#xff0c;五更佩可&#xff01; 原始数据&#xff1a; new_hires reasonother_column1other_column2校园招聘信息 11社会招聘信息 22内部推荐信息 33猎头推荐信息 44校园招聘信息 55社会招聘信息…

Kafka Kraft模式集群 + ssl

文章目录 启用集群资源规划准备证书创建相关文件夹配置文件启动各Kafka节点 故障转移测试spring boot集成 启用集群 配置集群时关键就是提前梳理好需要的网络资源&#xff0c;完成对应server.properties文件的配置。在执行前先把这些梳理好&#xff0c;可以方便后面的配置&…

watchEffect

在处理复杂异步逻辑时&#xff0c;Vue 3 的 watchEffect 相比传统的 watch 具有以下优势&#xff1a; 1. 自动追踪依赖 watchEffect 会自动收集其回调中使用的所有响应式依赖&#xff0c;无需手动指定监听源&#xff1a; import { ref, watchEffect } from vue;const count …

Linux系统平均负载与top、uptime命令详解

介绍 在Linux系统运维中&#xff0c;系统平均负载是一个重要的性能指标。通过 top和 uptime命令&#xff0c;可以实时监控系统的负载情况&#xff0c;帮助运维人员及时发现并解决系统性能问题。本文将详细介绍Linux系统平均负载的概念及其计算方法&#xff0c;并深入解析 top和…

前端配置nginx代理

一、定义静态文件的路径的两种方式 1. root 指令 &#xff08;1&#xff09;作用 指定文件系统的 基础路径&#xff0c;location 的 URI 会 追加到该路径后 形成完整路径。 &#xff08;2&#xff09;语法 location /uri/ {root /path/to/files; } &#xff08;3&#xf…

语音识别技术在人工智能中的应用

姓名&#xff1a;成杰 学号&#xff1a;21021210653 学院&#xff1a;电子工程学院 【嵌牛导读】 应用语音智能这项识别技术是为了使计算机可以听懂人类的语言&#xff0c;并执行人类的某项操作。现阶段这项技术已经成为人工智能领域的重点研究方向和实现人机语音交互的…

uniapp实现大视频文件上传-- 阿里云oss直传方式 - app、H5、微信小程序

之前的项目文件上传比较慢&#xff0c;使用预签名方式上传H5正常&#xff0c;微信小程序和app使用axios时出现了各种报错&#xff0c;配置完后还是不行。所以换一种oss直传方式。 找到一个 实现了的 参考:https://blog.csdn.net/qq_44860866/article/details/129670188

【Java学习笔记】抽象类

抽象类 引入关键字&#xff1a;abstract 应用场景&#xff1a;当子类中共有的部分 / 特性可以放到抽象类中 1. 通过子类的方法重写实现不同的功能 2. 编写一个方法把共有的部分放入其中&#xff0c;在该方法中调用抽象方法&#xff08;动态绑定机制&#xff09; 3. 便可以实…

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题 一、核心原理:分解提示与多空间投影 1. 提示分解:用低秩矩阵压缩长提示 传统问题: 长提示(如100个token)精度高但训练慢,短提示(如20个token)速度快但…

深入剖析Java中的伪共享:原理、检测与解决方案

在高性能Java应用的开发中&#xff0c;尤其是多线程环境下&#xff0c;开发者往往会关注锁竞争、线程调度等显性问题&#xff0c;但有一个隐蔽的性能杀手——伪共享&#xff08;False Sharing&#xff09;​&#xff0c;却容易被忽视。本文将通过原理分析、代码案例与实战工具&…

JMeter 教程:响应断言

目录 JMeter 教程&#xff1a;响应断言的简单介绍【轻松上手】 ✅ 什么是响应断言&#xff1f; &#x1f4cc; 使用场景示例 &#x1f6e0;️ 添加响应断言步骤 1. 选中 HTTP 请求 → 右键 → Add → Assertions → Response Assertion 2. 设置断言内容&#xff1a; ✅ …

11.11 TypedDict与Pydantic实战:Python高效状态管理秘籍

使用 TypedDict 和 Pydantic 管理状态 关键词:LangGraph 状态管理, TypedDict 类型化字典, Pydantic 数据模型, 状态持久化, 多轮对话设计 1. 状态管理的核心挑战 在复杂 AI Agent 系统中,状态管理需要解决三个关键问题: #mermaid-svg-0sX3763L7VP2RvuX {font-family:&quo…

ThreadLocal线程本地变量在dubbo服务使用时候遇到的一个坑

我昨天遇到一个问题&#xff0c;就是我springboot项目里面有一个提供代办服务审核的dubbo接口&#xff0c;这个接口给房源项目调用&#xff0c;但是碰到一个问题就是&#xff0c;房源项目每天凌晨5点会查询满足条件过期的数据&#xff0c;然后调用我这边的代办审核dubbo接口&am…

[Java实战]Spring Boot整合达梦数据库连接池配置(三十四)

[Java实战]Spring Boot整合达梦数据库连接池配置&#xff08;三十四&#xff09; 一、HikariCP连接池配置&#xff08;默认&#xff09; 1. 基础配置&#xff08;application.yml&#xff09; spring:datasource:driver-class-name: dm.jdbc.driver.DmDriverurl: jdbc:dm://…

【MySQL】08.视图

视图就是一个由查询到的内容定义的虚拟表。它和真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 mysql> select * from user; -------------------- | id | age | name …

4 通道1250MSPS‐16bit DAC 回放板

简介 4 通道1250MSPS‐16bit DAC 回放板 是一款4 路转换速率最高为1250MSPS 的DAC 回放板&#xff0c; DAC 位数16bit&#xff1b;板卡支持触发输出/触发输入&#xff1b;DAC 采样时钟源支持内部参考时 钟、外部参考时钟、外部采样时钟三种方式&#xff0c;可通过SPI 总线实现时…

C/C++---类型转换运算符

在C中&#xff0c;类型转换运算符&#xff08;Type Conversion Operator&#xff09;允许类对象在需要时自动转换为其他类型。这是一种特殊的成员函数&#xff0c;能够增强类的灵活性和交互性。 1. 基本语法 类型转换运算符的声明格式为&#xff1a; operator 目标类型() co…