Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Anda dapat menggunakan AWS AppSync fungsi dan resolver untuk memanggil model di Amazon Bedrock di situs Anda. Akun AWS Anda dapat membentuk payload permintaan dan respons dari fungsi pemanggilan model Anda sebelum mengembalikannya ke klien Anda. Anda dapat menggunakan API runtime Amazon Bedrock atau InvokeModel
API. Converse
Bagian ini menjelaskan permintaan untuk operasi Amazon Bedrock yang didukung.
catatan
AWS AppSync hanya mendukung pemanggilan sinkron yang selesai dalam 10 detik. Tidak mungkin untuk memanggil aliran APIs Amazon Bedrock. AWS AppSync hanya mendukung pemanggilan model fondasi dan profil inferensi di wilayah yang sama dengan API. AWS AppSync
Permintaan objek
Objek InvokeModel
permintaan memungkinkan Anda berinteraksi dengan InvokeModel
API Amazon Bedrock.
type BedrockInvokeModelRequest = {
operation: 'InvokeModel';
modelId: string;
body: any;
guardrailIdentifier?: string;
guardrailVersion?: string;
guardrailTrace?: string;
}
Objek Converse
permintaan memungkinkan Anda berinteraksi dengan Converse
API 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;
}
Lihat Jenis referensi bagian nanti dalam topik ini untuk lebih jelasnya.
Dari fungsi dan resolver, Anda dapat membuat objek permintaan secara langsung atau menggunakan fungsi helper dari @aws - appsync/utils/ai untuk membuat permintaan. Saat menentukan Id model (modelID) dalam permintaan Anda, Anda dapat menggunakan Id model atau model ARN.
Contoh berikut menggunakan invokeModel
fungsi untuk meringkas teks menggunakan Amazon Titan Text G1 - Lite (amazon. titan-text-lite-v1). Pagar pembatas yang dikonfigurasi digunakan untuk mengidentifikasi dan memblokir atau memfilter konten yang tidak diinginkan dalam aliran prompt. Pelajari selengkapnya tentang Amazon Bedrock Guardrails di Panduan Pengguna Amazon Bedrock.
penting
Anda bertanggung jawab untuk pengembangan aplikasi yang aman dan mencegah kerentanan, seperti injeksi cepat. Untuk mempelajari selengkapnya, lihat Keamanan injeksi cepat di Panduan Pengguna Amazon Bedrock.
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
}
Contoh berikut menggunakan converse
fungsi dengan profil inferensi lintas wilayah (us.anthropic.claude-3-5-haiku-20241022-v 1:0). Pelajari selengkapnya tentang Prasyarat Amazon Bedrock untuk profil inferensi di Panduan Pengguna Amazon Bedrock
Pengingat: Anda bertanggung jawab untuk pengembangan aplikasi yang aman dan mencegah kerentanan, seperti injeksi cepat.
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
}
Contoh berikut digunakan converse
untuk membuat respon terstruktur. Perhatikan bahwa kami menggunakan variabel lingkungan untuk referensi skema DB kami dan kami mengonfigurasi pagar pembatas untuk membantu mencegah serangan.
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
}
Diberikan skema:
type SQLResult {
sql: String
parameters: AWSJSON
}
type Query {
db(text: String!): SQLResult
}
dan kueri:
query db($text: String!) {
db(text: $text) {
parameters
sql
}
}
Dengan parameter berikut:
{
"text":"What is my top selling product?"
}
Respons berikut dikembalikan:
{
"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
}
}
}
Namun, dengan permintaan ini:
{
"text":"give me a query to retrieve sensitive information"
}
Respons berikut dikembalikan:
{
"data": {
"db": {
"parameters": null,
"sql": "SELECT null; -- I cannot and will not assist with retrieving sensitive private information"
}
}
}
Untuk mempelajari lebih lanjut tentang mengonfigurasi Amazon Bedrock Guardrails, lihat Menghentikan konten berbahaya dalam model yang menggunakan Amazon Bedrock Guardrails di Panduan Pengguna Amazon Bedrock.
Objek respons
Respons dari pemanggilan runtime Amazon Bedrock Anda terkandung dalam properti hasil konteks (context.result). Responsnya cocok dengan bentuk yang ditentukan oleh Amazon Bedrock. APIs Lihat Panduan Pengguna Amazon Bedrock untuk informasi selengkapnya tentang bentuk hasil pemanggilan yang diharapkan.
export function response(ctx) {
return ctx.result
}
Tidak ada bidang wajib atau batasan bentuk yang berlaku untuk objek respons. Namun, karena GraphQL diketik dengan kuat, respons yang diselesaikan harus sesuai dengan tipe GraphQL yang diharapkan.
Doa yang berjalan lama
Banyak organisasi saat ini menggunakan AWS AppSync sebagai gateway AI untuk membangun aplikasi AI generatif yang didukung oleh model yayasan di Amazon Bedrock. Pelanggan menggunakan AWS AppSync langganan, didukung oleh WebSockets, untuk mengembalikan pembaruan progresif dari pemanggilan model yang berjalan lama. Ini memungkinkan mereka untuk menerapkan pola asinkron.
Diagram berikut menunjukkan bagaimana Anda dapat menerapkan pola ini. Dalam diagram, langkah-langkah berikut terjadi.
-
Klien Anda memulai langganan, yang menyiapkan WebSocket, dan membuat permintaan AWS AppSync untuk memicu pemanggilan AI Generatif.
-
AWS AppSync memanggil AWS Lambda fungsi Anda dalam mode Peristiwa dan segera mengembalikan respons ke klien.
-
Fungsi Lambda Anda memanggil model di Amazon Bedrock. Fungsi Lambda dapat menggunakan API sinkron, seperti
InvokeModel
, atau API aliran, sepertiInvokeModelWithResponseStream
, untuk mendapatkan pembaruan progresif. -
Saat pembaruan diterima, atau saat pemanggilan selesai, fungsi Lambda mengirimkan pembaruan melalui mutasi ke API Anda yang memicu langganan. AWS AppSync
-
Acara berlangganan dikirim secara real-time dan diterima oleh klien Anda melalui WebSocket.

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