生成式 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 模型進行長文件摘要!我們期待能持續將最熱門、最前線的話題帶到您面前。