Invoerbinding voor Azure OpenAI-insluitingen voor Azure Functions
Belangrijk
De Azure OpenAI-extensie voor Azure Functions is momenteel in preview.
Met de Invoerbinding van Azure OpenAI-insluitingen kunt u insluitingen genereren voor invoer. De binding kan insluitingen genereren op basis van bestanden of onbewerkte tekstinvoer.
Zie Azure OpenAI-extensies voor Azure Functions voor informatie over de installatie en configuratie van de Azure OpenAI-extensie. Zie Meer informatie over insluitingen in Azure OpenAI Service voor meer informatie over insluitingen in Azure OpenAI Service.
Notitie
Verwijzingen en voorbeelden worden alleen verstrekt voor het Node.js v4-model.
Notitie
Verwijzingen en voorbeelden worden alleen verstrekt voor het Python v2-model.
Notitie
Hoewel beide C#-procesmodellen worden ondersteund, worden alleen geïsoleerde werkrolmodelvoorbeelden gegeven.
Opmerking
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
[EmbeddingsInput("{rawText}", InputType.RawText, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
this.logger.LogInformation(
"Received {count} embedding(s) for input text containing {length} characters.",
embeddings.Count,
requestBody?.RawText?.Length);
// TODO: Store the embeddings into a database or other storage.
}
In dit voorbeeld ziet u hoe u insluitingen ophaalt die zijn opgeslagen in een opgegeven bestand dat toegankelijk is voor de functie.
[Function(nameof(GetEmbeddings_Http_FilePath))]
public async Task GetEmbeddings_Http_FilePath(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings-from-file")] HttpRequestData req,
[EmbeddingsInput("{filePath}", InputType.FilePath, MaxChunkLength = 512, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
using StreamReader reader = new(req.Body);
string request = await reader.ReadToEndAsync();
EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
this.logger.LogInformation(
"Received {count} embedding(s) for input file '{path}'.",
embeddings.Count,
requestBody?.FilePath);
// TODO: Store the embeddings into a database or other storage.
}
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
@FunctionName("GenerateEmbeddingsHttpRequest")
public HttpResponseMessage generateEmbeddingsHttpRequest(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "embeddings")
HttpRequestMessage<EmbeddingsRequest> request,
@EmbeddingsInput(name = "Embeddings", input = "{RawText}", inputType = InputType.RawText, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
final ExecutionContext context) {
if (request.getBody() == null)
{
throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
}
JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
context.getLogger().info(String.format("Received %d embedding(s) for input text containing %s characters.",
embeddingsContextJsonObject.getJSONObject("response")
.getJSONArray("data")
.getJSONObject(0)
.getJSONArray("embedding").length(),
request.getBody().getRawText().length()));
// TODO: Store the embeddings into a database or other storage.
return request.createResponseBuilder(HttpStatus.ACCEPTED)
.header("Content-Type", "application/json")
.build();
}
In dit voorbeeld ziet u hoe u insluitingen ophaalt die zijn opgeslagen in een opgegeven bestand dat toegankelijk is voor de functie.
@FunctionName("GenerateEmbeddingsHttpFilePath")
public HttpResponseMessage generateEmbeddingsHttpFilePath(
@HttpTrigger(
name = "req",
methods = {HttpMethod.POST},
authLevel = AuthorizationLevel.ANONYMOUS,
route = "embeddings-from-file")
HttpRequestMessage<EmbeddingsRequest> request,
@EmbeddingsInput(name = "Embeddings", input = "{FilePath}", inputType = InputType.FilePath, maxChunkLength = 512, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
final ExecutionContext context) {
if (request.getBody() == null)
{
throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
}
JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
context.getLogger().info(String.format("Received %d embedding(s) for input file %s.",
embeddingsContextJsonObject.getJSONObject("response")
.getJSONArray("data")
.getJSONObject(0)
.getJSONArray("embedding").length(),
request.getBody().getFilePath()));
// TODO: Store the embeddings into a database or other storage.
return request.createResponseBuilder(HttpStatus.ACCEPTED)
.header("Content-Type", "application/json")
.build();
}
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
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 = await request.json();
let response = 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}
}
});
const embeddingsFilePathInput = input.generic({
input: '{filePath}',
inputType: 'FilePath',
interface EmbeddingsHttpRequest {
RawText?: string;
}
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}
}
});
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
const embeddingsFilePathInput = input.generic({
input: '{filePath}',
inputType: 'FilePath',
type: 'embeddings',
maxChunkLength: 512,
model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})
app.http('getEmbeddingsFilePath', {
methods: ['POST'],
route: 'embeddings-from-file',
authLevel: 'function',
extraInputs: [embeddingsFilePathInput],
handler: async (request, context) => {
let requestBody = await request.json();
let response = context.extraInputs.get(embeddingsFilePathInput);
context.log(
`Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
);
// TODO: Store the embeddings into a database or other storage.
return {status: 202}
}
});
interface EmbeddingsFilePath {
FilePath?: string;
}
const embeddingsFilePathInput = input.generic({
input: '{filePath}',
inputType: 'FilePath',
type: 'embeddings',
maxChunkLength: 512,
model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})
app.http('getEmbeddingsFilePath', {
methods: ['POST'],
route: 'embeddings-from-file',
authLevel: 'function',
extraInputs: [embeddingsFilePathInput],
handler: async (request, context) => {
let requestBody: EmbeddingsFilePath = await request.json();
let response: any = context.extraInputs.get(embeddingsFilePathInput);
context.log(
`Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
);
// TODO: Store the embeddings into a database or other storage.
return {status: 202}
}
});
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
Dit is het function.json-bestand voor het genereren van de insluitingen:
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"route": "embeddings",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"name": "Embeddings",
"type": "embeddings",
"direction": "in",
"inputType": "RawText",
"input": "{rawText}",
"model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
}
]
}
Zie de sectie Configuratie voor meer informatie over function.json bestandseigenschappen.
using namespace System.Net
param($Request, $TriggerMetadata, $Embeddings)
$input = $Request.Body.RawText
Write-Host "Received $($Embeddings.Count) embedding(s) for input text containing $($input.Length) characters."
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::Accepted
})
In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.
@app.function_name("GenerateEmbeddingsHttpRequest")
@app.route(route="embeddings", methods=["POST"])
@app.embeddings_input(arg_name="embeddings", input="{rawText}", input_type="rawText", model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%")
def generate_embeddings_http_request(req: func.HttpRequest, embeddings: str) -> func.HttpResponse:
user_message = req.get_json()
embeddings_json = json.loads(embeddings)
embeddings_request = {
"raw_text": user_message.get("rawText")
}
logging.info(f'Received {embeddings_json.get("count")} embedding(s) for input text '
f'containing {len(embeddings_request.get("raw_text"))} characters.')
# TODO: Store the embeddings into a database or other storage.
return func.HttpResponse(status_code=200)
Kenmerken
Pas het EmbeddingsInput
kenmerk toe om een invoerbinding voor insluitingen te definiëren, die ondersteuning biedt voor deze parameters:
Parameter | Description |
---|---|
Invoer | De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd. |
Model |
Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002 . U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie. |
MaxChunkLength | Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie. |
MaxOverlap | Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld. |
InputType | Optioneel. Hiermee haalt u het type invoer op. |
Aantekeningen
Met de EmbeddingsInput
aantekening kunt u een invoerbinding voor insluitingen definiëren, die ondersteuning biedt voor deze parameters:
Element | Description |
---|---|
name | Hiermee haalt u de naam van de invoerbinding op of stelt u deze in. |
invoer | De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd. |
model |
Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002 . U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie. |
maxChunkLength | Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie. |
maxOverlap | Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld. |
inputType | Optioneel. Hiermee haalt u het type invoer op. |
Decorators
Definieer tijdens de preview de invoerbinding als een binding van het generic_input_binding
type embeddings
, die deze parameters ondersteunt: embeddings
decorator ondersteunt deze parameters:
Parameter | Description |
---|---|
arg_name | De naam van de variabele die de bindingsparameter vertegenwoordigt. |
invoer | De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd. |
model |
Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002 . U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie. |
maxChunkLength | Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie. |
max_overlap | Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld. |
input_type | Hiermee haalt u het type invoer op. |
Configuratie
De binding ondersteunt deze configuratie-eigenschappen die u in het function.json-bestand hebt ingesteld.
Eigenschappen | Beschrijving |
---|---|
type | Moet EmbeddingsInput zijn. |
direction | Moet in zijn. |
name | De naam van de invoerbinding. |
invoer | De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd. |
model |
Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002 . U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie. |
maxChunkLength | Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie. |
maxOverlap | Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld. |
inputType | Optioneel. Hiermee haalt u het type invoer op. |
Configuratie
De binding ondersteunt deze eigenschappen, die zijn gedefinieerd in uw code:
Eigenschappen | Beschrijving |
---|---|
invoer | De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd. |
model |
Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002 . U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie. |
maxChunkLength | Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie. |
maxOverlap | Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld. |
inputType | Optioneel. Hiermee haalt u het type invoer op. |
Zie de sectie Voorbeeld voor volledige voorbeelden.
Gebruik
Als u de standaard insluitingen model
wijzigt, wordt de manier gewijzigd waarop insluitingen worden opgeslagen in de vectordatabase. Als u het standaardmodel wijzigt, kunnen de zoekacties niet goed werken wanneer ze niet overeenkomen met de rest van de gegevens die eerder in de vectordatabase zijn opgenomen. Het standaardmodel voor insluitingen is text-embedding-ada-002
.
Houd er bij het berekenen van de maximale tekenlengte voor invoersegmenten rekening mee dat de maximuminvoertokens die zijn toegestaan voor insluitingsmodellen van de tweede generatie, zijn8191
.text-embedding-ada-002
Een enkel token is ongeveer vier tekens lang (in het Engels), wat resulteert in ongeveer 32.000 (Engelse) tekens van invoer die in één segment passen.