你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure OpenAI 嵌入存储 Azure Functions 的输出绑定
重要
适用于 Azure Functions 的 Azure OpenAI 扩展目前为预览版。
Azure OpenAI 嵌入存储输出绑定允许将文件写入语义文档存储,稍后可以在语义搜索中引用。
如需了解有关 Azure OpenAI 扩展的设置和配置详细信息,请参阅适用于 Azure Functions 的 Azure OpenAI 扩展。 若要详细了解 Azure AI 搜索中的语义排名,请参阅 Azure AI 搜索中的语义排名。
注意
仅提供了适用于 Node.js v4 模型的参考和示例。
注意
仅提供了适用于 Python v2 模型的参考和示例。
注意
虽然支持这两个 C# 进程模型,但仅 提供了独立的辅助角色模型 示例。
示例
此示例将 HTTP 输入流写入提供的 URL 上的语义文档存储。
[Function("IngestFile")]
public static async Task<EmbeddingsStoreOutputResponse> IngestFile(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
ArgumentNullException.ThrowIfNull(req);
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
if (string.IsNullOrWhiteSpace(request))
{
throw new ArgumentException("Request body is empty.");
}
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
if (string.IsNullOrWhiteSpace(requestBody?.Url))
{
throw new ArgumentException("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
}
if (!Uri.TryCreate(requestBody.Url, UriKind.Absolute, out Uri? uri))
{
throw new ArgumentException("Invalid Url format.");
}
string filename = Path.GetFileName(uri.AbsolutePath);
return new EmbeddingsStoreOutputResponse
{
HttpResponse = new OkObjectResult(new { status = HttpStatusCode.OK }),
SearchableDocument = new SearchableDocument(filename)
};
}
public class EmbeddingsStoreOutputResponse
{
[EmbeddingsStoreOutput("{url}", InputType.Url, "AISearchEndpoint", "openai-index", Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")]
public required SearchableDocument SearchableDocument { get; init; }
public IActionResult? HttpResponse { get; set; }
}
此示例将 HTTP 输入流写入提供的 URL 上的语义文档存储。
import com.microsoft.azure.functions.openai.annotation.search.SearchableDocument;
import com.microsoft.azure.functions.openai.annotation.search.SemanticSearch;
public class FilePrompt {
@FunctionName("IngestFile")
public HttpResponseMessage ingestFile(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<EmbeddingsRequest> request,
@EmbeddingsStoreOutput(name="EmbeddingsStoreOutput", input = "{url}", inputType = InputType.Url,
connectionName = "AISearchEndpoint", collection = "openai-index",
model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") OutputBinding<EmbeddingsStoreOutputResponse> output,
final ExecutionContext context) throws URISyntaxException {
if (request.getBody() == null || request.getBody().getUrl() == null)
{
throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
}
URI uri = new URI(request.getBody().getUrl());
String filename = Paths.get(uri.getPath()).getFileName().toString();
EmbeddingsStoreOutputResponse embeddingsStoreOutputResponse = new EmbeddingsStoreOutputResponse(new SearchableDocument(filename));
output.setValue(embeddingsStoreOutputResponse);
JSONObject response = new JSONObject();
response.put("status", "success");
response.put("title", filename);
return request.createResponseBuilder(HttpStatus.CREATED)
.header("Content-Type", "application/json")
.body(response)
.build();
}
public class EmbeddingsStoreOutputResponse {
private SearchableDocument searchableDocument;
public EmbeddingsStoreOutputResponse(SearchableDocument searchableDocument) {
this.searchableDocument = searchableDocument;
}
此示例将 HTTP 输入流写入提供的 URL 上的语义文档存储。
const embeddingsStoreOutput = output.generic({
type: "embeddingsStore",
input: "{url}",
inputType: "url",
connectionName: "AISearchEndpoint",
collection: "openai-index",
model: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});
app.http('IngestFile', {
methods: ['POST'],
authLevel: 'function',
extraOutputs: [embeddingsStoreOutput],
handler: async (request, context) => {
let requestBody = await request.json();
if (!requestBody || !requestBody.url) {
throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
}
let uri = requestBody.url;
let url = new URL(uri);
let fileName = path.basename(url.pathname);
context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });
let response = {
status: "success",
title: fileName
};
return { status: 202, jsonBody: response }
}
});
interface EmbeddingsRequest {
url?: string;
}
const embeddingsStoreOutput = output.generic({
type: "embeddingsStore",
input: "{url}",
inputType: "url",
connectionName: "AISearchEndpoint",
collection: "openai-index",
model: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});
app.http('IngestFile', {
methods: ['POST'],
authLevel: 'function',
extraOutputs: [embeddingsStoreOutput],
handler: async (request, context) => {
let requestBody: EmbeddingsRequest | null = await request.json();
if (!requestBody || !requestBody.url) {
throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
}
let uri = requestBody.url;
let url = new URL(uri);
let fileName = path.basename(url.pathname);
context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });
let response = {
status: "success",
title: fileName
};
return { status: 202, jsonBody: response }
}
});
此示例将 HTTP 输入流写入提供的 URL 上的语义文档存储。
下面是 用于引入文件的function.json 文件:
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"name": "EmbeddingsStoreOutput",
"type": "embeddingsStore",
"direction": "out",
"input": "{url}",
"inputType": "Url",
"connectionName": "AISearchEndpoint",
"collection": "openai-index",
"model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
}
]
}
有关 function.json 文件属性的详细信息,请参阅配置部分。
using namespace System.Net
param($Request, $TriggerMetadata)
$ErrorActionPreference = 'Stop'
$inputJson = $Request.Body
if (-not $inputJson -or -not $inputJson.Url) {
throw 'Invalid request body. Make sure that you pass in {\"url\": value } as the request body.'
}
$uri = [URI]$inputJson.Url
$filename = [System.IO.Path]::GetFileName($uri.AbsolutePath)
Push-OutputBinding -Name EmbeddingsStoreOutput -Value @{
"title" = $filename
}
$response = @{
"status" = "success"
"title" = $filename
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $response
Headers = @{
"Content-Type" = "application/json"
}
})
此示例将 HTTP 输入流写入提供的 URL 上的语义文档存储。
@app.function_name("IngestFile")
@app.route(methods=["POST"])
@app.embeddings_store_output(arg_name="requests", input="{url}", input_type="url", connection_name="AISearchEndpoint", collection="openai-index", model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%")
def ingest_file(req: func.HttpRequest, requests: func.Out[str]) -> func.HttpResponse:
user_message = req.get_json()
if not user_message:
return func.HttpResponse(json.dumps({"message": "No message provided"}), status_code=400, mimetype="application/json")
file_name_with_extension = os.path.basename(user_message["url"])
title = os.path.splitext(file_name_with_extension)[0]
create_request = {
"title": title
}
requests.set(json.dumps(create_request))
response_json = {
"status": "success",
"title": title
}
return func.HttpResponse(json.dumps(response_json), status_code=200, mimetype="application/json")
特性
应用属性 EmbeddingsStoreOutput
来定义嵌入存储输出绑定,该绑定支持以下参数:
参数 | 说明 |
---|---|
Input | 要为其生成嵌入的输入字符串。 |
型号 | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
MaxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
MaxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
InputType | 可选。 获取输入的类型。 |
ConnectionName | 包含连接字符串值的应用设置或环境变量的名称。 此属性支持绑定表达式。 |
集合 | 要搜索的集合、表或索引的名称。 此属性支持绑定表达式。 |
批注
通过 EmbeddingsStoreOutput
批注可以定义嵌入存储输出绑定,该绑定支持以下参数:
元素 | 说明 |
---|---|
name | 获取或设置输出绑定的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
connectionName | 包含连接字符串值的应用设置或环境变量的名称。 此属性支持绑定表达式。 |
collection | 要搜索的集合、表或索引的名称。 此属性支持绑定表达式。 |
修饰符
在预览期间,将输出绑定定义为 semanticSearch
类型的 generic_output_binding
绑定,该绑定支持以下参数:
参数 | 说明 |
---|---|
arg_name | 表示绑定参数的变量的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
max_overlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
input_type | 获取输入的类型。 |
connection_name | 包含连接字符串值的应用设置或环境变量的名称。 此属性支持绑定表达式。 |
collection | 要搜索的集合、表或索引的名称。 此属性支持绑定表达式。 |
配置
绑定支持在 function.json 文件中设置的这些配置属性。
properties | 说明 |
---|---|
type | 必须是 embeddingsStore 。 |
direction | 必须是 out 。 |
name | 输出绑定的名称。 |
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
connectionName | 包含连接字符串值的应用设置或环境变量的名称。 此属性支持绑定表达式。 |
collection | 要搜索的集合、表或索引的名称。 此属性支持绑定表达式。 |
配置
绑定支持以下属性,这些属性在代码中定义:
properties | 说明 |
---|---|
input | 要为其生成嵌入的输入字符串。 |
model | 可选。 要使用的模型的 ID,默认为 text-embedding-ada-002 。 不应更改现有数据库的模型。 有关详细信息,请参阅用法。 |
maxChunkLength | 可选。 用于对输入进行分块的最大字符数。 有关详细信息,请参阅用法。 |
maxOverlap | 可选。 获取或设置区块之间重叠的最大字符数。 |
inputType | 可选。 获取输入的类型。 |
connectionName | 包含连接字符串值的应用设置或环境变量的名称。 此属性支持绑定表达式。 |
collection | 要搜索的集合、表或索引的名称。 此属性支持绑定表达式。 |
使用情况
有关完整示例,请参阅示例部分。