適用於 Azure Functions 的 Azure OpenAI 內嵌儲存輸出繫結
重要
適用於 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)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
if (requestBody == null || requestBody.Url == null)
{
throw new ArgumentException("Invalid request body. Make sure that you pass in {\"Url\": value } as the request body.");
}
Uri uri = new(requestBody.Url);
string filename = Path.GetFileName(uri.AbsolutePath);
IActionResult result = new OkObjectResult(new { status = HttpStatusCode.OK });
return new EmbeddingsStoreOutputResponse
{
HttpResponse = result,
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.SemanticSearch;
import com.sun.jndi.toolkit.url.Uri;
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 MalformedURLException {
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 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}
}
});
interface EmbeddingsFilePath {
FilePath?: string;
}
const embeddingsFilePathInput = input.generic({
input: '{FilePath}',
本範例會將 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
屬性來定義內嵌儲存輸出繫結,其支援下列參數:
參數 | 描述 |
---|---|
輸入 | 要為其產生內嵌的輸入字串。 |
模型 | 選擇性。 要使用的模型識別碼,預設為 text-embedding-ada-002 。 您不應該變更現有資料庫的模型。 如需詳細資訊,請參閱使用方式。 |
MaxChunkLength | 選擇性。 用於區塊化輸入的字元數目上限。 如需詳細資訊,請參閱使用方式。 |
MaxOverlap | 選擇性。 取得或設定區塊之間重疊的最大字元數目。 |
InputType | 選擇性。 取得輸入的類型。 |
ConnectionName | 包含連接字串值的應用程式設定或環境變數名稱。 此屬性支援繫結運算式。 |
集合 | 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。 |
註釋
批 EmbeddingsStoreOutput
注可讓您定義內嵌存放區輸出係結,其支援下列參數:
元素 | 描述 |
---|---|
name | 取得或設定輸出繫結的名稱。 |
input | 要為其產生內嵌的輸入字串。 |
model | 選擇性。 要使用的模型識別碼,預設為 text-embedding-ada-002 。 您不應該變更現有資料庫的模型。 如需詳細資訊,請參閱使用方式。 |
maxChunkLength | 選擇性。 用於區塊化輸入的字元數目上限。 如需詳細資訊,請參閱使用方式。 |
maxOverlap | 選擇性。 取得或設定區塊之間重疊的最大字元數目。 |
inputType | 選擇性。 取得輸入的類型。 |
connectionName | 包含連接字串值的應用程式設定或環境變數名稱。 此屬性支援繫結運算式。 |
collection | 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。 |
裝飾項目
在預覽期間,將輸出繫結定義為 semanticSearch
類型的 generic_output_binding
繫結,其支援下列參數:
參數 | 描述 |
---|---|
arg_name | 代表繫結參數的變數名稱。 |
input | 要為其產生內嵌的輸入字串。 |
model | 選擇性。 要使用的模型識別碼,預設為 text-embedding-ada-002 。 您不應該變更現有資料庫的模型。 如需詳細資訊,請參閱使用方式。 |
maxChunkLength | 選擇性。 用於區塊化輸入的字元數目上限。 如需詳細資訊,請參閱使用方式。 |
max_overlap | 選擇性。 取得或設定區塊之間重疊的最大字元數目。 |
input_type | 取得輸入的類型。 |
connection_name | 包含連接字串值的應用程式設定或環境變數名稱。 此屬性支援繫結運算式。 |
collection | 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。 |
組態
繫結支援您在 function.json 檔案中設定的下列組態屬性。
屬性 | 描述 |
---|---|
type | 必須是 embeddingsStore 。 |
direction | 必須是 out 。 |
name | 輸出繫結的名稱。 |
input | 要為其產生內嵌的輸入字串。 |
model | 選擇性。 要使用的模型識別碼,預設為 text-embedding-ada-002 。 您不應該變更現有資料庫的模型。 如需詳細資訊,請參閱使用方式。 |
maxChunkLength | 選擇性。 用於區塊化輸入的字元數目上限。 如需詳細資訊,請參閱使用方式。 |
maxOverlap | 選擇性。 取得或設定區塊之間重疊的最大字元數目。 |
inputType | 選擇性。 取得輸入的類型。 |
connectionName | 包含連接字串值的應用程式設定或環境變數名稱。 此屬性支援繫結運算式。 |
collection | 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。 |
組態
繫結支援您在程式碼中定義的下列屬性:
屬性 | 說明 |
---|---|
input | 要為其產生內嵌的輸入字串。 |
model | 選擇性。 要使用的模型識別碼,預設為 text-embedding-ada-002 。 您不應該變更現有資料庫的模型。 如需詳細資訊,請參閱使用方式。 |
maxChunkLength | 選擇性。 用於區塊化輸入的字元數目上限。 如需詳細資訊,請參閱使用方式。 |
maxOverlap | 選擇性。 取得或設定區塊之間重疊的最大字元數目。 |
inputType | 選擇性。 取得輸入的類型。 |
connectionName | 包含連接字串值的應用程式設定或環境變數名稱。 此屬性支援繫結運算式。 |
collection | 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。 |
使用方式
如需完整範例,請參閱範例一節。