你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Functions 的 Azure OpenAI 嵌入输入绑定
重要
适用于 Azure Functions 的 Azure OpenAI 扩展目前为预览版。
Azure OpenAI 嵌入输入绑定支持为输入生成嵌入。 绑定可以从文件或原始文本输入生成嵌入。
如需了解有关 Azure OpenAI 扩展的设置和配置详细信息,请参阅适用于 Azure Functions 的 Azure OpenAI 扩展。 若要详细了解 Azure OpenAI 服务中的嵌入,请参阅了解 Azure OpenAI 服务中的嵌入。
注意
仅提供了适用于 Node.js v4 模型的参考和示例。
注意
仅提供了适用于 Python v2 模型的参考和示例。
注意
虽然支持这两个 C# 进程模型,但仅 提供了独立的辅助角色模型 示例。
示例
此示例演示如何为原始文本字符串生成嵌入。
[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
[EmbeddingsInput("{rawText}", InputType.RawText, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
this.logger.LogInformation(
"Received {count} embedding(s) for input text containing {length} characters.",
embeddings.Count,
requestBody?.RawText?.Length);
// TODO: Store the embeddings into a database or other storage.
}
此示例演示如何检索存储在函数可访问的指定文件中的嵌入内容。
[Function(nameof(GetEmbeddings_Http_FilePath))]
public async Task GetEmbeddings_Http_FilePath(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings-from-file")] HttpRequestData req,
[EmbeddingsInput("{filePath}", InputType.FilePath, MaxChunkLength = 512, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
this.logger.LogInformation(
"Received {count} embedding(s) for input file '{path}'.",
embeddings.Count,
requestBody?.FilePath);
// TODO: Store the embeddings into a database or other storage.
}
此示例演示如何为原始文本字符串生成嵌入。
@FunctionName("GenerateEmbeddingsHttpRequest")
public HttpResponseMessage generateEmbeddingsHttpRequest(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "embeddings")
HttpRequestMessage<EmbeddingsRequest> request,
@EmbeddingsInput(name = "Embeddings", input = "{RawText}", inputType = InputType.RawText, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
final ExecutionContext context) {
if (request.getBody() == null)
{
throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
}
JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
context.getLogger().info(String.format("Received %d embedding(s) for input text containing %s characters.",
embeddingsContextJsonObject.getJSONObject("response")
.getJSONArray("data")
.getJSONObject(0)
.getJSONArray("embedding").length(),
request.getBody().getRawText().length()));
// TODO: Store the embeddings into a database or other storage.
return request.createResponseBuilder(HttpStatus.ACCEPTED)
.header("Content-Type", "application/json")
.build();
}
此示例演示如何检索存储在函数可访问的指定文件中的嵌入内容。
@FunctionName("GenerateEmbeddingsHttpFilePath")
public HttpResponseMessage generateEmbeddingsHttpFilePath(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "embeddings-from-file")
HttpRequestMessage<EmbeddingsRequest> request,
@EmbeddingsInput(name = "Embeddings", input = "{FilePath}", inputType = InputType.FilePath, maxChunkLength = 512, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
final ExecutionContext context) {
if (request.getBody() == null)
{
throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
}
JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
context.getLogger().info(String.format("Received %d embedding(s) for input file %s.",
embeddingsContextJsonObject.getJSONObject("response")
.getJSONArray("data")
.getJSONObject(0)
.getJSONArray("embedding").length(),
request.getBody().getFilePath()));
// TODO: Store the embeddings into a database or other storage.
return request.createResponseBuilder(HttpStatus.ACCEPTED)
.header("Content-Type", "application/json")
.build();
}
示例尚不可用。
此示例演示如何为原始文本字符串生成嵌入。
const embeddingsHttpInput = input.generic({
input: '{rawText}',
inputType: 'RawText',
type: 'embeddings',
model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})
app.http('generateEmbeddings', {
methods: ['POST'],
route: 'embeddings',
authLevel: 'function',
extraInputs: [embeddingsHttpInput],
handler: async (request, context) => {
let requestBody: EmbeddingsHttpRequest = await request.json();
let response: any = context.extraInputs.get(embeddingsHttpInput);
context.log(
`Received ${response.count} embedding(s) for input text containing ${requestBody.RawText.length} characters.`
);
// TODO: Store the embeddings into a database or other storage.
return {status: 202}
}
});
此示例演示如何检索存储在函数可访问的指定文件中的嵌入内容。
const embeddingsFilePathInput = input.generic({
input: '{filePath}',
inputType: 'FilePath',
type: 'embeddings',
maxChunkLength: 512,
model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})
app.http('getEmbeddingsFilePath', {
methods: ['POST'],
route: 'embeddings-from-file',
authLevel: 'function',
extraInputs: [embeddingsFilePathInput],
handler: async (request, context) => {
let requestBody: EmbeddingsFilePath = await request.json();
let response: any = context.extraInputs.get(embeddingsFilePathInput);
context.log(
`Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
);
// TODO: Store the embeddings into a database or other storage.
return {status: 202}
}
此示例演示如何为原始文本字符串生成嵌入。
下面是 用于生成嵌入的 function.json文件:
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"route": "embeddings",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"name": "Embeddings",
"type": "embeddings",
"direction": "in",
"inputType": "RawText",
"input": "{rawText}",
"model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
}
]
}
有关 function.json 文件属性的详细信息,请参阅配置部分。
using namespace System.Net
param($Request, $TriggerMetadata, $Embeddings)
$input = $Request.Body.RawText
Write-Host "Received $($Embeddings.Count) embedding(s) for input text containing $($input.Length) characters."
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::Accepted
})
此示例演示如何为原始文本字符串生成嵌入。
@app.function_name("GenerateEmbeddingsHttpRequest")
@app.route(route="embeddings", methods=["POST"])
@app.embeddings_input(arg_name="embeddings", input="{rawText}", input_type="rawText", model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%")
def generate_embeddings_http_request(req: func.HttpRequest, embeddings: str) -> func.HttpResponse:
user_message = req.get_json()
embeddings_json = json.loads(embeddings)
embeddings_request = {
"raw_text": user_message.get("rawText")
}
logging.info(f'Received {embeddings_json.get("count")} embedding(s) for input text '
f'containing {len(embeddings_request.get("raw_text"))} characters.')
# TODO: Store the embeddings into a database or other storage.
return func.HttpResponse(status_code=200)
特性
应用 EmbeddingsInput
属性来定义嵌入输入绑定,该绑定支持以下参数:
参数 | 说明 |
---|---|
Input | 要为其生成嵌入的输入字符串。 |
型号 | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
MaxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
MaxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
InputType | 可选。 获取输入的类型。 |
批注
通过 EmbeddingsInput
注释,可定义嵌入输入绑定,该绑定支持以下参数:
元素 | 说明 |
---|---|
name | 获取或设置输入绑定的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
修饰符
在预览期间,将输入绑定定义为 embeddings
类型的 generic_input_binding
绑定,该绑定支持以下参数:embeddings
修饰器支持以下参数:
参数 | 说明 |
---|---|
arg_name | 表示绑定参数的变量的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
max_overlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
input_type | 获取输入的类型。 |
配置
绑定支持在 function.json 文件中设置的这些配置属性。
properties | 说明 |
---|---|
type | 必须是 EmbeddingsInput 。 |
direction | 必须是 in 。 |
name | 输入绑定的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
配置
绑定支持以下属性,这些属性在代码中定义:
properties | 说明 |
---|---|
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
有关完整示例,请参阅示例部分。
使用情况
更改默认嵌入 model
会更改嵌入存储在矢量数据库中的方式。 更改默认模型可能导致查找与之前引入矢量数据库中的其余数据不匹配时,查找行为异常。 嵌入的默认模型是 text-embedding-ada-002
。
在计算输入区块的最大字符长度时,请考虑第二代输入嵌入模型(如 text-embedding-ada-002
)允许的最大输入令牌数为 8191
。 一个令牌的长度约为 4 个字符(英语),这相当于大约 32,000 个(英语)字符的输入可以放入一个区块中。