重要
現在、Azure Functions 用の Azure OpenAI 拡張機能はプレビュー段階です。
Azure OpenAI 埋め込みストアの出力バインドを使ってファイルをセマンティック ドキュメント ストアに書き込み、セマンティック検索で後で参照できるようにすることができます。
Azure OpenAI 拡張機能のセットアップと構成の詳細については、「Azure Functions 用の Azure OpenAI 拡張機能」を参照してください。 Azure AI 検索でのセマンティック ランク付けの詳細については、「Azure AI Search でのセマンティック ランク付け」を参照してください。
注
リファレンスと例は、Node.js v4 モデルに対してのみ提供されています。
注
リファレンスと例は、Python v2 モデルに対してのみ提供されます。
注
両方の C# プロセス モデルがサポートされていますが、 isolated worker モデル 例のみが提供されます。
例
この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。
public class EmbeddingsRequest
{
[JsonPropertyName("url")]
public string? Url { get; set; }
}
[Function("IngestFile")]
public static async Task<EmbeddingsStoreOutputResponse> IngestFile(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsStoreOutputResponse badRequestResponse = new()
{
HttpResponse = new BadRequestResult(),
SearchableDocument = new SearchableDocument(string.Empty)
};
if (string.IsNullOrWhiteSpace(request))
{
return badRequestResponse;
}
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))
{
return badRequestResponse;
}
string filename = Path.GetFileName(uri.AbsolutePath);
return new EmbeddingsStoreOutputResponse
{
HttpResponse = new OkObjectResult(new { status = HttpStatusCode.OK }),
SearchableDocument = new SearchableDocument(filename)
};
}
この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。
@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,
storeConnectionName = "AISearchEndpoint", collection = "openai-index",
embeddingsModel = "%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;
}
public SearchableDocument getSearchableDocument() {
return searchableDocument;
}
}
この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。
const embeddingsStoreOutput = output.generic({
type: "embeddingsStore",
input: "{url}",
inputType: "url",
connectionName: "AISearchEndpoint",
collection: "openai-index",
embeddingsModel: "%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",
embeddingsModel: "%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 }
}
});
この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。
ファイルを取り込むための 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",
"storeConnectionName": "AISearchEndpoint",
"collection": "openai-index",
"embeddingsModel": "%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"
}
})
この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。
@app.function_name("IngestFile")
@app.route(methods=["POST"])
@app.embeddings_store_output(
arg_name="requests",
input="{url}",
input_type="url",
store_connection_name="AISearchEndpoint",
collection="openai-index",
embeddings_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
属性を適用して、これらのパラメーターをサポートする埋め込みストア出力バインドを定義します。
パラメーター | 説明 |
---|---|
入力 | 埋め込みを生成する入力文字列。 |
AIConnectionName | 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。 |
EmbeddingsModel |
省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。 |
MaxChunkLength | 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。 |
MaxOverlap | 省略可。 チャンク間で重複する文字の最大数を取得または設定します。 |
InputType | 省略可。 入力の型を取得します。 |
StoreConnectionName | 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。 |
コレクション | 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。 |
注釈
EmbeddingsStoreOutput
注釈を使用すると、次のパラメーターをサポートする埋め込みストア出力バインドを定義できます。
要素 | 説明 |
---|---|
名前 | 出力バインドの名前を取得または設定します。 |
インプット | 埋め込みを生成する入力文字列。 |
aiConnectionName | 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。 |
embeddingsModel |
省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。 |
maxChunkLength | 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。 |
maxOverlap | 省略可。 チャンク間で重複する文字の最大数を取得または設定します。 |
inputType | 省略可。 入力の型を取得します。 |
storeConnectionName | 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。 |
コレクション | 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。 |
デコレーター
プレビュー中に、出力バインドをこれらのパラメーターをサポートする generic_output_binding
型の semanticSearch
バインドとして定義します。
パラメーター | 説明 |
---|---|
arg_name | バインド パラメーターを表す変数の名前。 |
インプット | 埋め込みを生成する入力文字列。 |
ai_connection_name | 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。 |
embeddings_model |
省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。 |
maxChunkLength | 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。 |
max_overlap | 省略可。 チャンク間で重複する文字の最大数を取得または設定します。 |
input_type | 入力の型を取得します。 |
store_connection_name | 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。 |
コレクション | 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。 |
構成
このバインドでは、function.json ファイルで設定したこれらの構成プロパティをサポートします。
プロパティ | 説明 |
---|---|
タイプ |
embeddingsStore である必要があります。 |
方向 |
out である必要があります。 |
名前 | 出力バインドの名前。 |
インプット | 埋め込みを生成する入力文字列。 |
aiConnectionName | 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。 |
embeddingsModel |
省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。 |
maxChunkLength | 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。 |
maxOverlap | 省略可。 チャンク間で重複する文字の最大数を取得または設定します。 |
inputType | 省略可。 入力の型を取得します。 |
storeConnectionName | 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。 |
コレクション | 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。 |
構成
このバインドでは、コードで定義されている、これらのプロパティをサポートします。
プロパティ | 説明 |
---|---|
インプット | 埋め込みを生成する入力文字列。 |
aiConnectionName | 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。 |
embeddingsModel |
省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。 |
maxChunkLength | 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。 |
maxOverlap | 省略可。 チャンク間で重複する文字の最大数を取得または設定します。 |
inputType | 省略可。 入力の型を取得します。 |
storeConnectionName | 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。 |
コレクション | 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。 |
使用方法
完全な例については、セクションの例を参照してください。