生成式 AI 成為開發人員和企業利益相關者關注的焦點,因此探索 Workflows (Google Cloud 的無伺服器執行引擎) 等產品如何自動化和編排大型語言模型 (LLM) 的應用案例至關重要。在這篇文章中,我們將演示一個具有廣泛適用性的應用案例:Workflows 如何執行長文件摘要。
開源 LLM 編排框架(例如針對 Python 和 TypeScript 開發人員的 LangChain 或針對 Java 開發人員的LangChain4j)整合了 LLM、文件載入器和向量資料庫等各種元件,以實現文件摘要等複雜任務。您也可以使用 Workflows 來完成此任務,而無需在 LLM 編排框架上投入大量時間!
技術摘要
透過將文件的全部內容作為提示輸入到 LLM 的上下文視窗中,可以輕鬆地摘要簡短的文件。然而,大型語言模型的提示通常是受 token 計數限制的。對於較長的文件,則需要不同的方法。兩種常見的方法有:
- Map/reduce (映射/歸約):一個長文件被分割成適合上下文視窗的較小部分。對於每個部分,都會建立摘要,並在最後一步建立所有摘要的總摘要。
- Iterative refinement (迭代精煉):與Map/reduce方法類似,以零碎的方式評估文件。為第一部分建立摘要,然後 LLM 使用下一部分中的詳細資訊來完善其第一個摘要,並依此迭代到文件結束。
兩種方法都能產生良好的效果,然而,映射/歸約方法跟精煉方法相比有一個優點 – 透過精煉,您將獲得一個連續的過程,因為文件的下一部分是使用先前精煉的摘要進行總結的。而使用映射/歸約,如下圖所示,您可以並行地為每個部分建立摘要(映射),並在最後一步中建立最終摘要(歸約),這樣的操作更有效率。
使用 Workflows 和 Gemini 模型進行長文件摘要
透過並行步驟執行功能,Google Cloud 可以並行建立長文件各部分的摘要。
- 當新文字檔新增至 Cloud Storage bucket 時,會觸發該工作流程。
- 文字檔案被分成“區塊”,並以並行步驟進行匯總。
- 最後的摘要步驟將所有較小的摘要分組,並將它們組合成一個完整摘要。
- 對 Gemini 1.0 Pro 模型的所有呼叫都是透過子工作流程進行的。
並行檢索文字檔,並摘要各個部分(映射)
main: params: [input] steps: – assign_file_vars: assign: – file_size: ${int(input.data.size)} – chunk_size: 64000 – n_chunks: ${int(file_size / chunk_size)} – summaries: [] – all_summaries_concatenated: “” – loop_over_chunks: parallel: shared: [summaries] for: value: chunk_idx range: ${[0, n_chunks]} steps: – assign_bounds: assign: – lower_bound: ${chunk_idx * chunk_size} – upper_bound: ${(chunk_idx + 1) * chunk_size} – summaries: ${list.concat(summaries, “”)} – dump_file_content: call: http.get args: url: ${“https://storage.googleapis.com/storage/v1/b/” + input.data.bucket + “/o/” + input.data.name + “?alt=media”} auth: type: OAuth2 headers: Range: ${“bytes=” + lower_bound + “-” + upper_bound} result: file_content – assign_chunk: assign: – chunk: ${file_content.body} – generate_chunk_summary: call: ask_gemini_for_summary args: textToSummarize: ${chunk} result: summary – assign_summary: assign: – summaries[chunk_idx]: ${summary} |
assign_file_vars 這個步驟準備了一些常數和資料結構。在此,我們選擇 64,000 個字元作為區塊大小,這樣它們就能容納在 LLM 的上下文視窗中,並保持在 Workflow 的記憶體限制內。我們還設有摘要列表的變數,以及一個用來保存最終摘要的變數。
Loop_over_chunks 這個步驟並行提取每個文字區塊,首先在 dump_file_content 子步驟中從 Cloud Storage 載入文件的每個部分。然後,它在 generate_chunk_summary 中呼叫 Gemini 模型驅動的子工作流程,該子工作流程摘要了文件的該部分。最後,我們將當前的摘要存儲在 summaries 矩陣中
為所有摘要總結(歸約)
現在我們已經有了所有的區塊摘要,我們可以將所有小摘要總結成整合摘要,或者最終摘要:
– concat_summaries: for: value: summary in: ${summaries} steps: – append_summaries: assign: – all_summaries_concatenated: ${all_summaries_concatenated + “\n” + summary} – reduce_summary: call: ask_gemini_for_summary args: textToSummarize: ${all_summaries_concatenated} result: final_summary – return_result: return: – summaries: ${summaries} – final_summary: ${final_summary} |
在 concat_summaries 中,我們連接所有區塊摘要。在 reduce_summary 步驟中,我們透過最後一次呼叫 Gemini 模型摘要子工作流程,以獲得最終摘要。在 return_result 中,我們傳回結果,包括區塊摘要和最終摘要。
向 Gemini 模型要求摘要
「映射」和「歸約」步驟都呼叫一個子工作流程,而該子工作流程封裝了 Gemini 模型的呼叫。讓我們放大一下工作流程的最後一部分:
ask_gemini_for_summary: params: [textToSummarize] steps: – init: assign: – project: ${sys.get_env(“GOOGLE_CLOUD_PROJECT_ID”)} – location: “us-central1” – model: “gemini-1.0-pro” – summary: “” – call_gemini: call: http.post args: url: ${“https://” + location + “-aiplatform.googleapis.com” + “/v1/projects/” + project + “/locations/” + location + “/publishers/google/models/” + model + “:generateContent”} auth: type: OAuth2 body: contents: role: user parts: – text: ‘${“Make a summary of the following text:\n\n” + textToSummarize}’ generation_config: temperature: 0.2 maxOutputTokens: 2000 topK: 10 topP: 0.9 result: gemini_response # Sometimes, there’s no text, for example, due to safety settings – check_text_exists: switch: – condition: ${not(“parts” in gemini_response.body.candidates[0].content)} next: return_summary – extract_text: assign: – summary: ${gemini_response.body.candidates[0].content.parts[0].text} – return_summary: return: ${summary} |
在 init 的步驟中,我們為要使用的 LLM (在此為 Gemini Pro) 的配置準備了一些變數。
在 call_gemini 步驟中,我們對模型的 REST API 進行 HTTP POST 請求。我們如何能夠僅通過指定OAuth2身份驗證方案來對該API進行宣告式驗證。在正文中,我們傳遞請求摘要的提示(prompt)以及一些模型參數,例如溫度(temperature)或生成摘要的最大長度。最後,子工作流程的最後一步會將摘要傳回給請求步驟。
結果展示
將 Jane Austen 的《傲慢與偏見》文字儲存到 Cloud Storage bucket 中會觸發並執行工作流程,從而產生以下部分和最終摘要:
在這篇文章中,我們探索了一個透過 Workflows 編排 LLM 的新案例,並在不使用專屬 LLM 框架的情況下實現了長文件摘要練習。我們利用 Workflows 的並行步驟功能,並行建立部分摘要,並減少建立整個摘要所需的延遲時間。
本文翻譯並改寫自 Google Cloud 官方部落格。希望大家都有透過宏庭科技這篇文章了解到如何透過 Workflows 和 Gemini 模型進行長文件摘要!我們期待能持續將最熱門、最前線的話題帶到您面前。