slm_embeddings_fl()

Wechseln Von Diensten mithilfe der Dropdownliste "Version ". Weitere Informationen zur Navigation.
Gilt für: ✅ Microsoft Fabric ✅ Azure Data Explorer

Die Funktion slm_embeddings_fl() ist eine UDF (benutzerdefinierte Funktion), die Texteinbettungen mithilfe lokaler SLM-Modelle (Small Language Models) generiert. Diese Funktion konvertiert Text in numerische Vektordarstellungen, die für die semantische Suche, Ähnlichkeitsanalyse und andere Verarbeitungsaufgaben in natürlicher Sprache verwendet werden können. Derzeit unterstützt die Funktion harrier-v1-270m, jina-v2-small, e5-small-v2 und SecBERT Modelle. SecBERT ist für Cybersicherheitstext konzipiert und generiert 768-dimensionale Einbettungen.

Voraussetzungen

  • Das Plug-In python() muss auf dem Cluster enabled auf dem Cluster sein entweder mit dem 3.11.7 oder 3.11.7 DL Python Sandkastenimage. Dies ist für die inline Python erforderlich, die in der Funktion verwendet wird. Informationen zum Überprüfen des Paketinhalts für diese Bilder finden Sie unter Python Paketreferenz.
  • Ändern Sie die Popuprichtlinie des Clusters so, dass der Zugriff auf die externen Artefakte zulässt (auf die im folgenden KQL-Code verwiesen wird):
.alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactswestus\\.z22\\.web\\.core\\.windows\\.net/models/SLM/","CanCall": true } ]'

Beachten Sie, dass für diese Änderung "AllDatabasesAdmin "-Berechtigungen erforderlich sind.

Syntax

T | invoke slm_embeddings_fl( , text_colembeddings_col [,batch_size ] [,model_name ] [,Präfix ])

Erfahren Sie mehr über Syntaxkonventionen.

Die Parameter

Name Typ Erforderlich Description
text_col string ✔️ Der Name der Spalte, die den einzubettenden Text enthält.
embeddings_col string ✔️ Der Name der Spalte zum Speichern der Ausgabeeinbettungen.
batch_size int Die Anzahl der Zu verarbeitenden Texte in den einzelnen Stapeln. Der Standardwert ist 32.
Model_name string Der Name des zu verwendenden Einbettungsmodells. Unterstützte Werte sind harrier-v1-270m (Standard), jina-v2-small, , e5-small-v2und secbert. Der Wert muss mit dem ZIP-Dateinamen des Modellartefaktes ohne die .zip Erweiterung übereinstimmen.
Präfix string Das Textpräfix, das vor jeder Eingabe hinzugefügt werden soll. Der Standardwert ist query:. Verwenden Sie query: für die Harrier- und E5-Modelle Suchabfragen und passage: für Dokumente, passage: die durchsucht werden sollen (für das Harrier-Modell ist dies der leeren Aufgabe zugeordnet). Dieser Parameter wird für die Jina- und SecBERT-Modelle ignoriert.

Funktionsdefinition

  • Definieren Sie die Funktion, indem Sie den Code entweder als abfragedefinierte Funktion einbetten oder als gespeicherte Funktion in Ihrer Datenbank erstellen.
  • Jeder Aufruf lädt das Einbettungsmodul und nur das ausgewählte Modellartefakt. Um den Speicher zu optimieren, löschen Sie externe Artefakte für Modelle, die nicht verwendet werden.
  • Wenn das Python Sandkastenimage das Paket nicht enthälttokenizers, heben Sie die Kommentare in tokenizers-0.22.1.whl der Funktionsdefinition auf.

Definieren Sie die Funktion mithilfe der folgenden Let-Anweisung. Es sind keine Berechtigungen erforderlich.

Von Bedeutung

Eine Let-Anweisung kann nicht alleine ausgeführt werden. Auf sie muss eine tabellarische Ausdrucksanweisung folgen. Informationen zum Ausführen eines funktionierenden Beispiels slm_embeddings_fl()finden Sie unter Beispiel.

let slm_embeddings_fl = (tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='harrier-v1-270m', prefix:string='query:')
{
    let artifact_root = 'https://artifactswestus.z22.web.core.windows.net/models/SLM/';
    let engine_artifact = 'embedding_engine.zip';
    let kwargs = bag_pack('text_col', text_col, 'embeddings_col', embeddings_col, 'batch_size', batch_size, 'model_name', model_name, 'prefix', prefix);
    let code = ```if 1:
		from sandbox_utils import Zipackage
		Zipackage.install('embedding_engine.zip')
#		Zipackage.install('tokenizers-0.22.1.whl')			# redundant if tokenizers package is included in the Python image
		
		from embedding_factory import create_embedding_engine
		
		text_col = kargs["text_col"]
		embeddings_col = kargs["embeddings_col"]
		batch_size = kargs["batch_size"]
		model_name = kargs["model_name"]
		prefix = kargs["prefix"]

		Zipackage.install(f'{model_name}.zip')

		engine = create_embedding_engine(model_name, cache_dir="C:\\Temp")
		embeddings = engine.encode(df[text_col].tolist(), batch_size=batch_size, prefix=prefix)		#	prefix is used by E5 and Harrier; Jina and SecBERT ignore it
		
		result = df
		result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(
        typeof(*), code, kwargs,
        external_artifacts=bag_pack(
//          'tokenizers-0.22.1.whl', strcat(artifact_root, 'tokenizers-0.22.1-cp39-abi3-win_amd64.whl'),
            'embedding_engine.zip', strcat(artifact_root, engine_artifact),
            strcat(model_name, '.zip'), strcat(artifact_root, model_name, '.zip')))
};
// Write your query to use the function here.

Example

Im folgenden Beispiel wird der Aufrufoperator verwendet, um die Funktion auszuführen.

Um eine abfragedefinierte Funktion zu verwenden, rufen Sie sie nach der definition der eingebetteten Funktion auf.

let slm_embeddings_fl=(tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='harrier-v1-270m', prefix:string='query:')
{
    let artifact_root = 'https://artifactswestus.z22.web.core.windows.net/models/SLM/';
    let engine_artifact = 'embedding_engine.zip';
    let kwargs = bag_pack('text_col', text_col, 'embeddings_col', embeddings_col, 'batch_size', batch_size, 'model_name', model_name, 'prefix', prefix);
    let code = ```if 1:
		from sandbox_utils import Zipackage
		Zipackage.install('embedding_engine.zip')
#		Zipackage.install('tokenizers-0.22.1.whl')			# redundant if tokenizers package is included in the Python image
		
		from embedding_factory import create_embedding_engine
		
		text_col = kargs["text_col"]
		embeddings_col = kargs["embeddings_col"]
		batch_size = kargs["batch_size"]
		model_name = kargs["model_name"]
		prefix = kargs["prefix"]

		Zipackage.install(f'{model_name}.zip')

		engine = create_embedding_engine(model_name, cache_dir="C:\\Temp")
		embeddings = engine.encode(df[text_col].tolist(), batch_size=batch_size, prefix=prefix)		#	prefix is used by E5 and Harrier; Jina and SecBERT ignore it
		
		result = df
		result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(
        typeof(*), code, kwargs,
        external_artifacts=bag_pack(
//          'tokenizers-0.22.1.whl', strcat(artifact_root, 'tokenizers-0.22.1-cp39-abi3-win_amd64.whl'),
            'embedding_engine.zip', strcat(artifact_root, engine_artifact),
            strcat(model_name, '.zip'), strcat(artifact_root, model_name, '.zip')))
};
//
// Create a sample dataset with text passages
let passages = datatable(text:string)
[
    "Machine learning models can process natural language efficiently.",
    "Python is a versatile programming language for data science.",
    "Azure Data Explorer provides fast analytics on large datasets.",
    "Embeddings convert text into numerical vector representations.",
    "Neural networks learn patterns from training data."
];
// Generate embeddings for passages using 'passage:' prefix
let passage_embeddings = 
    passages
    | extend text_embeddings=dynamic(null)
    | invoke slm_embeddings_fl('text', 'text_embeddings', 32, 'e5-small-v2', 'passage:');
// Create a search query and find similar passages
let search_query = datatable(query:string)
[
    "How do embeddings work?"
];
search_query
| extend query_embeddings=dynamic(null)
| invoke slm_embeddings_fl('query', 'query_embeddings', 32, 'e5-small-v2', 'query:')
| extend dummy=1
| join (passage_embeddings | extend dummy=1) on dummy
| project query, text, similarity=series_cosine_similarity(query_embeddings, text_embeddings, 1.0, 1.0)
| top 3 by similarity desc

Output

Anfrage Text Ähnlichkeit
Wie funktionieren Einbettungen? Einbettungen konvertieren Text in numerische Vektordarstellungen. 0.871
Wie funktionieren Einbettungen? Neurale Netzwerke lernen Muster aus Schulungsdaten kennen. 0.812
Wie funktionieren Einbettungen? Machine Learning-Modelle können natürliche Sprache effizient verarbeiten. 0.782

Die Funktion slm_embeddings_fl() ist eine UDF (benutzerdefinierte Funktion), die Texteinbettungen mithilfe lokaler SLM-Modelle (Small Language Models) generiert. Diese Funktion konvertiert Text in numerische Vektordarstellungen, die für die semantische Suche, Ähnlichkeitsanalyse und andere Verarbeitungsaufgaben in natürlicher Sprache verwendet werden können. Derzeit unterstützt die Funktion harrier-v1-270m, jina-v2-small, e5-small-v2 und SecBERT Modelle. SecBERT ist für Cybersicherheitstext konzipiert und generiert 768-dimensionale Einbettungen.

Voraussetzungen

  • Das Plug-In python() muss in der Datenbank enabled sein entweder mit dem 3.11.7 oder 3.11.7 DL Python Sandkastenbild. Dies ist für die inline Python erforderlich, die in der Funktion verwendet wird. Informationen zum Überprüfen des Paketinhalts für diese Bilder finden Sie unter Python Paketreferenz.
  • Erstellen Sie ein Seehaus, um die externen Artefakte (auf die im folgenden KQL-Code verwiesen wird) zu hosten, vorzugsweise im gleichen Arbeitsbereich wie Ihr Eventhouse.

Syntax

T | invoke slm_embeddings_fl( , text_colembeddings_col [,batch_size ] [,model_name ] [,Präfix ])

Erfahren Sie mehr über Syntaxkonventionen.

Die Parameter

Name Typ Erforderlich Description
text_col string ✔️ Der Name der Spalte, die den einzubettenden Text enthält.
embeddings_col string ✔️ Der Name der Spalte zum Speichern der Ausgabeeinbettungen.
batch_size int Die Anzahl der Zu verarbeitenden Texte in den einzelnen Stapeln. Der Standardwert ist 32.
Model_name string Der Name des zu verwendenden Einbettungsmodells. Unterstützte Werte sind harrier-v1-270m (Standard), jina-v2-small, , e5-small-v2und secbert. Der Wert muss mit dem ZIP-Dateinamen des Modellartefaktes ohne die .zip Erweiterung übereinstimmen.
Präfix string Das Textpräfix, das vor jeder Eingabe hinzugefügt werden soll. Der Standardwert ist query:. Verwenden Sie query: für die Harrier- und E5-Modelle Suchabfragen und passage: für Dokumente, passage: die durchsucht werden sollen (für das Harrier-Modell ist dies der leeren Aufgabe zugeordnet). Dieser Parameter wird für die Jina- und SecBERT-Modelle ignoriert.

Funktionsdefinition

  • Laden Sie die zip-Dateien herunter embedding_engine.zip , die Sie verwenden möchten, und laden Sie sie in Ihr Seehaus hoch.
  • Aktualisieren Sie artifact_root im KQL-Code auf den OneLake-Ordner, der die Artefakte enthält, z. B https://msit-onelake.dfs.fabric.microsoft.com/MY_WORKSPACE/MY_LAKEHOUSE.Lakehouse/Files/models/SLM/. .
  • Definieren Sie die Funktion, indem Sie den Code entweder als abfragedefinierte Funktion einbetten oder als gespeicherte Funktion in Ihrer Datenbank erstellen.
  • Jeder Aufruf lädt das Einbettungsmodul und nur das ausgewählte Modellartefakt. Um den Speicher zu optimieren, löschen Sie externe Artefakte für Modelle, die nicht verwendet werden.

Definieren Sie die Funktion mithilfe der folgenden Let-Anweisung. Es sind keine Berechtigungen erforderlich.

Von Bedeutung

Eine Let-Anweisung kann nicht alleine ausgeführt werden. Auf sie muss eine tabellarische Ausdrucksanweisung folgen. Informationen zum Ausführen eines funktionierenden Beispiels slm_embeddings_fl()finden Sie unter Beispiel.

let slm_embeddings_fl = (tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='harrier-v1-270m', prefix:string='query:')
{
    let artifact_root = 'https://msit-onelake.dfs.fabric.microsoft.com/MY_WORKSPACE/MY_LAKEHOUSE.Lakehouse/Files/models/SLM/';
    let engine_artifact = 'embedding_engine.zip';
    let kwargs = bag_pack('text_col', text_col, 'embeddings_col', embeddings_col, 'batch_size', batch_size, 'model_name', model_name, 'prefix', prefix);
    let code = ```if 1:
        import os
        from sandbox_utils import Zipackage
        Zipackage.install('embedding_engine.zip')

        from embedding_factory import create_embedding_engine

        text_col = kargs["text_col"]
        embeddings_col = kargs["embeddings_col"]
        batch_size = kargs["batch_size"]
        model_name = kargs["model_name"]
        prefix = kargs["prefix"]

        Zipackage.install(f'{model_name}.zip')

        work_dir = os.environ.get("UPLOAD_PATH")
        engine = create_embedding_engine(model_name, cache_dir=work_dir)
        embeddings = engine.encode(df[text_col].tolist(), batch_size=batch_size, prefix=prefix)		#	prefix is used by E5 and Harrier; Jina and SecBERT ignore it

        result = df
        result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(
        typeof(*), code, kwargs,
        external_artifacts=bag_pack(
            'embedding_engine.zip', strcat(artifact_root, engine_artifact, ';impersonate'),
            strcat(model_name, '.zip'), strcat(artifact_root, model_name, '.zip;impersonate')))
};
// Write your query to use the function here.

Example

Im folgenden Beispiel wird der Aufrufoperator verwendet, um die Funktion auszuführen.

Um eine abfragedefinierte Funktion zu verwenden, rufen Sie sie nach der definition der eingebetteten Funktion auf.

let slm_embeddings_fl = (tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='harrier-v1-270m', prefix:string='query:')
{
    let artifact_root = 'https://msit-onelake.dfs.fabric.microsoft.com/MY_WORKSPACE/MY_LAKEHOUSE.Lakehouse/Files/models/SLM/';
    let engine_artifact = 'embedding_engine.zip';
    let kwargs = bag_pack('text_col', text_col, 'embeddings_col', embeddings_col, 'batch_size', batch_size, 'model_name', model_name, 'prefix', prefix);
    let code = ```if 1:
        import os
        from sandbox_utils import Zipackage
        Zipackage.install('embedding_engine.zip')

        from embedding_factory import create_embedding_engine

        text_col = kargs["text_col"]
        embeddings_col = kargs["embeddings_col"]
        batch_size = kargs["batch_size"]
        model_name = kargs["model_name"]
        prefix = kargs["prefix"]

        Zipackage.install(f'{model_name}.zip')

        work_dir = os.environ.get("UPLOAD_PATH")
        engine = create_embedding_engine(model_name, cache_dir=work_dir)
        embeddings = engine.encode(df[text_col].tolist(), batch_size=batch_size, prefix=prefix)		#	prefix is used by E5 and Harrier; Jina and SecBERT ignore it

        result = df
        result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(
        typeof(*), code, kwargs,
        external_artifacts=bag_pack(
            'embedding_engine.zip', strcat(artifact_root, engine_artifact, ';impersonate'),
            strcat(model_name, '.zip'), strcat(artifact_root, model_name, '.zip;impersonate')))
};
//
// Create a sample dataset with text passages
let passages = datatable(text:string)
[
    "Machine learning models can process natural language efficiently.",
    "Python is a versatile programming language for data science.",
    "Azure Data Explorer provides fast analytics on large datasets.",
    "Embeddings convert text into numerical vector representations.",
    "Neural networks learn patterns from training data."
];
// Generate embeddings for passages using 'passage:' prefix
let passage_embeddings = 
    passages
    | extend text_embeddings=dynamic(null)
    | invoke slm_embeddings_fl('text', 'text_embeddings', 32, 'e5-small-v2', 'passage:');
// Create a search query and find similar passages
let search_query = datatable(query:string)
[
    "How do embeddings work?"
];
search_query
| extend query_embeddings=dynamic(null)
| invoke slm_embeddings_fl('query', 'query_embeddings', 32, 'e5-small-v2', 'query:')
| extend dummy=1
| join (passage_embeddings | extend dummy=1) on dummy
| project query, text, similarity=series_cosine_similarity(query_embeddings, text_embeddings, 1.0, 1.0)
| top 3 by similarity desc

Output

Anfrage Text Ähnlichkeit
Wie funktionieren Einbettungen? Einbettungen konvertieren Text in numerische Vektordarstellungen. 0.871
Wie funktionieren Einbettungen? Neurale Netzwerke lernen Muster aus Schulungsdaten kennen. 0.812
Wie funktionieren Einbettungen? Machine Learning-Modelle können natürliche Sprache effizient verarbeiten. 0.782