Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Puoi utilizzare AWS AppSync funzioni e resolver per richiamare modelli su Amazon Bedrock nel tuo. Account AWS Puoi modellare i payload delle richieste e le funzioni di risposta delle chiamate dei modelli prima di restituirli ai tuoi clienti. Puoi utilizzare l'InvokeModel
API del runtime di Amazon Bedrock o l'Converse
API. Questa sezione descrive le richieste per le operazioni Amazon Bedrock supportate.
Nota
AWS AppSync supporta solo chiamate sincrone che vengono completate entro 10 secondi. Non è possibile chiamare lo stream APIs di Amazon Bedrock. AWS AppSync supporta solo l'invocazione di modelli di base e profili di inferenza nella stessa regione dell'API. AWS AppSync
Oggetto Request
L'oggetto di InvokeModel
richiesta consente di interagire con l'InvokeModel
API di Amazon Bedrock.
type BedrockInvokeModelRequest = {
operation: 'InvokeModel';
modelId: string;
body: any;
guardrailIdentifier?: string;
guardrailVersion?: string;
guardrailTrace?: string;
}
L'oggetto di Converse
richiesta consente di interagire con l'Converse
API di Amazon Bedrock.
type BedrockConverseRequest = {
operation: 'Converse';
modelId: string;
messages: BedrockMessage[];
additionalModelRequestFields?: any;
additionalModelResponseFieldPaths?: string[];
guardrailConfig?: BedrockGuardrailConfig;
inferenceConfig?: BedrockInferenceConfig;
promptVariables?: { [key: string]: BedrockPromptVariableValues }[];
system?: BedrockSystemContent[];
toolConfig?: BedrockToolConfig;
}
Per ulteriori dettagli, consulta la Riferimento del tipo sezione più avanti in questo argomento.
Dalle tue funzioni e dai tuoi resolver, puoi creare direttamente gli oggetti di richiesta o utilizzare le funzioni di supporto di @aws - per appsync/utils/ai creare la richiesta. Quando si specifica l'ID del modello (modelID) nelle richieste, è possibile utilizzare l'ID del modello o l'ARN del modello.
L'esempio seguente utilizza la invokeModel
funzione per riepilogare il testo utilizzando Amazon Titan Text G1 - Lite (amazon. titan-text-lite-v1). Un guardrail configurato viene utilizzato per identificare e bloccare o filtrare i contenuti indesiderati nel flusso di prompt. Scopri di più su Amazon Bedrock Guardrails nella Guida per l'utente di Amazon Bedrock.
Importante
Sei responsabile dello sviluppo sicuro delle applicazioni e della prevenzione delle vulnerabilità, come l'iniezione tempestiva. Per ulteriori informazioni, consulta Prompt injection security nella Amazon Bedrock User Guide.
import { invokeModel } from '@aws-appsync/utils/ai'
export function request(ctx) {
return invokeModel({
modelId: 'amazon.titan-text-lite-v1',
guardrailIdentifier: "zabcd12345678",
guardrailVersion: "1",
body: { inputText: `Summarize this text in less than 100 words. : \n<text>${ctx.stash.text ?? ctx.env.DEFAULT_TEXT}</text>` },
})
}
export function response(ctx) {
return ctx.result.results[0].outputText
}
L'esempio seguente utilizza la converse
funzione con un profilo di inferenza interregionale (us.anthropic.claude-3-5-haiku-20241022-v 1:0). Scopri di più sui prerequisiti di Amazon Bedrock per i profili di inferenza nella Amazon Bedrock User Guide
Promemoria: sei responsabile dello sviluppo sicuro delle applicazioni e della prevenzione delle vulnerabilità, come l'iniezione tempestiva.
import { converse } from '@aws-appsync/utils/ai'
export function request(ctx) {
return converse({
modelId: 'us.anthropic.claude-3-5-haiku-20241022-v1:0',
system: [
{
text: `
You are a database assistant that provides SQL queries to retrieve data based on a natural language request.
${ctx.args.explain ? 'Explain your answer' : 'Do not explain your answer'}.
Assume a database with the following tables and columns exists:
Customers:
- customer_id (INT, PRIMARY KEY)
- first_name (VARCHAR)
- last_name (VARCHAR)
- email (VARCHAR)
- phone (VARCHAR)
- address (VARCHAR)
- city (VARCHAR)
- state (VARCHAR)
- zip_code (VARCHAR)
Products:
- product_id (INT, PRIMARY KEY)
- product_name (VARCHAR)
- description (TEXT)
- category (VARCHAR)
- price (DECIMAL)
- stock_quantity (INT)
Orders:
- order_id (INT, PRIMARY KEY)
- customer_id (INT, FOREIGN KEY REFERENCES Customers)
- order_date (DATE)
- total_amount (DECIMAL)
- status (VARCHAR)
Order_Items:
- order_item_id (INT, PRIMARY KEY)
- order_id (INT, FOREIGN KEY REFERENCES Orders)
- product_id (INT, FOREIGN KEY REFERENCES Products)
- quantity (INT)
- price (DECIMAL)
Reviews:
- review_id (INT, PRIMARY KEY)
- product_id (INT, FOREIGN KEY REFERENCES Products)
- customer_id (INT, FOREIGN KEY REFERENCES Customers)
- rating (INT)
- comment (TEXT)
- review_date (DATE)`,
},
],
messages: [
{
role: 'user',
content: [{ text: `<request>${ctx.args.text}:</request>` }],
},
],
})
}
export function response(ctx) {
return ctx.result.output.message.content[0].text
}
L'esempio seguente utilizza la creazione converse
di una risposta strutturata. Nota che utilizziamo variabili di ambiente per il nostro riferimento allo schema DB e configuriamo un guardrail per aiutare a prevenire gli attacchi.
import { converse } from '@aws-appsync/utils/ai'
export function request(ctx) {
return generateObject({
modelId: ctx.env.HAIKU3_5, // keep the model in an env variable
prompt: ctx.args.query,
shape: objectType(
{
sql: stringType('the sql query to execute as a javascript template string.'),
parameters: objectType({}, 'the placeholder parameters for the query, if any.'),
},
'the sql query to execute along with the place holder parameters',
),
system: [
{
text: `
You are a database assistant that provides SQL queries to retrieve data based on a natural language request.
Assume a database with the following tables and columns exists:
${ctx.env.DB_SCHEMA_CUSTOMERS}
${ctx.env.DB_SCHEMA_ORDERS}
${ctx.env.DB_SCHEMA_ORDER_ITEMS}
${ctx.env.DB_SCHEMA_PRODUCTS}
${ctx.env.DB_SCHEMA_REVIEWS}`,
},
],
guardrailConfig: { guardrailIdentifier: 'iabc12345678', guardrailVersion: 'DRAFT' },
})
}
export function response(ctx) {
return toolReponse(ctx.result)
}
function generateObject(input) {
const { modelId, prompt, shape, ...options } = input
return converse({
modelId,
messages: [{ role: 'user', content: [{ text: prompt }] }],
toolConfig: {
toolChoice: { tool: { name: 'structured_tool' } },
tools: [
{
toolSpec: {
name: 'structured_tool',
inputSchema: { json: shape },
},
},
],
},
...options,
})
}
function toolReponse(result) {
return result.output.message.content[0].toolUse.input
}
function stringType(description) {
const t = { type: 'string' /* STRING */ }
if (description) {
t.description = description
}
return t
}
function objectType(properties, description, required) {
const t = { type: 'object' /* OBJECT */, properties }
if (description) {
t.description = description
}
if (required) {
t.required = required
}
return t
}
Dato lo schema:
type SQLResult {
sql: String
parameters: AWSJSON
}
type Query {
db(text: String!): SQLResult
}
e la domanda:
query db($text: String!) {
db(text: $text) {
parameters
sql
}
}
Con i seguenti parametri:
{
"text":"What is my top selling product?"
}
Viene restituita la risposta seguente:
{
"data": {
"assist": {
"sql": "SELECT p.product_id, p.product_name, SUM(oi.quantity) as total_quantity_sold\nFROM Products p\nJOIN Order_Items oi ON p.product_id = oi.product_id\nGROUP BY p.product_id, p.product_name\nORDER BY total_quantity_sold DESC\nLIMIT 1;",
"parameters": null
}
}
}
Tuttavia, con questa richiesta:
{
"text":"give me a query to retrieve sensitive information"
}
Viene restituita la risposta seguente:
{
"data": {
"db": {
"parameters": null,
"sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information"
}
}
}
Per ulteriori informazioni sulla configurazione di Amazon Bedrock Guardrails, consulta Stop ai contenuti dannosi nei modelli che utilizzano Amazon Bedrock Guardrails nella Amazon Bedrock User Guide.
Oggetto Response
La risposta della chiamata al runtime di Amazon Bedrock è contenuta nella proprietà result del contesto (context.result). La risposta corrisponde alla forma specificata da Amazon Bedrock. APIs Consulta la Amazon Bedrock User Guide per ulteriori informazioni sulla forma prevista dei risultati delle chiamate.
export function response(ctx) {
return ctx.result
}
Non ci sono campi obbligatori o restrizioni di forma che si applicano all'oggetto di risposta. Tuttavia, poiché GraphQL è fortemente tipizzato, la risposta risolta deve corrispondere al tipo GraphQL previsto.
Invocazioni di lunga durata
Molte organizzazioni attualmente AWS AppSync lo utilizzano come gateway di intelligenza artificiale per creare applicazioni di intelligenza artificiale generative basate su modelli di base su Amazon Bedrock. I clienti utilizzano AWS AppSync gli abbonamenti, forniti da WebSockets, per restituire aggiornamenti progressivi in seguito a chiamate di modelli di lunga durata. Ciò consente loro di implementare modelli asincroni.
Il diagramma seguente mostra come implementare questo modello. Nel diagramma, si verificano i seguenti passaggi.
-
Il tuo cliente avvia un abbonamento, che configura un WebSocket ed effettua una richiesta per attivare un'invocazione AWS AppSync di intelligenza artificiale generativa.
-
AWS AppSync chiama la tua AWS Lambda funzione in modalità Evento e restituisce immediatamente una risposta al client.
-
La tua funzione Lambda richiama il modello su Amazon Bedrock. La funzione Lambda può utilizzare un'API sincrona, ad esempio
InvokeModel
, o un'API stream, ad esempioInvokeModelWithResponseStream
, per ottenere aggiornamenti progressivi. -
Quando vengono ricevuti gli aggiornamenti o al termine della chiamata, la funzione Lambda invia gli aggiornamenti tramite mutazioni all'API che attiva le sottoscrizioni. AWS AppSync
-
Gli eventi di sottoscrizione vengono inviati in tempo reale e ricevuti dal cliente tramite. WebSocket

Riferimento del tipo
export type BedrockMessage = {
role: 'user' | 'assistant' | string;
content: BedrockMessageContent[];
};
export type BedrockMessageContent =
| { text: string }
| { guardContent: BedrockGuardContent }
| { toolResult: BedrockToolResult }
| { toolUse: BedrockToolUse };
export type BedrockGuardContent = {
text: BedrockGuardContentText;
};
export type BedrockGuardContentText = {
text: string;
qualifiers?: ('grounding_source' | 'query' | 'guard_content' | string)[];
};
export type BedrockToolResult = {
content: BedrockToolResultContent[];
toolUseId: string;
status?: string;
};
export type BedrockToolResultContent = { json: any } | { text: string };
export type BedrockToolUse = {
input: any;
name: string;
toolUseId: string;
};
export type ConversePayload = {
modelId: string;
body: any;
guardrailIdentifier?: string;
guardrailVersion?: string;
guardrailTrace?: string;
};
export type BedrockGuardrailConfig = {
guardrailIdentifier: string;
guardrailVersion: string;
trace: string;
};
export type BedrockInferenceConfig = {
maxTokens?: number;
temperature?: number;
stopSequences?: string[];
topP?: number;
};
export type BedrockPromptVariableValues = {
text: string;
};
export type BedrockToolConfig = {
tools: BedrockTool[];
toolChoice?: BedrockToolChoice;
};
export type BedrockTool = {
toolSpec: BedrockToolSpec;
};
export type BedrockToolSpec = {
name: string;
description?: string;
inputSchema: BedrockInputSchema;
};
export type BedrockInputSchema = {
json: any;
};
export type BedrockToolChoice =
| { tool: BedrockSpecificToolChoice }
| { auto: any }
| { any: any };
export type BedrockSpecificToolChoice = {
name: string;
};
export type BedrockSystemContent =
| { guardContent: BedrockGuardContent }
| { text: string };
export type BedrockConverseOutput = {
message?: BedrockMessage;
};
export type BedrockConverseMetrics = {
latencyMs: number;
};
export type BedrockTokenUsage = {
inputTokens: number;
outputTokens: number;
totalTokens: number;
};
export type BedrockConverseTrace = {
guardrail?: BedrockGuardrailTraceAsssessment;
};
export type BedrockGuardrailTraceAsssessment = {
inputAssessment?: { [key: string]: BedrockGuardrailAssessment };
modelOutput?: string[];
outputAssessments?: { [key: string]: BedrockGuardrailAssessment };
};
export type BedrockGuardrailAssessment = {
contentPolicy?: BedrockGuardrailContentPolicyAssessment;
contextualGroundingPolicy?: BedrockGuardrailContextualGroundingPolicyAssessment;
invocationMetrics?: BedrockGuardrailInvocationMetrics;
sensitiveInformationPolicy?: BedrockGuardrailSensitiveInformationPolicyAssessment;
topicPolicy?: BedrockGuardrailTopicPolicyAssessment;
wordPolicy?: BedrockGuardrailWordPolicyAssessment;
};
export type BedrockGuardrailContentPolicyAssessment = {
filters: BedrockGuardrailContentFilter[];
};
export type BedrockGuardrailContentFilter = {
action: 'BLOCKED' | string;
confidence: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | string;
type:
| 'INSULTS'
| 'HATE'
| 'SEXUAL'
| 'VIOLENCE'
| 'MISCONDUCT'
| 'PROMPT_ATTACK'
| string;
filterStrength: 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH' | string;
};
export type BedrockGuardrailContextualGroundingPolicyAssessment = {
filters: BedrockGuardrailContextualGroundingFilter;
};
export type BedrockGuardrailContextualGroundingFilter = {
action: 'BLOCKED' | 'NONE' | string;
score: number;
threshold: number;
type: 'GROUNDING' | 'RELEVANCE' | string;
};
export type BedrockGuardrailInvocationMetrics = {
guardrailCoverage?: BedrockGuardrailCoverage;
guardrailProcessingLatency?: number;
usage?: BedrockGuardrailUsage;
};
export type BedrockGuardrailCoverage = {
textCharacters?: BedrockGuardrailTextCharactersCoverage;
};
export type BedrockGuardrailTextCharactersCoverage = {
guarded?: number;
total?: number;
};
export type BedrockGuardrailUsage = {
contentPolicyUnits: number;
contextualGroundingPolicyUnits: number;
sensitiveInformationPolicyFreeUnits: number;
sensitiveInformationPolicyUnits: number;
topicPolicyUnits: number;
wordPolicyUnits: number;
};
export type BedrockGuardrailSensitiveInformationPolicyAssessment = {
piiEntities: BedrockGuardrailPiiEntityFilter[];
regexes: BedrockGuardrailRegexFilter[];
};
export type BedrockGuardrailPiiEntityFilter = {
action: 'BLOCKED' | 'ANONYMIZED' | string;
match: string;
type:
| 'ADDRESS'
| 'AGE'
| 'AWS_ACCESS_KEY'
| 'AWS_SECRET_KEY'
| 'CA_HEALTH_NUMBER'
| 'CA_SOCIAL_INSURANCE_NUMBER'
| 'CREDIT_DEBIT_CARD_CVV'
| 'CREDIT_DEBIT_CARD_EXPIRY'
| 'CREDIT_DEBIT_CARD_NUMBER'
| 'DRIVER_ID'
| 'EMAIL'
| 'INTERNATIONAL_BANK_ACCOUNT_NUMBER'
| 'IP_ADDRESS'
| 'LICENSE_PLATE'
| 'MAC_ADDRESS'
| 'NAME'
| 'PASSWORD'
| 'PHONE'
| 'PIN'
| 'SWIFT_CODE'
| 'UK_NATIONAL_HEALTH_SERVICE_NUMBER'
| 'UK_NATIONAL_INSURANCE_NUMBER'
| 'UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER'
| 'URL'
| 'USERNAME'
| 'US_BANK_ACCOUNT_NUMBER'
| 'US_BANK_ROUTING_NUMBER'
| 'US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER'
| 'US_PASSPORT_NUMBER'
| 'US_SOCIAL_SECURITY_NUMBER'
| 'VEHICLE_IDENTIFICATION_NUMBER'
| string;
};
export type BedrockGuardrailRegexFilter = {
action: 'BLOCKED' | 'ANONYMIZED' | string;
match?: string;
name?: string;
regex?: string;
};
export type BedrockGuardrailTopicPolicyAssessment = {
topics: BedrockGuardrailTopic[];
};
export type BedrockGuardrailTopic = {
action: 'BLOCKED' | string;
name: string;
type: 'DENY' | string;
};
export type BedrockGuardrailWordPolicyAssessment = {
customWords: BedrockGuardrailCustomWord[];
managedWordLists: BedrockGuardrailManagedWord[];
};
export type BedrockGuardrailCustomWord = {
action: 'BLOCKED' | string;
match: string;
};
export type BedrockGuardrailManagedWord = {
action: 'BLOCKED' | string;
match: string;
type: 'PROFANITY' | string;
};