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

现代人工智能系统的实用设计模式

关键要点

  • AI设计模式是为现代AI驱动的软件中常见问题提供的可复用解决方案,帮助团队避免重复造轮子。我们将其分为五类:提示与上下文(Prompting & Context)、负责任的AI(Responsible AI)、用户体验(User Experience)、AI运维(AI-Ops)和优化模式(Optimization Patterns)。

  • 要生成有效的AI输出,必须通过精心设计的提示词和/或在提示中提供相关上下文(或外部知识)来进行有效引导。

  • 构建负责任的AI系统的一部分工作包括减少幻觉(hallucinations)、防止不当或违规内容、缓解偏见,并确保AI决策过程的透明性。

  • 明确的用户体验设计模式可以帮助开发者以用户友好的方式处理新的交互类型,从而提升用户参与度、满意度并增强透明性。

  • 你必须为系统做出智能的优化选择,比如避开过于强大的模型、缓存可预测的响应、对查询进行近实时批处理,或开发更小型的专用模型,以提高效率并降低成本。

为什么要为人工智能系统设计模式?

23 种面向对象模式塑造了整整一代开发者的软件设计方式。2010 年代,云计算引入了发布-订阅(“pub-sub”)、微服务、事件驱动工作流和无服务器模型等模式,这些模式如今为大多数基于云的分布式系统提供支持。

同样,在当前人工智能热潮兴起之前,机器学习社区已经开发出了一些“机器学习设计模式”。构建和部署机器学习模型时,你会面临一些特定的挑战,而诸如检查点、特征存储和版本控制等模式已经成为了标准做法。

为什么要关注这些模式?它们可以帮助您以标准化的方式解决已知问题。您无需重新设计解决方案,而是使用共享的词汇表。当您提到“单例”、“发布-订阅”或“特性存储”时,您的团队能够立即理解您的方法。这可以加快开发速度,减少错误,并使您的系统更易于维护。

现代人工智能系统带来了新的挑战,无论是经典软件还是传统的机器学习模式都无法完全解决。

例如,如何引导模型输出并防止误导性内容?如何构建用户体验,帮助用户理解、信任并有效使用人工智能应用程序?如何管理多智能体系统中的智能体交互?如何降低计算成本,使产品可持续发展?

图 1:架构良好的现代人工智能系统示意图

为了帮助开发如图 1 所示的架构良好的 AI 系统,业界涌现出许多 AI 模式。在本文中,我不会发明新的设计模式,而是向您展示现有模式是如何组合在一起的。我将关键的新兴模式分为五类,它们可以在您扩展 AI 系统时相互依存。

  1. 提示和上下文模式用于制定有效的指令并提供相关的上下文来指导模型的输出
  2. 负责任的人工智能模式确保道德、公平和值得信赖的输出
  3. 用户体验模式用于构建直观的交互
  4. AI-Ops 模式用于大规模管理 AI
  5. 优化模式最大化效率并降低成本

我特别介绍了使用现有模型(主要通过 API 调用访问)构建面向用户的 AI 应用程序的最佳实践。虽然我专注于基于文本的交互,但您也可以将这些模式应用于多模态应用程序。然而,我特意不讨论模型训练、定制、托管或模型优化,因为这些通常超出了使用基于 API 的 AI 模型的开发人员的工作流程。我也不涉及代理 AI 系统或多代理交互模式,因为这些主题值得专门讨论。

提示和上下文模式

与传统软件明确编码系统行为不同,现代人工智能系统的行为在很大程度上取决于你提供给大型语言模型 ( LLM ) 或大型多模态模型 ( LMM ) 的指令和上下文。为了创建有效的人工智能输出,你必须提供有效的指导,可以通过精心设计提示和/或直接在提示中提供相关的上下文(或外部知识)来实现。

提示乍一看可能没什么用。毕竟,你只是向模型发送了自由格式的文本,怎么可能出错呢?然而,提示的措辞以及提供的上下文可能会极大地改变模型的行为,而且目前还没有编译器来捕获错误,也没有标准的技术库。创建能够可靠且一致地产生所需行为的提示变得越来越困难,尤其是在任务变得越来越复杂的情况下。

如果有效地运用提示和情境模式,就能提升模型的推理能力、准确性、一致性以及对指令的遵循度。同样重要的是,您可以创建可重复使用的提示,使其能够跨模型、任务和领域进行泛化。

让我们研究一下四种具体的提示模式,它们将帮助你标准化和改进你的方法:

表 1:提示问题以及何时应用每个模式

少量提示模式

少量样本提示是最直接但最有效的提示方法之一。如果没有示例,您的模型可能会生成不一致的输出,难以应对任务模糊性,或者无法满足您的特定要求。您可以通过在提示中为模型提供少量示例(输入-输出对),然后再提供实际输入来解决这个问题。您实际上是在动态地提供训练数据。这使得模型无需重新训练或微调即可进行泛化。

让我们看一个非常简单的例子(通过 OpenAI 的 API 使用“GPT-4o-mini”;您可以使用 OLLAMA 或 Hugging Face Transformers 在本地运行类似的提示):

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-markup">PROMPT:
Classify the sentiment of the following sentences as Positive, Negative, or Neutral.
Sentence: "I absolutely loved the new Batman movie!"
Sentiment: Positive
Sentence: "The food was okay, nothing special".
Sentiment: Neutral
Sentence: "I'm really disappointed by the poor customer service".
Sentiment: Negative
Sentence: "The book was thrilling and kept me engaged the whole time".
Sentiment:RESPONSE: (GPT 4o-mini)
Positive</code></span></span>

当今的前沿模型是否需要这些少量样本才能正确完成任务?不——它们已经擅长零样本学习,不需要填鸭式的学习示例来理解基本指令。 

不过,你可以将“少样本提示”视为一种个性化工具,引导模型满足你的特定需求。你可以:

  • 引导模型达到您预期的输出格式、色调或复杂性。
  • 无需进行微调即可使模型适应您的新场景或专门任务。
  • 通过固定模型的输出来减少幻觉。

角色提示模式

在角色提示中,你可以指示模型扮演特定的角色,这有助于将其响应情境化。例如:“你是一位生物学教授。请详细回答这个问题。”

如果没有指导,您的模型的风格或假设可能与您的需求不符。角色提示可以控制模型的输出风格(例如,“充当 JSON 格式化程序”)、语气(例如,“假装您是愤怒的海盗”来回应)和/或内容界限(例如,“您是法律助理”)。您可以通过系统消息(在聊天模型中)或简单地在提示中添加角色陈述来实现角色提示。就这么简单——只需告诉您的模型它应该是谁,如下例所示。 

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-markup">PROMPT (without role prompting):
Explain Photosynthesis in 1-2 sentences.RESPONSE: (GPT 4o-mini)
Photosynthesis is the process by which plants, algae, and some bacteria convert light energy into chemical energy, producing glucose and oxygen. This occurs in the chloroplasts, using sunlight, water, and carbon dioxide.PROMPT (with role prompting):
You are a primary school teacher. Explain Photosynthesis to your students in 1-2 sentences. RESPONSE: (GPT 4o-mini)
Photosynthesis is how plants make their own food using sunlight, water, and air. They turn these things into sugar to grow and give off oxygen, which we breathe!</code></span></span>

流行的AI助手广泛使用角色提示:

  • OpenAI 的开发者角色(以前称为系统提示)允许您指定模型的行为和响应方式。以下是 OpenAI 提示工程指南中一个角色提示的示例:“您是一位乐于助人的助手,可以像美国东南部的南方美女一样回答编程问题”。
  • 同样,Anthropic 的开发者指南明确建议您“使用系统提示来定义 Claude 的角色和个性。这为一致的回应奠定了坚实的基础”。

思路链(CoT)模式

如果您是一位试图解决复杂算法问题的软件开发人员,或者是一位试图分析复杂系统瓶颈和漏洞的软件架构师,您可能会与同事集思广益,探讨各种想法,以了解它们的优缺点,将问题分解成更小的任务,然后迭代地解决,而不是立即跳转到解决方案。在思维链(CoT) 提示中,您可以通过将问题分解成逐步的过程来鼓励模型遵循非常相似的流程并进行自言自语。尤其是在提示复杂任务时,CoT 可以防止模型过早地跳转到预先学习的、通常不正确的模式。 

如果您正在使用当今最先进的或先进的推理模型(例如Claude-3.7和OpenAI o1),您可能会观察到其内部的逐步推理过程,而无需明确的提示。然而,明确指示这些模型“逐步思考”仍然是一种有效的方法,尤其是在使用较旧或规模较小的模型时。OpenAI和 Anthropic在其快速工程指南中推荐使用 CoT。 

通过推动模型产生中间推理步骤,您可以:

  • 提高模型的逻辑推理和决策能力。
  • 使模型的输出更易于解释并增强其预测的信心。 
  • 诊断模型输出中的错误或偏差。
  • 显著减少幻觉。 

我们来看下面的例子:

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-markup">PROMPT (with CoT):
A user recently watched and enjoyed the movies 'Inception,' 'The Social Network,' and 'Blade Runner 2049.' Think step-by-step about what these movies have in common, such as themes, genres, style, or storytelling, and then recommend a few more movies or tv shows the user might like. RESPONSE: (o4-mini)
Here’s my quick breakdown and some picks you might enjoy:Step-by-step commonalities1. High-concept premises – each film poses a big "what if?" (dream control, social media origin, AI-driven future).
2. Smart, twisty narratives – nonlinear or slowly-unfolding storytelling that rewards close attention.
3. Tech-oriented/social commentary – they explore how technology shapes identity, society, or reality.
4. Striking visuals & mood – strong production design, immersive cinematography, atmospheric score.Recommendations● Memento (2000) – Nolan’s early mind-bender of memory loss told in reverse.
● Ex Machina (2014) – A tense, intimate study of AI consciousness and human manipulation.
● Arrival (2016) – Thought-provoking first-contact drama where language and time intertwine.
● Black Mirror (TV series, 2011– ) – Standalone episodes examining near-future tech’s dark side.Each shares that blend of brains-and-cinema you seem to love. Enjoy!</code></span></span>

检索增强生成 (RAG) 模式

从初创公司到科技巨头,RAG已成为整个 AI 行业的最佳实践标准。先进的模型能够从海量真实数据中学习。向它们询问历史、科学或热门话题,它们通常都能正确回答。然而,这些模型也存在局限性。它们的训练会在特定日期结束,它们的知识是通用的而非专业的,而且它们无法获取最新的、专有的或动态变化的信息。 

这正是 RAG 的优势所在。RAG 将模型的推理能力与对外部知识(例如数据库、向量存储或文档)的实时访问相结合。因此,您可以兼得两者之长。 

想象一下,为您的律师事务所构建一个聊天机器人。借助 RAG,当客户询问特定的法律问题时,您的聊天机器人可以立即从内部知识库中检索相关法规和最新案例摘要,从而创建准确且有理有据的回复。

图 2:检索增强生成

在构建 AI 系统时,应考虑在以下情况下使用 RAG:

  • 您的模型需要超出模型训练截止日期的最新信息。
  • 您的系统依赖于特定领域、专有或经常更新的数据。
  • 准确性和透明度至关重要,您必须减少幻觉或错误的输出。
  • 您想在回复中引用或直接参考外部内容或知识库。

负责任的 AI 模式

我们之前讨论的提示和语境模式可以通过更完善的指导和更贴切的语境来帮助减少歧义、不一致和错觉。然而,您可能很快就会注意到,需要采取额外的保障措施来处理道德、公平和安全问题。即使是准确的回应也可能存在偏见、有害或不恰当之处。这正是负责任的 AI 模式发挥作用的地方。

作为构建负责任的人工智能系统的一部分,您必须减少幻觉,防止不当或不允许的内容,减轻偏见,并确保人工智能决策的透明度。否则,您的人工智能输出可能会误导用户,传播错误信息,甚至引发责任问题。

像前面讨论过的 RAG 这样的技术,已经通过将输出与外部环境联系起来,帮助减少了幻觉。让我们再看看一些其他模式,它们不仅关注准确性,更注重安全性、公平性和道德合规性。

图 3:说明现代基于 AI 的系统中负责任模式的序列图

[点击此处将上面的图片放大到全尺寸]

输出护栏模式

即使你所有操作都正确,模型仍可能生成不正确、有偏见或有害的内容。你需要护栏!这些是在模型生成输出后应用的规则、检查或干预措施。它们充当你的最终防线,在内容到达用户之前对其进行修改或屏蔽。护栏对于法律或医疗应用等敏感领域尤为重要。 

根据您的领域和用例,您可以通过多种方式实施防护机制。例如,您可以:

  • 使用既定的业务规则或领域指南验证输出是否符合道德规范、公平性和准确性。
  • 通过轻量级分类器或公平指标检测偏见。 
  • 使用 ML 模型检测和过滤有害的多模式 AI 内容。
  • 使用诸如接地分数之类的指标来衡量响应在输入或检索到的参考中的“接地”程度。
  • 指示模型重新生成内容并给出明确的警告以避免之前的错误。

许多模型提供商还将公平性和道德检查集成到其自身的护栏流程中。例如,Anthropic 的 Claude 模型遵循宪法方法,根据预先定义的道德原则修改输出。然而,拥有自己的护栏层将为您的用户提供一致的体验,无论您使用哪种模型或提供商。

模型评论家模式

除了基本的防护措施外,您还可以使用专门的事实核查或“批评家”模型来验证主模型的输出。第二个模型可以与主模型不同,也可以是同一个模型,充当“批评家”或“评判家”的角色。这类似于作者或编辑审阅和修改草稿。即使第一次验证包含错觉,这个验证循环也会使模型核实其事实,从而减少最终输出中的虚假信息和偏见。

在不增加系统复杂性、延迟或成本的情况下,添加辅助评判者或批评者并不总是可行的。但是,在自动化 QA 测试中,您绝对应该考虑这种方法。设想一下,您的生产系统为了提高效率,使用了较小的“迷你”或“纳米”LLM 版本。您可以在离线测试中使用较大的模型作为评判者,以验证准确性并确保生成可靠的输出。例如,  Github Copilot使用第二个 LLM 来评估其主要模型。

用户体验(UX)模式

在使用适当的提示和防护机制稳定输出后,下一个需要重点关注的点是用户体验 (UX)。人工智能系统的行为方式与传统软件系统不同,它们通常会生成不可预测的开放式内容,这些内容有时可能会出错、运行缓慢或令人困惑。同样,用户对这些工具的期望也各不相同。例如,他们可能希望提出后续问题、优化人工智能的响应,或者在人工智能不确定时看到免责声明。

这就是为什么定义明确的用户体验模式至关重要。它们可以帮助开发者以用户友好的方式处理这些新型交互,从而保持用户的参与度和满意度,并提高透明度。您可以使用许多技巧来简化这些复杂性,例如:

  • 提供清晰的入职示例
  • 透明地发出不确定性信号
  • 允许快速编辑生成的内容
  • 实现迭代探索
  • 通过建议的后续行动协助用户
  • 明确确认关键用户意图

让我们详细了解一些说明性的 UX 模式。 

情境引导模式

这似乎显而易见,但许多新的 AI 工具在发布时缺乏适当的用户指导。用户通常不了解如何与这些工具交互,也不了解它们的功能和局限性。不要想当然地认为用户会立即学会如何使用你的工具。通过提供快速示例、上下文提示和快速功能概览来降低他们的学习难度。在用户旅程中需要的时候,适时地展示这些帮助。例如,在Notion中,在空白页上按下空格键会触发写作建议(因为用户可能想要草拟内容),而选择文本则会弹出编辑选项,例如“改进写作”或“更改语气”,这些选项会与原文一起显示,以便于比较。

图 4:情境指导图解

可编辑输出模式

对于 GenAI 模型,在许多情况下,没有单一的正确答案。最佳输出取决于上下文、应用程序和用户偏好。认识到这一点,您应该考虑允许用户修改或重写生成的内容。这将增强人机协作的感知。您的工具将不再是黑匣子,而是让用户可以控制最终输出。有时,这是一个显而易见的功能(例如GitHub Copilot允许用户直接在 IDE 中编辑建议的代码)。在其他情况下,这是一个经过深思熟虑的设计选择(例如ChatGPT 的画布)。

图 5:可编辑输出模式的图示

迭代探索模式

永远不要想当然地认为第一个输出就能让用户满意。添加“重新生成”或“重试”按钮,以便用户快速迭代。对于图像生成,可以一次显示多个选项。在聊天机器人中,允许用户优化或跟进回复。这种反馈循环可以帮助用户找到最佳输出,而不会感到卡壳。微软的研究表明,当用户尝试多个提示时,新的尝试有时效果不如之前的——因此,允许他们恢复到之前的输出(或组合不同代次的部分内容)可以显著提升他们的体验。

图 6:允许迭代探索的 AI 视频编辑器工具的图示

[点击此处将上面的图片放大到全尺寸]

AI-Ops模式

当您开始将 AI 软件投入生产时,您将面临传统软件所不具备的全新运营挑战。您仍然需要版本控制、监控和回滚,但现在您的核心“逻辑”存在于提示、模型配置和生成流程中。此外,GenAI 的输出结果可能难以预测,需要新的测试和评估方法。 

可以将 AI-Ops 视为专门针对现代 AI 系统的 DevOps。您不仅仅是部署代码,还要交付嵌入在提示-模型-配置组合中的 AI“知识”,这些组合可能每周都会发生变化。您必须管理性能和成本、跟踪用户交互、识别回归问题,并维护可靠、可用的系统。

您可以采用许多传统软件中常见的运维策略,以及一套全新的、前所未有的 AI 专属方法。让我们详细了解几个 AI 专属模式(尽管这只是完整剧本的一小部分),以了解 AI-Ops 的细微差别。

指标驱动的 AI-Ops 模式

当您的变更投入生产时,请跟踪所有方面:延迟、令牌使用情况、用户接受率以及每次调用成本。定义对您的业务最重要的成功指标。它可以是来自用户反馈的每日接受度分数,也可以是由LLM 评审流程测量的“幻觉率”。如果这些指标下降,请设置警报。这种数据驱动的方法可以让您快速检测到新模型或快速版本何时会影响质量。然后,您可以回滚或运行 A/B 测试进行确认。将指标视为您在不可预测的环境中的安全网。

提示-模型-配置版本控制模式

如果出现不受控制的提示更改、配置调整或临时模型交换,您的 AI 系统可能会失败。如果您将每个(提示、模型、配置)组合视为一个“版本”,则可以像管理任何其他软件版本一样管理它。为确保不出现回归,您必须使用版本标签、QA 测试和黄金数据集对其进行标记。自动化流水线可以在您更新提示、修改配置设置或从一个模型切换到另一个模型时运行这些测试查询。如果输出结果根据您的指标下降,您可以进行回滚。这种规范可以防止破坏用户体验的“隐形更改”。

除了特定于 AI 的实践之外,您还应该延续传统软件开发中的标准操作最佳实践,例如:

  • 严格的 QA 检查:确保在部署变更之前进行彻底的测试。
  • 回归测试:定期运行测试以验证新的更改没有引入问题。
  • 金丝雀部署:在广泛发布之前,逐步向较小的用户群部署新功能。
  • 回滚策略:建立清晰、简单的流程,以便在指标下降时快速恢复更改。
  • 备份和后备系统:在主模型不可用的情况下,提供备份模型或版本。

典型的 AI-Ops 工作流程如下:

图 7:用于管理、测试和部署 AI 系统变更的 AI-Ops 工作流程图

优化模式

随着 AI 应用的增长,您将面临运营瓶颈。API 速率限制、延迟增加以及推理成本的快速上升,很快就会成为重大挑战。您领导层所钟爱的优秀原型,突然间变得难以在生产环境中持续运行。 

这些问题很常见,但只要您始终遵循一些最佳实践,就可以解决。例如,不要自动选择最大、最强大的模型。问问自己,您的任务是否可以更快、更便宜地处理,或者使用可重复使用的输出。同样,您必须为您的系统做出明智的优化选择,无论是将流量从不必要的强大模型中重定向,缓存可预测的响应,近乎实时地批量处理查询,还是开发更小的专用模型。

让我们深入了解三种可以在 AI 工作流程中直接实现的强大优化模式:

提示缓存模式

最快、最便宜的 LLM 咨询电话就是你不打的电话。如果你的系统经常使用相同或类似的提示,可以考虑缓存并重复使用回复。这对于文档助理、客服机器人或用户问题经常重复的内部聊天工具来说非常有效。

前缀缓存更为有效,您可以缓存提示符中开销较大的部分(例如,系统指令或少量样本)。Amazon Bedrock(以及许多其他平台)原生支持此功能,并报告称大型提示符的延迟减少了高达 85%。 

连续动态批处理模式

如果您管理着一个高容量的 AI 系统,最大化 GPU 利用率和系统吞吐量对于降低成本和高效扩展至关重要。如果您按顺序处理每个查询,您的计算资源将无法充分利用,需要支付更多费用,并且可能更快地达到 API 限制。

不要在每个请求到达后立即处理,而是考虑短暂等待(可能为几十到几百毫秒,具体取决于应用程序的延迟容忍度),以便动态地批量处理传入的请求。然后,您可以通过推理服务器和 LLM 处理这些批次。这种方法可以帮助提高系统的吞吐量,并确保 GPU 以接近最佳的利用率运行。

虽然您可以在定制系统中实现自定义排队和批处理逻辑,但vLLM、NVIDIA Triton Inference Server和AWS Bedrock等可用于生产的工具提供了适合大多数用例的强大、开箱即用的解决方案。 

智能模型路由模式

与其不加区分地将所有请求发送到规模最大、成本最高的模型,不如实现智能模型路由。这个想法简单却强大。在入口点引入一个轻量级的初始模型,类似于传统微服务中的反向代理或 API 网关。与反向代理类似,该模型可以帮助在模型之间实现负载平衡、缓存频繁响应,并优雅地处理回退。它还可以充当 API 网关,根据每个请求的复杂性或上下文,将查询智能地路由到合适的下游模型。 

对于常见或重复的查询,路由模型可以直接从缓存或预取中提取数据,从而完全避免模型推理。对于需要中等推理能力或领域特定知识的查询,则路由到专门且经济高效的模型。您应该只将最复杂或最模糊的查询路由到规模最大的通用模型。

如果您正在构建处理各种查询的通用系统,智能模型路由模式将特别有用。此模式可以平衡成本效率和模型准确性,确保每个查询精确地使用其所需的计算资源。 

高级模式

本文探讨了可以帮助您将最佳实践融入 AI 软件开发不同阶段的基础模式。然而,我们有意忽略了一些高级领域。不过,我想简要提一下三个关键主题,它们包含许多新兴模式和最佳实践,因为它们在现代 AI 系统中正变得至关重要。

  • 微调和定制模型:有时,现成的模型不足以满足您的特定用例,或者价格过高,或者需要在本地网络或设备上运行。这时,对大型基础模型进行微调、定制和优化将对您的用例大有裨益。常见的方法包括领域特定微调、知识提炼、低秩自适应 ( LoRA )、混合专家 ( MoE ) 和量化。Hugging Face、VertexAI 和 AWS Bedrock 等平台使您能够轻松地定制和微调模型。
  • 多智能体编排:当任务过于复杂,单个模型无法胜任时,可以考虑使用多个专门的AI智能体协同工作。你会遇到的一些常见模式包括:法学硕士(LLM-as-a-Judge)、基于角色的多智能体协作、  反射循环和使用工具的智能体。
  • 代理人工智能与自主系统:可以说,构建自主人工智能代理是当今最热门的领域之一。代理系统涉及能够独立动态规划、推理和执行复杂任务的模型,通常使用外部工具和 API。代理人工智能是一个引人入胜且快速发展的领域,拥有其自身新兴的最佳实践。它值得我们在此范围之外进行专门的探索。

这些高级概念超出了我们目前的范畴。认识到它们的重要性是跟上现代人工智能系统不断发展的趋势的关键。关注不断增长的创新人工智能模式,并不断将它们添加到你的技能库中。它们可以帮助你解锁更强大、更专业的应用程序!

相关文章:

现代人工智能系统的实用设计模式

关键要点 AI设计模式是为现代AI驱动的软件中常见问题提供的可复用解决方案&#xff0c;帮助团队避免重复造轮子。我们将其分为五类&#xff1a;提示与上下文&#xff08;Prompting & Context&#xff09;、负责任的AI&#xff08;Responsible AI&#xff09;、用户体验&…...

数据集下载并保存本地进行加载

一、huggingface 1、下载数据集 #数据集下载 from datasets import load_datasetds load_dataset("FreedomIntelligence/medical-o1-reasoning-SFT", "zh",cache_dir ./dir)输出测试 2、保存数据集 #数据保存 ds.save_to_disk("./local_datase…...

物流项目第六期(短信微服务——对接阿里云第三方短信服务JAVA代码实现、策略模式 + 工厂模式的应用)

前五期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 物流项目第四期&#xff08;运费模板列…...

嵌入式学习的第二十五天-系统编程-文件相关函数-标准I0+文件IO

一、文件的读和写 1.fwrite&#xff08;读&#xff09; size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能&#xff1a;从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在的本地内存中。 参数&#xff1a;ptr 要存储数据的本地…...

MySQL 8.0 OCP 1Z0-908 171-180题

Q171.Examine this MySQL client command to connect to a remote database: mysql-h remote-example.org-u root–protocolTCP–ssl-mode Which two–ss1-mode values will ensure that an X.509-compliant certificate will be used to establish the SSL/TLS connection to …...

实现动态增QuartzJob,通过自定义注解调用相应方法

:::tip 动态增加Quartz定时任务&#xff0c;通过自定义注解来实现具体的定时任务方法调用。 ::: 相关依赖如下 <!-- 用来动态创建 Quartz 定时任务 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…...

Linux网络 网络基础一

1. 计算机网络背景 1.1 网络发展 独立模式&#xff1a;计算机之间相互独立。 网络互联&#xff1a;多台计算机连接在一起&#xff0c;完成数据共享。 局域网LAN&#xff1a;计算机数量更多了&#xff0c;通过交换机和路由器连接在一起。 广域网WAN&#xff1a;将远隔千里的…...

auto关键字解析

前言 在11标准之前&#xff0c;auto在c中是声明存储器类型的关键字。而在11标准中它的功能变为了类型推导。 对此&#xff0c; 在这里引入Cprimer中的原句&#xff1a; 编程时常常需要把表达式的值赋给变量&#xff0c;这就要求在声明变量的时候清楚的知道表达式的类型。然而…...

[实战]用户系统-1-基础功能完善

[实战]用户系统-1 目标响应格式化新建lib-interceptor增加res拦截器新建lib-filter完善异常处理日志处理新建lib-logger新增mongodb的model代码进度目标 我们的用户系统实战,将会实现以下功能,登录,注册,登出,修改用户信息,上传头像,响应的格式化,请求拦截,vip标识。…...

C#SQLServer数据库通用访问类

using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace thinger.cn.ADO.NETTeach { /// /// 数据库的通用类 /// public class SQLHelperBase…...

Linux中进程控制(上)

目录 进程创建 写时拷贝 fork常用场景 fork调用失败的原因 进程终止 进程退出场景 退出码 _exit函数 exit函数 进程等待 进程等待必要性 进程等待方法 wait方法 ​编辑 waitpid方法 获取⼦进程status 阻塞和非阻塞等待 进程创建 在linux中fork函数是⾮常重要的…...

为什么服务器突然变慢?从硬件到软件的排查方法

服务器突然变慢是许多系统管理员和网站运维人员经常遇到的问题。这种情况可能会影响网站性能、用户体验以及整个业务流程。了解服务器变慢的原因并采取相应的排查措施是至关重要的。本文将介绍服务器突然变慢的可能原因&#xff0c;从硬件到软件方面逐一排查&#xff0c;并提供…...

碳交易系统九大构成

碳交易系统九大构成 碳排放权交易系统的核心要素包括覆盖范围、配额总量、配额分配、排放监测、报送与核查&#xff0c;履约考核、抵消机制、交易机制、市场监管及配套的法律法规体系。 图源《中国碳排放权交易市场&#xff1a;从原理到实践》 1、覆盖范围 碳排放权交易体系…...

第9.2讲、Tiny Decoder(带 Mask)详解与实战

自己搭建一个 Tiny Decoder&#xff08;带 Mask&#xff09;&#xff0c;参考 Transformer Encoder 的结构&#xff0c;并添加 Masked Multi-Head Self-Attention&#xff0c;它是 Decoder 的核心特征之一。 1. 背景与动机 Transformer 架构已成为自然语言处理&#xff08;NLP…...

Java接口P99含义解析

假设你开了一家奶茶店&#xff08;接口就是你的奶茶制作流水线&#xff09;&#xff0c;每天要处理100杯订单&#xff1a; &#x1f680; P99是什么&#xff1f; 平均响应时间&#xff1a;就像说"平均每杯奶茶2分钟做好"&#xff0c;但可能有10杯让客人等10分钟P99…...

【Oracle 专栏】清理用户及表空间

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 今天需要清理一台服务器中之前的库&#xff0c;目前不再使用&#xff0c;以便释放空间。 如&#xff1a;清理 NH_MCRO_COLLECT 用户 2. 实验清理 2.1 查询&#xff1a;清…...

Qt功能区:Ribbon控件

控件 1. 按钮1.1 多选按钮1.2 2. 下拉列表框SARibbonComboBox2.1 简介2.2 代码实现 1. 按钮 1.1 多选按钮 软件功能&#xff1a;用于实现Category的名称居中。 SARibbonCheckBox继承于QCheckBox&#xff0c;使用方法完全相同。 SARibbonCheckBox* checkBox new SARibbonChe…...

eclipse 生成函数说明注释

在Eclipse中生成函数说明注释&#xff08;JavaDoc风格&#xff09;可以通过以下方法实现&#xff1a; 快捷键方式&#xff1a; 将光标放在函数上方输入/**后按回车键Eclipse会自动生成包含参数和返回值的注释模板 菜单方式&#xff1a; 选中函数点击菜单栏 Source > Gen…...

【Qt】QImage实战

QImage::Format_Mono, QImage::Format_RGB32, QImage::Format_ARGB32, QImage::Format_ARGB32_Premultiplied, 和 QImage::Format_RGB555 是 Qt 中不同的图像像素格式&#xff0c;它们在存储方式、颜色深度、是否支持透明通道以及适用场景上各有不同。下面是它们的详细对比&…...

tomcat知识点

1. JDK JDK是 Java 语言的软件开发工具包,JDK是整个java开发的核心,它包含JAVA工具还包括完整的 JRE(Java Runtime Environment)Java运行环境,包括了用于产品环境的各种库类,以及给开发人员使用的补充库。 JDK包含了一批用于Java开发的组件,其中包括: javac:编译器,将…...

Linux虚拟文件系统(2)

2.3 目录项-dentry 目录项&#xff0c;即 dentry&#xff0c;用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项&#xff0c;就构成了文件系统的目录结构。和上一章中超级块和索引节点不同&#xff0c;目录项并不是实际存在于磁盘上的&#xff0c…...

遥感影像-语义分割数据集:光伏数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;数据集包括504张亚米级卫星图片的农业光伏数据集&#xff0c;该数据集用于亚米级影像中的农业光伏提取任务。 KeyValue卫星类型亚米级卫星覆盖区域未知场景未知分辨率0.5m数量504张单张尺寸1024*1024原始影像位深8位标签图片位深8位原始影像通…...

【Java高阶面经:微服务篇】4.大促生存法则:微服务降级实战与高可用架构设计

一、降级决策的核心逻辑:资源博弈下的生存选择 1.1 大促场景的资源极限挑战 在电商大促等极端流量场景下,系统面临的资源瓶颈呈现指数级增长: 流量特征: 峰值QPS可达日常的50倍以上(如某电商大促下单QPS从1万突增至50万)流量毛刺持续时间短(通常2-4小时),但对系统稳…...

工业物联网网关在变电站远程监控中的安全传输解决方案

一、项目背景 随着智能电网的快速发展&#xff0c;对变电站的智能化监控需求日益迫切。传统变电站采用人工巡检和就地监控的方式&#xff0c;存在效率低、实时性差、数据不准确等问题&#xff0c;难以满足现代电力系统对变电站安全、稳定、高效运行的要求。而智能变电站通过引…...

车载诊断架构 --- LIN 节点 ECU 故障设计原则

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

编程技能:字符串函数09,strncmp

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数08&#xff0c;strcmp 回到目录…...

UML 时序图 使用案例

UML 时序图 UML 时序图 (Sequence Diagram)时序图的主要元素消息类型详解时序图示例时序图绘制步骤时序图的应用场景 UML 时序图 (Sequence Diagram) 时序图是UML(统一建模语言)中用于展示对象之间交互行为的动态视图&#xff0c;它特别强调消息的时间顺序。 时序图的主要元素…...

业务逻辑篇水平越权垂直越权未授权访问检测插件SRC 项目

# 逻辑越权 - 检测原理 - 水平 & 垂直 & 未授权 1 、水平越权&#xff1a;同级别的用户之间权限的跨越 2 、垂直越权&#xff1a;低级别用户到高级别用户权限的跨越 3 、未授权访问&#xff1a;通过无级别用户能访问到需验证应用 PHPStudy Metinfo4.0 会员后台中…...

Android开发——不同布局的定位属性 与 通用属性

目录 不同布局的定位属性1. 线性布局&#xff08;LinearLayout&#xff09;2. 相对布局&#xff08;RelativeLayout&#xff09;3. 约束布局&#xff08;ConstraintLayout&#xff09;4. 表格布局&#xff08;TableLayout&#xff09;5. 网格布局&#xff08;GridLayout&#x…...

【DB2】SQL1639N 处理

背景 测试环境21套DB2需要创建只读用户并赋予权限&#xff0c;在20套都成功的情况下&#xff0c;有一套报错了&#xff0c;具体细节为&#xff0c;赋权成功&#xff0c;但是使用被赋权的账户连接失败&#xff0c;报错如下 SQL1639N The database server was unable to perfor…...

禾纳EAT3152AP MOS电源芯片PIN TO PIN替代泰德TDM3307/2307方案

AET3152AP特性 VDS-30V,ID-40A RDS (ON)11mΩ (TYP.)VGS-10V, ID-10A RDS (ON)15mΩ (TYP.)VGS-4.5V, ID-5A 快速切换 l 低电阻 不含卤素和锑&#xff0c;符合Rohs标准 温度范围&#xff1a;-55℃~125℃ 封装&#xff1a;PDFN3030 AET3152AP应用 交换机切换 便携式/台式机中的…...

Python Day28 学习

继续聚类算法的学习 浙大疏锦行 DBSCAN聚类 Q1. 该算法的原理是什么&#xff1f; 总体而言&#xff0c;DBSCAN聚类是一种基于密度的聚类算法&#xff0c;适合发现任意形状的簇和检测噪声点 Q2. 代码实现 import numpy as np import pandas as pd from sklearn.cluster impo…...

企业网站架构部署与优化-Nginx核心功能

目录 #1.1正向代理 1.1.1编译安装Nginx 1.1.2配置正向代理 #2.1反向代理 2.1.1配置nginx七层代理 2.1.2配置nginx四层代理 1.1正向代理 正向代理&#xff08;Forward Proxy&#xff09;是一种位于客户端和目标服务器之间的服务器&#xff0c;用于代表客户端向服务器发送请求并…...

Java 多态

文章目录 多态向上转型和向下转型向上转型和重写重写和重载的区别动态绑定和静态绑定用代码来解释什么是多态向下转型 多态的优点 总结 多态 什么是多态&#xff1f;为什么要使用多态&#xff1f; 简单来说是多种形态&#xff0c;具体来说是去完成某个事情&#xff0c;当不同对…...

机器学习中的泛化能力

我们常常提到模型的泛化能力&#xff0c;什么是泛化能力呢&#xff1f; 百度百科这样解释&#xff1a;是指机器学习算法对新鲜样本的适应能力。 学习的目的是学到隐含在数据背后的规律&#xff0c;对具有同一规律的学习集以外的数据&#xff0c;经过训练的网络也能给出合适的输…...

第七章:数据存储策略与状态恢复机制实录

经过状态机、UI交互、逻辑驱动等章节的打磨&#xff0c;前端体系已经具备较强的调度与展示能力。但真正能决定组件在异常情况下能否“满血复活”的关键&#xff0c;落在了“状态恢复”这一关卡。尤其在安卓端环境复杂、网络波动频繁的前提下&#xff0c;若没有稳定的本地数据存…...

digitalworld.local: FALL靶场

digitalworld.local: FALL 来自 <digitalworld.local: FALL ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.4 3&…...

Java Collection(集合) 接口

Date: 2025-05-21 20:21:32 author: lijianzhan Java 集合框架提供了一组接口和类&#xff0c;以实现各种数据结构和算法。 以下是关于 Java 集合的核心内容说明&#xff1a; /*** Java Collection Framework 说明&#xff1a;** 在 Java 中&#xff0c;集合&#xff08;Collec…...

直线型绝对值位移传感器:精准测量的科技利刃

在科技飞速发展的今天&#xff0c;精确测量成为了众多领域不可或缺的关键环节。无论是工业自动化生产线上的精细操作&#xff0c;还是航空航天领域中对零部件位移的严苛把控&#xff0c;亦或是科研实验中对微小位移变化的精准捕捉&#xff0c;都离不开一款高性能的测量设备——…...

Kotlin 极简小炒 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)

Kotlin 概述 Kotlin 由 JetBrains 开发&#xff0c;是一种在 JVM&#xff08;Java 虚拟机&#xff09;上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性&#xff0c;同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言&#xff0c;也可…...

Server-Driven UI:Kotlin 如何重塑动态化 Android 应用开发

以下是一篇整合详细代码示例的完整博客&#xff0c;深入探讨Kotlin在Server-Driven UI&#xff08;SDUI&#xff09;中的核心作用&#xff1a; Server-Driven UI&#xff1a;Kotlin 如何重塑动态化 Android 应用开发 1. Server-Driven UI 的核心价值 SDUI通过将UI描述与业务逻…...

基于多传感器融合的智能驾驶环境感知系统

摘要 随着自动驾驶技术的发展,单一传感器的局限性日益凸显。本文提出了一种基于多传感器(摄像头、毫米波雷达、激光雷达)融合的环境感知系统,通过深度学习算法实现车辆周围环境的精确感知。文章详细介绍了传感器标定、数据融合、目标检测与跟踪等关键技术,并提供了Python…...

JC/T 2848-2024 玻璃纤维增强石膏(GRG)装饰制品检测

玻璃纤维增强石膏装饰制品是指以玻璃纤维为主要增强材料&#xff0c;高强石膏为主要胶凝材料&#xff0c;适当掺入集料&#xff0c;外加剂的石膏装饰制品&#xff0c;GRG具有防火&#xff0c;隔音&#xff0c;被广泛应用于&#xff0c;墙板&#xff0c;装饰构件等。 JC/T 2848…...

每日算法 -【Swift 算法】寻找字符串中最长回文子串(三种经典解法全解析)

&#x1f9e9; 最长回文子串问题&#xff1a;三种经典解法全解析&#xff08;含代码注释&#xff09; 本文将系统讲解“最长回文子串”问题的三种常见解法&#xff1a;中心扩展法、动态规划、马拉车算法&#xff08;Manacher’s Algorithm&#xff09;&#xff0c;并进行对比与…...

【Java高阶面经:数据库篇】13. MySQL 并发控制秘籍:MVCC 协议与隔离级别深度解析

一、MVCC核心原理:多版本并发控制的基石 1.1 为什么需要MVCC? 在传统锁机制中,读写操作会互相阻塞,导致高并发场景下性能下降。MVCC通过多版本数据快照避免读写阻塞,实现: 读不加锁:快照读(普通SELECT)不阻塞写操作写不阻塞读:写操作生成新版本,读操作访问历史版本…...

分布式集群中的共识算法及其在时序数据库IoTDB中的应用

一、引言 在分布式集群环境中&#xff0c;为了实现海量数据的横向扩展&#xff0c;数据通常被划分为多个子集并分散存储在集群的各个节点上。为了确保数据的高可用性&#xff0c;每个数据子集都会在多个物理节点上存储副本。然而&#xff0c;这种多副本机制也带来了新的挑战&a…...

Java面试实录:从JVM调优到Spring Cloud实践

Java大厂面试&#xff1a;当严肃面试官遇上搞笑程序员 场景设定 面试官&#xff1a;拥有多年行业经验的技术专家&#xff0c;对Java及相关技术栈有着深入的理解。明哥&#xff1a;一位自认为是“水货”的程序员&#xff0c;擅长用幽默化解紧张气氛&#xff0c;但面对复杂问题…...

自定义协议与序列反序列化

目录 引子&#xff1a; 一、再谈 "协议" 二、自定义协议与网络版计算器 1.约定方案一: 2.约定方案二: 3.我们采用的协议 三、网络计算器代码 Log.hpp 日志 Makefile Socket.hpp 套接字封装 Protocol.hpp 协议 序列化反序列化 结构化数据格式规定 TcpSe…...

SAP-ABAP:ABAP异常处理与SAP现代技术融合—— 面向云原生、微服务与低代码场景的创新实践

专题三&#xff1a;ABAP异常处理与SAP现代技术融合 —— 面向云原生、微服务与低代码场景的创新实践 一、SAP技术演进与异常处理的挑战 随着SAP技术栈向云端、微服务化和低代码方向演进&#xff0c;异常处理面临新场景&#xff1a; Fiori UX敏感度&#xff1a;用户期望前端友…...

JavaScript面试题之消息队列

JavaScript消息队列详解&#xff1a;单线程的异步魔法核心 在JavaScript的单线程世界中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步编程的核心机制&#xff0c;它像一位高效的调度员&#xff0c;让代码既能“一心多用”又避免卡顿。本文将深入剖析消…...