View a markdown version of this page

AWS AppSync JavaScript resolver e riferimento alle funzioni per il runtime di Amazon Bedrock - AWS AppSync GraphQL

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à.

AWS AppSync JavaScript resolver e riferimento alle funzioni per il runtime di Amazon Bedrock

Puoi utilizzare AWS AppSync funzioni e resolver per richiamare modelli su Amazon Bedrock nel tuo. Account AWS Puoi modellare i payload delle richieste e la risposta delle funzioni di richiamo dei modelli prima di restituirli ai tuoi clienti. Puoi utilizzare l'API o l'InvokeModelAPI del runtime di Amazon Bedrock. Converse 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 le API di streaming di Amazon Bedrock. AWS AppSync supporta solo il richiamo di modelli di base e profili di inferenza nella stessa regione dell'API. AWS AppSync

Oggetto Request

L'oggetto della InvokeModel richiesta consente di interagire con l'API di Amazon Bedrock. InvokeModel

type BedrockInvokeModelRequest = { operation: 'InvokeModel'; modelId: string; body: any; guardrailIdentifier?: string; guardrailVersion?: string; guardrailTrace?: string; }

L'oggetto della Converse richiesta consente di interagire con l'API di Amazon Bedrock. Converse

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 maggiori dettagli, consulta la Riferimento di tipo sezione più avanti in questo argomento.

Tramite le funzioni e i resolver, potete creare direttamente gli oggetti della richiesta o utilizzare le funzioni di supporto di @aws - appsync/utils /ai per 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 Amazon Bedrock User Guide.

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 viene utilizzato converse per creare 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 Bloccare i contenuti dannosi nei modelli che utilizzano Amazon Bedrock Guardrails nella Amazon Bedrock User Guide.

Oggetto Response

La risposta alla chiamata del runtime di Amazon Bedrock è contenuta nella proprietà result del contesto (context.result). La risposta corrisponde alla forma specificata dalle API di Amazon Bedrock. Consulta la Amazon Bedrock User Guide per ulteriori informazioni sulla forma prevista dei risultati di chiamata.

export function response(ctx) { return ctx.result }

Non ci sono campi obbligatori o restrizioni di forma applicabili 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 utilizzano AWS AppSync 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 da richiami di modelli di lunga durata. Ciò consente loro di implementare modelli asincroni.

Il diagramma seguente mostra come è possibile implementare questo modello. Nel diagramma, si verificano i seguenti passaggi.

  1. Il cliente avvia un abbonamento, che imposta un e WebSocket invia una richiesta per attivare una chiamata AWS AppSync all'IA generativa.

  2. AWS AppSync chiama la tua AWS Lambda funzione in modalità Evento e restituisce immediatamente una risposta al client.

  3. La tua funzione Lambda richiama il modello su Amazon Bedrock. La funzione Lambda può utilizzare un'API sincrona, ad esempio, o un'API di streamingInvokeModel, ad esempio, per ottenere aggiornamenti progressiviInvokeModelWithResponseStream.

  4. Non appena gli aggiornamenti vengono ricevuti o quando l'invocazione viene completata, la funzione Lambda invia aggiornamenti tramite mutazioni all'API che attivano le sottoscrizioni. AWS AppSync

  5. Gli eventi di sottoscrizione vengono inviati in tempo reale e ricevuti dal cliente tramite. WebSocket

Un diagramma che illustra il flusso di lavoro per l'utilizzo di un AWS AppSync abbonamento per restituire gli aggiornamenti da un modello Amazon Bedrock.

Riferimento di 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; };