基于 Claude 与 Amazon Bedrock 构建客户支持 Agent:claude-quickstarts 实战指南
【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstarts
本指南以 claude-quickstarts 仓库中的customer-support-agent项目为核心,系统讲解如何基于 Claude 大模型与 Amazon Bedrock Knowledge Bases 构建一个具备知识检索、情绪识别、人工转接与高度可定制 UI 的客户支持聊天应用。读完本文,你将掌握该项目的环境配置、Bedrock RAG 知识库搭建、模型切换、结构化响应解析、AWS Amplify 部署以及按需裁剪界面的完整方案。
项目概览与核心特性
customer-support-agent是一个面向客户支持场景的聊天界面示例,核心组合是「Claude 模型对话 + Amazon Bedrock 知识检索(RAG)」。从 README 与源码可以归纳出以下核心能力:
- AI 对话:基于 Anthropic 的 Claude 模型生成回复,由 API 路由 统一调用
@anthropic-ai/sdk; - Bedrock RAG 检索:通过 BedrockAgentRuntimeClient 调用知识库为对话注入上下文;
- 实时思考过程与调试信息展示:接口返回
thinking、debug等字段,前端侧边栏实时渲染; - 知识来源可视化:RAG 检索到的来源(文件名、片段、相关性分数)通过响应头回传并展示在右侧边栏;
- 用户情绪检测与人工转接:模型输出
user_mood与redirect_to_agent,触发「转接人工」按钮; - 高可定制 UI:基于 shadcn/ui 组件构建,支持主题、布局灵活配置。
快速启动
按照 README 的指引,只需五步即可在本地跑起来:
- 克隆本仓库(
claude-quickstarts); - 在
customer-support-agent目录安装依赖:npm install; - 配置环境变量(见下文「环境变量与密钥配置」);
- 启动开发服务器:
npm run dev; - 浏览器打开
http://localhost:3000。
需要说明的运行前提:customer-support-agent/package.json中声明了"engines": { "node": ">=18.17.0" },建议使用 Node.js 18.17.0 及以上版本;框架为 Next.js 14.2.5(React 18),依赖中包含@aws-sdk/client-bedrock-agent-runtime、@anthropic-ai/sdk等核心库。
环境变量与密钥配置
在项目根目录创建.env.local文件,填入以下变量:
ANTHROPIC_API_KEY=your_anthropic_api_key BAWS_ACCESS_KEY_ID=your_aws_access_key BAWS_SECRET_ACCESS_KEY=your_aws_secret_key注意 AWS 相关变量名前有一个额外的B(BAWS_*而非AWS_*)。README 明确说明这是为部署阶段准备的:AWS Amplify 不允许以AWS开头的环境变量名,因此统一加前缀规避该限制。从源码看,app/lib/utils.ts 中的 Bedrock 客户端正是通过process.env.BAWS_ACCESS_KEY_ID与process.env.BAWS_SECRET_ACCESS_KEY读取凭证:
const bedrockClient = new BedrockAgentRuntimeClient({ region: "us-east-1", // Make sure this matches your Bedrock region credentials: { accessKeyId: process.env.BAWS_ACCESS_KEY_ID!, secretAccessKey: process.env.BAWS_SECRET_ACCESS_KEY!, }, });这里有两个容易踩坑的细节:一是region硬编码为us-east-1,需要与你的 Bedrock 知识库所在区域保持一致;二是.env.local仅作用于本地开发,部署到 Amplify 时要在控制台另行配置(见部署章节)。
获取 Claude API Key
- 访问 Anthropic 控制台(console.anthropic.com);
- 注册或登录账号;
- 点击 "Get API keys";
- 复制密钥填入
.env.local。
获取 AWS Access Key 与 Secret Key
- 登录 AWS 管理控制台,进入 IAM(身份与访问管理)控制台;
- 左侧菜单点击Users;
- 点击Create user创建新用户(创建用户截图);
- 在 Set Permission 页面选择Attach policies directly(授权方式截图);
- 权限策略选择AmazonBedrockFullAccess(策略选择截图);
- 完成 Review 并创建用户;
- 在用户 Summary 页面点击Create access key;
- 选择 "Application running on an AWS compute service",按需填写描述后创建;
- 页面会一次性展示 Access Key ID 与 Secret Access Key,务必妥善保存(密钥截图),因为关闭后无法再次查看;
- 将两个密钥填入
.env.local。
安全提醒:密钥只应在创建时可见,请勿公开分享;建议为最小权限原则考虑,生产环境可用更细粒度的策略替代
AmazonBedrockFullAccess。
Amazon Bedrock RAG 集成
这是项目的核心差异化能力:对话前先到 Bedrock 知识库中检索相关内容,再把检索结果拼进系统提示词,让 Claude 基于知识库内容回答。
检索链路与实现原理
前端把用户最新消息与选中的知识库 ID 通过POST /api/chat发给后端,app/lib/utils.ts 中的retrieveContext(query, knowledgeBaseId, n = 3)完成检索:
const input: RetrieveCommandInput = { knowledgeBaseId: knowledgeBaseId, retrievalQuery: { text: query }, retrievalConfiguration: { vectorSearchConfiguration: { numberOfResults: n }, }, }; const command = new RetrieveCommand(input); const response = await bedrockClient.send(command);其关键行为包括:
- 默认返回
n = 3条向量检索结果,可按需调整召回数量; - 若
knowledgeBaseId为空或检索抛错,会安全降级返回空上下文并置isRagWorking = false,不会中断对话(见 route.ts 的 try/catch 分支); - 检索结果会被组装为
RAGSource[](含id、fileName、snippet、score),通过响应头x-rag-sources回传前端用于来源可视化; - 最终上下文以纯文本拼接进系统提示词:
${isRagWorking ? retrievedContext : "No information found for this query."},并在debug.context_used中记录是否实际使用了知识库上下文。
配置你的知识库
- 确保 AWS 账号已开通 Bedrock 访问权限;
- 在目标区域创建 Bedrock 知识库;
- 将文档/语料索引进知识库(步骤见下文);
- 编辑 components/ChatArea.tsx 中的
knowledgeBases数组,替换为你的知识库 ID 与名称:
const knowledgeBases: KnowledgeBase[] = [ { id: "your-knowledge-base-id", name: "Your KB Name" }, // Add more knowledge bases as needed ];应用会在对话过程中使用这些知识库做上下文检索。前端顶栏也提供了知识库下拉选择器(与模型下拉并列),便于在多个知识库之间切换。
如何创建自己的知识库
- 进入 AWS 控制台选择Amazon Bedrock;
- 左侧菜单 "More" 下点击Knowledge base;
- 点击Create knowledge base(创建入口截图);
- 为知识库命名,可保留 "Create a new service role" 默认选项;
- 选择数据源,示例中使用 Amazon S3(数据源选择截图)。若用 S3,需先创建 bucket 并上传文件,也可以在知识库创建后再上传;
- 点击Next;
- 选择数据位置:可以是 S3 bucket、文件夹甚至单个文档;
- 点击Next;
- 选择 embedding 模型,示例使用 Titan Text Embeddings 2;
- 选择Quick create a new vector store(快速创建向量存储);
- 确认并创建知识库;
- 从知识库概览页获取knowledge base ID,填入
knowledgeBases数组。
切换模型
项目支持多个 Claude 模型并通过下拉菜单切换。在 components/ChatArea.tsx 中,models数组定义了可用模型,仓库当前默认包含三个:
const models: Model[] = [ { id: "claude-3-haiku-20240307", name: "Claude 3 Haiku" }, { id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" }, { id: "claude-3-5-sonnet-20240620", name: "Claude 3.5 Sonnet" }, ];当前选中的模型由selectedModelstate 控制:
const [selectedModel, setSelectedModel] = useState("claude-haiku-4-5-20251001");UI 层使用DropdownMenu组件渲染模型列表,选中后更新selectedModel,并在提交请求时通过model字段传给/api/chat,最终作为anthropic.messages.create({ model, ... })的入参。README 中给出的默认选中值为claude-3-haiku-20240307,而当前仓库源码默认值为claude-haiku-4-5-20251001,以实际代码为准;添加新模型只需向models数组追加{ id, name }即可。
后端 API 与结构化响应机制
customer-support-agent/app/api/chat/route.ts是前后端通信的核心。除了调用 Claude,它还承担了「结构化输出」的关键职责。
Zod 响应 Schema
为保证模型输出可被前端可靠解析,路由使用 Zod 定义了响应结构:
const responseSchema = z.object({ response: z.string(), thinking: z.string(), user_mood: z.enum([ "positive", "neutral", "negative", "curious", "frustrated", "confused", ]), suggested_questions: z.array(z.string()), debug: z.object({ context_used: z.boolean() }), matched_categories: z.array(z.string()).optional(), redirect_to_agent: z.object({ should_redirect: z.boolean(), reason: z.string().optional(), }).optional(), });模型生成的内容经过sanitizeAndParseJSON清洗(把字符串值内部的换行转义为\n后再JSON.parse)后,通过该 Schema 校验,保证响应字段完整、类型正确。
系统提示词与 JSON 输出
系统提示词把检索到的上下文、支持分类列表与 JSON 输出格式一并交给模型,要求其「整个响应必须是一个合法 JSON 对象」,并给出了带转接与不带转接两种示例。值得注意的实现技巧是:请求会把消息末尾追加一个内容为{的 assistant 消息(anthropicMessages.push({ role: "assistant", content: "{" })),诱导模型从「对象起始括号」之后继续生成,随后在拼装响应时补上前缀"{",从而显著提升 JSON 输出的稳定性。
响应头与调试信息
接口除返回 JSON body 外,还通过响应头传递辅助信息:
x-rag-sources:RAG 检索到的知识来源(JSON 序列化);X-Debug-Data:服务端调试信息,包含收到的消息数、最新消息长度、API Key 前缀掩码(如sk-****)与时间戳,长度限制为 1000 字符。
前端 ChatArea.tsx 会解析x-rag-sources并派发updateRagSources事件供右侧边栏展示,解析X-Debug-Data输出到控制台。服务端还通过performance.now()对「用户输入接收、RAG 开始/完成、Claude 生成、API 完成」等阶段计时并打印日志,便于定位延迟瓶颈。
支持分类(matched_categories)
分类清单定义在 app/lib/customer_support_categories.json 中,默认包含 8 个类别:account(账号)、billing(计费)、feature(功能)、internal(内部)、legal(法律)、other(其他)、technical(技术)、usage(使用),每个类别附带若干关键词。系统提示词会要求模型在回答之外,将命中类别 ID 写入matched_categories数组,多个命中可返回多个 ID,无命中返回空数组——这套机制可以支撑后续的工单自动分类与统计。
用户情绪检测与人工转接
这是该项目区别于普通聊天机器人的体验设计。模型在每次响应中输出:
user_mood:六档情绪标签(positive / neutral / negative / curious / frustrated / confused);redirect_to_agent:是否建议转接人工及原因;suggested_questions:建议的追问问题,前端渲染为可点击的快捷按钮,点击后自动作为新消息提交。
当redirect_to_agent.should_redirect为true时,前端MessageContent会渲染UISelector组件,展示一个"Talk to a human"按钮;点击后派发humanAgentRequested自定义事件(携带 reason、mood、timestamp),方便业务方接入真实的客服排队/工单系统。服务端也会在转接触发时输出🚨 AGENT REDIRECT TRIGGERED!与原因日志。同时,系统提示词约束:当检索不到相关信息、信息与问题无关,或问题与产品无关时,应引导用户转接人工。
界面定制
项目基于 shadcn/ui 组件体系构建,定制路径清晰:
- UI 组件:修改 components/ui 目录下的基础组件(按钮、卡片、对话框、下拉菜单、输入框、头像等);
- 全局样式:调整 app/globals.css 中的主题变量;
- 页面布局:在 app/page.tsx 中调整顶层导航、左右侧边栏与聊天区的组合,侧边栏组件通过
dynamic(..., { ssr: false })按需加载; - 主题色板:编辑 styles/themes.js,其结构如下:
// styles/themes.js export const themes = { neutral: { light: { // Light mode colors for neutral theme }, dark: { // Dark mode colors for neutral theme } }, // Add more themes here };新增主题或调整现有主题,只需修改该文件的颜色值;主题切换由 components/theme-provider.tsx 配合next-themes完成。
使用 AWS Amplify 部署
Amplify 构建配置
- 进入 AWS 控制台选择Amplify;
- 点击Create new app;
- 选择 GitHub(或其他代码托管平台)作为源码来源;
- 选择本仓库;
- 将构建配置(YAML)编辑为以下内容(仓库中的 amplify.yml 即为该配置的成品版本):
version: 1 frontend: phases: preBuild: commands: - npm ci --cache .npm --prefer-offline build: commands: - npm run build # Next.js build runs first - echo "ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY" >> .env - echo "KNOWLEDGE_BASE_ID=$KNOWLEDGE_BASE_ID" >> .env - echo "BAWS_ACCESS_KEY_ID=$BAWS_ACCESS_KEY_ID" >> .env - echo "BAWS_SECRET_ACCESS_KEY=$BAWS_SECRET_ACCESS_KEY" >> .env artifacts: baseDirectory: .next files: - "**/*" cache: paths: - .next/cache/**/* - .npm/**/*要点说明:preBuild阶段用npm ci做可复现安装;build阶段先执行 Next.js 构建,再把 Amplify 环境变量写入.env供服务端读取(注意此处引入了 README 中提到的KNOWLEDGE_BASE_ID,即知识库 ID 在部署场景下也走环境变量注入);cache阶段缓存.next/cache与.npm以加速后续构建。
- 选择新建服务角色或复用已有角色(见下文「Service Role」);
- 点击Advanced settings添加环境变量:
ANTHROPIC_API_KEY=your_anthropic_api_key BAWS_ACCESS_KEY_ID=your_aws_access_key BAWS_SECRET_ACCESS_KEY=your_aws_secret_key再次强调加B前缀的原因:AWS 不允许 Amplify 中出现以AWS开头的环境变量名,所以这里的键名沿用了BAWS_*。
- 点击Save and deploy开始部署。
Service Role(服务角色)
部署完成后,如果选择了新建服务角色,还需补齐 Bedrock 访问权限:
- 进入部署页面,选中刚创建的部署;
- 点击App settings;
- 复制Service role ARN;
- 到 IAM 控制台找到该角色;
- 为该角色附加AmazonBedrockFullAccess策略。
这样 Amplify 应用才具备与 Amazon Bedrock 交互的权限,避免部署成功但 RAG 检索全部失败。
灵活的侧边栏配置与 NPM 脚本
项目支持按需裁剪界面布局(左/右侧边栏),由根目录 config.ts 通过环境变量控制:
type Config = { includeLeftSidebar: boolean; includeRightSidebar: boolean; }; const config: Config = { includeLeftSidebar: process.env.NEXT_PUBLIC_INCLUDE_LEFT_SIDEBAR === "true", includeRightSidebar: process.env.NEXT_PUBLIC_INCLUDE_RIGHT_SIDEBAR === "true", }; export default config;两个环境变量的含义:
NEXT_PUBLIC_INCLUDE_LEFT_SIDEBAR:设为"true"时包含左侧边栏(展示思考过程、情绪、匹配分类);NEXT_PUBLIC_INCLUDE_RIGHT_SIDEBAR:设为"true"时包含右侧边栏(展示 RAG 知识来源)。
package.json 预置了对应的 NPM 脚本:
npm run dev # 完整应用(双侧边栏,默认) npm run build # 构建完整应用(双侧边栏,默认) npm run dev:full # 同 npm run dev npm run dev:left # 仅左侧边栏 npm run dev:right # 仅右侧边栏 npm run dev:chat # 仅聊天区(无侧边栏) npm run build:full # 同 npm run build npm run build:left # 构建仅左侧边栏 npm run build:right # 构建仅右侧边栏 npm run build:chat # 构建仅聊天区(无侧边栏)这些脚本通过在执行next dev/next build前设置对应环境变量来切换布局,例如dev:chat实质是NEXT_PUBLIC_INCLUDE_LEFT_SIDEBAR=false NEXT_PUBLIC_INCLUDE_RIGHT_SIDEBAR=false next dev。配合 app/page.tsx 中的条件渲染(config.includeLeftSidebar && <LeftSidebar />等),即可按测试、开发或生产需求灵活定制界面形态。当某侧边栏被禁用时,ChatArea.tsx 仍会监听对应的自定义事件(updateSidebar/updateRagSources),只是改为在控制台输出,方便你自行决定数据如何处理。
附录:原型声明
按 README 附录 的说明,本项目定位为原型(prototype),以 "as-is" 形式提供,不适用于生产或关键任务环境,可能包含缺陷与不一致之处。使用前请知悉:软件以预发布/beta/试用形态提供;开发者不对使用造成的任何问题、数据丢失或损害负责;不提供任何明示或暗示的担保;支持可能有限或不可用;使用风险自负。如需在生产环境落地,建议在充分测试、加固安全与可观测性之后再进行。项目整体作为 claude-quickstarts 仓库的一部分,旨在帮助开发者快速上手基于 Claude API 构建可部署的应用。
【免费下载链接】claude-quickstartsA collection of projects designed to help developers quickly get started with building deployable applications using the Claude API项目地址: https://gitcode.com/GitHub_Trending/an/claude-quickstarts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考