Funkcja ai_prep_search

Dotyczy:zaznacz pole wyboru oznaczone jako tak Databricks SQL zaznacz pole wyboru oznaczone jako tak Databricks Runtime

Ważna

Ta funkcja jest dostępna w wersji beta. Administratorzy obszaru roboczego mogą kontrolować dostęp do tej funkcji ze strony Podglądy . Zobacz Zarządzanie podglądami Azure Databricks.

Funkcja ta ai_prep_search() przekształca zawartość dokumentu w format zoptymalizowany pod kątem systemów wyszukiwania wektorowego RAG i wyszukiwania informacji. Akceptuje albo ustrukturyzowany wynik, ai_parse_document albo zwykły tekst i zawartość z odznaczaniem STRING danych. Dla każdego dokumentu wejściowego funkcja dzieli zawartość na fragmenty semantyczne, wzbogaca każdy fragment z kontekstem na poziomie dokumentu, takim jak tytuł dokumentu, nagłówki sekcji, odwołania do stron i tworzy reprezentację gotową do osadzania.

Bezpieczeństwo danych

Dane dokumentu są przetwarzane w ramach strefy bezpieczeństwa Databricks. Databricks nie przechowuje parametrów przekazywanych do wywołań funkcji AI, ale zachowuje szczegóły metadanych, takie jak używana wersja Databricks Runtime.

Wymagania

  • Databricks Runtime 18.2 lub nowszy.
  • Jeśli używasz obliczeń bezserwerowych, wymagane są również następujące elementy:
    • Wersja środowiska bezserwerowego musi być ustawiona na 3 lub nowszą, ponieważ umożliwia to korzystanie z funkcji takich jak VARIANT.
    • Należy użyć Python lub SQL. Aby uzyskać dodatkowe funkcje i ograniczenia bezserwerowe, zobacz Ograniczenia obliczeniowe bezserwerowe.
  • Funkcja ai_prep_search jest dostępna przy użyciu notesów usługi Databricks, edytora SQL, przepływów pracy usługi Databricks, zadań lub potoków lakeflow.

Składnia

ai_prep_search(parsed [, options])

Arguments

  • parsed: Dokumentuj treść, aby przygotować się do wyszukiwania. Jedna z następujących czynności:
    • Wyrażenie reprezentujące VARIANT ustrukturyzowany wynik .ai_parse_document
    • Wyrażenie STRING zawierające zwykły tekst lub markdown. Ciągi JSON, które nie są ustrukturyzowanym ai_parse_document (lub powiązanym) wyjściem, są traktowane jako tekst literalny i dzielone na części w ten sam sposób.
  • options: opcjonalny element MAP<STRING, STRING>. Obsługiwane klucze:
    • 'version': wersja schematu wyjściowego do użycia.
    • 'schema': Schemat JSON definiujący zestaw kluczy do ekstrakcji metadanych na poziomie dokumentu. Schemat wykorzystuje te same formaty co ai_extract:
      • Prosty schemat: tablica JSON nazw pól (zakładana jako ciągi)
        "[\"vendor_name\", \"invoice_id\", \"total_amount\"]"
        
      • Zaawansowany schemat: obiekt JSON z informacjami o typie, opisami i zagnieżdżonych struktur
        • Obsługuje stringtypy , , integernumber, booleani enum . Przeprowadza walidację typu. Wartości, które nie są prawidłowe, powodują błąd. Maksymalnie 500 wartości wyliczenia.
        • Obsługuje obiekty zagnieżdżone przy użyciu polecenia "type": "object""properties"
        • Obsługuje tablice elementów pierwotnych lub obiektów przy użyciu polecenia "type": "array""items"
        • Opcjonalne "description" pole dla każdej właściwości w celu uzyskania jakości wyodrębniania

Zwroty

Zawierający VARIANT fragmenty dokumentu sformatowane na potrzeby indeksowania wyszukiwania wektorowego. Każdy wiersz w danych wyjściowych reprezentuje jeden dokument wejściowy.

Schemat danych wyjściowych to:

{
  "document": {
    "contents": [
      {
        "chunk_id": STRING,       // Unique identifier composed of the document ID and chunk position
        "chunk_position": INT,    // 0-based position of the chunk within the document
        "chunk_to_retrieve": STRING,  // Raw text content of the chunk
        "chunk_to_embed": STRING, // Context-enriched text prepared for embedding; see chunk_to_embed format
        "metadata": OBJECT,   // Typed values for the keys in schema; empty object when schema is omitted
        "pages": [
          {
            "page_id": INT,       // Page index that this chunk appears on
            "image_uri": STRING   // Path to the page image for multi-modal retrieval
          }
        ]
      }
    ],
    "pages": [
      {
        "id": INT,           // 0-based page index
        "image_uri": STRING  // Path to the rendered page image, populated when
                             // imageOutputPath is set in ai_parse_document
      }
    ],
    "source_uri": STRING   // Source document URI
  },
  "error_status": {...}
}

Ważna

Schemat danych wyjściowych funkcji jest wersjonowany przy użyciu formatu major.minor. Usługa Databricks może uaktualnić obsługiwaną lub domyślną wersję, aby odzwierciedlić ulepszone reprezentacje na podstawie bieżących badań.

  • Uaktualnienia wersji mniejszej są wstecznie kompatybilne i mogą wprowadzać tylko nowe pola.
  • Uaktualnienia wersji głównej mogą obejmować zmiany, które mogą prowadzić do problemów kompatybilności, takie jak dodawanie pól, usunięcia lub zmiany nazw.

format chunk_to_embed

Pole chunk_to_embed jest pojedynczym ciągiem utworzonym na fragmenty przez połączenie nieprzetworzonego tekstu fragmentu z kontekstem na poziomie dokumentu w celu poprawy jakości pobierania podczas wyszukiwania semantycznego.

Ciąg składa się z następujących części:

  • Metadane dokumentu: Document Title, , Page HeaderPage Footer, Section HeaderCaption, , Footnote, Page Number. Wyodrębnione bezpośrednio z analizowanej struktury dokumentu.
  • Pola dokumentu: dodatkowe Klucz: linie wartości dla pól na poziomie dokumentu. Bez schema tej opcji LLM wykrywa nazwy pól w każdym dokumencie (na przykład "Firma", "Typ dokumentu", "Rok fiskalny"). Dzięki opcji funkcja korzysta z kluczy, które schema podałaś.
  • Zdanie kontekstu dokumentu: jedno zdanie podsumowujące, o czym chodzi w dokumencie, wygenerowane przez llM.
  • Zawartość: nieprzetworzonego tekstu fragmentu. Ta sama wartość co chunk_to_retrieve pole dla fragmentu.
  • Podsumowanie tabeli: krótkie parafrazy wygenerowane przez llM zawartości spisu. W przypadku fragmentów zawierających tabelę funkcja dołącza to podsumowanie tabeli i zestaw powiązanych pytań w języku naturalnym, na które tabela może odpowiedzieć.
  • Powiązane pytania: pytania w języku naturalnym, na które tabela jest w stanie odpowiedzieć, używane do ulepszania przypomnienia pobierania zawartości tabeli.

Ciąg jest zgodny z tym szablonem:

Document Title: {doc_title}
Page Header: {page_header}
Page Footer: {page_footer}
Section Header: {section_header}
Caption: {caption}
Footnote: {footnote}
Page Number: {page_number}
{additional_document_fields}

{document_context_sentence}

Table summary: {table_summary}

Content:
{chunk_to_retrieve}

Related questions:
{qa_text}
Przykład renderowany chunk_to_embed
Document Title: Acme Corp 2024 Annual Report
Page Header:
Page Footer:
Section Header: Risk Factors
Caption:
Footnote:
Page Number: 14
Company: Acme Corp
Document Type: 10-K
Fiscal Year: 2024

Acme Corp's 2024 annual report covering financial performance and risk disclosures across global operating segments.

Content:
Our business faces a number of risks, including competition from established providers, evolving regulatory requirements, and concentration in a small number of large customers.

Uwaga / Notatka

Stałe pola metadanych są zawsze renderowane z etykietą, a wartość pozostawiona jest pusta, gdy jest niedostępna. Pola dokumentu, zdanie kontekstu dokumentu, podsumowanie tabeli oraz powiązane pytania są całkowicie pomijane, gdy są niedostępne lub nie mają zastosowania. Dokładna kompozycja może zostać zaktualizowana w przyszłych wersjach, aby poprawić jakość pobierania.

Examples

Przygotuj tekst zwykły lub zbiór

Poniższy przykład przygotowuje tekst STRING jawny do indeksowania wyszukiwania:

SELECT ai_prep_search(
  'Quarterly revenue grew twenty percent year over year.',
  options => map('version', '2.0')
);

Łańcuch z ai_parse_document

Poniższy przykład umożliwia ai_prep_searchai_parse_document tworzenie fragmentów gotowych do wyszukiwania z nieprzetworzonych dokumentów przechowywanych w woluminie wykazu aparatu Unity:

WITH parsed_documents AS (
  SELECT ai_parse_document(content) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
)
SELECT ai_prep_search(parsed) AS result
FROM parsed_documents;

Wyodrębniaj strukturalne metadane z opcją schema

Poniższy przykład wykorzystuje prosty schemat do wyodrębniania company, document_type, oraz fiscal_year jako metadanych ciągu na każdym chunku.

WITH parsed_documents AS (
  SELECT ai_parse_document(content) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
)
SELECT ai_prep_search(
  parsed,
  map('schema', '["company", "document_type", "fiscal_year"]')
) AS result
FROM parsed_documents;

Wyodrębnij typowe metadane za pomocą zaawansowanego schematu

Poniższy przykład wykorzystuje zaawansowany schemat do określania typów pól i opisów. Opisy kierują ekstrakcją i fiscal_year zwraca się jako liczba całkowita.

WITH parsed_documents AS (
  SELECT ai_parse_document(content) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
)
SELECT ai_prep_search(
  parsed,
  map(
    'schema',
    '{
      "company": {"type": "string", "description": "Legal business name"},
      "document_type": {"type": "string", "description": "Filing or document type"},
      "fiscal_year": {"type": "integer", "description": "Fiscal year covered by the document"}
    }'
  )
) AS result
FROM parsed_documents;

Pola metadanych Surface jako kolumny

Poniższy przykład spłaszcza fragmenty i rzutuje każdy klucz w opcji schema do osobnej kolumny:

WITH parsed_documents AS (
  SELECT ai_parse_document(content) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
),
prepped_documents AS (
  SELECT ai_prep_search(
    parsed,
    map('schema', '["company", "document_type", "fiscal_year"]')
  ) AS result
  FROM parsed_documents
)
SELECT
  chunk.value:chunk_id::STRING AS chunk_id,
  chunk.value:chunk_to_embed::STRING AS chunk_to_embed,
  chunk.value:metadata:company::STRING AS company,
  chunk.value:metadata:document_type::STRING AS document_type,
  chunk.value:metadata:fiscal_year::INT AS fiscal_year
FROM
  prepped_documents,
  LATERAL variant_explode(prepped_documents.result:document.contents) AS chunk;

Tworzenie tabeli źródłowej wyszukiwania wektorów

Poniższy przykład spłaszcza dane wyjściowe do poszczególnych wierszy fragmentów i zapisuje je w tabeli delty. Następnie tabelę można użyć jako źródła indeksu wyszukiwania sztucznej inteligencji usługi Databricks , używając chunk_to_embed jako kolumny osadzania i chunk_id jako klucza podstawowego.

WITH parsed_documents AS (
  SELECT
    path,
    ai_parse_document(content) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
),
prepped_documents AS (
  SELECT
    path,
    ai_prep_search(parsed) AS result
  FROM parsed_documents
)
SELECT
  chunk.value:chunk_id::STRING AS chunk_id,
  chunk.value:chunk_position::INT AS chunk_position,
  chunk.value:chunk_to_retrieve::STRING AS chunk_to_retrieve,
  chunk.value:chunk_to_embed::STRING AS chunk_to_embed,
  chunk.value:metadata AS metadata,
  prepped_documents.path AS source_uri
FROM
  prepped_documents,
  LATERAL variant_explode(prepped_documents.result:document.contents) AS chunk;

Wynikowe wiersze mają następujący schemat:

Nazwa kolumny Typ
chunk_id STRING
chunk_position INT
chunk_to_retrieve STRING
chunk_to_embed STRING
metadata VARIANT
source_uri STRING

Włączanie pobierania wielomodalnego

Gdy ai_parse_document jest wywoływana z opcją imageOutputPath , renderowane obrazy stron są zapisywane w woluminie wykazu aparatu Unity, a image_uri pole w tablicy każdego fragmentu pages jest wypełniane. Odwołania do tych obrazów można przekazać do modelu z możliwością przetwarzania obrazów w czasie wykonywania zapytań, aby odpowiedzieć na pytania wymagające kontekstu wizualnego, takich jak diagramy blokowe, wykresy lub tabele, które nie są w pełni reprezentowane w tekście.

WITH parsed_documents AS (
  SELECT ai_parse_document(
    content,
    map(
      'imageOutputPath', '/Volumes/catalog/schema/volume/page_images/',
      'descriptionElementTypes', '*'
    )
  ) AS parsed
  FROM READ_FILES('/Volumes/mydata/documents/', format => 'binaryFile')
),
prepped_documents AS (
  SELECT ai_prep_search(parsed) AS result
  FROM parsed_documents
)
SELECT
  chunk.value:chunk_id::STRING AS chunk_id,
  chunk.value:chunk_to_embed::STRING AS chunk_to_embed,
  chunk.value:pages AS pages
FROM
  prepped_documents,
  LATERAL variant_explode(prepped_documents.result:document.contents) AS chunk;

Ograniczenia

  • Gdy przekazujesz , VARIANTużyj poprawnego ai_parse_document wyjścia. Przekazywanie innych VARIANT danych lub nieobsługiwanej wersji schematu może spowodować nieoczekiwane wyniki lub błędy.
  • Gdy zdasz , STRINGużyj tekstu zwykłego lub zwykłego znaczenia. Ciągi JSON, które nie są strukturalnym wyjściem dokumentu parsowania, są indeksowane jako tekst literalny, a nie odrzucane.
  • Maksymalny rozmiar danych wejściowych jest zgodny z maksymalnym rozmiarem danych wyjściowych ai_parse_document.