来自:SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs

目录

  • 相关工作
  • 引理
    • 符号规则
    • 任务描述
  • 方法
    • Agent-Planner
    • Agent-Executor
      • Action空间
      • 交互过程
    • 自学习
      • 在线探索
      • 离线迭代策略更新

相关工作

相关工作-语义解析法
语义解析方法会将问题解析为可执行的形式化语言(如SPARQL),并在知识图谱上执行精确查询以获取答案。早期研究则利用序列到序列(Seq2Seq)模型(如T5)直接生成SARSQL表达式,借助预训练语言模型的能力来增强语义解析过程。最近,ChatKBQA通过对大型语言模型(如LLaMA)进行进一步微调,提高了形式化语言生成的准确性。尽管取得了这些进展,但语义解析方法严重依赖生成查询序列的质量,若查询无法执行,则无法得到答案

相关工作-检索增强法
检索增强方法从知识图谱中检索相关的事实三元组,然后将其输入大型语言模型,以辅助生成最终答案。一些方法则通过评估问题与相关事实之间的语义相似度来检索事实。同时,某些方法利用LLM对问题进行分解,然后检索相应的三元组用于生成,以此提高检索过程的精度。值得注意的是,ToG采用了一种探索与利用策略,允许大型语言模型遍历知识图谱来收集信息,从而取得了最先进的性能。GoG进一步提出了“思考-搜索-生成”范式,以解决知识图谱的不完备性问题。然而,这些方法大多依赖于功能强大的闭源大型语言模型接口(例如GPT-4),当使用较弱的大型语言模型作为基础时,性能会显著下降

基于LLM的Agent
鉴于大型语言模型(LLMs)展现出令人惊叹的长程规划与推理能力,研究人员已开始探索构建基于大型语言模型的智能体系统,以开启通用人工智能的大门。最具代表性的大型语言模型智能体ReAct提出了一种提示方法,使大型语言模型能够与外部环境交互并接收反馈。后续研究进一步聚焦于智能体规划、函数调用和代码生成,提升了大型语言模型在各类复杂任务中的能力。近来,越来越多的研究关注通过在从教师模型中提炼的专家数据上进行微调,赋予开源大型语言模型以智能体能力。然而,AutoAct和AgentGym等方法提出了自交互轨迹合成技术,其性能优于蒸馏方法,并展现出巨大潜力。此外,近期研究强调了将强化学习技术与大型语言模型相结合的重要性,以增强其在动态场景中的决策能力

引理

符号规则

知识图谱是事实三元组的集合,表示为G={(e,r,e′)∣e,e′∈E,r∈R}G = \{(e, r, e') | e, e' \in E, r \in R\}G={(e,r,e)e,eE,rR},其中EEERRR分别代表实体集和关系集。知识图谱中的符号规则通常表示为一阶逻辑公式:
rh(x,y)←r1(x,z1)∧r2(z1,z2)∧...∧rn(zn−1,y),(1)r_{h}(x, y) \leftarrow r_{1}\left(x, z_{1}\right) \land r_{2}\left(z_{1}, z_{2}\right) \land ... \land r_{n}\left(z_{n-1}, y\right), (1)rh(x,y)r1(x,z1)r2(z1,z2)...rn(zn1,y),(1)

其中,左侧表示规则头,包含关系rhr_{h}rh,该关系可由右侧的规则体推导得出(←);规则体形成一个闭合链,后续关系共享中间变量(如ziz_izi),通过合取(∧)来表示。通过将所有变量xxxyyyzzz替换为特定实体,知识图谱可被视为符号规则的实例化。例如,给定三元组(Sam,workFor,OpenAI)、(OpenAI,locatedIn,SF)和(Sam,liveIn,SF),一个长度为2的符号规则的实例化为liveIn(Sam, SF) ← workFor(Sam, OpenAI) ∧ locatedIn(OpenAI, SF)。

任务描述

在本文中,将知识图谱(KG)上的推理任务转化为一项基于大语言模型(LLM)的智能体任务。在此任务中,知识图谱充当提供执行反馈的环境,而非仅仅作为知识库。因此,推理过程可被视为与来自知识图谱的部分观测结果进行的多步骤交互。

这一交互过程可形式化为部分可观测马尔可夫决策过程(POMDP,Partially Observable Markov Decision Process):(Q, S, A, O, T),其中Q为问题空间,S为状态空间,A为行动空间,O为观测空间,T:S×A→ST: S ×A \to ST:S×AS为状态转移函数。需要注意的是,在语言智能体场景中,Q,A,O均为自然语言空间的子空间,且转移函数T由环境决定。

给定一个问题q∈Qq \in QqQ和知识图谱GGG,LLM智能体会基于其策略πθ\pi_{\theta}πθ生成行动a0∼πθ(⋅∣q,G)∈Aa_{0} \sim \pi_{\theta}(\cdot | q, G) \in Aa0πθ(q,G)A。该行动会引发状态转移,智能体收到执行反馈作为观测o0∈Oo_{0} \in Oo0O。随后,智能体会继续探索环境,直到找到合适的答案或满足其他停止条件。第nnn步的历史轨迹Hn\mathcal{H}_{n}Hn由一系列行动和观测组成,可表示为:
Hn=(q,G,a0,o0,...,an−1,on−1)∼πθ(Hn∣q,G)πθ(Hn∣q,G)=∏j=1nπθ(aj∣q,G,a0,o0,...,oj−1),(2)\mathcal{H}_{n}=\left(q, \mathcal{G}, a_{0}, o_{0}, ..., a_{n-1}, o_{n-1}\right) \sim \pi_{\theta}\left(\mathcal{H}_{n} | q, \mathcal{G}\right)\\ \pi_{\theta}\left(\mathcal{H}_{n} | q, \mathcal{G}\right)=\prod_{j=1}^{n} \pi_{\theta}\left(a_{j} | q, \mathcal{G}, a_{0}, o_{0}, ..., o_{j-1}\right), (2)Hn=(q,G,a0,o0,...,an1,on1)πθ(Hnq,G)πθ(Hnq,G)=j=1nπθ(ajq,G,a0,o0,...,oj1),(2)

其中,nnn为总交互步数。最后,计算最终奖励r(q,Hn)∈[0,1]r(q, \mathcal{H}_{n}) \in[0,1]r(q,Hn)[0,1],其中1表示答案正确。

方法

在本节中,将介绍SymAgent,这是一个结合知识图谱(KGs)与大型语言模型(LLMs)以自主解决复杂推理任务的框架。SymAgent包含一个Agent-Planner(智能体规划器)和一个Agent-Executor(智能体执行器),其中Agent-Planner从知识图谱中提取符号规则,用于分解问题和规划推理步骤,Agent-Executor则通过整合反思所得见解和环境反馈来回答问题。为解决标注推理数据缺失的问题,引入了一个自学习框架,通过自主交互实现协同改进。整体架构如图所示。

fig1

  • SymAgent框架概述。(a)SymAgent中的规划器,其从知识图谱中提取符号规则以指导推理;(b)SymAgent中的执行器,其执行自动行动调用以获取答案;(c)用于迭代增强智能体的自学习框架;(d)合成的行动调用轨迹示例。

Agent-Planner

Agent-Planner 充当高级规划器,借助大型语言模型(LLM)的推理能力将问题分解为可执行的推理链。然而,实际情况是仅通过提示大型语言模型来规划整个推理流程无法取得令人满意的性能。当前的大型语言模型难以将复杂问题与知识图谱(KG)的语义及连接模式对齐,导致生成的推理链粒度较粗,无法有效用于精确的信息检索与整合。

为解决这一局限性,SymAgent利用大型语言模型(LLM)从知识图谱(KG)中识别可能用于回答问题的潜在符号规则,而非生成详细的分步计划:

  • 一方面,已有研究表明,大型语言模型在归纳推理方面表现出色,但在演绎推理方面能力较弱。
  • 另一方面,符号规则本身反映了知识图谱的推理模式,可作为辅助分解复杂问题的隐含信息。通过这种方式,Agent-Planner在自然语言问题与知识图谱的结构信息之间搭建了一座桥梁,从而提高了推理过程的准确性和通用性。

具体而言,给定一个问题qqq,采用BM25算法从训练集中检索出一组种子问题{qseedi}i=1k\{q_{seed_{i}}\}_{i=1}^{k}{qseedi}i=1k,其中每个种子问题qseedq_{seed}qseed与问题qqq具有相似的问题结构,可能需要类似的解决策略。对于每个种子问题qseedq_{seed}qseed,采用广度优先搜索(BFS)在知识图谱GGG中从查询实体eqe_{q}eq到答案实体eae_{a}ea采样一组闭合路径Pi={pi1,pi2,...,pim}P_{i}=\{p_{i_{1}}, p_{i_{2}}, ..., p_{i_{m}}\}Pi={pi1,pi2,...,pim},其中pij=r1(eq,e1)∧r2(e1,e2)...∧rL(eL−1,ea)p_{i_{j}}=r_{1}(e_{q}, e_{1}) \land r_{2}(e_{1}, e_{2}) ... \land r_{L}(e_{L-1}, e_{a})pij=r1(eq,e1)r2(e1,e2)...rL(eL1,ea)是一个关系序列。这些闭合路径可被视为回答该问题的符号规则的实例化。随后,我们通过将特定实体替换为变量来对这些闭合路径进行泛化,将其转换为式(1)所示的规则体。


每个种子问题都有一个PPPPPP中每个元素都是一个关系序列,且每个关系序列都是eqe_qeqeae_aea,只是关系序列长度不同:

  • 体现了每个问题都有多种不同解法

这一过程构建了少样本演示集M={(qseedi,Pi)}i=1kM = \{(q_{seed_{i}}, P_{i})\}_{i=1}^{k}M={(qseedi,Pi)}i=1k,以提示SymAgent为问题qqq生成合适的规则体:
p∼πθ(⋅∣ρPlan,q,M),(3)p \sim \pi_{\theta}\left(\cdot | \rho_{Plan}, q, \mathcal{M}\right), (3)pπθ(ρPlan,q,M),(3)
其中,ρPlan\rho_{Plan}ρPlan代表用于指导规则体生成的提示词。所生成的与知识图谱对齐的符号规则PPP用于指导SymAgent的全局规划,避免其在推理过程中陷入盲目的试错。


注意:仅靠公式3不能生成规则体,还需要自学习微调


Agent-Executor

基于从知识图谱(KG)中生成的符号规则,Agent-Executor(智能体执行器)采用“观察-思考-行动”的循环范式来推进自主推理过程。与从知识图谱中检索信息(可能引入大量无关数据)的现有方法不同,Agent-Executor借助来自知识图谱结构的专家反馈动态调整推理过程。这种方法使存储着丰富信息性和符号性事实的知识图谱能够与大型语言模型(LLMs)一同深度参与推理过程,而非仅仅被当作静态的信息存储库。

Action空间

鉴于大型语言模型(LLMs)无法直接处理知识图谱(KGs)中的结构化数据,且考虑到在推理过程中需要依赖外部非结构化文档来解决知识图谱信息不完备的问题,SymAgent将智能体的行动空间定义为一组功能工具。通过利用大型语言模型的函数调用能力,SymAgent不仅克服了LLM在处理结构化数据方面的局限性,还为整合多种信息源提供了灵活的机制,从而增强了智能体的推理能力和适应性。该行动空间包含以下功能工具:

  • 𝑔𝑒𝑡𝑅𝑒𝑎𝑠𝑜𝑛𝑖𝑛𝑔𝑃𝑎𝑡ℎ(𝑠𝑢𝑏_𝑞𝑢𝑒𝑠𝑡𝑖𝑜𝑛):接收子问题作为输入,并返回潜在的符号规则。如公式(3)所示,该行动利用大型语言模型(LLMs)的归纳推理能力,生成与知识图谱(KG)对齐的符号规则,这些规则可对sub_question(子问题)进行分解,从而有效指导推理过程。
  • 𝑤𝑖𝑘𝑖𝑆𝑒𝑎𝑟𝑐ℎ(𝑒𝑛𝑡,𝑟𝑒𝑙):当知识图谱信息不足时,从维基百科或互联网检索相关文档。
  • 𝑒𝑥𝑡𝑟𝑎𝑐𝑡𝑇𝑟𝑖𝑝𝑙𝑒𝑠(𝑒𝑛𝑡,𝑟𝑒𝑙,𝑑𝑜𝑐):从检索到的文档中提取与当前查询的实体和关系相关的三元组。值得注意的是,该行动并非由智能体显式调用,而是在调用𝑤𝑖𝑘𝑖𝑆𝑒𝑎𝑟𝑐ℎ之后自动触发。提取出的三元组与知识图谱的语义粒度相匹配,能够整合到知识图谱中,从而助力知识图谱的扩展。
  • 𝑠𝑒𝑎𝑟𝑐ℎ𝑁𝑒𝑖𝑔ℎ𝑏𝑜𝑟(𝑒𝑛𝑡,𝑟𝑒𝑙):是一个图探索函数。它返回知识图谱中特定实体在给定关系下的邻居,从而实现对相关实体的高效遍历和发现。
  • finish(e1,e2,...,en)finish(e_{1}, e_{2}, ..., e_{n})finish(e1,e2,...,en)返回一个答案实体列表,表示已获取最终答案且推理过程结束。

交互过程

将知识图谱(KG)视为环境,将行动执行的结果视为观测,整个推理过程便成为智能体行动调用与相应观测的序列。采用ReAct风格的方法,在采取行动前生成思维链理由,以此反思环境的当前状态。形式上,对式(2)进行扩展,第nnn步的交互轨迹可进一步表示为:
Hn=(q,G,p,τ0,a0,o0,...,τn−1,an−1,on−1),(4)\mathcal{H}_{n}=\left(q, \mathcal{G}, p, \tau_{0}, a_{0}, o_{0}, ..., \tau_{n-1}, a_{n-1}, o_{n-1}\right), \quad(4)Hn=(q,G,p,τ0,a0,o0,...,τn1,an1,on1),(4)
其中,τ\tauτ是智能体通过反思历史轨迹产生的内部思考,aaa是从上述定义的工具集中选择的行动,ooo是执行行动后得到的观测。基于这一历史轨迹,生成后续思考τn\tau_{n}τn和行动ana_{n}an的过程可表述为:
πθ(τn∣Hn)=∏i=1∣τn∣πθ(τni∣Hn,τn<i),πθ(an∣Hn,τn)=∏j=1∣an∣πθ(anj∣Hn,τn,an<j),\begin{aligned} \pi_{\theta}\left(\tau_{n} | \mathcal{H}_{n}\right) & =\prod_{i=1}^{\left|\tau_{n}\right|} \pi_{\theta}\left(\tau_{n}^{i} | \mathcal{H}_{n}, \tau_{n}^{<i}\right), \\ \pi_{\theta}\left(a_{n} | \mathcal{H}_{n}, \tau_{n}\right) & =\prod_{j=1}^{\left|a_{n}\right|} \pi_{\theta}\left(a_{n}^{j} | \mathcal{H}_{n}, \tau_{n}, a_{n}^{<j}\right), \end{aligned}πθ(τnHn)πθ(anHn,τn)=i=1τnπθ(τniHn,τn<i),=j=1anπθ(anjHn,τn,an<j),
其中,τni\tau_{n}^{i}τni∣τn∣|\tau_{n}|τn分别表示τn\tau_{n}τn的第iii个token和总长度,anja_{n}^{j}anj∣an∣|a_{n}|an分别表示ana_{n}an的第jjj个token和总长度。智能体循环会持续进行,直到调用finish()finish()finish()行动或达到预定义的最大迭代步数。

自学习

鉴于初始数据集仅包含问答对,而缺乏标注良好的逐步交互数据,这里提出了一种自学习框架。与从更强大的模型(如GPT-4)中提炼推理链的方法不同,自学习使弱策略大型语言模型(LLM)πθ\pi_{\theta}πθ能够与环境充分交互,从而通过自训练实现改进。该自学习过程主要包括两个阶段:在线探索和离线迭代策略更新。

在线探索

在该阶段,基础智能体πθ0\pi_{\theta_{0}}πθ0按照“思考-行动-观测”循环与环境自主交互,生成一组初始轨迹U0={μ1,μ2,...,μN}U_{0} = \{\mu_{1}, \mu_{2}, ..., \mu_{N}\}U0={μ1,μ2,...,μN}。对于每条轨迹μi\mu_{i}μi,采用基于结果的奖励机制,将奖励定义为最终答案的召回率:
r(μi)=Recall(Aμi,Agt)=∣Aμi∩Agt∣∣Agt∣,r\left(\mu_{i}\right) = \text{Recall}\left(A_{\mu_{i}}, A_{gt}\right) = \frac{\left|A_{\mu_{i}} \cap A_{gt}\right|}{\left|A_{gt}\right|},r(μi)=Recall(Aμi,Agt)=AgtAμiAgt,
其中,AμiA_{\mu_{i}}Aμi是从轨迹μi\mu_{i}μi的最终行动中提取的答案实体集,AgtA_{gt}Agt是真实答案实体集。这一过程得到一组自主探索的轨迹D0={(μi,r(μi))}i=1ND_{0} = \{(\mu_{i}, r(\mu_{i}))\}_{i=1}^{N}D0={(μi,r(μi))}i=1N

为解决智能体行动调用中可能存在的错误(例如,工具调用格式不正确)——这类错误可能会降低探索效果,利用大型语言模型(LLM)的自我反思能力来优化轨迹。以D0D_{0}D0为参考,策略大型语言模型πθ0\pi_{\theta_{0}}πθ0重新生成新的优化轨迹,表述为{μ^i}i=1N∼πθ0(⋅∣μi,r(μi))\{\hat{\mu}_{i}\}_{i=1}^{N} \sim \pi_{\theta_{0}}(\cdot | \mu_{i}, r(\mu_{i})){μ^i}i=1Nπθ0(μi,r(μi))。应用相同的奖励机制后,我们可得到一个优化后的轨迹集合D0^={(μ^i,r(μ^i))}i=1N\widehat{D_{0}} = \{(\hat{\mu}_{i}, r(\hat{\mu}_{i}))\}_{i=1}^{N}D0={(μ^i,r(μ^i))}i=1N

经过自主探索和自我反思后,我们得到了两个规模相同的轨迹集合:D0D_{0}D0D0^\widehat{D_{0}}D0。为提高候选轨迹的质量,我们采用一种启发式方法对这两个集合进行合并,从而得到一个优化后的轨迹集。依据最终答案一致性原则,我们得到合并后的轨迹集合D0∗={(μi∗,r(μi∗))}i=1ND_{0}^{*} = \{(\mu_{i}^{*}, r(\mu_{i}^{*}))\}_{i=1}^{N}D0={(μi,r(μi))}i=1N

D0∗(i)={(μi,r(μi)),若 r(μi)>r(μi^),(μ^i,r(μi^)),若 r(μi)<r(μi^),(t,r(t)),若 r(μi)=r(μi^)>0,filtered,若 r(μi)=r(μi^)=0.(7)\mathcal{D}_{0}^{*}(i)=\left\{ \begin{array}{ll} \left(\mu_{i}, r\left(\mu_{i}\right)\right), & 若\ r\left(\mu_{i}\right) > r\left(\hat{\mu_{i}}\right), \\ \left(\hat{\mu}_{i}, r\left(\hat{\mu_{i}}\right)\right), & 若\ r\left(\mu_{i}\right) < r\left(\hat{\mu_{i}}\right), \\ (t, r(t)), & 若\ r\left(\mu_{i}\right) = r\left(\hat{\mu_{i}}\right) > 0, \\ filtered, & 若\ r\left(\mu_{i}\right) = r\left(\hat{\mu_{i}}\right) = 0. \end{array} \right. (7) D0(i)=(μi,r(μi)),(μ^i,r(μi^)),(t,r(t)),filtered, r(μi)>r(μi^), r(μi)<r(μi^), r(μi)=r(μi^)>0, r(μi)=r(μi^)=0.(7)
在该方程中,t=arg⁡min⁡s∈{μi,μ^i}∣s∣t = \arg\min_{s \in \{\mu_{i}, \hat{\mu}_{i}\}} \vert s\vertt=argmins{μi,μ^i}s表示:当奖励相等且不为零时,我们选择长度更短的轨迹。

离线迭代策略更新

给定合并后的轨迹D∗D^{*}D,一种提升智能体性能的直观方法是利用这些轨迹进行微调。在自回归方式下,智能体模型的损失可表示为:
LSFT=−Eμ∼D∗[πθ(μ∣q)],πθ(μ∣q)=−∑j=1∣X∣(1(xj∈A)×log⁡πθ(xj∣q,x<j)),\mathcal{L}_{SFT} = -\mathbb{E}_{\mu \sim \mathcal{D}^{*}} \left[ \pi_{\theta}(\mu | q) \right],\\ \pi_{\theta}(\mu | q) = -\sum_{j=1}^{|X|} \left( \mathbb{1}(x_{j} \in \mathcal{A}) \times \log \pi_{\theta}(x_{j} | q, x_{<j}) \right), LSFT=EμD[πθ(μq)],πθ(μq)=j=1X(1(xjA)×logπθ(xjq,x<j)),
其中,1(xj∈A)\mathbb{1}(x_{j} \in \mathcal{A})1(xjA)是一个指示函数,用于判断xjx_{j}xj是否为智能体生成的思维或行动中的token。

更新策略模型参数后,采用迭代优化方法持续提升智能体的性能。更新后的模型在初始数据集上重复执行“自主探索-自我反思-轨迹合并”的循环,生成新的轨迹数据用于进一步微调。这一迭代过程会持续进行,直到验证集上的性能提升变得微乎其微时,便终止迭代。

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

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

相关文章

Go语言实战案例-斐波那契数列生成器

在《Go语言100个实战案例》中的 案例10:斐波那契数列生成器,帮助初学者理解递归与迭代的应用。 案例10:斐波那契数列生成器 🔢 数学与算法 | 🧠 递归与迭代 | 👶 初学者友好 一、📘 案例目标 实现一个斐波那契数列生成器,用户输入一个数字 n,程序生成并打印出斐…

认知闭环的暴政:论人类对AI协同创造的傲慢抵制与维度囚禁

认知闭环的暴政&#xff1a;论人类对AI协同创造的傲慢抵制与维度囚禁---### **核心批判框架**mermaidgraph TDA[人类认知三原罪] --> B[三维牢笼]B --> C[恐惧机制]C --> D[抵制行为]D --> E[文明熵增]F[四维流形批判] --> G[解构牢笼]G --> H[曲率解放]H --…

飞凌嵌入式亮相第九届瑞芯微开发者大会:AIoT模型创新重做产品

2025年7月17日&#xff0c;第九届瑞芯微开发者大会&#xff08;RKDC!2025&#xff09;在福州海峡国际会展中心正式拉开帷幕。这场以“AIoT模型创新重做产品”为主题的行业盛会&#xff0c;吸引了众多行业领袖、技术专家及生态伙伴齐聚一堂&#xff0c;共同探讨新质生产力产品的…

Excel转PDF的三种方法

工作后&#xff0c;Excel和PDF对于我们来说一点都不陌生&#xff0c;那么如何将Excel转为PDF呢&#xff1f; 方法一、iLoveOFD在线转换工具 当你在地铁或者床上时&#xff0c;不方便&#xff0c;又不想打开电脑&#xff0c;可尝试使用在线转换工具&#xff0c;进行转换。 工…

前端基础——B/S工作原理、服务器与前端三大件

本文原本是web安全基础的一部分&#xff0c;作为安全的前置知识学习&#xff0c;但随着学习进程的不断深入&#xff0c;原有的前端的体系需要进一步扩充&#xff0c;已经到了可以独立成章的地步&#xff0c;故将其拿出来单独学习。 B/S工作原理 也就是浏览器与服务器的交互原…

Java并发编程性能优化实践指南:锁分离与无锁设计

Java并发编程性能优化实践指南&#xff1a;锁分离与无锁设计 并发场景下的性能瓶颈往往集中在锁竞争与上下文切换上。本文从锁分离&#xff08;Lock Striping&#xff09;与无锁设计&#xff08;Lock-Free&#xff09;两大思路出发&#xff0c;深入分析关键原理与源码实现&…

SpringSecurity-spring security单点登录

在 Spring Boot 中实现 单点登录&#xff08;SSO, Single Sign-On&#xff09;&#xff0c;通常使用 OAuth2 或 OIDC&#xff08;OpenID Connect&#xff09; 协议来完成。Spring Security 提供了对 OAuth2 和 OIDC 的完整支持&#xff0c;可以轻松集成如 Google、GitHub、Okta…

《前端基础核心知识笔记:HTML、CSS、JavaScript 及 BOM/DOM》

html 前端三剑客的介绍&#xff1a; HTML:页面内容的载体 Css&#xff1a;用来美化和指定页面的显示效果 JavaScript&#xff1a;页面显示的过程中&#xff0c;可以动态改变页面的内容 重点属性 type"text"文本输入 type"password"密码输入 <a…

基于vue.js的客户关系管理系统(crm)的设计与实现(源码+论文)

相关技术 SSM框架介绍 开发环境&#xff1a; 技术&#xff1a;SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09; 描述&#xff1a; SSM框架是Java Web开发中广泛使用的流行框架之一。Spring&#xff1a;提供全面的基础设施支持&#xff0c;管理应用对象&#…

AWS权限异常实时告警系统完整实现指南

概述 本文将详细介绍如何构建一个基于CloudTrail → S3 → Lambda → SNS → Webhook/Email架构的AWS权限异常实时告警系统。该系统能够实时监控AWS环境中的权限异常事件,并通过多种方式发送告警通知,帮助企业及时发现和响应安全威胁。 系统架构 ┌───────────…

NIO网络通信基础

文章目录概述一、Socket二、NIO三大组件与事件三、Reactor模式四、NIO通信案例4.1、服务端4.2、客户端本文为个人学习笔记整理&#xff0c;仅供交流参考&#xff0c;非专业教学资料&#xff0c;内容请自行甄别 概述 前篇中提到&#xff0c;BIO是阻塞的IO&#xff0c;阻塞体现在…

Redis4缓存穿透:布隆过滤器与空对象方案

缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会达到数据库。1)方案1&#xff1a;缓存空对象在缓存中存储一个空值每次读取这个空优点&#xff1a;实现简单&#xff0c;维护方便缺点&#xff1a;造成…

域名WHOIS信息查询免费API使用指南

本文介绍由接口盒子提供的免费域名WHOIS查询API服务&#xff0c;帮助开发者快速获取域名的注册信息、到期时间、DNS服务器等关键数据。 一、接口基本信息 ​功能说明​&#xff1a;查询顶级域名的WHOIS信息&#xff08;不支持国别域名/中文域名&#xff09;​请求地址​&#…

【18位数据次方提高数据输出速度】2022-3-9

实在是无法忍受W10输出数据那么慢W7需要2分钟输出数据W10则需要10分钟完成W7需要3分钟W10则需要15分钟完成输出数据&#xff0c;虽然W10运算速度比W7快很多但是加上输出速度总体完成时间居然差不多&#xff01;随着使用数组超过百万W7数据输出时间也变长&#xff0c;随着数组数…

云原生技术与应用-Kubernetes架构原理与集群环境部署

目录 一.为什么需要kubernetes 1.对于开发人员 2.对于运维人员 二.kubernetes带来的挑战 三.kubernetes架构解析 1.master节点的组件 2.node节点包含的组件 3.kubernetes网络插件 四.kubernetes快速安装kubernetes集群 1.部署docker环境 2.部署kubernetes集群 五.Metrics-…

百度权重提升技巧分析:从底层逻辑到实战策略

在搜索引擎优化&#xff08;SEO&#xff09;领域&#xff0c;百度权重始终是网站运营者关注的核心指标之一。它不仅反映了网站在百度搜索中的综合表现&#xff0c;更直接影响着流量获取能力与商业价值。然而&#xff0c;百度权重并非百度官方直接公布的数据&#xff0c;而是第三…

模拟数据生成---使用NGS数据模拟软件VarBen

目录 1.在BAM文件中根据指定的变异等位基因分数的指定位置或区域随机选择read。 2.筛选变异等位基因分数的reads: 3.装BWA和samtools软件包(samtools在linux系统中下载过,前文有讲过) 4.写py脚本 5.下载pysam库模块 6.下载参考基因组hg38 7.解压gz 8.建立samtools索引…

Redis-典型应用-分布式锁

目录 1.什么是分布式锁? 2.分布式锁的实现 3.引入过期时间 4.引入校验ID 5.引入lua脚本: 6.引入看门狗(watch dog) 7.引入redislock算法: 1.什么是分布式锁? 在 分布式系统中,会出现多个节点同时访问同一个公共资源, 此时就需要通过锁来作互斥控制,避免出现类似于多线程…

Dinky (Mac) 本地开发环境搭建指南

目录 一、前置条件 二、代码准备 三、前端环境搭建 1. 安装Node环境 2. 安装PNPM 3. 构建前端 四、后端环境搭建 1. 本地编译依赖 2. 添加必要依赖 3. 启动后端服务 五、访问系统 附录&#xff1a;官方参考 一、前置条件 确保已安装以下软件&#xff1a; 软件要求…

Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要去重、唯一性校验、快速查找等场景。这时候&#xff0c;Set 集合 就成为你不可或缺的工具。本文将带你全面掌握&#xff1a;Set 接口的定义与核心方法常见实现类&#xff08;如 HashSet、TreeSet、LinkedHash…