共用方式為


適用於 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)
{
    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)
    };

本範例會將 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 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 要搜尋的集合、資料表或索引名稱。 此屬性支援繫結運算式。

使用方式

如需完整範例,請參閱範例一節。