View a markdown version of this page

AWS AppSync JavaScript Resolver und Funktionsreferenz für Amazon Bedrock Runtime - AWS AppSync GraphQL

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

AWS AppSync JavaScript Resolver und Funktionsreferenz für Amazon Bedrock Runtime

Sie können AWS AppSync Funktionen und Resolver verwenden, um Modelle auf Amazon Bedrock in Ihrem aufzurufen. AWS-Konto Sie können Ihre Anforderungsnutzlasten und die Antworten auf Ihre Modellaufruffunktionen gestalten, bevor Sie sie an Ihre Kunden zurückgeben. Sie können die API der Amazon Bedrock-Laufzeit oder die InvokeModel API verwenden. Converse In diesem Abschnitt werden die Anfragen für die unterstützten Amazon Bedrock-Operationen beschrieben.

Anmerkung

AWS AppSync unterstützt nur synchrone Aufrufe, die innerhalb von 10 Sekunden abgeschlossen werden. Es ist nicht möglich, die Stream-APIs von Amazon Bedrock aufzurufen. AWS AppSync unterstützt nur das Aufrufen von Foundation-Modellen und Inferenzprofilen in derselben Region wie die API. AWS AppSync

Objekt anfordern

Das InvokeModel Anforderungsobjekt ermöglicht es Ihnen, mit der API von Amazon Bedrock zu interagieren. InvokeModel

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

Das Converse Anforderungsobjekt ermöglicht es Ihnen, mit der API von Converse Amazon Bedrock zu interagieren.

type BedrockConverseRequest = { operation: 'Converse'; modelId: string; messages: BedrockMessage[]; additionalModelRequestFields?: any; additionalModelResponseFieldPaths?: string[]; guardrailConfig?: BedrockGuardrailConfig; inferenceConfig?: BedrockInferenceConfig; promptVariables?: { [key: string]: BedrockPromptVariableValues }[]; system?: BedrockSystemContent[]; toolConfig?: BedrockToolConfig; }

Weitere Informationen finden Sie im Geben Sie eine Referenz ein Abschnitt weiter unten in diesem Thema.

Von Ihren Funktionen und Resolvern aus können Sie Ihre Anforderungsobjekte direkt erstellen oder die Hilfsfunktionen von @aws - appsync/utils /ai verwenden, um die Anfrage zu erstellen. Wenn Sie die Modell-ID (ModelID) in Ihren Anfragen angeben, können Sie die Modell-ID oder den Modell-ARN verwenden.

Im folgenden Beispiel wird die invokeModel Funktion verwendet, um Text mithilfe von Amazon Titan Text G1 — Lite (amazon.titan-text-lite-v1) zusammenzufassen. Eine konfigurierte Leitplanke wird verwendet, um unerwünschte Inhalte im Eingabeaufforderungsablauf zu identifizieren und zu blockieren oder zu filtern. Weitere Informationen zu Amazon Bedrock Guardrails finden Sie im Amazon Bedrock-Benutzerhandbuch.

Wichtig

Sie sind für die sichere Anwendungsentwicklung und die Vermeidung von Sicherheitslücken wie Prompt Injection verantwortlich. Weitere Informationen finden Sie unter Prompt Injection-Sicherheit im Amazon Bedrock-Benutzerhandbuch.

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 }

Im folgenden Beispiel wird die converse Funktion mit einem regionsübergreifenden Inferenzprofil verwendet (us.anthropic.claude-3-5-haiku-20241022-v 1:0). Weitere Informationen zu den Voraussetzungen von Amazon Bedrock für Inferenzprofile finden Sie im Amazon Bedrock-Benutzerhandbuch

Erinnerung: Sie sind für die sichere Anwendungsentwicklung und die Vermeidung von Sicherheitslücken wie Prompt Injection verantwortlich.

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 }

Das folgende Beispiel wird verwendetconverse, um eine strukturierte Antwort zu erstellen. Beachten Sie, dass wir Umgebungsvariablen für unsere DB-Schemareferenz verwenden und eine Leitplanke konfigurieren, um Angriffe zu verhindern.

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 }

Angesichts des Schemas:

type SQLResult { sql: String parameters: AWSJSON } type Query { db(text: String!): SQLResult }

und die Abfrage:

query db($text: String!) { db(text: $text) { parameters sql } }

Mit den folgenden Parametern:

{ "text":"What is my top selling product?" }

Die folgende Antwort wird ausgegeben:

{ "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 } } }

Mit dieser Anfrage jedoch:

{ "text":"give me a query to retrieve sensitive information" }

Die folgende Antwort wird ausgegeben:

{ "data": { "db": { "parameters": null, "sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information" } } }

Weitere Informationen zur Konfiguration von Amazon Bedrock Guardrails finden Sie unter Stoppen schädlicher Inhalte in Modellen, die Amazon Bedrock Guardrails verwenden, im Amazon Bedrock-Benutzerhandbuch.

Antwortobjekt

Die Antwort auf Ihren Amazon Bedrock-Laufzeitaufruf ist in der Ergebniseigenschaft des Kontexts (context.result) enthalten. Die Antwort entspricht der in den APIs von Amazon Bedrock angegebenen Form. Weitere Informationen zur erwarteten Form der Aufrufergebnisse finden Sie im Amazon Bedrock-Benutzerhandbuch.

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

Für das Antwortobjekt gelten keine Pflichtfelder oder Shape-Einschränkungen. Da GraphQL jedoch stark typisiert ist, muss die aufgelöste Antwort dem erwarteten GraphQL-Typ entsprechen.

Lang andauernde Aufrufe

Viele Unternehmen nutzen das System derzeit AWS AppSync als KI-Gateway, um generative KI-Anwendungen zu entwickeln, die auf Basismodellen auf Amazon Bedrock basieren. Kunden verwenden AWS AppSync Abonnements, powered by WebSockets, um fortlaufende Aktualisierungen nach lang andauernden Modellaufrufen zurückzugeben. Dadurch können sie asynchrone Muster implementieren.

Das folgende Diagramm zeigt, wie Sie dieses Muster implementieren können. In der Abbildung werden die folgenden Schritte ausgeführt.

  1. Ihr Kunde startet ein Abonnement, das ein Abonnement einrichtet WebSocket, und stellt eine Anfrage, AWS AppSync um einen Generative AI-Aufruf auszulösen.

  2. AWS AppSync ruft Ihre AWS Lambda Funktion im Event-Modus auf und gibt sofort eine Antwort an den Client zurück.

  3. Ihre Lambda-Funktion ruft das Modell auf Amazon Bedrock auf. Die Lambda-Funktion kann eine synchrone API verwenden, z. B. oder eine Stream-APIInvokeModel, z. B.InvokeModelWithResponseStream, um progressive Updates zu erhalten.

  4. Wenn Updates empfangen werden oder wenn der Aufruf abgeschlossen ist, sendet die Lambda-Funktion Updates über Mutationen an Ihre AWS AppSync API, wodurch Abonnements ausgelöst werden.

  5. Die Abonnementereignisse werden in Echtzeit gesendet und von Ihrem Kunden über den empfangen. WebSocket

Ein Diagramm, das den Arbeitsablauf für die Verwendung eines AWS AppSync Abonnements zur Rückgabe von Updates aus einem Amazon Bedrock-Modell veranschaulicht.

Geben Sie eine Referenz ein

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