使用 AWS Bedrock 知识库创建 AI 驱动的 Slackbot
Source: Dev.to
请提供您希望翻译的具体文本内容(除代码块和 URL 之外),我将为您翻译成简体中文并保持原有的 Markdown 格式。
迄今为止,阻力最低、投资回报率最高的大语言模型(LLM)应用之一是 内部 AI 助手
是的,AI 并不一定非得是面向客户的聊天机器人或完全自主的代理。一个让用户可以提出以下问题的简单界面,就能成为强大的工具:
- “我该如何部署这个服务?”
- “这个警报的值班手册在哪里?”
- “最新的设计文档图示在哪里?”
这些问题的答案已经存在——分散在 Confluence 页面、Google 文档、GitHub README 和 Slack 线程中。问题不在于生成,而在于 检索。
开箱即用的 LLM 在推理和摘要方面表现出色,但它们与组织的制度性知识完全脱节。提示填充(prompt stuffing)略有帮助。微调在非常狭窄的场景下有效。但当你的知识库每周都在变化,或当正确性真正重要时,这两者都无法扩展。
这正是检索增强生成(RAG)填补的空白
RAG 弥合了概率语言模型与确定性内部知识之间的鸿沟。与其让 LLM 猜测,你可以:
- 检索 相关文档。
- 让 模型在该上下文基础上合成答案。
这样得到的助手既显得智能,又不轻率——关键是它可以在无需持续再训练的情况下保持最新。
如果你已经在使用 AWS,Amazon Bedrock Knowledge Bases 提供了一种简便方式来创建、部署并将 RAG 集成到现有基础设施中。在本文中,我们将演示如何使用 AWS Bedrock 知识库,并将其连接到 Slack 机器人,以实现真实的内部 AI 助手用例。

设置 AWS Bedrock 知识库
-
打开 AWS 控制台 → Amazon Bedrock → Build → Knowledge Bases。
-
截至撰写本文时,Bedrock 支持通过以下方式对非结构化数据进行索引:
- 自定义向量存储,
- Kendra GenAI 服务,或
- 使用结构化数据的语义搜索(例如数据库、表格)。
由于大多数内部数据是非结构化的(Confluence 文档、Markdown 文件等),请选择 “Create knowledge base with vector store.”
-
数据源选项(目前限制为 5 种):Confluence、Salesforce、SharePoint、S3 上的网页爬虫等。
本演示中我们将使用 Confluence。
将 Confluence 凭证存储在 AWS Secrets Manager,如官方指南所述。 -
配置解析和分块
- 选择 AWS 默认解析器或基础模型(例如 Claude)作为解析器。
- 为向量数据库选择分块策略。
Bedrock 将自动对文档进行分块、生成嵌入,并将向量存储在 OpenSearch Serverless 中。
为了快速演示,保持默认设置并使用 Amazon Titan embeddings。
-
同步数据源
向量存储创建后,手动触发同步。
您以后可以添加其他来源(SharePoint PDF、开源库文档、内部 S3 文件等)。
设置 Slack 机器人
- 在 Slack 管理控制台 创建一个 Slack 应用。
- 启用 Socket Mode。
- 添加最小的 OAuth 权限范围:
chat:writeapp_mentions:readchannels:history
- 从 基本信息 页面获取 Bot Token。
机器人实现(Python + Slack Bolt)
我们将使用 Slack Bolt SDK 来创建一个机器人,它能够:
- 解析 Slack 事件(提及、斜杠命令等)
- 查询 Bedrock 知识库
- 生成响应

伪代码
def handler(event, context):
# 1️⃣ 从 Slack 事件中提取用户消息
text = extract_slack_message(event)
# 2️⃣ 从知识库检索相关片段
retrieval = bedrock.retrieve(
knowledgeBaseId=KB_ID,
query=text,
retrievalConfiguration={
"vectorSearchConfiguration": {"numberOfResults": 5}
},
)
# 3️⃣ 构建将用户查询与检索到的上下文结合的提示词
prompt = build_prompt(
user_question=text,
retrieved_chunks=retrieval["results"]
)
# 4️⃣ 通过 Bedrock Runtime 调用 LLM(例如 Claude Sonnet)
response = bedrock_runtime.invoke_model(
modelId="arn:aws:bedrock:us-east-1:...:inference-profile/us.anthropic.claude-sonnet-4-5-20250929-v1:0",
body=prompt,
)
# 5️⃣ 将答案发送回 Slack
post_to_slack(response)
性能调优
由于大模型(LLM)具有非确定性,我们应当使用明确的系统提示来引导它们。RAG 提供“内部”知识,而提示工程则提升相关性和安全性。
提示模板
You are an internal engineering assistant.
Answer the question using ONLY the provided context.
If the answer is not in the context, say you do not know.
{{retrieved_chunks}}
Question: {{user_question}}
技巧
- 将上下文大小控制在模型的 token 限制范围内(例如 Claude Sonnet 为 4 KB)。
- 试验
temperature=0以获得更确定性的输出。 - 根据延迟与相关性之间的权衡,调整
numberOfResults和块大小。
小结
- 创建一个由向量存储(OpenSearch Serverless)支持的 Bedrock 知识库。
- 连接内部数据源(Confluence、SharePoint、S3 等),让 Bedrock 负责解析、分块和嵌入。
- 构建一个 Slack 机器人,检索相关块,将它们与简洁的系统提示一起输入 LLM,并将答案返回给用户。
- 迭代提示和检索设置,以优化准确性、延迟和成本。
附加说明
- 进入全屏模式
- 退出全屏模式
我们可以调节的另一个维度是如何嵌入和存储内部知识。AWS 有一篇关于内容分块工作原理的优秀指南(适用于知识库)。关键要点是,根据数据的结构不同,采用不同的分块方案会有更好的表现。例如,许多 Confluence 文档具有自然的层级结构,包括标题和正文,因此使用层级分块可以更好地关联信息,从而提升检索性能。
总结
AI 驱动的 Slack 机器人正快速成为内部知识的前门。借助 Amazon Bedrock 知识库,AWS 让构建 RAG 变得容易,基本不需要自行运营和维护向量数据库。
有了像 ChatGPT 和 Claude 这样的强大大语言模型,创建 Slack 机器人比以往任何时候都更简单。如果您想将自己的方案与可运行的模型进行比较,AWS 团队在 GitHub 上提供了一个稍显过时但仍可用的示例,您可以参考。