Inserciones de Azure OpenAI para almacenar el enlace de salida para Azure Functions
Importante
La extensión de Azure OpenAI para Azure Functions está actualmente en versión preliminar.
El enlace de salida del almacén de inserciones de Azure OpenAI permite escribir archivos en un almacén de documentos semántico al que se puede hacer referencia más adelante en una búsqueda semántica.
Para obtener información sobre la configuración y los detalles de configuración de la extensión de Azure OpenAI, consulte Extensiones de Azure OpenAI para Azure Functions. Para más información sobre la clasificación semántica en Búsqueda de Azure AI, consulte Clasificación semántica en Búsqueda de Azure AI.
Nota:
Las referencias y ejemplos solo se proporcionan para el modelo de Node.js v4.
Nota:
Las referencias y ejemplos solo se proporcionan para el modelo de Python v2.
Nota:
Aunque se admiten ambos modelos de proceso de C#, solo se proporcionan ejemplos de modelos de trabajo aislados.
Ejemplo
En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.
[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; }
}
En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.
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;
}
En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.
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 }
}
});
En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.
Este es el archivo de function.json para la ingesta de archivos:
{
"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%"
}
]
}
Para obtener más información sobre las propiedades del archivo function.json, consulte la sección de Configuración.
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"
}
})
En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.
@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")
Atributos
Aplique el atributo EmbeddingsStoreOutput
para definir un enlace de salida del almacén de inserciones, que admite estos parámetros:
Parámetro | Descripción |
---|---|
Entrada | Cadena de entrada para la que se van a generar inserciones. |
Modelo | Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002 . No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso. |
MaxChunkLength | Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso. |
MaxOverlap | Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos. |
InputType | Opcional. Obtiene el tipo de la entrada. |
ConnectionName | Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace. |
Colección | Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace. |
anotaciones
La EmbeddingsStoreOutput
anotación permite definir un enlace de salida del almacén de incrustaciones, que admite estos parámetros:
Elemento | Descripción |
---|---|
name | Obtiene o establece el nombre del enlace de salida. |
input | Cadena de entrada para la que se van a generar inserciones. |
model | Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002 . No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso. |
maxChunkLength | Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso. |
maxOverlap | Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos. |
inputType | Opcional. Obtiene el tipo de la entrada. |
connectionName | Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace. |
collection | Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace. |
Elementos Decorator
Durante la versión preliminar, defina el enlace de salida como un enlace generic_output_binding
de tipo semanticSearch
, que admite estos parámetros:
Parámetro | Descripción |
---|---|
arg_name | Nombre de la variable que representa el parámetro de enlace. |
input | Cadena de entrada para la que se van a generar inserciones. |
model | Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002 . No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso. |
maxChunkLength | Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso. |
max_overlap | Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos. |
input_type | Obtiene el tipo de la entrada. |
connection_name | Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace. |
collection | Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace. |
Configuración
El enlace admite estas propiedades de configuración que se establecen en el archivo function.json.
Propiedad | Descripción |
---|---|
type | Debe ser embeddingsStore . |
direction | Debe ser out . |
name | Nombre del enlace de salida. |
input | Cadena de entrada para la que se van a generar inserciones. |
model | Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002 . No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso. |
maxChunkLength | Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso. |
maxOverlap | Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos. |
inputType | Opcional. Obtiene el tipo de la entrada. |
connectionName | Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace. |
collection | Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace. |
Configuración
El enlace admite estas propiedades, que se definen en el código:
Propiedad | Descripción |
---|---|
input | Cadena de entrada para la que se van a generar inserciones. |
model | Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002 . No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso. |
maxChunkLength | Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso. |
maxOverlap | Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos. |
inputType | Opcional. Obtiene el tipo de la entrada. |
connectionName | Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace. |
collection | Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace. |
Uso
Consulte la sección de ejemplos para ver ejemplos completos.