使用JavaScript SDK v3操作Amazon Bedrock Runtime的完整指南
概述
Amazon Bedrock Runtime是一项完全托管的服务,它简化了使用来自第三方提供商和亚马逊的基础模型的过程。本文将详细介绍如何使用AWS SDK for JavaScript (v3)与Amazon Bedrock Runtime进行交互。
核心概念解析
什么是Amazon Bedrock Runtime?
Bedrock Runtime是AWS提供的一项托管服务,它允许开发者轻松访问和使用各种基础模型(Foundation Models)。这些模型包括:
- 文本生成模型(如Amazon Titan Text、Anthropic Claude等)
- 图像生成模型(如Amazon Nova Canvas)
- 多模态模型
为什么使用JavaScript SDK v3?
AWS SDK for JavaScript v3提供了现代化的API设计,具有以下优势:
- 模块化架构,可按需导入
- 改进的类型支持
- 更好的错误处理机制
- 更高效的性能
准备工作
环境要求
- Node.js环境(建议使用最新LTS版本)
- AWS账户配置
- 必要的IAM权限
重要注意事项
- 使用这些代码可能会产生AWS费用
- 建议遵循最小权限原则
- 使用模型前必须申请访问权限
代码示例详解
基础示例
Hello Bedrock示例
// 最简单的Bedrock调用示例
import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime";
const client = new BedrockRuntimeClient({ region: "us-west-2" });
async function invokeModel() {
const input = {
modelId: "amazon.titan-text-express-v1",
contentType: "application/json",
accept: "*/*",
body: JSON.stringify({
inputText: "请用中文解释什么是Amazon Bedrock"
})
};
const command = new InvokeModelCommand(input);
const response = await client.send(command);
const result = JSON.parse(Buffer.from(response.body).toString());
console.log(result.results[0].outputText);
}
invokeModel();
进阶场景
多模型调用场景
这个场景展示了如何同时调用多个不同的基础模型:
// 多模型调用示例
import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime";
const models = [
"amazon.titan-text-express-v1",
"anthropic.claude-v2",
"meta.llama2-13b-chat-v1"
];
async function compareModelResponses(prompt) {
const client = new BedrockRuntimeClient({ region: "us-west-2" });
const responses = await Promise.all(models.map(async modelId => {
const input = {
modelId,
body: JSON.stringify({ prompt }),
contentType: "application/json"
};
const response = await client.send(new InvokeModelCommand(input));
return {
modelId,
response: JSON.parse(Buffer.from(response.body).toString())
};
}));
responses.forEach(({modelId, response}) => {
console.log(`=== ${modelId} ===`);
console.log(response);
});
}
工具使用场景
这个高级场景展示了如何将AI模型与外部API(如天气API)集成:
// 工具使用示例
import { BedrockRuntimeClient, ConverseCommand } from "@aws-sdk/client-bedrock-runtime";
async function getWeatherWithAI(location) {
const client = new BedrockRuntimeClient({ region: "us-west-2" });
const input = {
modelId: "anthropic.claude-3-sonnet-20240229-v1:0",
messages: [{
role: "user",
content: `获取${location}的当前天气`
}],
toolConfig: {
tools: [{
name: "get_current_weather",
description: "获取指定位置的当前天气",
inputSchema: {
type: "object",
properties: {
location: { type: "string" }
},
required: ["location"]
}
}]
}
};
const command = new ConverseCommand(input);
const response = await client.send(command);
// 处理工具调用请求
if (response.stopReason === "tool_use") {
const toolCall = response.output.toolUses[0];
if (toolCall.name === "get_current_weather") {
// 这里实际调用天气API
const weatherData = await fetchWeather(toolCall.input.location);
// 将结果返回给模型
const followUp = new ConverseCommand({
modelId: input.modelId,
messages: [
...input.messages,
{
role: "assistant",
content: response.output.message
},
{
role: "user",
content: JSON.stringify(weatherData)
}
]
});
const finalResponse = await client.send(followUp);
return finalResponse.output.message;
}
}
return response.output.message;
}
模型特定实现
Amazon Titan Text模型
// Titan Text模型调用示例
async function generateTextWithTitan(prompt) {
const client = new BedrockRuntimeClient({ region: "us-west-2" });
const input = {
modelId: "amazon.titan-text-express-v1",
body: JSON.stringify({
inputText: prompt,
textGenerationConfig: {
maxTokenCount: 4096,
stopSequences: [],
temperature: 0.7,
topP: 0.9
}
}),
contentType: "application/json"
};
const response = await client.send(new InvokeModelCommand(input));
return JSON.parse(Buffer.from(response.body).toString());
}
Anthropic Claude模型
// Claude 3模型流式响应示例
async function streamWithClaude(prompt) {
const client = new BedrockRuntimeClient({ region: "us-west-2" });
const input = {
modelId: "anthropic.claude-3-sonnet-20240229-v1:0",
messages: [{ role: "user", content: prompt }],
stream: true
};
const command = new ConverseCommand(input);
const response = await client.send(command);
for await (const streamEvent of response.stream) {
if (streamEvent.contentBlockDelta) {
process.stdout.write(streamEvent.contentBlockDelta.delta.text);
}
}
}
最佳实践
- 错误处理:始终处理可能的API错误
- 性能优化:对于长时间运行的操作,考虑使用流式响应
- 安全考虑:
- 不要硬编码凭证
- 使用IAM角色最小权限原则
- 成本控制:
- 监控API调用次数
- 设置预算警报
常见问题解答
Q: 为什么我收到"Model not accessible"错误? A: 使用模型前必须先在AWS控制台中申请访问权限。
Q: 如何选择合适的模型? A: 根据任务类型选择:
- 通用文本:Claude或Titan
- 编程相关:Claude或Llama
- 多语言支持:Llama或Mistral
Q: 流式响应和普通响应有什么区别? A: 流式响应可以逐步接收输出,适合长文本生成场景,能提供更好的用户体验。
总结
本文详细介绍了如何使用JavaScript SDK v3与Amazon Bedrock Runtime交互,从基础调用到高级场景实现。通过合理利用Bedrock提供的各种基础模型,开发者可以快速构建强大的AI应用,而无需关心底层基础设施管理。
建议从简单的文本生成开始,逐步尝试更复杂的工具集成场景,以充分利用Bedrock Runtime的强大功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考