GenAIOps:生成式 AI 运维 - 实用指南
https://medium.com/google-cloud/genaiops-operationalize-generative-ai-a-practical-guide-d5bedaa59d78
作者:Dr Sokratis Kartakis
从创意到生产:使用生成式 AI 和运维 (GenAIOps)
概述
生成式 AI (GenAI) 的世界充满了令人兴奋的可能性,但要掌握这种变革性技术,不仅需要强大的模型,还需要深入理解运维策略、最佳实践以及生成式 AI 和运维 (GenAIOps) 的不断演变。
这篇博客提供了一个全面指南,帮助你面对生成式 AI 部署的复杂性。无论你是刚刚开始你的 GenAI 之旅,还是已经成熟到可以微调自己的模型,这篇文章都将为你提供有效将 GenAI 创意转化为生产的知识和见解。
以下是你可以学到的内容:
- MLOps 基础:我们重温了预测性机器学习 (ML) 中的 MLOps 核心原则,强调在成功的 AI 部署中,人、流程和技术之间的关键协作。
- GenAI 布局:我们深入探索了 GenAI 生态系统中的各种角色,从消费者和微调者到提供者,并探讨了 GenAI Ops 的术语演变,包括 Prompt Ops、Agent Ops 和 RAG Ops。
- GenAI 之旅:我们概述了 GenAI 用户的典型旅程,重点关注模型选择、Prompt 工程以及定制数据在评估中的重要性。此外,我们提供了开发面向消费者的 GenAI 应用的实用指导,包括后端和前端开发、利用检索增强生成 (RAG) 以及基于代理系统的架构。最后,我们提供了 GenAIOps 平台的参考架构。
加入我们,一起揭开 GenAIOps 的神秘面纱,助你释放这项突破性技术的全部潜力。
回顾预测性 ML 的 MLOps
在深入探讨 GenAIOps 的细节之前,有必要通过回顾 MLOps 的核心原则来奠定坚实的基础。
MLOps 的本质是人、流程和技术之间的和谐结合,共同努力将机器学习解决方案高效地部署到实际生产环境中。需要认识到,MLOps 不仅仅是技术问题;它不仅是关于构建和交付 ML 管道。成功的 MLOps 实现更深入地考虑了客户的运维模式、现有的业务单元以及整体组织结构。这种整体方法确保了技术针对其特定需求量身定制,能够无缝集成到业务中并最大化其价值。
通过生成式 AI 驱动商业价值
构建 MLOps 平台的主要目标是使客户能够部署更多解决方案到生产环境中,并以更快的速度和更大的规模实现这一点。这种加速的部署周期使企业能够保持竞争力,并快速适应不断变化的市场需求。上表显示了一些标准化 MLOps 平台所期望的结果。
MLOps 是释放机器学习 (ML) 和生成式 AI(如本文稍后讨论)的真正潜力的关键。虽然技术本身具有开创性,但如果没有高效的部署和扩展,其实际影响是有限的。强大的 MLOps 策略的主要目标是大幅缩短将用例从概念转化为生产的时间。与通常长达一年的流程相比,一个实施良好的 MLOps 平台可以将这一周期缩短到仅几周,从而几乎立刻带来收入提升。
这种加速是通过标准化实现的。透过建立一致的流程来构建和部署解决方案,以及为常见用例创建可重用的模板,组织可以显著简化其工作流程。结合像 Google Cloud Platform 这样安全且稳健的云端平台,这种标准化使团队能够专注于创新和快速迭代。
在这种背景下,关键绩效指标 (KPI) 围绕实现价值的速度展开。尽管成本降低可能看起来是主要目标,但真正的优势在于可扩展性。MLOps 能够使组织在 ML 和生成式 AI 计划上实现指数级增长。想象一下,一家公司目前管理两个生产就绪的用例,借助强大的 MLOps 平台和战略,他们可能扩展到数百个,从而显著增加对业务的整体影响。这种对可扩展性的关注,由高效的MLOps实践推动,将生成性AI从一项有前景的技术转变为推动业务增长的强大引擎。
团队结构的演变
实施 ML 解决方案时,强大的 MLOps 平台至关重要。这不仅仅是关于部署模型,还需要一个结构良好的团队和明确的角色来管理从数据摄取到模型治理的整个生命周期。一个典型的设置包括几个互相协作的团队。
首先,我们有基础的云平台团队。这个团队由架构师、管理员和安全专家组成,他们提供基本的基础设施和访问控制。他们管理云环境,定义 IAM 角色和策略、网络,并确保所有项目的安全运行。他们就像组织端到端云战略的建筑师和建设者。
接下来是数据工程团队。他们负责构建和维护为 AI 模型提供数据的数据管道。在数据湖或数据网格架构中,他们摄取、预处理并准备数据,用于数据科学家和其他利益相关者的使用。这个团队确保数据质量和可访问性,为成功的模型训练奠定基础。
基于这一数据基础的是数据科学和 MLOps 团队。在这里,数据科学家在沙盒环境中进行实验和训练模型,随后与 ML 工程师合作,构建 ML 管道并自动化数据预处理、模型训练和后处理过程,通过开发、预生产和生产环境进行迭代。至关重要的是,这个团队利用 CI/CD 管道来自动化模型的部署和管理。在这里,MLOps 工程师扮演着关键角色。他们负责构建和维护支持 CI/CD 管道的基础设施,确保模型的无缝部署,并促进数据科学家和 ML 工程师专注于用例开发。
最后,在这些团队之上是机器学习治理功能。这个集中单元充当所有模型元数据、开发工件和性能指标的存储库。产品负责人可以利用这些信息评估已部署模型的有效性,而审计员可以跟踪数据来源并确保合规性。这种集中治理提供了透明度和问责制,对于负责任的 AI 开发和部署至关重要。本质上,这种结构促进了协作和效率,确保从最初的实验到生产就绪的路径平稳且受控。
基于 Google Cloud 的参考架构
在探讨生成式 AI 如何改变 MLOps 之前,让我们简要回顾一下典型的 MLOps 架构。去年,我们的标准方法采用了模块化设计,强调关注点的分离。我们通常围绕关键功能领域来结构化项目:基础设施、数据管理、MLOps 和各种部署环境(开发、预生产和生产)。一个集中治理项目监督整个过程,确保合规性和最佳实践。
这种架构包括一个专门存放所有基础设施即代码 (IaC) 的项目,允许可重现和可扩展的部署。单独的数据项目专注于数据的摄取和预处理,确保用于模型训练的数据质量和一致性。这个设置的核心是 MLOps 层,它位于生产环境之外的实验沙盒中。这种隔离空间允许迭代模型开发和实验,而不会影响实际系统。最后,为开发、预生产和生产环境分别设立的独立项目,确保了模型部署过程的顺畅和受控。
这种传统的 MLOps 架构为 ML 模型的部署提供了坚实的基础,但正如我们将看到的,生成式 AI 的出现需要一些关键的变化。如果想更深入了解预测性 ML 的 MLOps,请阅读以下文章《使用 Amazon SageMaker 为企业建立 MLOps 基础路线图》。
揭开生成式 AI 和运维的面纱
现在我们已经建立了对 MLOps 的扎实理解,让我们探讨生成式 AI 如何重塑这一领域。
探索 GenAI 生态系统:从消费者到提供者
生成式 AI 生态系统是一个动态的空间,拥有多样化的参与者。理解这些角色对于掌握这种变革性技术的机遇和挑战至关重要。总体而言,我们可以将 GenAI 用户分为三大类:消费者、微调者和提供者。每个角色在生成式 AI 模型和应用的开发与部署中都扮演着重要角色。
-
消费者:这是 GenAI 用户群体中规模最大的一部分。这些用户通过现成的 API 使用预训练的基础模型 (FMs),专注于应用而非模型开发。他们的主要工具包括 Prompt 工程、检索增强生成 (RAG) 和基于代理的系统。消费者无需深厚的 ML 专业知识;他们的重点是有效利用现有模型来开发创新的 GenAI 应用解决方案。
-
微调者:这是一个技术更高级的群体。他们使用自己的数据将现有的基础模型调整到特定任务或领域。这通常需要数据科学专业知识来管理微调过程,重新训练模型(或其部分),并确保最佳性能。微调允许更好地控制模型输出,使其能够满足特定业务需求,超越通用模型的局限性。
-
提供者:这些是基础模型 (FMs) 的架构师。例如 Anthropic(Claude)和 Google DeepMind(Gemini)就属于这一类。他们拥有深厚的 ML 专业知识,并掌握大量资源,用于大规模数据收集、标注和模型训练。构建这些基础模型是一项资源密集型工作,需要庞大的数据集和复杂的基础设施。
有趣的是,这些类别并非固定不变。随着需求的变化,消费者可能会转变为微调者,以寻求对 AI 解决方案更大的控制权,或满足 RAG 无法满足的性能要求。同样,提供者有时也会扮演微调者的角色,将自己的模型调整用于特定任务,例如 Meta 的 Llama Chat 就是 Meta 微调版的 Llama。这种 GenAI 生态系统内的流动性反映了技术的快速发展以及其多样化的利用方式。这种消费者、微调者和提供者之间的动态交互推动了创新,并扩展了 GenAI 在各个行业中的可能性。
在这篇博客中,我们主要关注与 GenAIOps 更相关的消费者 GenAI 旅程。
生成式 AI 的新时代进一步复杂化了企业组织的景观,新增了一个 GenAI 应用层,由 Prompt 工程师、AI 工程师和 DevOps/应用开发人员组成,他们共同致力于构建下一代 AI 驱动的解决方案和应用。GenAI 应用层突出了在有效应用和部署 GenAI 模型方面对专业技能日益增长的需求。
导航生成式 AI 运维领域
生成式 AI 的快速发展带来了大量新术语和运维范式的涌现。理解这些不同的“Ops”对于在该领域工作的任何人来说都是至关重要的。
- DevOps:作为许多软件开发实践的基础,DevOps 强调自动化和持续集成/持续交付 (CI/CD) 管道,以简化代码部署和测试。这为后续更专业化的实践奠定了坚实的基础。
- MLOps:在此基础上,MLOps 解决了部署机器学习模型的独特挑战。与传统软件不同,模型的性能高度依赖于训练数据,需要持续监控和重新训练以保持生产质量。这为运维过程增加了另一层复杂性。
- FMOps 和 LLMOps:当模型的规模和复杂性不断增加时,我们进入了基础模型 (FMs) 和大型语言模型 (LLMs) 的领域,对应的运维框架是 FMOps 或其子集 LLMOps。这些专业领域关注于部署和管理这些强大模型的独特需求,包括基础设施管理、微调和性能优化。
- GenAIOps:随着生成式 AI 应用的出现,产生了新的运维需求。GenAIOps 涵盖了构建和部署生成式模型应用的运维方面。在 GenAI Ops 中,我们还可以进一步细分出 PromptOps(管理和优化提示)、AgentOps(管理自主代理)和 RAGOps(检索增强生成——管理外部知识的检索和集成)。尽管这些术语可能看起来令人困惑,但理解这些不同“Ops”之间的关系,可以更清晰地了解生成式 AI 的不断演变的格局。
更多细节可参考文章《Dev-, ML-, GenAI-, FM-及其他-Ops 的详细分类与比较分析》。
消费者的 GenAI 之旅
在了解了 GenAI 生态系统内的不同角色和运维框架后,让我们深入探讨 GenAI 用户(特别是消费者)的典型旅程。
为你的需求选择合适的模型
围绕生成式 AI 的兴奋是显而易见的,但要有效地实现这些强大的模型,需要清晰地理解实现的过程。许多企业在尝试利用 GenAI 时,会因可用模型的多样性及其整合到工作流程中的步骤而不知所措。这种情况通常会导致陷入功能过载的困境,而缺乏明确的路线图。
成功实现 GenAI 的关键在于理解 GenAI 旅程,并专注于仔细的模型选择。这一旅程通常包括选择模型、严格评估其在特定用例上的表现,然后通过诸如聊天机器人等接口让终端用户与模型交互,并不断迭代改进模型的有效性。
旅程中的第一个关键步骤是模型选择。企业往往会问的第一个也是最重要的问题是:“我该如何选择合适的模型?” 这一决定不仅仅是选择最强大的模型,而是需要对多个关键因素进行战略评估。
当一个新用例出现时,首先要识别出两到三个候选模型。它们可以来自同一系列(例如,不同版本的 Gemini),也可以来自完全不同的提供者。然后,使用你的特定数据和目标用例的需求对这些模型进行严格评估。
虽然准确性无疑是重要的,但它并不是唯一的决定因素。商业指标(如成本和延迟)在确定最优模型时也起着重要作用。一种高度准确的模型可能代价高昂,或者在实时应用中速度太慢,因此不适合某些用例。通过这种评估过程,可以在性能和实际考虑之间找到最佳平衡。
对模型特性的深入了解是这个阶段的关键。这需要考虑多个方面,例如模型是专有的还是开源的,其许可协议、微调能力、速度、成本,甚至其使用的参数数量。上下文窗口的大小是另一个关键因素,尤其是对于处理较长文本序列的应用,如文档摘要或 RAG。模型的训练数据对其优势和劣势产生了重大影响,因此理解训练数据至关重要。最后,考虑模型的多模态性(如文本、图像、视频等)以及你的团队对不同模型的现有技能和熟悉程度,以确保顺利的整合过程。
通过系统地评估这些因素,你可以有效地导航复杂的 GenAI 模型领域,并选择最适合你的具体需求和目标的模型,为成功的 GenAI 实现奠定基础。
从 Prompt 工程到构建强大的 Prompt 目录
开发高效的 GenAI 应用不仅仅是选择一个模型并期待最好的结果。这是一个以理解特定用例为起点的旅程,涉及到精心的 Prompt 工程、模型选择和持续评估。这一过程是 GenAI Ops for Consumers 的关键部分,确保所选模型能够为目标应用实现最佳性能。
这一过程通常从产品负责人向 AI 工程师概述他们的目标用例开始,而后者可能也擅长 Prompt 工程。
AI 工程师然后会查阅可用基础模型 (FMs) 的参考表,Prompt 工程师开始设计初始 Prompt——通常是大约五个的小集合。这些 Prompt 会在几个表现最佳的模型(最初可能是四个)上进行测试,以评估其效果。这种初步测试有助于将候选范围缩小到两到三个模型。在此过程中,构建一个 Prompt 目录尤为重要。这个目录一开始规模较小,可能只包含十个提示及其相应的输出,但随着时间的推移,它会成长为一个功能强大的工具。
Prompt 目录是输入 Prompt 及其相应响应的精心整理的集合,随着时间的推移,它会发展成为生产化和评估过程的核心工具。最初可能只有十条记录,但最终可能扩展到数百甚至数千条记录,从而成为自动评估的宝贵资源。
这时,Prompt 模板就派上用场了。许多模型(如 Llama 2)依赖于特定的 Prompt 模板。这些模板充当结构化蓝图,定义了所需的输入格式和参数。将这些模板连接到一个结构化的指令、上下文和期望响应的表格上,可以系统地创建全面的 Prompt 目录。通过使用表中的不同数据填充模板,我们可以有效地创建 Prompt 目录的物化视图,形成一个强大且定制化的评估数据集。
使用 Prompt 模板目录加速 AI 开发
企业越来越多地采用 Prompt 模板目录来加速 AI 开发。这些目录作为集中存储库,用于存储、管理和优化预构建的 Prompt 模板。这种方法有几个优势:
- 提高效率:Prompt 工程师可以快速利用经过验证的通用任务模板,避免从头开始。
- 改进性能:存储的模板通常针对特定用例和数据集进行了测试和优化,从而带来更好的结果。
- 简化协作:目录提供了一个共享空间,用于存储 Prompt 的版本、所有权详细信息和相关元数据,促进协作和知识共享。
- 简化模型迁移:通过包含针对不同基础模型 (FMs) 定制的 Prompt 变体,目录可以在无需大量重新设计的情况下实现模型之间的平稳过渡。这种跨模型兼容性通常通过人工专业知识或利用其他 LLMs 进行转换来实现。
图片灵感来源于《自动 Prompt 工程:终极实操指南》
为了进一步优化 Prompt 的开发,基于最佳历史 Prompt 的 Prompt 优化成为市场上的新趋势。更多详细信息可参考博客文章《自动 Prompt 工程:终极实操指南》。
找到合适的评估指标
拥有一个定制化的评估数据集至关重要,因为通用排行榜可能会产生误导。尽管排行榜可能基于通用基准对模型进行排名,但它们通常无法反映模型在特定用例和业务数据上的真实表现。相反,基于从 Prompt 目录中提取的定制数据集对模型进行评估,更能可靠地揭示其实际能力,确保所选模型能够有效地泛化到目标应用中,从而为消费者交付真正的价值。
评估生成式 AI 模型性能需要仔细选择合适的指标,而这一过程受到多个因素的影响。一个关键因素是标注数据的可用性,例如问题-答案对或文档-摘要对。这类数据往往稀缺,尤其是在生成式 AI 项目的早期阶段。
在标注数据可用的情况下,指标的选择通常取决于具体任务。例如,在具有唯一、明确答案的问题回答场景中,传统的机器学习指标(如精准率、召回率和 F1 分数)是有效的。然而,生成式 AI 通常需要处理输出可能与标注数据相似但不完全相同的任务。在这些情况下,任务特定的指标变得尤为重要,例如:
- 相似性度量:例如余弦相似性、ROUGE(用于文本摘要)和 BLEU(用于机器翻译)评估生成输出与参考数据的相似程度。
- 事实准确性:例如 HELM 这样的指标评估生成文本的事实基础。
- 安全性和偏差:例如 Toxigen 测量生成内容的毒性,同时评估潜在的偏见和刻板印象。语义鲁棒性(如词错误率)则确保生成的输出是有意义且连贯的。
当标注数据不可用时,有两种主要方法:
- 人工评估 (Human-in-the-Loop, HIL):人类评估者根据预定义的指南审查模型的输入和输出,提供分数和定性反馈。这种方法精度高,但需要大量资源且成本昂贵。
- LLM 作为评估者:利用 LLM 作为评估者/裁判,提供比人工评估更快速、更大规模的替代方案。尽管精度可能不如人工评估,但对于精度需求不高的应用来说,LLM 是一种有效的选择。
在企业环境中,评估过程通常会逐步演进:
- 起初使用 HIL 以确保高精度;
- 随后转向半自动化方法,结合 LLM 作为部分数据的评估者;
- 最终,当积累了足够的标注数据池后,采用完全自动化评估并使用任务特定的指标。
进行严格的模型评估
AI 工程师通过利用包含必要评估数据的 Prompt 目录,并选择相应的评估指标以及三大基础模型 (FMs),实现大规模自动化评估。如果有标注数据,算法会自动生成目录中每条记录的评估分数;否则,由人工评估者手动评估每条记录。此过程生成每条记录的个体分数,以及所选 FMs 的聚合结果,表明基于特定数据的精度。最后,系统存储评估结果并记录执行过程,保持 Prompt 目录的溯源性。
根据业务优先级选择模型
尽管精度重要,但为特定 GenAI 用例选择最优基础模型 (FM) 不仅仅是追求准确性。还需要考虑应用和业务需求,例如速度/延迟和成本(如每次交互的成本、托管成本)。例如,为低延迟聊天机器人选择一个又大又慢的模型,或者在预算受限时选择一个昂贵的模型,显然是不实际的。
因此,首先需要设定优先级,例如优先优化两类指标中的一类(例如优先级 0 是成本,优先级 1 是精度),同时忽略速度。然后,可以选择在成本最低的情况下表现良好的(但不一定是最好的)模型。这一过程确保了所选模型在满足业务需求的同时,提供准确的解决方案。
弥合差距:可靠的后端与用户友好的前端
成功选择并离线评估了最佳模型后,下一步是将 GenAI 应用付诸实践。构建生成式 AI 应用不仅仅需要强大的算法和模型,还需要使这些能力变得易于访问且用户友好。这需要后端开发和前端开发之间的紧密协作,其中后端负责 AI 的核心功能,而前端则专注于用户体验。
可以将其比作一辆汽车:后端是强大的引擎,生成文本、图像或内容,而前端是直观的仪表盘和方向盘,使用户能够轻松地控制并与这些功能交互。
为了确保一个可靠且稳健的 GenAI 解决方案,后端需要一些关键组件:
- 护栏(Guardrails)和安全性:这一关键组件充当看门人,过滤所有输入和输出。它保护系统免受未经授权的访问、数据泄露和恶意攻击,同时通过筛查不当或有害内容确保负责任的使用。此外,缓存常用输出还可以优化性能并降低成本。
- 上下文检索:虽然离线评估通常依赖预准备的数据,但实际的 GenAI 应用通常需要实时访问和集成来自各种知识源(数据库、云存储等)的信息。这需要一个上下文检索组件,使应用能够利用 RAG 或基于代理的技术(将在后续部分详细讨论),提供准确且上下文相关的响应。
- 持续监控:AI 模型在面对异常输入时可能表现出不可预测的行为。持续监控对于分析每次交互(无论是单独的还是整体的)至关重要。实时评估有助于识别潜在问题,跟踪性能指标(如毒性水平),并确保应用保持可靠性和符合预期。
- 反馈和评分机制:终端用户的反馈对于持续改进和评估至关重要。评分机制允许将用户反馈转化为改进评估数据(Prompt 和示例输出)的依据,这些数据存储到 Prompt 目录的新版本中用于进一步评估。这创造了一个持续改进的循环,确保应用不断发展以满足用户需求和期望。
后端可以运行在一个容器中,需要基于稳健的 DevOps 基础进行开发,遵循持续集成和持续部署 (CI/CD) 的原则以及代码存储库。自动化的 CI/CD 管道、测试和部署确保代码更新可以快速可靠地实施,使 AI 工程师能够更快地迭代并提供不断改进的用户体验。
作为面向消费者的 GenAI 体验的关键部分,前端是用户交互的界面,无论是用于上传数据以生成摘要的网站,还是用于动态对话的聊天机器人界面。一个直观且设计良好的前端可以让用户轻松利用后端生成式 AI 模型的功能,而无需了解背后的复杂技术。一个流畅且高效的用户界面可能是用户体验令人沮丧或真正赋能的区别所在。
前端和后端的生命周期是独立的(分别拥有不同的代码存储库和 CI/CD 管道),这使 DevOps/应用开发人员能够独立开发和更新应用的外观和功能。
上图展示了在 Google Cloud 中开发后端和前端所需使用的主要服务。
为日常使用赋能:通过 RAG 利用你的数据
生成式 AI 已经取得了令人难以置信的进步,使我们能够与机器对话并以前所未有的方式生成创意内容。然而,这些强大的模型往往缺乏回答基于你数据的问题所需的具体上下文知识。例如,想象你的 AI 助手需要基于 2024 年的财务记录总结你公司的表现。一个标准的生成式模型(在一般知识上训练)无法访问这些信息。
这就是检索增强生成 (RAG) 的用武之地,它弥合了通用模型和个性化数据之间的差距,为生成式 AI 提供了所需的相关上下文,从而交付真正有用的结果。
RAG 的工作流程包括以下几个步骤:
- 数据准备:将数据存储在云存储、数据库甚至简单的 PDF 文件中,并使其可供 AI 模型访问。
- 数据分块:将数据分解成更小的可管理块,例如将 PDF 按段落拆分。
- 嵌入生成:通过嵌入模型将这些块转换为数字表示(向量),捕捉它们的语义含义。
- 向量存储:将这些向量存储并索引在向量数据库中,从而创建一个特定于你的数据的可搜索知识库。
当你提出问题时,RAG 系统不仅仅依赖基础模型的通用知识。相反,它首先查询向量数据库,基于语义相似性检索与问题最相关的数据块。然后,这些数据块与初始问题一起被输入到生成模型中,为精确且信息丰富的响应提供必要的上下文。系统还会验证生成的答案是否基于检索到的上下文(或通过在特定知识库中搜索引用),确保 AI 不会“幻觉化”信息。这种双层方法结合了大型语言模型的强大功能和目标数据检索的精确性。
在离线过程中,数据工程师负责数据准备,确保数据的清洁性、准确分块、有效的嵌入表示和高效的索引以实现最佳搜索性能,并选择合适的向量存储。在生产环境中,数据工程师需要运行一系列测试来选择正确的机制(例如嵌入模型、分块和索引),以确保 RAG 检索部分的高性能。AI 工程师则专注于在线生成组件,针对生成过程中的任何检索挑战向数据工程师提供反馈。像 RAGAS 这样的框架可以用来评估检索和生成两个层面的表现。
我们将在单独的文章中深入探讨 RAG 和运维(RAGOps),并提供更多关于生产环境注意事项的细节。
探索代理系统的世界
生成式 AI 正在迅速发展,而代理(Agents)的兴起是最令人兴奋的进展之一。可以将代理看作是增强版的 Prompt,它们通过访问特定工具被赋予了更强大的能力。与简单地向大型语言模型 (LLM) 发送文本 Prompt 不同,代理利用外部资源来提供更丰富且更具操作性的结果。例如,这些工具可能包括检索增强生成 (RAG) 系统以访问相关文档、直接链接到知识库(如 Wikipedia)、与数据库的连接或甚至简单的计算器。这使得 LLM 能够超越文本生成,执行更复杂的任务。
代理的真正能力在于多个代理的部署,每个代理专注于特定的业务功能。例如,一个营销团队可以拥有一个设计用于生成目标广告活动的代理,而采购团队则使用另一个优化处理交易的代理。
管理这种多代理架构需要强大的运维策略,这就是 AgentOps 的作用所在。AgentOps 的一个重要组成部分是“路由代理”的概念。路由代理充当中央枢纽,根据任务将用户请求定向到相应的专用代理。这需要清楚了解现有代理及其使用的工具,通常通过一个代理目录或工具目录来实现。这些目录充当可重用资产的清单,促进效率并防止重复开发。可以将其看作是你的 AI 代理的工具箱,确保始终为工作提供正确的工具。
我们将在单独的文章中更详细地探讨代理和运维(AgentOps),并提供更多关于本节中介绍的每个组件的细节。
构建面向消费者的 GenAIOps 平台
要为消费者构建一个稳健且可扩展的生成式人工智能应用程序,就必须仔细考虑底层架构。这需要采用结构化的方法,从最初的开发和实验到严格的测试和最终部署。其中的一个关键因素是将关注点分开,这通常是通过利用不同的团队和环境来实现的。
通常情况下,由专门的平台团队管理基础架构代码,为各种项目提供一致的基础。这使得 GenAI 开发团队能够专注于核心应用逻辑。在开发项目中,将实施后端,包括与检索增强生成(RAG)和智能代理等关键组件的集成,其中必要的数据和数据准备过程将运行到数据湖项目(或数据网格环境中的多个项目)中。开发项目也是进行关键实验和评估的地方,可确保模型按预期运行并提供有价值的输出。除了后端,还要开发前端,以处理用户交互并有效呈现生成的内容。
在通往生产的过程中,需要一个独立的测试和暂存环境,而后端和前端则使用 CI/CD 管道自动推进。这个专用空间允许在向用户发布应用程序之前进行全面测试。自动测试对于验证功能和捕捉潜在问题至关重要。然而,GenAI 应用程序的独特性质也要求进行人工测试。提示测试人员在这方面发挥着至关重要的作用,他们使用预定的用户界面和专用的游乐场用户界面与应用程序进行交互,以评估在不同输入情况下生成内容的质量和相关性。这种自动测试和人工驱动测试相结合的方式,可确保最终部署时的用户体验稳健可靠。最后,所有相应的资源库、CI/CD 管道、GenAI 解决方案的评估结果和元数据都被定位到人工智能治理项目中。在此环境中,产品负责人和审计人员对 GenAI 解决方案进行评估。
从消费者到微调者:生成式 AI 的下一步
GenAI 的发展日新月异,已不仅仅局限于使用预先训练好的模型。这种认识正在推动 GenAI 之旅发生转变。虽然大多数用户仍然是消费者,只是简单地访问和使用现有模型,但越来越多的用户正在突破检索增强生成(RAG)和基于代理的系统的界限。他们认识到现成解决方案的局限性,并寻求对人工智能实施的更大控制。这使他们走上了微调之路,即根据特定数据集和用例调整预训练模型的过程。从消费者到微调者的转变标志着真正利用 GenAI 力量的重要一步。
在构建 GenAI 应用时,消费者可能会遇到以下场景,从而选择进行微调:
- RAG 无法解决问题:对于某些任务,仅依赖检索增强生成不足以提供所需的性能。
- 更高的性能要求:企业可能需要更高的准确性或速度,而这超出了现有基础模型的能力。
- 特定任务定制:某些任务需要模型专注于非常具体的领域知识或语言风格,这需要通过微调实现。
- 业务差异化:企业希望通过微调模型获得竞争优势,使其解决方案与众不同。
在此阶段,企业需要具备强大的 MLOps 能力来支持微调和上线部署。这包括管理数据管道、模型训练和版本控制,以及整合微调后的模型到生产环境中的能力。
微调使组织能够超越一般的响应,创建能够深入理解其独特数据和术语的模型。这就需要对模型开发采用更多的实践方法,包括制作自定义数据集和定义与特定应用相关的评估指标。通过精心策划一个包含指令、上下文和所需响应的数据集,然后将这些数据输入模型,我们就可以根据自己的具体需求量身定制模型的输出。这种个性化的人工智能方法可以提高精确度,改善相关性,并最终将人工智能更有效地融入业务工作流程中。
基于上述原因,云计算提供商提供的微调功能非常简单,只需上传新数据并调用应用程序接口即可重新训练新模型。同样,Gemini API 也支持指令调整、强化学习微调和蒸馏。我们将单独发布一篇文章,深入探讨微调技术和实现方法。
以下是微调文章的预览:在微调过程中,我们会根据不同的数据或基础 FM 重新训练多个模型。不过,我们需要遵循与消费者旅程中讨论的完全相同的流程,并将微调后的模型视为新模型进行选择和评估。由于我们要创建和生产新模型,因此需要一个 MLOps 平台来确保模型的性能和稳健性。MLOps 生产平台将托管经过微调的 FM,GenAI 应用层的开发、暂存和生产项目/环境都将使用这些 FM。
下图提供了端到端架构的全面视图,包括所有重要层:GenAI 应用程序、数据湖/网状网、MLOps、AI 治理和着陆区(Landing Zone)内的共享服务项目。
虽然以前的架构提供了全面的控制,但它可能很复杂,甚至对于企业环境来说也是如此。更简化的方法是利用 "模型即服务"(Model-as-a-Service),通过应用程序接口提供微调功能。这大大简化了架构,而且无需为新模式建立专用的 MLOps 平台。
这种方法具有以下优势
- 降低复杂性:通过外包模型管理和微调,您可以专注于核心应用逻辑。
- 部署更快:应用程序接口驱动的微调允许快速迭代和部署新模型。
- 可扩展性和可靠性:利用提供商的基础设施实现可扩展性和可靠的模型服务。
- 成本效益:降低基础设施和维护成本。
下图说明了这一简化架构:
将生成式 AI 推向生产:GenAIOps 平台
为了更好地支持生成式 AI 的生产化,我们需要一个全面的 GenAIOps 平台。与传统的 MLOps 平台类似,GenAIOps 平台的设计重点是快速、高效地将生成式 AI 应用从概念阶段推向生产环境,同时确保其安全性、可靠性和可扩展性。
一个典型的 GenAIOps 平台架构包括以下几个关键组件:
-
PromptOps
- 专注于管理和优化 Prompt。
- 提供 Prompt 目录,支持版本控制和可追溯性。
- 自动化 Prompt 测试和评估流程。
-
RAGOps
- 管理检索增强生成的所有方面,包括数据分块、嵌入生成和向量存储。
- 提供工具和框架来评估 RAG 系统的检索和生成性能。
-
AgentOps
- 提供代理目录,用于管理和跟踪多代理架构中的所有代理及其工具。
- 支持路由代理的开发和优化,以动态分配任务给最合适的代理。
-
微调支持
- 提供微调流水线,支持数据准备、模型训练和评估。
- 集成 CI/CD 流水线,实现微调模型的自动化部署和版本管理。
-
监控与治理
- 实施实时监控,跟踪模型的性能、安全性和偏差问题。
- 提供集中化的模型治理功能,支持合规性和审计要求。
这些组件共同构成一个全面的 GenAIOps 平台,使企业能够高效地开发、部署和管理生成式 AI 应用。
结论
在这篇博文中,我们探索了令人兴奋的 GenAIOps 世界,揭开了生成式人工智能操作过程的神秘面纱。我们看到了它如何建立在 MLOps 的基础之上,并引入了新的复杂性和机遇。从了解 GenAI 生态系统中的不同角色到驾驭不断变化的 "运营 "环境,我们为您提供了开启 GenAI 之旅的知识。
无论您是利用预训练模型的消费者,还是根据特定需求调整模型的早期微调人员,GenAIOps 都能为您提供成功的框架。通过采用及时工程、掌握 RAG 以及构建稳健、可扩展的系统,您可以释放生成式人工智能的真正潜力。
旅程可能充满挑战,但回报却是巨大的。随着创生式人工智能不断革新各行各业,GenAIOps 将成为将创新理念转化为现实影响的关键。因此,请拥抱 GenAIOps 的力量,从今天开始,踏上掌握生成式人工智能的征程。
相关文章:
GenAIOps:生成式 AI 运维 - 实用指南
https://medium.com/google-cloud/genaiops-operationalize-generative-ai-a-practical-guide-d5bedaa59d78 作者:Dr Sokratis Kartakis 从创意到生产:使用生成式 AI 和运维 (GenAIOps) 概述 生成式 AI (GenAI) 的世界充满了令人兴奋的可…...
用户界面软件04
后果 使用这种架构很容易对两个层面的非功能性需求进行优化,但是你仍然需要小心不要将功能 需求重复实现。 现在,两个层面可能有完全不同的设计。比如,用户界面层可能使用配件模型(Widget Model), 以大量的…...
分布式系统设计:Java的秘密基地布局
分布式系统设计是Java企业级开发中的一个关键领域,它涉及到构建高可用、可扩展、高性能的系统。以下是分布式系统设计的一些核心概念和实践: 3.1 分布式系统的特点 分布式系统由多个独立的计算机节点组成,这些节点通过网络连接在一起&#x…...
【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿
文章目录 完成任务1. 什么是缓存2. 添加商户缓存3. 缓存更新策略3.1 主动更新 4. 缓存穿透5. 缓存雪崩6. 缓存击穿6.1 使用互斥锁查询商铺信息6.2 使用逻辑过期查询商铺信息 7. 封装 Redis 工具类 完成任务 1. 什么是缓存 缓存:数据交换的缓冲区(Cache…...
MySQL索引覆盖(覆盖索引, Covering Index)
文章目录 说明MySQL索引覆盖(覆盖索引, Covering Index)覆盖索引的概念覆盖索引的示例示例查询及索引覆盖情况覆盖索引的性能优势覆盖索引的实现条件覆盖索引 vs 非覆盖索引覆盖索引的限制如何设计覆盖索引覆盖索引的实际案例场景 1:电商系统…...
VUE3 provide 和 inject,跨越多层级组件传递数据
provide 和 inject 是 Vue 3 提供的 API,主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中,跨越多层组件传递数据,而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...
【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程
目录 前言 步骤 一、新建插件 二、创建第三方库 三、使用第三方库 前言 主要就是介绍如何将普通C++工程生成的头文件和.dll导入到UE中去使用。 步骤 一、新建插件 1. 打开插件浏览器选项卡 2. 打开插件创建器 3. 选择“第三方库”,这里命名为“MyThirdPartyLibrary…...
Type-C双屏显示器方案
在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...
20250112面试鸭特训营第20天
更多特训营笔记详见个人主页【面试鸭特训营】专栏 250112 1. TCP 和 UDP 有什么区别? 特性TCPUDP连接方式面向连接(需要建立连接)无连接(无需建立连接)可靠性可靠的,提供确认、重传机制不可靠,…...
使用conda出现requests.exceptions.HTTPError 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
玩转大语言模型——langchain调用ollama视觉多模态语言模型
系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...
【玩转MacBook】mdfind命令搜索
mdfind 是 macOS 上的一个命令行工具,它允许用户根据元数据来查找文件。mdfind 使用 Spotlight 索引来快速搜索文件系统中的项目。这意味着它可以非常快地找到文件,因为它不直接在磁盘上搜索,而是查询由 Spotlight 维护的索引数据库。 基本用…...
数据结构与算法之二叉树: LeetCode 637. 二叉树的层平均值 (Ts版)
二叉树的层平均值 https://leetcode.cn/problems/average-of-levels-in-binary-tree/description/ 描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受 示例 1 输入:root…...
【巨实用】Git客户端基本操作
本文主要分享Git的一些基本常规操作,手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置(第一次使用或者需求变更的时候),告诉git未来是谁在提交代码 git config --global user.na…...
从预训练的BERT中提取Embedding
文章目录 背景前置准备思路利用Transformer 库实现 背景 假设要执行一项情感分析任务,样本数据如下 可以看到几个句子及其对应的标签,其中1表示正面情绪,0表示负面情绪。我们可以利用给定的数据集训练一个分类器,对句子所表达的…...
BGP 泄露
大家读完觉得有帮助记得关注和点赞!!! 目录 1. BGP 是什么? 2. 什么是 BGP 泄露? 3. 今天发生了什么? 4. 正常和被劫持状态下的路由示意图 5. 受影响区域 6. 责任在谁? 7. 有办法避免这…...
IntelliJ IDEA和MAVEN基本操作:项目和缓存存储到非C盘
为了将 IntelliJ IDEA 的所有项目和缓存存储到 C 盘以外的地方,以下是你需要调整的设置和步骤: 1. 更改项目默认存储位置 打开 IntelliJ IDEA。点击顶部菜单的 File > Settings (Windows)或 IntelliJ IDEA > Preferences &…...
Leetcode 3418. Maximum Amount of Money Robot Can Earn
Leetcode 3418. Maximum Amount of Money Robot Can Earn 1. 解题思路2. 代码实现 题目链接:3418. Maximum Amount of Money Robot Can Earn 1. 解题思路 这一题我的思路比较暴力,就是一个动态规划,本质上就是全量遍历,然后找到…...
occ的开发框架
occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...
SYS_OP_MAP_NONNULL NULL的等值比较
无意在数据库中发现了这个操作SYS_OP_MAP_NONNULL。 SYS_OP_MAP_NONNULL应该不是数据库中的对象,因为在DBA_OBJECTS中根本找不到它,而在STANDARD和DBMS_STANDARD包中也找不到函数说明。 SQL> SELECT * 2 FROM DBA_OBJECTS 3 WHERE OBJECT_NAME…...
acwing_3196_I‘m stuck
acwing_3196_I’m stuck // // Created by HUAWEI on 2024/11/17. // #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 50 5; char g[N][N];// 地图 bool str1[N][N], str2[N][N]; // 判断1,判断2 …...
C++实现设计模式---状态模式 (State)
状态模式 (State) 状态模式 是一种行为型设计模式,它允许对象在运行时根据内部状态的改变来动态改变其行为。通过将状态相关的行为封装到独立的类中,状态模式使得状态的切换更加清晰和灵活。 意图 将对象的行为和状态分离,随着状态的改变动…...
【1】Word:邀请函
目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开,wps打开作答无效☞作答完毕,F12或者手动另存为(考生文件夹:路径文件名) 注意:一定要检查,很有可能你前面步…...
作业(一)
1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 # vim a.sh#!/bin/bash#先对文件/tmp/size.log 是否存在进行判断 if [ -f /tmp/size.log ]; #如果存在,则用cat命令显示文件内容thencat /tmp/…...
[SAP ABAP] APPEND INITIAL LINE 追加空行
语法格式 APPEND INITIAL LINE TO itab.示例1 SFLIGHT(航班) 输出结果: 示例2 我们可以使用下面的语法进行内表分配指针,追加空行并赋值的操作 APPEND INITIAL LINE TO lt_tab ASSIGNING FIELD-SYMBOL(<lfs_val>). REPORT z437_test_2025.* 自…...
Meilisearch ASP.Net Core API 功能demo
安装 MeiliSearch 0.15.5 0.15.5demo code using Meilisearch; using System.Data; using System.Text.Json; using System.Text.Json.Serialization;namespace MeiliSearchAPI {public class MeilisearchHelper{public MeilisearchHelper(){DefaultClient…...
口碑很好的国产LDO芯片,有哪些?
在几乎任何一个电路设计中,都可能会使用LDO(低压差线性稳压器)这个器件。 虽然LDO不是什么高性能的IC,但LDO芯片市场竞争异常激烈。最近几年,诞生了越来越多的精品国产LDO,让人看得眼花缭乱。 业内人士曾经…...
深入浅出C#线程池ThreadPool:提升程序性能的利器
深入浅出C#线程池ThreadPool:提升程序性能的利器 在C#编程中,线程是并发编程的基石,它使我们能够同时执行多个任务,提升程序的响应速度和效率。然而,直接创建和管理线程会带来一定的开销,例如线程创建和销…...
git问题
拉取项目代码后,出现 1、找回未commit的代码 2、记录不全,只是显示部分代码记录...
Code-Server 项目介绍与部署指南
搜索关注,分享更多有趣的知识。 在这里插入图片描述 1. 概述 GitHub: https://github.com/coder/code-server 在日常学习和工作中,Visual Studio Code(VSCode)已成为许多开发者的首选代码编辑器。然而,其…...
NAT技术
NAT技术 1. NAT原理 NAT(Network Address Translation,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。路由器构建了子网,将…...
pytest 常用插件
pytest 提供了许多功能强大的插件来增强测试体验和执行能力。以下是一些常用的 pytest 插件介绍,并结合 pytest.main() 进行使用的示例。 1. pytest-xdist pytest-xdist 插件用于并行化测试的执行,可以将测试分配到多个 CPU 核心并行运行,从…...
Avalonia 入门笔记(零):概述
Avalonia 是一个基于 .NET 和 Skia 的开源、跨平台 UI 框架,支持 Windows、Linux、macOS、iOS、Android 和 WebAssembly。Skia 是一个基于 C 的开源 2D 渲染引擎,Avalonia 通过 Skia 自绘 UI 控件,保证在全平台具有一致的观感 基于 .NET 的跨…...
19_TypeScript 声明文件 --[深入浅出 TypeScript 测试]
TypeScript 声明文件(.d.ts 文件)用于描述 JavaScript 库或模块的类型信息,使得 TypeScript 编译器能够在使用这些库时提供类型检查和智能感知。声明文件并不包含任何实现代码,只定义了接口、类、函数等的类型签名。这对于确保类型…...
如何当前正在运行的 Elasticsearch 集群信息
要查看当前正在运行的 Elasticsearch 集群信息,可以通过以下几种方法: 1. 使用 _cluster/health API _cluster/health API 返回集群的健康状态、节点数量、分片状态等信息。可以用 curl 命令直接访问: curl -X GET "http://localhost…...
【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表
本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…...
【hadoop学习遇见的小问题】centos常见配置 添加组用户权限 修改主机名等
1、指定静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0修改BOOTPROTO为static BOOTPROTOstatic IPADDR192.168.80.145 NETMASK255.255.255.0 GATEWAY192.168.80.2IPADDR、NETMASK用ifconfig命令即可查看 GATEWAY如何查看(编辑—虚拟网络编辑器—上面选择NA…...
16_Redis Lua脚本
Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…...
Appium版本升级,需要注意哪些点:使用UiAutomator2Options传递capabilities
mac上安装的是较新的Appium版本,在跑之前写的Android UI 自动化代码时报错:AttributeError: dict object has no attribute to_capabilities。 查了一下资料,这是因为较新的 Selenium 和 Appium 版本要求使用 Options 类来定义能力ÿ…...
MySQL的增删改查(基础)-下篇
修改 真正在改硬盘了,这样的修改是“持久有效”。一定要确保,update的修改是改对了,改出问题来就麻烦。指定update的时候,如果当前不指定任何条件,就会针对所有的行都能生效! (把整个表都给改了)。 案例 --…...
Mysql--基础篇--事务(ACID特征及实现原理,事务管理模式,隔离级别,并发问题,锁机制,行级锁,表级锁,意向锁,共享锁,排他锁,死锁,MVCC)
在MySQL中,事务(Transaction)是一组SQL语句的集合,这些语句一起被视为一个单一的工作单元。事务具有ACID特性,确保数据的一致性和完整性。通过事务,可以保证多个操作要么全部成功执行,要么全部不…...
Android系统定制APP开发_如何对应用进行系统签名
前言 当项目开发需要使用系统级别权限或frame层某些api时,普通应用是无法使用的,需要在AndroidManifest中配置sharedUserId: AndroidManifest.xml中的android:sharedUserId“android.uid.system”,代表的意思是和系统相同的uid&a…...
Vue篇-06
1、路由简介 vue-rooter:是vue的一个插件库,专门用来实现SPA应用 1.1、对SPA应用的理解 1、单页 Web 应用(single page web application,SPA)。 2、整个应用只有一个完整的页面 index.html。 3、点击页面中的导航链…...
学习threejs,导入wrl格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.VRMLLoader wrl模型加…...
winform第三方界面开源库AntdUI的使用教程保姆级环境设置篇
1. AntdUI 1.1. 导入项目 1.1.1. 首先新建一个空白的基于.net的Winfrom项目1.1.2. 复制AntdUI中src目录到我们的解决方案下面1.1.3. 解决方案下添加现有项目1.1.4. 添加项目引用 1.2. 编写代码 1.2.1. 改写Form1类,让其继承自public partial class Form1 : AntdUI.W…...
likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法
前言:首先likeshop是一个开发平台,是一个独创的平台就像TP内核平台一样,你可以在这个平台上开发和衍生出很多伟大的产品,以likeshop为例,他们开发出商城系统,团购系统,外卖点餐系统,…...
java -jar启动项目报错:XXX.jar中没有主清单属性
XXX.jar中没有主清单属性 1、错误复现2、错误原因3、解决方案 java -jar启动项目报错:XXX.jar中没有主清单属性 1、错误复现 今天使用springboot给项目打了jar包,使用命令启动时报错,截图如下: 2、错误原因 项目的pom文件配置如…...
浅谈云计算03 | 云计算的技术支撑(云使能技术)
云计算的技术支撑 一、定义与内涵1.1 定义与内涵 二、云计算使能技术架构2.1 宽带网络和 Internet 架构2.2 数据中心技术2.3 虚拟化技术2.4 Web 技术2.5 多租户技术2.6 服务技术 一、定义与内涵 1.1 定义与内涵 云计算技术包含一些基础的关键技术,这里称为使能技术…...
使用LinkedList手撕图的邻接表
主要是学习图的邻接表的核心结构等等,话不多说直接上代码: import java.util.LinkedList;public class GrapAdj {private int n ; // 表示图中顶点的数量。private LinkedList<Integer>[] adj;public GrapAdj(int n){this.n n;adj new LinkedLis…...
学习RocketMQ
1.为什么要用MQ? 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下4个方面: 1.1 异步解耦 最常见的一个场景是用户注册后,需要发送注册邮件和短信通知,以告知用户注册成功。传统的做法有以下两种: …...