BaikalDB 架構演進實錄:打造融合向量化與 MPP 的 HTAP 查詢引擎

導讀

BaikalDB作為服務百度商業產品的分布式存儲系統,支撐了整個廣告庫海量物料的存儲和OLTP事務處理。隨著數據不斷增長,離線計算時效性和資源需求壓力突顯,基于同一份數據進行OLAP處理也更為經濟便捷,BaikalDB如何在OLTP系統內實現適合大數據分析場景的查詢引擎以應對挑戰?

01 BaikalDB應對OLAP場景的挑戰

BaikalDB是面向百度商業產品系統的需求而設計的分布式存儲系統,過去多年把商業內部幾十套存儲系統全部統一到BaikalDB,解決了異構存儲帶來的各種問題,支撐了整個廣告庫的海量物料存儲和復雜的業務查詢。BaikalDB核心特點包括:

  • 兼容mysql協議,支持分布式事務:基于Raft協議實現三副本強一致性,通過兩階段提交協議保障跨節點事務的原子性與持久性?。

  • 豐富檢索能力:不僅支持傳統的結構化索引、全文索引等,為解決LLM應用的向量需求,BaikalDB通過內置向量索引方式實現向量數據的存儲和檢索,一套系統支持結構化檢索、全文檢索、向量檢索等豐富的檢索能力,綜合滿足LLM應用的各種記憶存儲和檢索需求。

  • 高可用,彈性擴展:支持自動擴縮容和數據均衡,支持自動故障恢復和遷移,無單點。當前管理數千業務表與數十萬億行數據,日均處理百億級請求?。

△BaikalDB架構

隨著業務發展,離線分析難以滿足訴求,實時多維分析需求對BaikalDB大數據處理能力的要求顯著提高。BaikalDB的查詢引擎主要面向OLTP(聯機事務處理)場景設計的,以下雙重關鍵瓶頸使其應對OLAP (聯機分析處理)有很大的挑戰:

  1. 計算性能瓶頸:傳統火山模型使用行存結構破壞緩存局部性、逐行虛函數調用風暴頻繁中斷指令流水線、單調用鏈阻塞多核并行擴展等等弊端,導致大數據分析性能呈超線性劣化。

  2. 計算資源瓶頸:Baikaldb單節點計算資源有限,面對大規模數據計算,單節點CPU、內存使用容易超限。

BaikalDB從OLTP向HTAP(混合事務/分析處理)架構演進亟需解決當前OLTP查詢架構在面向大規模數據的計算性能瓶頸、計算資源瓶頸,并通過如向量化查詢引擎、MPP多機并行查詢、列式存儲等技術手段優化OLAP場景查詢性能。

02 BaikalDB OLAP查詢引擎的目標

2.1 向量化查詢引擎:解決OLTP查詢引擎性能瓶頸

2.1.1 火山模型性能瓶頸

設計之初,由于BaikalDB主要面向OLTP場景,故而BaikalDB查詢引擎是基于傳統的火山模型而實現。

如下圖所示,在火山模型里,SQL的每個算子會抽象為一個Operator Node,整個SQL執行計劃構建一個Operator Node樹,執行方式就是從根節點到葉子節點自上而下不斷遞歸調用next()函數獲取一批數據進行計算處理。 由于火山模型簡單易用,每個算子獨立實現,不用關心其他算子邏輯等優點,使得火山模型非常適合OLTP場景。

△select id, name, age, (age - 30) * 50 as bonus from peope where age > 30 火山模型執行計劃

但當火山模型處理大量數據時有著以下三大弊端,這些弊端是導致火山模型面對大數據量分析場景查詢性能差的元兇。

  1. 行式存儲引發的緩存失效問題?

    1. 數據局部性缺失?:行式存儲(Row-based Storage)將整行數據連續存放,當查詢僅需部分列時,系統被迫加載整行冗余數據,容易造成Cache Miss。

    2. 硬件資源浪費?:現代CPU三級緩存容量有限,行存結構導致有效數據密度降低。

  2. 逐行處理機制的性能衰減?

    1. ?函數調用過載?:火山模型要求每個算子逐行調用 next() 接口,處理百萬級數據時產生百萬次函數調用。

    2. ?CPU流水線中斷?:頻繁的上下文切換導致CPU分支預測失敗率升高。

  3. 執行模型的多核適配缺陷

    1. 流水線阻塞?:Pull-based模型依賴自頂向下的單調用鏈,無法并行執行相鄰算子。

    2. ?資源閑置浪費?:現代服務器普遍具備64核以上計算能力,單調用鏈無法充分利用多核能力。

當查詢模式從OLTP輕量操作轉向OLAP海量掃描復雜計算時,上述三個弊端導致的查詢性能衰減呈現級聯放大效應。雖然能做一些如batch計算,算子內多線程計算等優化,但并不能解決根本問題,獲得的收益也有限。BaikalDB尋求從根本上解決瓶頸的方法,探尋新架構方案以突破性能瓶頸!

2.1.2 向量化查詢引擎

多核時代下的現代數據庫執行引擎,發展出了向量化查詢引擎,解決上述火山模型的種種弊端,以支持OLAP大數據量查詢性能。與火山模型弊端一一對應,向量化執行引擎特點是如下:

  1. 列式存儲與硬件加速協同優化?

    1. 列存數據緊湊布局?:采用列式存儲結構(Colum-based Storage),將同類型數據連續存儲于內存,有效提升CPU緩存行利用率,減少Memory Stall。

    2. ?SIMD指令集加速?:通過向量寄存器批量處理128/256/512位寬度的連續數據單元,允許CPU在單個指令周期內對多組數據進行相同的操作。

  2. 批量處理提升緩存親和性

    1. ?數據訪問模式優化?:算子/計算函數內部采用批量處理機制,每次處理一批連續數據塊。這種連續內存訪問模式提升了 CPU DCache 和ICache 的友好性,減少 Cache Miss。

    2. 流水線氣泡消除?:批處理大量減少上下文切換,降低CPU資源空閑周期占比,顯著提升流水線吞吐量?。

  3. 多核并行計算架構創新

    1. Morsel-Driven Parallelism范式?:將Scan輸入的數據劃分為多個數據塊(稱為morsel),morsel作為計算調度的最小單位,能均勻分發給多個CPU core并行處理。

    2. Push-based流水線重構?:顛覆傳統Pull模型,通過工作線程主動推送數據塊至下游算子(算子樹中的父節點),消除線程間等待開銷。數據驅動執行,將算子樹切分成多個線性的Pipeline,多Pipeline之間能并行計算。

△向量化執行引擎pipeline并行計算

2.2 MPP多機并行計算的啟發:進一步提升OLAP查詢性能

向量化執行引擎在OLAP場景有大幅度的性能提升,卻仍然無法解決單臺計算節點的CPU和內存受限的問題,同時隨著處理數據量增大,單節點執行時間呈指數級增長。

為了打破這一單點限制,進一步提升OLAP查詢性能,MPP(Massively Parallel Processing)大規模并行計算應運而生,其核心特點有:

  1. ****分布式計算架構:****基于哈希、范圍等策略將數據分布到不同計算節點,實現并行計算加速,能顯著縮短SQL響應時間。

  2. ****線性擴展:****各計算節點采用無共享架構,通過高速網絡實現跨節點數據交換,天然具備橫向擴展能力,可通過增加節點線性提升整體吞吐量?。

△MPP: 3臺計算節點并行計算

03?BaikalDB HTAP查詢架構落地

3.1 巧妙結合Arrow Acero實現向量化查詢引擎

BaikalDB團隊在向量化執行引擎設計過程中,秉持"避免重復造輪子"的技術理念,優先探索開源生態的優秀解決方案?。基于BaikalDB已采用Apache Arrow列式存儲格式實現全文索引的技術積淀?,團隊發現Arrow項目最新推出的Acero流式執行引擎子項目展現出三大核心功能:①支持Arrow列式存儲格式向量化計算,支持SIMD加速;②Push-Based流式執行框架支持Pipeline并行計算,能充分利用多核能力;③執行框架可擴展——這些特性與BaikalDB對向量化執行引擎的需求高度契合?。最終團隊選擇基于Arrow列存格式和Acero流式計算引擎實現BaikalDB向量化執行引擎,不僅大幅度縮短了研發周期,更充分發揮了開源技術生態的協同優勢?。

BaikalDB巧妙結合開源Apache Arrow列存格式和Arrow Acero向量化執行引擎,通過將火山模型計劃翻譯為Acero執行計劃,全程使用Arrow列存格式,計算最終列存結果再列轉行返回給用戶,在BaikalDB內部實現了適合大量數據計算的向量化查詢架構。

核心實現包括以下五點:

  1. 數據格式:將源頭RocksDB掃描出來的行存數據直接轉為Arrow列存格式,SQL計算全程使用Arrow列存,最終將列存格式的計算結果再轉換成行存輸出給用戶。

  2. 計算函數:將所有BaikalDB計算函數翻譯成Arrow Compute Expression,每個Arrow計算函數運行一次處理萬行數據,同時能支持部分如AVX2、SSE42等SIMD指令集,支持SIMD加速。

  3. 執行計劃:將每個SQL生成的BaikalDB原生執行計劃,轉換成一個Acero執行計劃Exec Plan(包含所有BaikalDB算子翻譯成的Acero ExecNode Declaration樹),使用Acero向量化執行引擎替換火山模型執行。

  4. 調度器:將進行數據掃描SourceNode的IO Executor和計算的CPU Executor獨立開。

    1. 每個Baikaldb和BaikalStore實例內置一個全局的Pthread CPU IO Executor池,支持計算階段的Push-based Pipeline并行計算,同時支持算子內并行計算,如Agg并發聚合、Join并發Build/Probe等。

    2. 每個SourceNode都獨自一個Bthread IO Executor,支持Hash Join或Union的各個子節點能并發查表。

  5. RPC接口:Baikaldb和BaikalStore之間RPC使用Arrow列存格式替換行存pb格式進行數據傳輸,大幅度降低傳輸數據大小,同時去掉了pb序列化和反序列化的開銷,加速了數據傳輸效率。

△BaikalDB火山模型(左) BaikalDB向量化引擎(中:Index Lookup HashJoin,右:HashJoin)

3.2 拆解執行計劃實現MPP多機并行查詢引擎

BaikalDB實現了向量化執行引擎后,大部分OLAP請求性能得到大幅度提升,但很快就遇到了受限于單計算節點資源和性能的case。團隊首先對業務場景進行了分析,發現資源/性能卡點主要在集中在最后單點Agg/Join的計算上。

為了破除這一單點限制,因Agg/Join都依賴內部HashTable進行計算,很容易想到按照HashKey將源數據hash shuffle到不同的計算節點進行并行計算來加速計算性能,平攤計算需要的內存和CPU資源,每個計算節點依然可以使用向量化執行引擎加速單機計算性能。如下圖所示,這一方案需要解決的核心問題有以下兩點:

  1. 實現Exchange算子對進行跨節點數據Shuffle。

  2. 在執行計劃合適的地方的插入Exchange算子對拆分為多個并行子計劃Fragment。

△BaikalDB Agg Mpp執行示例

△BaikalDB Hash Join Mpp執行示例

3.2.1? Exchange算子跨節點數據shuffle

Exchange算子包括ExchangeSenderNode/ExchangeReceiverNode算子對,必須成對出現,進行跨節點數據分發和接收。ExchangeReceiverNode核心功能主要是接收對應的下游Fragment所有ExchangeSenderNode發來的數據,需保證不重不丟,進行超時處理等。ExchangeSenderNode核心功能是進行數據分發,其分發模式主要有以下三種,以支持不同的場景需求。

  1. SinglePartition:一個或者多個ExchangeSenderNode將所有數據直接完整發送到單個上游Fragment ExchangeReciverNode實例,使用場景如Fragment 0單個計算節點收集最終結果輸出給用戶。

  2. HashPartition:ExchangeSenderNode將所有數據都先根據指定HashKey計算每一行hash值,根據hash值將每行數據re-partition到不同的發送隊列里,最終發送到上游Fragment多個ExchangeReceiverNode,使用場景如Store Fragment將rocksdb掃描出來的數據shuffle到上游多個實例進行Agg/HashJoin計算。

  3. BroadcastPartition:ExchangeSenderNode將所有數據都直接完整發送到多個上游ExchangeReciverNode,使用場景如Join小表數據直接完整發送到上游多個實例進行BroadcastJoin。

△BaikalDB Exchange算子實現(HashPartition)

3.2.2? 執行計劃拆解多個并行子計劃Fragment

在插入Exchange算子對之前,需要給物理執行計劃里的每個算子明確其分區屬性PartitionProperty,標志著該算子是否可以分發到多個計算節點進行并行加速。PartitionProperty主要有三種:

  1. AnyParitition:該節點沒有任何要求,如FilterNode,可以根據相鄰節點分區屬性情況單節點或多節點執行。

  2. SinglePartition:該節點必須要在單個計算節點上執行,如用于將最終數據打包發送給用戶的PacketNode。

  3. HashPartition:該節點可以按照指定key將數據分發到多個計算節點上并行執行,當前只有AggNode和JoinNode會產生HashPartition。

如下圖所示,明確了每個算子的分區屬性后,需要加入Exchange算子對的位置就很清晰明了了:分區屬性有沖突的相鄰算子之間。

在物理計劃中插入了Exchange算子對后,在一對ExchangeSenderNode/ExchangeReceiverNode之間進行拆解,即可以將單個物理執行計劃拆分為多個子執行計劃Fragment。單機執行的Fragment在本機執行,多機執行的Fragment發送給多個同集群其他計算節點進行異步執行,store fragment根據表數據分布情況分發給BaikalStore存儲集群并行執行。

在MPP物理計劃制定過程中,為了減少數據shuffle的開銷,盡可能減少SQL shuffle數據量,BaikalDB也實現了多種查詢計劃優化手段,如limit下推、hash partition fragment合并等等。

△MPP物理計劃制定過程

3.3? 自適應策略支持一套系統應對TP/AP請求

BaikalDB設計HTAP架構的核心目標是一套系統能同時兼容OLTP和OLAP請求,無需業務進行任何改造,這需要系統擁有極強的兼容性。

目前BaikalDB內部有三種執行方式:火山模型、單機向量化執行引擎、MPP多機執行引擎,不同的執行引擎適用不同數據量級的SQL。隨著數據量大小從小到大,適合的計算引擎是火山模型執行 → 單機向量化執行 → MPP多機并行執行,原因有以下兩點:

  1. 火山模型執行對比向量化執行更為輕量,導致在OLTP小請求(如SQL涉及數據行數<1024)方面,傳統火山模型性能比單機向量化執行性能更好。

  2. MPP執行會帶來額外的網絡開銷(數據shuffle)、CPU開銷(hash計算和re-partition),導致Baikaldb處理數據量需要超過一定閾值時,Baikaldb多機并行執行才能cover額外的網絡/CPU開銷,SQL性能才能提升,否則單機向量化執行是性能最優。

BaikalDB實現了智能執行引擎決策系統,支持SQL自適應選擇合適的執行引擎,支持一套集群能同時滿足業務OLTP和OLAP場景需求。技術實現包含兩大核心機制:

  1. 向量化引擎動態熱切換:BaikalDB支持SQL在執行過程中,隨著數據量增大,從火山模型動態切換到向量化執行引擎執行。

  2. 統計信息驅動MPP加速:BaikalDB支持根據過去執行統計信息決策是否走MPP加速執行,當SQL統計的99分位處理數據行數/大小超過指定的閾值,則SQL直接通過MPP多機并行執行。

04? 總結

4.1 項目收益

BaikalDB通過架構創新打造了HTAP架構,期望一套系統支持線上OLTP/OLAP請求,其技術演進路徑呈現『混合執行引擎架構自適應選擇』的特征:SQL自適應選擇火山模型、向量化執行引擎、MPP多機并行執行引擎。

目前BaikalDB HTAP架構已經應用到線上多個業務,大數據量查詢取得大幅度的性能提升,同時Baikaldb單點內存使用峰值也得以大幅度下降:

  • 單機向量化執行相對于火山模型執行,大數據量查詢請求耗時平均下降62%,最大能下降97%(如11s優化到300ms),內存使用峰值最大能降低56%(57G->25G)。

  • MPP在單機向量化執行基礎上,大數據量查詢耗時還能進一步優化,查詢耗時平均下降54%,最大能下降71%(如42s優化到12s),內存使用峰值最大能降低80%(5 hash partition)。

4.2 未來展望

BaikalDB HTAP架構目前還在不斷發展,包括性能優化、豐富支持算子和計算函數等等,未來還預期結合列式存儲、CBO等技術進一步提升OLAP場景性能:

  • 結合列式存儲提升數據掃描性能:目前BaikalDB向量化查詢引擎和MPP查詢引擎全程基于Arrow列存格式,但是底層數據存儲仍然是行存,存在一次行轉列的開銷;并且OLAP場景,更適合使用列存格式作為底層數據存儲格式。BaikalDB當前在發展列存引擎,未來單機向量化和MPP能直接基于底層列式存儲,進一步提升OLAP場景查詢性能。

  • 結合CBO(Cost-Based Optimization)優化自適應MPP選擇策略:當前BaikalDB是基于過去的執行統計信息判斷SQL是否適合走MPP,當SQL過去執行統計信息波動巨大時,自適應判斷方法可能會失效,未來可能結合代價模型來進一步優化MPP選擇策略。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84294.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【抖音小程序】通用交易系統-下單問題整理

在通用交易系統中&#xff0c;支付流程如下 1、服務端-預下單&#xff1a;生成參數與簽名信息&#xff08;此過程不需要與抖音平臺對接&#xff09; 參考 生成下單參數與簽名_抖音開放平臺 2、小程序用戶端&#xff1a;根據返回的參數與簽名&#xff0c;拉起抖音支付&#x…

模型參數、模型存儲精度、參數與顯存

模型參數量衡量單位 M&#xff1a;百萬&#xff08;Million&#xff09; B&#xff1a;十億&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 參數存儲精度 模型參數是固定的&#xff0c;但是一個參數所表示多少字節不一定&#xff0c;需要看這個參數以什么…

EurekaServer 工作原理

一、核心工作流程 二、核心組件解析 1. 自動配置引擎 入口&#xff1a;EnableEurekaServer 引入 EurekaServerMarkerConfiguration&#xff0c;創建標記Bean Marker觸發條件&#xff1a;EurekaServerAutoConfiguration 檢測到 Marker 存在時激活關鍵Bean初始化&#xff1a; …

Playwright 與 Selenium:自動化測試的兩大主流工具對比

《Playwright 與 Selenium&#xff1a;自動化測試的兩大主流工具對比》 *Playwright 和 Selenium 是自動化測試領域的兩大主流工具&#xff0c;二者在架構設計、功能特性和適用場景上存在顯著差異&#xff0c;以下是核心對比&#xff1a; 一、架構與設計理念 維度Playwright…

網絡編程(Modbus進階)

思維導圖 Modbus RTU&#xff08;先學一點理論&#xff09; 概念 Modbus RTU 是工業自動化領域 最廣泛應用的串行通信協議&#xff0c;由 Modicon 公司&#xff08;現施耐德電氣&#xff09;于 1979 年推出。它以 高效率、強健性、易實現的特點成為工業控制系統的通信標準。 包…

R語言速釋制劑QBD解決方案之二

影響含量均一性的顯著因子&#xff08;%RSD&#xff09; 數據分析表明含量均一性的彎曲性不顯著。如半正態圖&#xff08;圖12&#xff09;所示&#xff0c;影響含量均一性的顯著因子為A&#xff08;原料藥粒徑&#xff09;和C&#xff08;MCC/Lactose&#xff09;。 mod2 <…

大模型原理、架構與落地

近年來&#xff0c;大模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;在人工智能領域迅猛發展&#xff0c;從GPT-3到GPT-4、Claude、Gemini、文心一言、GLM等模型相繼發布&#xff0c;大模型已逐漸走出實驗室&#xff0c;邁向產業落地。本文將從技術原理、…

WWDC 2025 macOS 26有哪些更新點

在2025年6月10日凌晨結束的WWDC 2025發布會中&#xff0c;蘋果正式發布了全新的macOS 26&#xff0c;并給其命名為Tahoe。 以下為macOS相關的主要內容&#xff1a; 命名方式改變 蘋果正式將各大系統的版本號改為對應年份&#xff0c;讓命名方式更直觀好記&#xff0c;macOS 2…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年6月10日第104彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。 (1)定…

.NET 8集成阿里云短信服務完全指南【短信接口】

文章目錄 前言一、準備工作1.1 阿里云賬號準備1.2 .NET 8項目創建 二、集成阿里云短信SDK2.1 安裝NuGet包2.2 配置阿里云短信參數2.3 創建配置類 三、實現短信發送服務3.1 創建短信服務接口3.2 實現短信服務3.3 注冊服務 四、創建控制器五、測試與優化5.1 單元測試5.2 性能優化…

解決HuggingFace不能git clone的問題

今天在從HuggingFace上clone項目的時候&#xff0c;一直出現超時問題&#xff0c;查了很多資料沒有解決&#xff0c;后來向mentor請教了一下&#xff0c;可以通過鏡像的方法解決這個問題&#xff0c;所以把方法放上來&#xff0c;希望對大家有幫助。 HuggingFace的服務器在國外…

Zookeeper 集群部署與故障轉移

Zookeeper 介紹 Zookeeper 是一個開源的分布式協調服務&#xff0c;由Apache基金會維護&#xff0c;專為分布式應用提供高可用、強一致性的核心基礎能力。它通過簡單的樹形命名空間&#xff08;稱為ZNode樹&#xff09;存儲數據節點&#xff08;ZNode&#xff09;&#xff0c;…

簡單聊下阿里云DNS劫持事件

阿里云域名被DNS劫持事件 事件總結 根據ICANN規則&#xff0c;域名注冊商&#xff08;Verisign&#xff09;認定aliyuncs.com域名下的部分網站被用于非法活動&#xff08;如傳播惡意軟件&#xff09;&#xff1b;頂級域名DNS服務器將aliyuncs.com域名的DNS記錄統一解析到shado…

服務器出現故障怎么辦?快速排查與解決方法

服務器故障的常見原因分析 硬件故障&#xff1a;內存、硬盤、網絡設備故障。 軟件故障&#xff1a;操作系統、應用程序、數據庫異常。 網絡攻擊&#xff08;如DDoS攻擊&#xff09;造成資源耗盡。 快速排查故障的步驟 檢查監控系統報警日志。 查看系統資源使用情況&#x…

Claude vs ChatGPT vs Gemini:功能對比、使用體驗、適合人群

隨著AI應用全面進入生產力場景&#xff0c;市面上的主流AI對話工具也進入“三國殺”時代&#xff1a; Claude&#xff08;Anthropic&#xff09;&#xff1a;新銳崛起&#xff0c;語言邏輯驚艷&#xff0c;Opus 模型被稱為 GPT-4 殺手ChatGPT&#xff08;OpenAI&#xff09;&a…

Git 使用大全:從入門到精通

Git 是目前最流行的分布式版本控制系統&#xff0c;被廣泛應用于軟件開發中。本文將全面介紹 Git 的各種功能和使用方法&#xff0c;包含大量代碼示例和實踐建議。 文章目錄 Git 基礎概念版本控制系統Git 的特點Git 的三個區域Git 文件狀態 Git 安裝與配置安裝 GitLinuxmacOSWi…

SpringBoot 框架第 1 次接口調用慢

文章目錄 背景分析思路 1:DeepSeek 分析思路 2:日志分析思路 3:Arthas 分析下載 Arthas啟動 Arthastrace 調用耗時分析Controller 調用耗時Service 調用分析ServiceImpl 耗時分析IService 耗時分析BaseMapper 耗時分析debug 執行鏈路MyBatisMapperProxy 解讀解決思路 1:預熱…

數據分析Agent構建

數據分析agent構建 代碼資料來源于 Streamline-Analyst&#xff0c;旨在通過該倉庫上的代碼了解如何使用大語言模型構建數據分析工具&#xff1b; 個人倉庫&#xff1a;Data-Analysis-Agent-Tutorial 不同的在于 Data-Analysis-Agent-Tutorial 是在 Streamline-Analyst 基礎…

Java后端檢查空條件查詢

通過拋出運行異常&#xff1a;throw new RuntimeException("請輸入查詢條件&#xff01;");BranchWarehouseServiceImpl.java // 查詢試劑交易&#xff08;入庫/出庫&#xff09;記錄Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…

6??Go 語言中的哈希、加密與序列化:通往區塊鏈世界的鑰匙

Go 語言中的哈希、加密與序列化:通往區塊鏈世界的鑰匙 一、前言:離區塊鏈還有多遠? 區塊鏈聽起來可能遙不可及,似乎是只有密碼學專家和資深工程師才能涉足的領域。但事實上,構建一個區塊鏈的核心并不復雜,尤其當你已經掌握了一門系統編程語言,比如 Go。 要真正理解區…