百度视觉搜索架构演进实践

news2025/4/13 18:38:13

本文深入探讨百度视觉搜索在快速发展的业务及技术背景下,如何通过持续的技术创新和架构升级强化自身的竞争力和适应性,支撑业务健康高效迭代。本文介绍了我们如何通过技术栈升级、架构能力提升以及稳定性建设,来实现全链路架构的演进。借助Golang、百度自研GDP开发框架和ExGraph图化引擎,我们对视觉搜索展现架构进行了全面重构,并重新定义了视觉搜索全系统通路上的模块职责和分层逻辑,开展了一系列系统收敛内聚优化。此外,我们还建设了配套稳定性基础设施,确保系统的高效运行。期望大家能有所收获和借鉴。

01 背景

视觉搜索是基于图像识别和深度学习技术实现的图像搜索应用,区别于传统文本方式搜索,接受用户拍照/上传图片输入,识别图像特征和内容,获取图片内容相关的检索结果。目前广泛应用在学习、动植物、商品等领域,满足用户对图片的认知、购买等多元需求。

图片

△视觉搜索业务概览

随着产品的高频迭代和规模迅速拓展,视觉搜索架构需要通过持续的技术创新和架构升级,强化自身的竞争力和适应性,以应对业务和技术的一系列新挑战。具体手段为:

  • 【技术栈更新】现有展现架构采用PHP开发、HHVM运行,随着HHVM基础设施停止维护,以及对异步/多线程等功能支持的局限性,我们需要探索下一代框架和语言,以持续满足服务高可用性、及AI大模型挑战下的新产品迭代要求

  • 【架构能力升级】随着业务高速迭代,要求系统架构也必须随之升级以不断适配新的业务需求,当架构通路中开始出现庞大的单体应用模块和日益复杂的模块交互,需要及时开展架构重构/优化,保障业务健康可持续迭代

  • 【稳定性保障】稳定性方面,随着技术栈和架构的升级,配套的基础技术建设也当随之加强,从测试流水线、监控拦截、线上监控、定位工具等各环节持续健全稳定性能力,从而高效实现问题闭环,确保服务稳定性目标得以实现

02 解决方案

2.1 整体设计

本项目从展现架构重构、系统分层改造、基础技术建设等多个角度出发,结合图化思想,对现有视觉搜索整体架构进行全链路重构优化,同时一方面接入搜索内部公共技术栈,另一方面完善视觉自有技术基建,建设如下全系统图:

图片

△视觉搜索全系统图

  • 展现架构重构

  • 接入层:开发视觉BFF(Backend For Frontend)接入模块,提供多端统一适配&动态路由解决方案,提高系统可扩展性和可维护性;

  • 技术栈:PHP+HHVM转向Golang,支持并发/异步/流式交互能力,提高系统性能;同时,基于百度内部的Golang开发框架和搜索内部自研的ExGraph图化服务,对展现模块进行彻底重写,以DAG图的方式描述业务流程,算子化实现业务细节和基础Lib,并保障算子的可复用性;

  • 全系统改造:

  • 分层:明确视觉整体架构分层及模块定位,对检索通路中现存庞大单体应用解耦拆分,实现展现层与检索层单次请求多路召回,降低业务与数据耦合,简化架构通路交互;

  • 协议:统一召回数据及模板展现数据协议,提升研发效率;

  • 稳定性建设:

  • 流水线:健全全模块持续集成与持续交付流水线能力;

  • 标准化:拒绝重复造轮子,复用搜索内部配套运维与问题闭环生态环境,统一基础技术栈,降低运维成本;同时基于Prometheus+Grafana监控解决方案重建业务监控系统,保障核心稳定性。

2.2 详细设计

2.2.1 接入模块建设

通过建设视觉BFF(Backend For Frontend)模块提供多端适配问题解决方案,提高用户跨设备使用业务的无缝性和一致性,并且使得业务需求的开发能够更专注于需求自身逻辑,实现高效接入和迭代。为满足上述要求,视觉BFF整体流程如下:

图片

△视觉接入层整体流程

  1. 服务初始化:系统首先完成服务启动,初始化App及依赖词典、服务等;

  2. 多端适配:接收到用户实时流量请求时,首先完成对不同前端应用输入数据协议的解析适配,然后执行中间件,识别用户信息、设备信息,完成抽样染色、功能开关初始化等;

  3. 路由分发:根据多端适配信息,以及流量分发配置规则,动态调整负载均衡和API响应;

  4. 结果输出:收集下游返回数据,适配各端私有化协议,确保业务数据传输到不同前端应用的安全性与一致性。

2.2.2 展现模块重构

视觉展现模块的主要职责是使用图片请求检索系统获取结果,基于检索数据,完成不同业务场景下的数据解析和组装渲染,最终在多终端上呈现给用户丰富多样的结果满足样式。本小节将主要介绍使用Golang对视觉展现模块进行图化改造和重写的实现方案。

图片

△视觉搜索展现模块架构图

  • 框架选型:采用百度内部基于Golang实现的业务开发平台GDP(Golang Develop Platform),具备完善的RPC Server和RPC Client能力,主要用于API、Web以及后端服务开发。

  • 模块拆分:解决原展现模块自身复杂度的问题,拆分独立功能,如上文所述的BFF接入模块,让UI聚焦到具体的业务逻辑实现,忽略不同端或者场景不同协议以及不同参数等的输入输出问题;

  • 逻辑分层:为了保持UI模块有清晰的逻辑分层,便于业务长期健康迭代和维护,将UI内部按照功能逻辑定义分层结构,在后续迭代里遵循分层规范,严格控制相应的代码和逻辑管理;

  • 图化改造:抽象和封装公共算子及业务算子,简化业务主干逻辑,通过图化引擎编排和调用算子实现需求->图->算子->Lib库/基础设施的层次调度:

图片

△检索流程图化改造前后对比图

  • 图化引擎选型:采用百度搜索展现团队自研图执行引擎ExGraph,提供了一套利于研发人员和机器理解的图语言,该图语言将算子作为基础单位,通过串行组、并行组、子图、条件算子、switch算子、中断、等待等机制,能灵活适配复杂的业务流程;

  • 公共算子:可在不同业务图流程中灵活配置调用的功能算子,目前已实现图片上传,缓存管理,风控,检索请求,渲染等,一处开发,多处快速配置即用;

  • 业务算子:如特定的数据解析、字段填充,下游请求构造等;

  • 策略组:为了使算子逻辑清晰简洁,通过策略组的方式来管理个性化场景,如参数处理策略组、意图选择策略组、不同垂类的整页展现策略组等;

  • 公共Lib库:封装一些业务逻辑无关的开发常用功能库,例如规则引擎、数据结构容器(如集合、有序map以及字符串常用方法等)、图片下载工具等,提高代码的可复用性及研发效率。

2.2.3 系统分层改造

在前2小节中阐述了对视觉接入和展现模块的图化重构及技术栈升级,为服务性能、技术储备、研发效率等方面带来了一定程度的提升,随后我们转向全系统架构通路,着手解决如下问题:

  • 模块交互复杂:一次用户请求过程中,展现模块与检索模块多次交互,不仅增加了网络耗时,也增加了线上问题定位的难度,同时造成线上服务间相互依赖,甚至请求成环等问题;

  • 检索系统复杂:视觉在线检索系统承接了数十业务场景下的多轮调度、触发、召回等检索逻辑、图片处理等策略逻辑、以及数据整合等展现逻辑,是视觉架构中最为庞大的单体应用,随着业务日益复杂化和大模型应用场景崛起,检索系统开始面临架构设计、模型管理、可扩展性、流式能力、高速迭代等方面的多重诉求和挑战;

  • 数据适配复杂:缺少业务标准数据定义,以模板驱动数据选择,数据通路可复用性较差,展现模块中字段适配归一的逻辑占比较高。

首先,我们梳理了全链路模块内部逻辑,明确各模块的职责功能,重新制定模块间的交互接口协议及模块内的逻辑分层,在此基础上,完成了对检索模块中业务展现、检索及策略逻辑的解耦重构,主要工作包括以下几个方面:

图片

△视觉全系统分层改造前后对比

  1. 展现服务分层改造:模块内部定义逻辑分层,降低模块代码复杂度,提升可复用性,同时提高系统的异步执行和并行化能力;

  2. 检索接口收敛内聚:检索服务底层框架升级,采用图化思路重写,以算子化的方式重新拼装组合不同场景及不同下游的逻辑调度,对上游提供收敛后的统一检索接口,一次检索请求即可拿到全部召回结果和策略信号;

  3. 庞大单体应用解耦:重新分解和认领庞大单体应用中的功能,按照系统分层完成对应逻辑的迁移重构,最终完成目标模块解耦下线,提升系统效能,优化机器资源;

  4. 数据协议标准化:统一召回数据规范,并制定标准组件模板协议,以数据驱动展现模板选择;同时增加特征通路和日志通路,去除数据透传模块依赖。

2.2.4 稳定性建设

随着视觉架构和各模块的演进改造,我们也梳理了配套的质量保障技术设施,查漏补缺,完善感知>处置>预防>根因分析复盘>巡检各环节的稳定性基建,从而保障服务能够提供稳定可靠的用户效果。

故障感知:

首先,GDP框架提供了一套基于Prometheus的标准化采集&监控解决方案,能极大降低传统日志采集+解析+监控配置+可视化的学习和管理成本,它定义了统一的指标规范,可由业务方按需调用接入。基于该标准化监控方案和业务核心诉求,我们建设了如下核心指标故障感知指标:

上述指标的监控报警生效在研发、测试、上线全流程,快速发现故障,确保各阶段业务效果符合预期。

故障处置:

长期以来,经过对线上各模块错误日志的治理和代码重构优化后,线上日常故障更多的集中到了机器/实例/应用等容器管理的健康状态波动上,因此,我们通过ALM(Application Lifecycle Management)机制,依据健康探活、日常quota及日常采集指标,自动化实现实例迁移以及模块容量弹性伸缩管理,提升系统的自愈能力,同时提升资源整体的分配率和使用率。

根因分析复盘

通过ALM自愈机制我们实现了问题实例的快速感知和自动迁移,但在日常运维中,不易做到快速介入人工分析,导致现场丢失,以至于cpu/mem/协程等指标异常多归于偶发问题。为了有效实现问题排查和闭环,搜索团队基于Go语音内置pprof性能工具及监控平台,自研pprof自动化采集系统Keeper,在对应报警事件发生时,通过回调触发pprof文件采集及上报,能有效保留问题现场,让业务做到对故障根因的分析复盘。

辅助平台工具

  • 调研平台:全模块建设线下仿真环境,一键搭建/升级环境模块,快速满足环境交付需求,提高业务评测、开发联调效率;

  • Debug平台:平台化模拟端到端请求,可视化展现全链路模块日志,快速实现问题复现和定位;

  • Trace平台:采集业务核心模块,自定义日志切割规则及链式日志关键字,条件化快速查询线上日志,提高定位效率;

03 总结

本文介绍了视觉搜索架构为了应对业务和技术发展带来的一系列挑战,从技术栈更新、架构能力升级、稳定性保障等方面入手,采取了全链路架构演进的技术应对方案。基于业务特点,结合百度内外的技术设施储备,我们采用Golang+GDP开发框架+ExGraph图化引擎重构了视觉展现架构,将其拆分为接入模块及展现模块,降低多端数据与业务逻辑耦合度;然后重新定义了视觉搜索架构分层及模块功能职责,并对展现模块及检索模块进行了数据协议统一、功能收敛内聚、逻辑分层改造工作;最后完善了业务感知>处置>预防>根因分析复盘>巡检各环节的稳定性基建。本文旨在将视觉搜索架构演进的思路和方案分享给大家,希望对面临类似挑战的业务有所借鉴,未来我们仍将持续优化业务系统和性能,为大家提供更好的产品服务。

————END————

推荐阅读

智算基石全栈加速,百度百舸 4.0 的技术探索和创新

HelixFold 3 全球首个完整复现 AlphaFold 3,百度智能云 CHPC 为人类生命探索提供算力平台支撑

百度搜索结果波动的极致治理

PaddleX图像分割赋能医疗领域筛查检测,打造智能医疗诊断系统

百度智能云x️石家庄交管局,大模型打造全时在线数字交警

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 9从入门到性能优化-二进制日志

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

matlab输入汉字时,输入法在左上角显示解决办法

解决方法: 输入汉字时输入法在左上角显示(如图1),将鼠标放在竖着的小点处拖动到工作区合适位置(如图2),下次输入汉字时输入法便在图2处显示。 图1 图2

前端小技巧-网页点击动画效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>点击触发动画效果</title><link rel"stylesheet" href"styles.css" /></head><style>/* styles.css */…

【C++ 贪心 滑动窗口 前后缀分解】948. 令牌放置|1762

本文涉及的基础知识点 贪心 决策包容性 C算法&#xff1a;滑动窗口及双指针总结 反向双指针 C前后缀分解 LeetCode948. 令牌放置 你的初始 能量 为 power&#xff0c;初始 分数 为 0&#xff0c;只有一包令牌以整数数组 tokens 给出。其中 tokens[i] 是第 i 个令牌的值&…

C语言 | Leetcode C语言题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; bool makesquare(int* matchsticks, int matchsticksSize) {int totalLen 0;for (int i 0; i < matchsticksSize; i) {totalLen matchsticks[i];}if (totalLen % 4 ! 0) {return false;}int len totalLen / 4, n matchsticksSize;i…

【实战经验】互联网信息服务域名注册和备案-指导指南 v2

一、业务场景 个人/企业/组织&#xff08;ICP&#xff09;在提供互联网信息服务&#xff08;例&#xff1a;开通网站、小程序&#xff09;之前&#xff0c;应当向为其接入互联网服务的互联网服务提供商&#xff08;ISP&#xff09;&#xff08;腾讯、阿里云&#xff09;提交相关…

【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)

前言 &#x1f31f;&#x1f31f;本期讲解关于CAS的补充和JUC中有用的类&#xff0c;这里涉及到高频面试题哦~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&…

初识算法 · 滑动窗口(3)

目录 前言&#xff1a; 水果成篮 题目解析 算法原理 算法编写 找到字符串中所有字符异位词 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是滑动窗口&#xff0c;通过两道题目讲解&#xff0c;一道是水果成篮&#xff0c;一道是找到字符串中的所有字母异…

(Linux驱动学习 - 11).Input 子系统

一.Input 子系统的定义 input 就是输入的意思&#xff0c;因此 input 子系统就是管理输入的子系统&#xff0c;和 pinctrl、 gpio 子系统 一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备&#xff0c;不…

聊聊 Facebook Audience Network 绑定收款账号的问题

大家好&#xff0c;我是牢鹅&#xff01;本篇是Facebook开发者系列的第五篇&#xff0c;最近看见好多群友在群里问这个&#xff0c;说Facebook的变现账户在绑定国内的银行账户时&#xff08;有些用户反馈就算不是国内的卡也会出现该问题&#xff09;&#xff0c;显示“无法绑定…

05 django管理系统 - 部门管理 - 修改部门

04我们已经实现了新增部门的功能&#xff0c;下面开始修改部门模块的实现。 按道理来说&#xff0c;应该是做成弹框样式的&#xff0c;通过ajax悄咪咪的发数据&#xff0c;然后更新前端数据&#xff0c;但是考虑到实际情况&#xff0c;先用页面跳转的方式实现&#xff0c;后面…

【含文档】基于Springboot+Vue的旅游信息管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

QSettings 使用详解

QSettings 类是 Qt 框架中的一个重要类&#xff0c;用于存储和访问应用程序的设置和配置。它提供了一种简单的方法来读取和写入应用程序的配置数据&#xff0c;支持多种存储格式&#xff0c;包括 Windows 注册表、INI 文件和 XML 文件等。 主要功能 1. 存储设置&#xff1a;可…

PDF在线编辑器推荐!一站式解决PDF编辑难题!

当你要对PDF文件进行编辑时&#xff0c;一款PDF编辑器就十分重要。今天小编就为大家推荐几款PDF编辑器&#xff0c;有在线的&#xff0c;也有本地的&#xff0c;大家可以根据自己的需求体验选择&#xff01; Foxit PDF Edit 直达链接&#xff1a;editor.foxitsoftware.cn Fo…

大舍传媒-海外媒体发稿:为您打造全球品牌影响力

大舍传媒-海外媒体发稿&#xff1a;为您打造全球品牌影响力 在当今全球化的商业环境中&#xff0c;企业若想在激烈的市场竞争中脱颖而出&#xff0c;拓展全球市场&#xff0c;提升品牌影响力至关重要。大舍传媒的海外媒体发稿服务&#xff0c;正是您实现这一目标的得力助手。 …

某宝228滑块 请求头 bx_pp、bx_et、以及slide接口中参数n值。90%左右的成功率,轨迹不会爆,需要的联系

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关。 本文章未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;擅自使用本文讲解的技术而导致的任何意外&#xff…

PostgreSQL学习笔记:学习总结

一、架构 1. 常驻进程&#xff08;Postmaster&#xff09; 管理后端的常驻进程&#xff0c;默认监测UNIX Domain Socket和TCP/IP&#xff08;Windows等一部分平台只监测TCP/IP&#xff09;的5432端口&#xff0c;等待前端连接处理&#xff0c;监测的端口号可在设置文件postgre…

基于腾讯云的AI视频课程制作工具

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

注册安全分析报告:北外网校

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【软考】设计模式之中介者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点 1. 说明 1.用一个中介对象来封装一系列的对象交互。2.中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。3.中介者模式&#xff08;Mediator Pattern&…