Osadzanie usługi Azure OpenAI przechowuje powiązanie wyjściowe dla usługi Azure Functions
Ważne
Rozszerzenie Azure OpenAI dla usługi Azure Functions jest obecnie dostępne w wersji zapoznawczej.
Osadzanie usługi Azure OpenAI przechowuje powiązanie wyjściowe umożliwia zapisywanie plików w semantycznym magazynie dokumentów, do którego można się odwoływać w dalszej części wyszukiwania semantycznego.
Aby uzyskać informacje na temat konfigurowania i konfigurowania rozszerzenia Azure OpenAI, zobacz Azure OpenAI extensions for Azure Functions (Rozszerzenia azure OpenAI dla usługi Azure Functions). Aby dowiedzieć się więcej na temat klasyfikacji semantycznej w usłudze Azure AI Search, zobacz Semantic ranking in Azure AI Search (Ranking semantyczny w usłudze Azure AI Search).
Uwaga
Odwołania i przykłady są udostępniane tylko dla modelu Node.js w wersji 4.
Uwaga
Odwołania i przykłady są udostępniane tylko dla modelu języka Python w wersji 2.
Uwaga
Chociaż oba modele procesów języka C# są obsługiwane, udostępniane są tylko izolowane przykłady modeli procesów roboczych.
Przykład
W tym przykładzie strumień wejściowy HTTP jest zapisywany w magazynie dokumentów semantycznych pod podanym adresem 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; }
}
W tym przykładzie strumień wejściowy HTTP jest zapisywany w magazynie dokumentów semantycznych pod podanym adresem 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;
}
W tym przykładzie strumień wejściowy HTTP jest zapisywany w magazynie dokumentów semantycznych pod podanym adresem 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 }
}
});
W tym przykładzie strumień wejściowy HTTP jest zapisywany w magazynie dokumentów semantycznych pod podanym adresem URL.
Oto plik function.json do pozyskiwania plików:
{
"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%"
}
]
}
Aby uzyskać więcej informacji na temat function.json właściwości pliku, zobacz sekcję Konfiguracja.
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"
}
})
W tym przykładzie strumień wejściowy HTTP jest zapisywany w magazynie dokumentów semantycznych pod podanym adresem 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")
Atrybuty
Zastosuj atrybut, EmbeddingsStoreOutput
aby zdefiniować powiązanie wyjściowe magazynu osadzania, które obsługuje następujące parametry:
Parametr | Opis |
---|---|
Dane wejściowe | Ciąg wejściowy, dla którego mają być generowane osadzanie. |
Model | Opcjonalne. Identyfikator modelu do użycia, który domyślnie ma wartość text-embedding-ada-002 . Nie należy zmieniać modelu dla istniejącej bazy danych. Aby uzyskać więcej informacji, zobacz Użycie. |
MaxChunkLength | Opcjonalne. Maksymalna liczba znaków używanych do fragmentowania danych wejściowych. Aby uzyskać więcej informacji, zobacz Użycie. |
MaxOverlap | Opcjonalne. Pobiera lub ustawia maksymalną liczbę znaków nakładających się między fragmentami. |
InputType | Opcjonalne. Pobiera typ danych wejściowych. |
Nazwa połączenia | Nazwa ustawienia aplikacji lub zmiennej środowiskowej zawierającej wartość parametry połączenia. Ta właściwość obsługuje wyrażenia powiązań. |
Kolekcja | Nazwa kolekcji lub tabeli lub indeksu do wyszukania. Ta właściwość obsługuje wyrażenia powiązań. |
Adnotacje
Adnotacja EmbeddingsStoreOutput
umożliwia zdefiniowanie powiązania wyjściowego magazynu osadzania, które obsługuje następujące parametry:
Element | opis |
---|---|
name | Pobiera lub ustawia nazwę powiązania wyjściowego. |
wkład | Ciąg wejściowy, dla którego mają być generowane osadzanie. |
model | Opcjonalne. Identyfikator modelu do użycia, który domyślnie ma wartość text-embedding-ada-002 . Nie należy zmieniać modelu dla istniejącej bazy danych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxChunkLength | Opcjonalne. Maksymalna liczba znaków używanych do fragmentowania danych wejściowych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxOverlap | Opcjonalne. Pobiera lub ustawia maksymalną liczbę znaków nakładających się między fragmentami. |
inputType | Opcjonalne. Pobiera typ danych wejściowych. |
connectionName | Nazwa ustawienia aplikacji lub zmiennej środowiskowej zawierającej wartość parametry połączenia. Ta właściwość obsługuje wyrażenia powiązań. |
kolekcja | Nazwa kolekcji lub tabeli lub indeksu do wyszukania. Ta właściwość obsługuje wyrażenia powiązań. |
Dekoratory
W wersji zapoznawczej zdefiniuj powiązanie wyjściowe jako generic_output_binding
powiązanie typu semanticSearch
, które obsługuje następujące parametry:
Parametr | Opis |
---|---|
arg_name | Nazwa zmiennej reprezentującej parametr powiązania. |
wkład | Ciąg wejściowy, dla którego mają być generowane osadzanie. |
model | Opcjonalne. Identyfikator modelu do użycia, który domyślnie ma wartość text-embedding-ada-002 . Nie należy zmieniać modelu dla istniejącej bazy danych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxChunkLength | Opcjonalne. Maksymalna liczba znaków używanych do fragmentowania danych wejściowych. Aby uzyskać więcej informacji, zobacz Użycie. |
max_overlap | Opcjonalne. Pobiera lub ustawia maksymalną liczbę znaków nakładających się między fragmentami. |
input_type | Pobiera typ danych wejściowych. |
connection_name | Nazwa ustawienia aplikacji lub zmiennej środowiskowej zawierającej wartość parametry połączenia. Ta właściwość obsługuje wyrażenia powiązań. |
kolekcja | Nazwa kolekcji lub tabeli lub indeksu do wyszukania. Ta właściwość obsługuje wyrażenia powiązań. |
Konfigurowanie
Powiązanie obsługuje te właściwości konfiguracji ustawione w pliku function.json.
Właściwości | Opis |
---|---|
type | Musi mieć wartość embeddingsStore . |
direction | Musi mieć wartość out . |
name | Nazwa powiązania wyjściowego. |
wkład | Ciąg wejściowy, dla którego mają być generowane osadzanie. |
model | Opcjonalne. Identyfikator modelu do użycia, który domyślnie ma wartość text-embedding-ada-002 . Nie należy zmieniać modelu dla istniejącej bazy danych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxChunkLength | Opcjonalne. Maksymalna liczba znaków używanych do fragmentowania danych wejściowych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxOverlap | Opcjonalne. Pobiera lub ustawia maksymalną liczbę znaków nakładających się między fragmentami. |
inputType | Opcjonalne. Pobiera typ danych wejściowych. |
connectionName | Nazwa ustawienia aplikacji lub zmiennej środowiskowej zawierającej wartość parametry połączenia. Ta właściwość obsługuje wyrażenia powiązań. |
kolekcja | Nazwa kolekcji lub tabeli lub indeksu do wyszukania. Ta właściwość obsługuje wyrażenia powiązań. |
Konfigurowanie
Powiązanie obsługuje te właściwości zdefiniowane w kodzie:
Właściwości | opis |
---|---|
wkład | Ciąg wejściowy, dla którego mają być generowane osadzanie. |
model | Opcjonalne. Identyfikator modelu do użycia, który domyślnie ma wartość text-embedding-ada-002 . Nie należy zmieniać modelu dla istniejącej bazy danych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxChunkLength | Opcjonalne. Maksymalna liczba znaków używanych do fragmentowania danych wejściowych. Aby uzyskać więcej informacji, zobacz Użycie. |
maxOverlap | Opcjonalne. Pobiera lub ustawia maksymalną liczbę znaków nakładających się między fragmentami. |
inputType | Opcjonalne. Pobiera typ danych wejściowych. |
connectionName | Nazwa ustawienia aplikacji lub zmiennej środowiskowej zawierającej wartość parametry połączenia. Ta właściwość obsługuje wyrażenia powiązań. |
kolekcja | Nazwa kolekcji lub tabeli lub indeksu do wyszukania. Ta właściwość obsługuje wyrażenia powiązań. |
Użycie
Zobacz sekcję Przykład, aby zapoznać się z kompletnymi przykładami.