使用 MLTransform 生成嵌入

本頁說明為何要使用 MLTransform 功能準備資料,以及如何使用這項功能訓練機器學習 (ML) 模型。具體來說,本頁面會說明如何使用 MLTransform 生成嵌入,進而處理資料。

在一個類別中合併多個資料處理轉換,可簡化將 Apache Beam ML 資料處理作業套用至工作流程的程序。MLTransform

Dataflow ML 工作流程圖,其中醒目顯示資料處理步驟。

圖 1. 完整的 Dataflow ML 工作流程。在工作流程的預先處理步驟中使用 MLTransform

嵌入總覽

嵌入是現代語意搜尋和檢索增強生成 (RAG) 應用程式的必要元素。嵌入可讓系統從更深層、更概念性的層面瞭解資訊並與之互動。在語意搜尋中,嵌入項目會將查詢和文件轉換為向量表示法。這些表示法會擷取字詞的潛在意義和關係。因此,即使關鍵字不直接相符,您也能找到相關結果。這項技術比以關鍵字為基礎的標準搜尋功能更先進。 您也可以使用嵌入內容來提供產品建議。包括使用圖片和文字的多模態搜尋、記錄分析,以及重複資料刪除等工作。

在 RAG 中,嵌入扮演重要角色,可從知識庫檢索最相關的脈絡,為大型語言模型 (LLM) 的回覆提供依據。只要將使用者查詢和知識庫中的資訊區塊嵌入,RAG 系統就能有效找出並擷取語意最相似的內容。這項語意比對功能可確保 LLM 取得必要資訊,生成準確且實用的答案。

擷取及處理嵌入的資料

這張圖表顯示如何擷取知識並生成嵌入內容,其中醒目顯示了資料處理步驟,包括分塊和生成嵌入內容。

圖 2. 知識擷取圖。這張圖顯示輸入的多模態文件資料,以及兩個處理步驟:分塊和生成嵌入。分塊是前處理步驟,用於複雜資料,然後再產生嵌入。資料處理完畢後,嵌入內容會儲存在向量資料庫中。

對於核心嵌入用途,主要考量是知識的擷取和處理方式。您可以選擇批次或串流方式擷取資料。這類知識的來源可能大不相同。舉例來說,這項資訊可能來自 Cloud Storage 中儲存的檔案,也可能來自 Pub/Sub 或 Google Cloud Managed Service for Apache Kafka 等串流來源。

如果是串流來源,資料本身可能是原始內容 (例如純文字),也可能是指向文件的 URI。無論來源為何,第一階段通常會預先處理資訊。如果是原始文字,這項作業可能很簡單,例如基本資料清理。不過,如果是較大的文件或較複雜的內容,分塊是相當重要的步驟。分塊是指將來源資料拆分為易於管理的小型單元。最佳分塊策略並無標準做法,取決於特定資料和應用程式。Dataflow 等平台提供內建功能,可處理各種分塊需求,簡化這個重要的預先處理階段。

優點

MLTransform 類別具有下列優點:

  • 生成嵌入項目,可用於將資料推送至向量資料庫,或執行推論作業。
  • 轉換資料時,不必編寫複雜的程式碼或管理基礎程式庫。
  • 透過單一介面,有效串連多種處理作業。

支援與限制

MLTransform 類別具有下列限制:

  • 適用於使用 Apache Beam Python SDK 2.53.0 以上版本的管道。
  • 管道必須使用預設視窗

文字嵌入轉換:

用途

範例筆記本會說明如何針對特定用途使用 MLTransform

我想使用 Vertex AI 為 LLM 生成文字嵌入
使用 Apache Beam MLTransform 類別搭配 Vertex AI 文字嵌入 API ,生成文字嵌入。文字嵌入是將文字表示為數值向量的方法,許多自然語言處理 (NLP) 工作都需要用到這類向量。
我想使用 Hugging Face 為 LLM 生成文字嵌入
使用 Apache Beam MLTransform 類別和 Hugging Face Hub 模型,生成文字嵌入。Hugging Face SentenceTransformers 架構會使用 Python 生成句子、文字和圖片的嵌入內容。
我想生成文字嵌入,並將其擷取至 PostgreSQL 適用的 AlloyDB
使用 Apache Beam,特別是 MLTransform 類別和 Hugging Face Hub 模型,生成文字嵌入。然後使用 VectorDatabaseWriteTransform 將這些嵌入內容和相關聯的中繼資料載入 AlloyDB for PostgreSQL。本筆記本示範如何建構可擴充的批次和串流 Beam 資料管道,以填入 PostgreSQL 適用的 AlloyDB 向量資料庫。包括處理來自各種來源 (例如 Pub/Sub 或現有資料庫表格) 的資料、建立自訂結構定義,以及更新資料。
我想生成文字嵌入,並擷取至 BigQuery
使用 Apache Beam MLTransform 類別和 Hugging Face Hub 模型,從應用程式資料 (例如產品目錄) 生成文字嵌入。這項作業會使用 Apache Beam HuggingfaceTextEmbeddings 轉換。這項轉換會使用 Hugging Face SentenceTransformers 架構,提供產生句子和文字嵌入的模型。接著,系統會使用 Apache Beam VectorDatabaseWriteTransform,將這些生成的嵌入和中繼資料擷取至 BigQuery。筆記本會進一步示範如何使用 Enrichment 轉換,在 BigQuery 中執行向量相似度搜尋。

如需可用轉換指令的完整清單,請參閱 Apache Beam 說明文件中的「轉換」。

使用 MLTransform 生成嵌入

如要使用 MLTransform 類別將資訊分塊並產生嵌入,請在管道中加入下列程式碼:

  
  def create_chunk(product: Dict[str, Any]) -> Chunk:
    return Chunk(
        content=Content(
            text=f"{product['name']}: {product['description']}"
        ),
        id=product['id'],  # Use product ID as chunk ID
        metadata=product,  # Store all product info in metadata
    )

  [...]
  with beam.Pipeline() as p:
    _ = (
            p
            | 'Create Products' >> beam.Create(products)
            | 'Convert to Chunks' >> beam.Map(create_chunk)
            | 'Generate Embeddings' >> MLTransform(
  write_artifact_location=tempfile.mkdtemp())
  .with_transform(huggingface_embedder)
            | 'Write to AlloyDB' >> VectorDatabaseWriteTransform(alloydb_config)
        )

上一個範例會為每個元素建立一個區塊,但您也可以使用 LangChain 建立區塊:

splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=20)
provider = beam.ml.rag.chunking.langchain.LangChainChunker(
document_field='content', metadata_fields=[], text_splitter=splitter)

with beam.Pipeline() as p:
_ = (
p
| 'Create Products' >> beam.io.textio.ReadFromText(products)
| 'Convert to Chunks' >> provider.get_ptransform_for_processing()

後續步驟