SmartETL循環流程的設計與應用

1. 引言

**檢索增強生成(RAG)**是指通過檢索對大模型生成進行增強的技術,通過充分利用信息檢索(尤其是語義檢索)相關技術,實現大模型快速擴展最新知識、有效減少幻覺的能力。主流RAG框架包括問題理解、知識檢索、知識選擇/重排、答案生成等幾個過程,并且通常來說這幾個步驟是順序執行的(pipeline),如下圖(圖片引用自https://medium.com/@mayssamayel4/building-a-rag-system-with-gpt-4-a-step-by-step-guide-291711342f0d)所示:
RAG流程圖
繼RAG之后,研究人員提出了DeepSearch技術,主要是針對RAG的單輪串行流程可能無法進行準確回答的問題,提出通過多輪的問題擴展、檢索、上下文判別的方式,實現對問題更加完整、準確的回答。DeepSearch流程不是順序的pipeline,而是循環流程,如下圖(圖片引用自https://milvus.io/zh/blog/introduce-deepsearcher-a-local-open-source-deep-research.md)所示。
DeepSearch流程圖
循環流程是指包含重復執行環節的流程。通常來說,普通的數據處理——也就是常見的ETL任務——都是線性流程,包括讀取、轉換、過濾、抽取、入庫等流程節點,他們按照業務要求組合成完整流程,每條數據像水流一樣按照順序“流”經每一個節點。循環流程則能夠基于指定的循環是否終止的判定,對指定的子流程進行重復執行。

SmartETL框架作為一個ETL框架,此前未考慮循環流程。DeepSearch的流程雖然通常是用于問答助手這類應用,但其實也可以用于實現基于大模型的數據處理,例如數據集構造大模型蒸餾等。因此有必要在框架中增加循環流程的流程控制邏輯。

2.循環流程控制設計

新設計一個特殊的processor組件,命名為While,將可能循環的子流程(對應代碼中的循環體)交給While組件托管,在所給定的條件(匹配或過濾節點)符合時執行子流程。

While組件的構造參數包括:

  1. 循環子流程,是另一個Process組件,通常為Chain串聯的一套流程
  2. 匹配條件,一個函數或函數式對象(實現了__call__方法的類的對象),或者提供一個字段名,如果這個字段的值不為空,表示條件滿足
  3. 最大迭代次數,避免進入死循環,且方便評估和控制流程的整體時延。

While組件重寫了__process__方法,這是實現流程循環的關鍵。簡單地說,在每一次迭代中,對每一條輸入數據,檢查匹配條件是否滿足,如果滿足則執行指定的子流程,并收集子流程的輸出數據作為當前迭代的輸出數據(子流程可能產生多條輸出,比如包含Flat操作)。如果匹配條件不滿足,需要注意,這里要將上一次迭代的輸出數據(或整個While循環的輸入)作為整個While循環的輸出,以確保符合循環流程的邏輯。

下圖是一個對比普通過濾節點與循環節點的示意圖,流程均為Chain(A, B, C)。在上半部分,數據通過節點B(普通節點或過濾節點)時,如果輸出為None(即沒有輸出),則當前處理流程結束,否則數據傳輸給節點C。在下半部分中,B節點是一個循環節點,如果循環條件不滿足,則數據直接傳輸給節點C,否則將B的子流程的輸出數據傳輸給節點C。
普通節點與循環節點對比

3.DeepSearch應用

DeepSearch應用的處理過程可以看成一種對輸入問題進行循環處理,最終輸出問題答案的數據處理流程。利用循環流程機制,SmartETL可以實現DeepSearch應用,下面介紹這個流程是如何設計的。

首先,需要設計一種數據結構,對DeepSearch的各個階段的狀態進行統一表示。因為ETL框架與普通的編程語言或運行時環境不一樣,ETL流程是以數據為驅動的,每個節點除了自身的配置信息(也稱為組件的環境信息)和當前處理數據以外,通常無法獲得全局信息。SmartETL也在考慮加入某種獲取全局信息的機制。數據結構設計如下:

{“original_query”: “user query”, //原始查詢“gap_queries”: [“query1”, “query2”], //當前的差距查詢列表 最初由原始查詢提示生成,后續通過提示大模型基于original_query、all_sub_queries和all_chunks生成“chunks”: [{“text”: “doc1”}], //當前查詢的檢索結果文檔列表 基于當前gap_queries語義化檢索得到“all_chunks”: [{“text”: “doc1”}, {“text”: “doc2”}], //當前已收集的全部相關文檔 持續合并chunks相關的得到“all_sub_queries”: [“sub1”, “sub2”], //當前全部子查詢 不斷合并gap_queries得到“answer”: “xxxx” //最終答案 通過original_query、all_sub_queries和all_chunks提示給大模型進行生成
}

第二,流程設計。將整個流程劃分為3個階段,如下圖所示:
在這里插入圖片描述
階段1:初始化階段,初始化all_chunksall_sub_queries字段為空列表,并通過提示大模型生成最初的gap_queries

階段2:循環流程階段,包括檢索判定反思3個具體過程。檢索過程對當前gap_queries進行向量化并檢索,獲得一批候選文檔chunks。判定過程對當前候選文檔進行相關性判定,相關的文檔會合并到all_chunks中。反思過程是基于當前的original_queryall_sub_queriesall_chunks,提示大模型進行推理思考,確定是否還需要進一步搜索,得到的結果作為新的gap_queries字段,但為了保存全部子查詢,這里在生成新的gap_queries之前,將gap_queries合并到all_sub_queries中。

階段3:基于當前的original_queryall_sub_queriesall_chunks,提示大模型進行答案生成。雖然階段2可以執行多次以盡量獲得答案,但是也必須有限制,在達到迭代次數限制或Token超限之后,盡管沒有獲得完全足夠的上下文信息,也需要讓大模型進行生成,避免輸出空的答案。

第三,流程yaml文件編寫。基于已有的數據結構和流程設計,整個流程實現已經變得較為容易了。

不過存在一個問題:在階段2中,需要多次對批量數據進行處理,包括對gap_queries進行向量化、基于向量化結果進行檢索、對檢索結果進行相干性判定。SmartETL框架已有的向量化、大模型調用等組件的設計不支持批量處理,并且這里需要進行邏輯對應,需要逐個gap_query進行向量化、檢索相關文檔,然后對結果文檔逐個進行相關性判定,過濾掉不相關文檔,最后把對應同一個原始查詢的結果進行聚合,以便在階段3進行答案生成。為了實現這個目的,在不增加批量處理算子的情況下,通過扁平化(Flat)聚合(Group by)分組收集操作,實現批處理。修改后的數據結果如下所示:

{“original_query”: “user query”, //原始查詢“gap_queries”: [“query1”, “query2”], //當前的差距查詢列表 最初由原始查詢提示生成,后續通過提示大模型基于original_query、all_sub_queries和all_chunks生成“all_chunks”: [{“text”: “doc1”}, {“text”: “doc2”}], //當前已收集的全部相關文檔 持續合并chunks相關的得到“all_sub_queries”: [“sub1”, “sub2”], //當前全部子查詢 不斷合并gap_queries得到“answer”: “xxxx”, //最終答案 通過original_query、all_sub_queries和all_chunks提示給大模型進行生成“sub_query”: “sub1”, //當前的一個子查詢“sub_query_vector”: [0.5, 0.3, .... ], //當前子查詢對應向量 基于sub_query向量化“chunks”: [{“text”: “doc1”}], //當前子查詢的檢索結果文檔列表 基于sub_query_vector的語義檢索“chunk”: {“text”: “doc1”}, //當前的一篇文檔“selected”: true, //當前文檔是否與問題相關 基于提示大模型進行相關性判定“chunks_selected”: [{“text”: “doc2”}] //當前檢索結果中相關的文檔
}

4.總結

本文面向DeepSearch應用的迭代處理需求,基于SmartETL框架設計了循環流程控制,使得支持部分子流程的循環處理。通過設計DeepSearch流程,驗證了循環流程的有效性,并為其他具有循環結構的數據處理流程提供了參考。

附錄

  1. SmartETL項目地址:https://github.com/ictchenbo/SmartETL
  2. 循環流程控制節點代碼:https://github.com/ictchenbo/SmartETL/blob/main/wikidata_filter/iterator/flow_control.py
  3. 基于SmartETLDeepSearch應用流程:https://github.com/ictchenbo/SmartETL/blob/main/flows/agent/deepsearch-v2.yaml
  4. 實現DeepSearch應用的所有大模型提示模板可以在這里找到:https://github.com/ictchenbo/SmartETL/blob/main/config/prompt/deepsearch
  5. Jina-DeepSearch實施指南:https://jina.ai/news/a-practical-guide-to-implementing-deepsearch-deepresearch/

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

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

相關文章

uni-app開發小程序,根據圖片提取主題色值

需求&#xff0c;在頁面根據傳入的圖片提取圖片主色值并用來設置區塊背景色<template><view class"icon-container"><view class"sport-icon" :style"{ backgroundColor: mainColor }"><image :src"/static/images/sp…

ESP32-Cam三腳架機器人:DIY你的智能移動監控平臺

項目概述 在物聯網與機器人技術融合發展的今天&#xff0c;基于ESP32的創意項目層出不窮。今天為大家介紹一款極具創新性的ESP32-Cam三腳架機器人&#xff08;Dodge&#xff09;&#xff0c;它將傳統三腳架結構與智能監控功能完美結合&#xff0c;通過巧妙的機械設計和開源硬件…

Kotlin集合過濾

過濾操作 在處理集合時&#xff0c;根據特定條件過濾集合或檢查集合中是否包含符合特定條件的元素是軟件開發中的常見任務。為了解決這個問題&#xff0c;我們可以使用 Kotlin 中實現的函數式 API。 在本主題中&#xff0c;我們將介紹如何使用謂詞過濾集合&#xff0c;并獲得滿…

14.8 LLaMA2-7B×Dolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%?

LLaMA2-7BDolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%? 在大模型微調中,“數據質量”往往比“數據數量”更能決定最終效果。Databricks發布的Dolly-15K數據集以“全人工標注+多維度校驗”的特點,成為指令微調的“黃金樣本”——用它微調后的LLaMA…

OpenCV中常用特征提取算法(SURF、ORB、SIFT和AKAZE)用法示例(C++和Python)

OpenCV 中提供了多種常用的特征提取算法&#xff0c;廣泛應用于圖像匹配、拼接、SLAM、物體識別等任務。以下是 OpenCV 中幾個主流特征提取算法的 用法總結與代碼示例&#xff0c;涵蓋 C 和 Python 兩個版本。常用特征提取算法列表算法特點是否需額外模塊SIFT&#xff08;尺度不…

復雜度+包裝類型+泛型

什么是集合框架什么是數據結構什么是算法時間復雜度與空間復雜度的概念時間復雜度的表達方式時間復雜度的大 O 的漸近表示法時間復雜度函數的大小排序包裝類和泛型基本數據類型和對應的包裝類型包裝類型出現的原因什么叫做裝箱&#xff08;裝包&#xff09;和拆箱&#xff08;拆…

硬件設計學習DAY15——自舉電容:MOSFET高端驅動的核心奧秘

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.自舉電容 1.自舉電容的作用 2.自舉電路原理 3.工作過程分析 4.實際應用中的問題 5.關鍵要點 二.自舉電容實現MOSFET高端驅動 2.1MOSFET半橋高端驅動的基本原理 2.2自舉電…

【SpringAI實戰】實現仿DeepSeek頁面對話機器人

一、實現效果 二、代碼實現 2.1 后端代碼 2.2 前端代碼 一、實現效果 可以保存聊天記錄與會話記錄 二、代碼實現 2.1 后端代碼 pom.xml <!-- 繼承Spring Boot父POM&#xff0c;提供默認依賴管理 --><parent><groupId>org.springframework.boot</grou…

RedisJSON 指令精講JSON.STRLEN 高效統計字符串長度

1 場景與價值 在日志累加、指標采集、消息追蹤等場景中&#xff0c;我們常需快速判斷某個字符串字段“到底有多長”&#xff0c;以便&#xff1a; 阻止過大日志&#xff1a;若長度超限則截斷或歸檔&#xff1b;動態分桶&#xff1a;按長度選擇不同存儲策略&#xff1b;性能監控…

大數據量查詢計算引發數據庫CPU告警問題復盤

大數據量查詢計算引發數據庫CPU告警問題復盤一、背景二、根因分析三、解決方案方案1&#xff1a;多線程緩存方案2&#xff1a;利用中間表緩存四、總結一、背景 2025年7月份某天&#xff0c;CDP系統每天不定時推送我們的Portal服務&#xff0c;生產環境運營看板會展示統計數據&…

2025最新版虛幻引擎5(UE5)C++入門教程:前言——你的隨身教程和學習筆記

大家好&#xff0c;我是開發游戲的老王&#xff0c;一名高校教師&#xff0c;我主講游戲開發已有十余年時間&#xff0c;通過我的博客大家應該可以了解我所涉獵的游戲技術范疇非常廣泛&#xff0c;除了Unreal,Unity,Godot等主流游戲引擎&#xff0c;還包括Blender、Houdini、3D…

(3)重定向 | 時間相關指令 | 文件查找 | 打包與壓縮

Ⅰ . 初始重定向01 輸出重定向 >在上一節中我們為了方便講解 head 和 tail 指令&#xff0c;我們用到了 > 去生成了一千行文本。通過 > 將生成的一千行文本寫入到了 large.txt 中……我們現在來正式介紹一下&#xff1a;$ echo "內容" > [目標] 本來應…

DTH11測量溫濕度學習(第十一天)

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;開發者-削好皮的Pineapple! &#x1f468;?&#x1f4bb; hello 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 削好皮的Pineapple! 原創 &#x1f468;?&#x1f4…

Go語言初識--標識符 可見性

Go語言初識–標識符 可見性 和C語言相似&#xff0c;go語言的基本組成有&#xff1a; 包聲明&#xff0c;編寫源文件時&#xff0c;必須在非注釋的第一行指明這個文件屬于哪個包&#xff0c;如package main。引入包&#xff0c;其實就是告訴Go 編譯器這個程序需要使用的包&…

Python實例之畫小豬佩奇

效果圖&#xff1a;python代碼以及解釋&#xff0c;沒有運用模塊。 """ 繪制小豬佩奇 """ from turtle import *def nose(x,y):"""畫鼻子"""penup()# 將海龜移動到指定的坐標goto(x,y)pendown()# 設置海龜的方向&…

Unity筆記——事件中心

事件中心是什么事件中心是 Unity 游戲開發中常用的架構設計&#xff0c;它基于觀察者模式 或 發布-訂閱模式&#xff0c;通過委托和事件構建的一種消息管理系統。主要用于降低代碼耦合度&#xff0c;實現模塊間的松耦合通信的消息處理系統能大幅提升代碼的可維護性和擴展性&…

Java: 反射機制的 ParameterizedType(參數化類型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一個接口&#xff0c;屬于反射 API 的一部分&#xff0c;主要用于表示參數化類型&#xff08;即帶有類型參數的泛型類型&#xff09;。它是 Java 反射機制中處理泛型類型信息的關鍵接口之一。 一、什么是參…

OkHttp 與 Retrofit 完美結合:打造高效的 Android 網絡請求

前言在現代 Android 開發中&#xff0c;網絡請求是幾乎每個應用都必不可少的功能。OkHttp 和 Retrofit 作為當前最流行的網絡請求庫組合&#xff0c;為開發者提供了簡潔高效的解決方案。本文將詳細介紹如何將這兩者結合使用&#xff0c;充分發揮它們的優勢。一、OkHttp 和 Retr…

系統辨識建模

系統辨識建模 一、系統辨識建模的作用 1. 建立真實物理系統的數學模型 2. 為后續控制器/強化學習算法提供仿真環境 3. 提高控制精度和安全性 二、本文的系統辨識是怎么做的 1. 實驗采集 2. 數學建模 3. 在控制系統中的作用 三、實際用法流程(簡化版) 1. 系統辨識階段 2. 強化…

Android開發:Java與Kotlin深度對比

1. 語言特性與現代性 Java (特別是 Android 主要使用的 Java 8 及之前版本): 相對冗長&#xff1a; 需要編寫更多的樣板代碼&#xff08;如 getter/setter、findViewById 的顯式類型轉換、匿名內部類等&#xff09;。空指針異常 (NPE)&#xff1a; 類型系統默認允許 null&#…