slm_embeddings_fl()

适用于:✅Azure 数据资源管理器

该函数 slm_embeddings_fl()一个 UDF(用户定义的函数), 它使用本地小型语言模型(SLM)生成文本嵌入。 此函数将文本转换为数字向量表示形式,这些表示形式可用于语义搜索、相似性分析和其他自然语言处理任务。 目前,该函数支持 jina-v2-smalle5-small-v2 模型。

先决条件

  • 必须在群集上启用 Python 插件。 这是函数中使用的内联 Python 所必需的。
  • 更改群集的 标注策略 以允许访问外部项目(以下 KQL 代码中引用):
.alter-merge cluster policy callout @'[ { "CalloutType": "sandbox_artifacts", "CalloutUriRegex": "artifactschinaeast2\\.z22\\.web\\.core\\.chinacloudapi\\.cn/models/SLM/","CanCall": true } ]'

请注意,此更改需要 AllDatabasesAdmin 权限。

Syntax

T | invoke slm_embeddings_fl( , text_colembeddings_col [,batch_size] [,model_name] [,prefix])

详细了解语法约定

参数

Name 类型 必选 Description
text_col string ✔️ 包含要嵌入的文本的列的名称。
embeddings_col string ✔️ 用于存储输出嵌入的列的名称。
batch_size int 要在每个批处理中处理的文本数。 默认值为 32。
model_name string 要使用的嵌入模型的名称。 支持的值是 jina-v2-small (默认值) 和 e5-small-v2
前缀 string 要在每个输入之前添加的文本前缀。 默认值为 query:。 对于 E5 模型,用于 query: 搜索查询和 passage: 要搜索的文档。 对于 Jina 模型,忽略此参数。

函数定义

可以通过将函数的代码嵌入为查询定义的函数,或将其创建为数据库中的存储函数来定义函数,如下所示:

使用以下 let 语句定义函数。 不需要任何权限。

重要

let 语句不能独立运行。 它必须后跟一个表格表达式语句。 若要运行 slm_embeddings_fl() 的工作示例,请参阅示例

let slm_embeddings_fl = (tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='jina-v2-small', prefix:string='query:')
{
    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 only for E5
		
		result = df
		result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(typeof(*), code, kwargs, external_artifacts = bag_pack(
    			'embedding_engine.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/embedding_engine.zip',
				'tokenizers-0.22.1.whl', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/tokenizers-0.22.1-cp39-abi3-win_amd64.whl',
				'jina-v2-small.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/jina-v2-small.zip',
				'e5-small-v2.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/e5-small-v2.zip'))
};
// Write your query to use the function here.

Example

以下示例使用 invoke 运算符运行函数。

若要使用查询定义的函数,请在嵌入的函数定义后调用它。

let slm_embeddings_fl=(tbl:(*), text_col:string, embeddings_col:string, batch_size:int=32, model_name:string='jina-v2-small', prefix:string='query:')
{
    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 only for E5
		
		result = df
		result[embeddings_col] = list(embeddings)
	```;
    tbl
    | evaluate hint.distribution=per_node python(typeof(*), code, kwargs, external_artifacts = bag_pack(
    			'embedding_engine.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/embedding_engine.zip',
				'tokenizers-0.22.1.whl', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/tokenizers-0.22.1-cp39-abi3-win_amd64.whl',
				'jina-v2-small.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/jina-v2-small.zip',
				'e5-small-v2.zip', 'https://artifactschinaeast2.z22.web.core.chinacloudapi.cn/models/SLM/e5-small-v2.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

输出

查询 文本消息 相似
嵌入的工作原理是什么? 嵌入将文本转换为数字向量表示形式。 0.871
嵌入的工作原理是什么? 神经网络从训练数据中学习模式。 0.812
嵌入的工作原理是什么? 机器学习模型可以高效地处理自然语言。 0.782