适用于:✅Azure 数据资源管理器
该函数 slm_embeddings_fl() 是 一个 UDF(用户定义的函数), 它使用本地小型语言模型(SLM)生成文本嵌入。 此函数将文本转换为数字向量表示形式,这些表示形式可用于语义搜索、相似性分析和其他自然语言处理任务。
目前,该函数支持 jina-v2-small 和 e5-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 = (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 |