大多数关于RAG的教程都是以同样的方式结束的:你最终会得到一个可以正常运行的原型系统,以及一套用于存储向量数据库的解决方案,这套系统无论是否有人在使用,都会持续运行。如果再添加一个始终处于开启状态的嵌入服务、一个托管式的大语言模型端点,再加上常见的AWS基础设施,那么在第一个用户出现之前,你就已经需要支付大量的费用了。

但实际上并不一定非得这样才行。在这个教程中,你将部署一个完全无服务器架构的RAG处理流程,该流程能够处理文档、图片、视频和音频数据,并且当没有人使用它时,其资源消耗会降为零。

所有这些功能都在你的AWS账户中运行,你的数据也永远不会离开你的基础设施。对于一个规模较小的知识库系统来说,你每月所需的费用大概在200到300美元之间,而远远不会达到300美元。

我们将使用RAGStack-Lambda这个开源项目来进行演示。通过这个教程的学习,你最终会得到一个已经部署好的处理流程系统,其中包括一个控制面板、一个能够提供引用信息的人工智能聊天界面、一个可以嵌入到任何应用程序中的Web组件,以及一个可用于为你的知识库系统提供上下文信息的MCP服务器。

目录

  1. 实际费用是多少

  2. 你将构建什么

  3. 先决条件

  4. 通过AWS Marketplace进行部署

  5. 从源代码开始部署

  6. 上传你的第一份文档

  7. 与你的知识库进行交互

  8. 将Web组件嵌入到你的应用程序中

  9. 使用MCP服务器

  10. 从这里开始,你可以构建什么

  11. 总结

实际费用是多少

在开始任何操作之前,我们先来谈谈费用的问题,因为了解成本结构才是整个学习过程的核心所在。

RAG处理流程通常包含两个阶段的费用:数据导入阶段(一次性处理你的文档)和后续使用阶段(长期查询这些文档)。

大多数平台都会收取固定的月费,而无论你处于哪个阶段。但是无服务器架构则有所不同:数据导入阶段会产生成一定的费用,而之后的使用阶段则不会产生任何额外费用。

数据导入阶段:一次性成本

当你上传文档时,系统会执行以下操作:文本提取(针对PDF和图片进行光学字符识别)、嵌入信息的生成、元数据的提取以及文档的存储。下面是各项服务的具体费用:

TextExtract(光学字符识别):这是数据导入阶段中最昂贵的环节,但它仅适用于需要提取文本的扫描PDF文件和图片。对于纯文本文件、HTML文件、CSV文件以及其他基于文本的格式,这一环节是完全不需要执行的。

Textract针对标准文本检测服务,每1,000页收取约1.50美元的费用。如果您上传500页扫描后的PDF文件,费用约为0.75美元;而如果初次上传数千页扫描文件,费用可能会在5到10美元之间。不过一旦您的文档被处理完毕,除非您再次添加新的文档,否则无需再支付这些费用。

Bedrock Embeddings (Nova Multimodal):该服务会将您的内容转换为向量格式,以便进行语义搜索。其收费标准低得惊人:

  • 文本:每1,000个输入字符收取0.00002美元

  • 图片:每张图片收取0.00115美元

  • 视频/音频:每分钟收取0.00200美元

举个例子来说,如果您有1,500份文本文件,每份文件平均包含2,500个字符,那么进行嵌入处理的总费用约为0.08美元。而一个包含500张图片的知识库,其嵌入成本仅为0.58美元。即使是一个由文本、图片以及几小时视频组成的混合数据集,整个嵌入处理过程的费用也远低于2美元。需要注意的是,这些费用只需支付一次——除非您添加或更新了新的文档,否则无需再次支付。

Bedrock LLM (元数据提取):RAGStack会使用大语言模型来分析每份文档,并自动提取结构化的元数据。对于每份文档而言,这一过程只需要进行几次推理计算,而所使用的模型可能是Nova Lite或类似的模型。按照每百万输入/输出字符0.06至0.24美元的费用标准计算,处理1,500份文档的总费用远低于1美元。

S3 Vectors (存储服务):用于存储经过嵌入处理的数据。按照每月每GB 0.06美元的标准计算,一个包含1,500份文档、每份文档的向量维度为1,024的知识库,其存储成本几乎可以忽略不计——每月只需支付几美分而已。

S3 (文档存储服务):用于存储原始文档。费用更加低廉,仅为每月每GB 0.023美元。

DynamoDB:用于存储文档的元数据及处理状态。由于其采用按请求计费的模式,因此在数据导入阶段需要支付相应费用,而在数据静态存储期间则无需额外付费。对于初次导入大量数据的情况,所需费用也仅为几美分而已。

举个具体的例子来说,如果您上传200份文本文件(无论是PDF格式、HTML格式还是markdown格式),那么整个数据导入过程的费用很可能低于1美元。而如果您上传1,000份需要进行OCR处理的扫描PDF文件,一次性费用可能会在5到8美元之间。有时人们会提到7到10美元这个数字,那其实是针对初次上传大量文件、且需要进行大量OCR处理的情况而言的最高费用标准。

扩展性:零基础也能轻松应对大规模需求

一旦您的文档被导入系统,后续的处理流程就会进入等待状态,并不会立即开始运行。下面我们来具体了解一下各项服务的收费标准:

Lambda:调用次数和执行时长都会被计入费用。免费套餐每月提供100万次调用额度。对于个人或小型团队使用来说,很可能永远都用不到超过这个免费额度的服务。

S3 Vectors (查询服务):每进行100万次查询API调用,收取2.50美元的费用,此外还会根据处理的数据量额外收费。对于一个每月被查询几百次的小型索引来说,实际费用几乎可以忽略不计。

Bedrock (聊天推理服务):这是您的主要运营成本。每次聊天响应都需要调用大语言模型。如果使用Nova Lite模型,按照每百万输入字符0.06美元、每百万输出字符0.24美元的标准计算,一次典型的聊天查询费用可能在0.001到0.003美元之间。如果每月进行100次查询,总费用约为0.10到0.30美元。

步骤函数:用于协调文档处理流程。标准工作流程中,每发生1,000次状态转换,需支付0.025美元的费用;在运行过程中,这种功能的消耗非常低,因为它仅在数据导入阶段才会被激活。

Cognito:用户身份验证服务。对于每月活跃用户数量不超过10,000人的用户来说,该服务是免费的。

CloudFront:用于提供仪表盘界面所需的服务。免费 tier允许用户每月传输最多1 TB的数据。

API Gateway:用于处理GraphQL API请求。免费 tier允许用户每月发起最多100万次API调用。

假设某个知识库包含500份文档,而这些文档每月会被查询几百次,那么其每月的运营成本大概会在0.50美元到3.00美元之间。其中大部分费用实际上都是用于支持LLM模型生成聊天回复所需的计算资源。

真正值得比较的地方

以下是使用传统架构构建的相同处理流程的详细成本对比:

服务名称 传统架构成本 RAGStack-Lambda成本
向量数据库 Pinecone Starter:70美元/月;OpenSearch Serverless:至少350美元/月 S3 Vectors:几美分/月
计算资源 EC2或ECS:50至150美元/月 Lambda:免费tier
LLM推理成本 每次查询的成本相同 每次查询的成本相同
总成本(空闲状态时) 120至500美元/月 约0.50美元至3.00美元/月

无论采用哪种架构,LLM模型每次查询所需的成本大致都是相同的——这是因为Bedrock采用了按需计费的模式。真正的区别在于其他各项费用:传统架构无论是否有人使用,都会产生固定的成本;而无服务器架构则只按实际使用的资源来付费,空闲状态时几乎不会产生任何费用。

那Transcribe服务呢?

如果需要上传视频或音频文件,AWS的Transcribe服务会收取语音转文本的费用。标准转录服务的收费标准约为每分钟0.024美元;对于10分钟长的视频来说,转录费用为0.24美元。这部分费用只需支付一次,在视频或音频被转录并嵌入到系统中后,生成的文本片段就可以像其他文档一样被查询使用了。

你最终将构建什么

完成本教程的学习后,你将会拥有一个能够完成以下功能的处理流程:

  1. 你可以通过网页仪表盘上传文档(PDF、图片、视频、音频、HTML、CSV格式等,具体支持类型非常丰富)。
  2. 该处理流程会自动识别文件类型,并将其转发给相应的处理工具:扫描后的PDF文件会通过Textract进行OCR处理;视频和音频文件则会经过Transcribe服务进行语音转文本处理,同时会被分割成长度为30秒、可搜索的片段,并附带说话者的身份信息;图片则会被生成视觉嵌入码,同时也会保留你添加的标题文字。
  3. LLM模型会自动分析每份文档,提取其中的结构化元数据、主题、文档类型、时间范围、被提及的人名等相关信息。
  4. 所有处理后的数据都会使用Amazon Nova Multimodal Embeddings技术进行嵌入处理,然后存储在由S3 Vectors支持的Bedrock知识库中。
  5. 你或你的用户可以通过AI聊天界面提出问题,该处理流程会自动检索相关的文档,将这些文档作为上下文传递给Bedrock LLM模型,最终生成包含可折叠引用信息的答案;对于视频和音频文件,还会提供直接跳转到相应位置的链接。

所有这些功能都在你的AWS账户中运行。不需要任何外部控制层,也不需要除AWS之外的第三方服务。

架构设计

显示AWS架构的流程图。文档处理涉及S3、Lambda OCR、Step Functions以及Amazon Bedrock;聊天API则使用AppSync和Lambda。

关于这个架构设计,有几点需要注意:

Step Functions负责协调整个处理流程。当文档被上传后,状态机会管理整个处理流程:它会检测文件类型,将文件转发给相应的处理模块,等待像“转录任务”这样的异步操作完成,之后再触发嵌入处理和元数据提取操作。

正是这种设计使得该处理流程无需运行任何服务器就能保持可靠性。如果某个步骤失败,系统会自动重试;你也可以清楚地了解到每份文档在处理流程中的当前位置。

Lambda负责具体的计算工作。每一个处理环节实际上都是一个Lambda函数。这些函数会在需要时被启动,运行几秒到几分钟后就会关闭。因此,根本不会有什么EC2实例在凌晨3点还在空闲运行。

S3 Vectors是用于存储向量的数据仓库。你的向量数据被保存在S3专门为存储向量数据而设计的存储系统中,而不是像Pinecone或OpenSearch这样的专用向量数据库中。

正因为如此,才能实现“零成本扩展”的目标:你只需要按照对象存储的费用标准来支付向量数据的存储费用,而无需维持任何数据库集群的运行。同时,你的向量数据也保存在自己的S3桶里,而不是由第三方服务来管理。

Cognito负责处理身份验证工作。控制面板和API都是通过Cognito用户池来进行保护的。在部署时,你会通过电子邮件收到一个临时密码;Web组件使用基于IAM的身份验证机制,而服务器端的集成则使用API密钥进行认证。

CloudFront用于提供UI界面。控制面板实际上是一个静态的React应用,它是通过CloudFront来提供的,因此根本不需要维护任何Web服务器。

两种部署方式

根据你的需求,有两种不同的部署方法可供选择:

  1. 通过AWS Marketplace进行部署(最快的方式):只需点击“部署”按钮,填写两个字段(栈名称和电子邮件地址),然后等待大约10分钟即可。这种方式不需要使用任何本地工具。我们首先会介绍这种部署方法。

  2. 从源代码开始进行部署(开发人员专用方式):你需要克隆仓库,运行`publish.py`脚本,然后通过SAM CLI来进行部署。如果你想要自定义处理流程、修改UI界面,或者为该项目做出贡献,就可以选择这种部署方法。我们会在介绍完AWS Marketplace的部署方式之后再详细讲解这种方法。

这两种部署方法最终都会生成相同的系统配置。只不过通过AWS Marketplace进行部署时,CloudFormation模板会被封装在一个“一键部署”的流程中而已。

先决条件

在开始部署之前,你需要准备以下这些事项:

  • 需要一个具有创建CloudFormation堆栈、Lambda函数、S3存储桶、DynamoDB表以及Cognito用户池权限的AWS账户。如果你使用的是管理员账户,那么这些权限已经满足要求了。

  • 需要具备访问Bedrock模型的权限:RAGStack默认使用us-east-1区域,因为该区域提供了Nova Multimodal Embeddings服务。亚马逊自家的模型(包括Nova)在Bedrock中也是可用的,无需进行任何手动配置——只需确保你的IAM角色具有必要的bedrock:InvokeModel权限即可。

  • 对于访问Marketplace资源而言,只需要一台网页浏览器即可。

  • 而对于处理源代码文件来说,需要满足以下条件:使用Python 3.13及以上版本、Node.js 24及以上版本,同时确保AWS CLI和SAM CLI已经配置完成;此外,如果需要构建Lambda函数的相关资源,还需要安装Docker。

通过AWS Marketplace进行部署

这是最快捷的方式——无需使用任何本地工具、命令行界面或Docker。您只需花费大约10分钟的时间,就能启动CloudFormation堆栈并建立可正常使用的部署流程。

步骤1:启动堆栈

点击直接部署链接,即可打开预加载了模板文件的CloudFormation“快速创建堆栈”页面。

云平台中“快速创建堆栈”界面的截图。页面包含模板URL、堆栈名称输入框、参数设置以及具有深色主题的构建选项。

步骤2:填写两个字段

虽然该页面提供了许多设置选项,但您只需要填写两个字段:

  • 堆栈名称:必须使用小写字母。这个名称将会成为您所有AWS资源的前缀(例如my-docsteam-kbproject-notes)。请保持名称简短。

  • 管理员邮箱地址:属于“必备设置”类别。Cognito会将临时登录凭据发送到这个邮箱地址。请使用您当前可以访问的邮箱地址。

其他所有选项,如“构建选项”、“高级设置”、“OCR后端”以及模型选择等,都可以保持默认值。这些选项以后可以根据需要进行自定义配置,但默认设置已经能够满足基本需求。

步骤3:开始部署

滚动到页面底部,确认“功能与转换”选项下的三个复选框都已选中,然后点击创建堆栈按钮。

部署过程大约需要10分钟。如果您感兴趣,可以在CloudFormation事件页面上查看部署进度,但在堆栈状态变为CREATE COMPLETE之前,您无需进行任何操作。

步骤4:登录系统

当部署完成后,请检查您的邮箱。Cognito会向您发送仪表板访问地址和临时密码。登录后设置新的密码,之后您就能看到一个尚未添加任何文档的空仪表板了。

用于文档管理的仪表板界面,侧边栏提供上传、抓取、搜索和聊天等功能选项;主显示区域目前还没有显示任何文档。

从源代码进行部署

如果您想要自定义部署流程、修改用户界面,或者为该项目做出贡献,那么可以选择从源代码进行部署。

步骤1:克隆并配置环境

git clone https://github.com/HatmanStack/RAGStack-Lambda.git
cd RAGStack-Lambda

python -m venv venv
source venv/bin/activate  # 在Windows系统中使用:venv\Scripts\activate
pip install -r requirements.txt

步骤2:部署

publish.py脚本会完成所有工作:构建前端界面、打包Lambda函数,并通过SAM CLI进行部署。

python publish.py \
  --project-name my-docs \
  --admin-email admin@example.com

对于Nova Multimodal Embeddings来说,默认部署区域为us-east-1。该脚本会构建React仪表板、生成Web组件,使用Docker打包所有的Lambda函数层,然后通过SAM部署CloudFormation栈。

首次部署需要较长时间(15到20分钟),因为所有内容都是从零开始构建的。后续的部署速度会更快,因为SAM会缓存未发生变化的资源。

如果你只想修改后端代码而不生成用户界面,可以执行以下命令:

# 跳过仪表板的构建过程(但仍会生成Web组件)
python publish.py --project-name my-docs --admin-email admin@example.com --skip-ui

# 完全跳过所有用户界面的构建过程
python publish.py --project-name my-docs --admin-email admin@example.com --skip-ui-all

部署完成后,你将获得与Marketplace路径相同的Cognito邮箱地址以及仪表板访问链接。

上传你的第一份文档

仪表板上有多个用于不同类型内容的标签页。我们先从“文档”标签页开始操作,因为这是最常用的功能。

文档

点击文档标签页,然后上传文件。RAGStack支持多种格式:PDF、DOCX、XLSX、HTML、CSV、JSON、XML、EML、EPUB、TXT以及Markdown。你可以使用拖放功能或文件选择器来上传文件。

文件上传后,会进入处理流程。你可以实时看到处理进度:

  1. 已上传:文件已接收并存储在S3中。

  2. 正在处理:Step Functions已经接收到文件,并将其转发给相应的处理程序。文本格式的文件(如HTML、CSV、Markdown)会直接被提取内容;扫描后的PDF文件和图片则会通过Textract OCR技术进行识别;大型语言模型会分析文件内容,提取结构化元数据、主题、文档类型、提及的人物信息、时间范围等相关数据。

  3. 已建立索引:生成了嵌入向量,文档内容已可被搜索。

文本文件通常需要1到5分钟才能完成处理;而包含大量图片或文字的文件,则可能需要2到15分钟,具体时间取决于文件页数。

文档上传界面的截图。界面提供拖放区域,支持选择文件夹图标,同时提供针对文档、图片和图片存档的选项。侧边栏显示仪表板、上传、存储、搜索和聊天功能。

图片

图片标签页的用法有所不同。你可以上传JPG、PNG、GIF或WebP格式的图片,并为其添加说明文字。无论是图片本身还是说明文本,都会通过Nova Multimodal Embeddings技术进行嵌入处理,因此你可以通过图片内容或描述来搜索相关文档。

这就是多模态嵌入技术发挥作用的地方。传统的纯文本检索系统需要你手动为每一张图片添加描述信息,而在这里,图片本身就可以被直接用于搜索。而且由于所有数据都存储在你的AWS账户中,因此你无需将个人照片或敏感的视觉内容发送给外部服务来进行处理。

视频和音频文件怎么办呢?

你可以上传视频或音频文件,RAGStack会通过AWS Transcribe将其转换为文本。转换后的文本会被分割成30秒长的片段,并标注出发言者的身份信息,然后这些文本就会像其他文档一样被嵌入到知识库中。当聊天结果中提到了某个视频来源时,系统会提供时间戳链接,让你可以直接跳转到录像中的相应位置。

网络爬取

“爬取”功能允许你直接将网站内容导入到知识库中。只需输入网址,RAGStack就会自动浏览该页面、提取内容,并通过与上传文档相同的处理流程对提取到的信息进行进一步处理——包括元数据提取、嵌入以及建立索引。

这一功能非常实用,因为它可以帮助你无需手动保存和上传网页内容,就能从现有的网络资源中构建知识库。无论是文档网站、博客存档还是参考资料,只要是可以公开访问的内容,都可以使用这个功能。

这是一个名为‘爬取网站’的网络爬取界面截图,界面上有输入网址、设置最大检索页数、深度和范围等选项。侧边栏列出了“仪表盘”、“上传”和“开始爬取”等按钮。设计简洁实用,其中“开始爬取”按钮被标为蓝色,体现了高效便捷的操作流程。

与知识库进行交互

这才是真正的价值所在。进入“聊天”界面,输入问题,RAGStack会从你的知识库中检索相关文档,将这些文档作为上下文传递给Bedrock LLM,然后生成包含来源引用的答案。

这些引用信息是可以展开查看的,你可以点击展开来了解是哪些文档为生成答案提供了依据,同时还可以下载原始文件。对于视频和音频资料,系统还会提供可点击的时间戳链接,让你可以直接跳转到相关片段。

这是一个基于文档管理系统的知识库聊天界面截图。界面上提示用户输入消息以开始对话。

元数据过滤

如果你上传了足够多的文档,从而形成了有意义的元数据分类体系,那么在查询之前,聊天界面就会允许你根据元数据进行筛选。RAGStack会自动从你的文档中提取元数据结构,因此你无需手动配置这些设置——随着知识库内容的不断增长,这些元数据分类选项也会自动出现。

当你拥有大量混合类型的资料时,这个功能就非常有用。你不必依赖向量搜索在成千上万的文档中自行筛选出合适的上下文信息,而是可以直接指定搜索范围:“只搜索与项目X相关的文档”或“只搜索2024年第四季度的内容”。

将Web组件集成到您的应用程序中

控制面板对于管理知识库非常有用,但真正强大的功能在于能够将RAGStack的聊天功能集成到您自己的应用程序中。该Web组件适用于任何框架,无论是React、Vue、Angular、Svelte还是纯HTML。

只需从您的CloudFront分发服务器中加载一次脚本即可:

<script src="https://your-cloudfront-url/ragstack-chat.js"></script>

然后,将这个组件放置在您需要设置聊天界面的任何位置:

<>ragstack-chat
  conversation-id="my-app"
  header-text="查询文档信息"
></ragstack-chat>

就这样。该组件会负责处理身份验证(通过IAM机制)、管理对话状态,并自动显示引用来源的信息,所有这些功能都是独立运行的。您的CloudFront地址会在配置输出中提供。

对于那些不需要用户界面的服务器端集成方案,也可以使用GraphQL API,并通过API密钥进行身份验证。您可以在控制面板的“设置”选项中找到相应的端点和API密钥。

使用MCP服务器

RAGStack提供了一个MCP服务器,它可以将您的知识库与Claude Desktop、Cursor、VS Code以及Amazon Q CLI等人工智能助手连接起来。这样一来,您无需切换到控制面板来搜索文档,而是可以直接通过这些助手来查询所需信息。

安装方法如下:

pip install ragstack-mcp

随后,请将其添加到您所使用的人工智能助手的MCP配置中:

{
  "ragstack": {
    "command": "uvx",
    "args": ["ragstack-mcp"],
    "env": {
      "RAGSTACK_GRAPHQL_ENDPOINT": "YOUR_ENDPOINT",
      "RAGSTACK_API_KEY": "YOUR_API_KEY"
    }
  }
}

您的端点和API密钥可以在控制面板的“设置”选项中找到。配置完成后,在助手的聊天界面中输入@ragstack,即可调用MCP服务器。例如,您可以输入“在我的知识库中搜索关于身份验证的文档”,系统会直接从RAGStack系统中检索相关信息。

有关可用工具及配置细节的完整信息,请参阅MCP服务器文档

从此处开始,您可以构建更多功能

现在您已经拥有一个部署好的RAG管道系统,它的运行成本几乎为零,而且能够处理文本、图片、视频和音频等多种类型的数据。以下是一些您可以尝试的开发方向:

打造一个可搜索的个人档案系统。将您保存的所有会议演讲资料、PDF格式的教科书以及教程视频全部上传进去,这样您就可以通过一个统一的搜索界面来查找多年来积累的各种资料了。由于支持多模态数据嵌入技术,因此截图和图表也同样可以被搜索到,而不仅仅是文本。

我就是用这种方式开发了一个家庭档案应用。通过将RAGStack作为嵌套的CloudFormation堆栈进行部署,整个家庭都可以使用聊天功能来搜索几十年以来积累的各种回忆资料。

对于客户项目而言,这其实就是一个“第二大脑”。你可以抓取客户现有的文档,上传服务范围说明和会议记录,再加入代码库的相关文档。这样一来,你就拥有了一个专门针对该项目的可搜索知识库。可以在项目开始时搭建这个系统,等合同结束时再将其拆除——以这样的成本来看,这种基础设施属于“一次性使用”的类型。

对于那些专业性很强的数据集来说,AI聊天工具也是非常实用的。比如食谱集合、法律文件、研究论文、地方政府会议记录等等——这些内容对于通用的大型语言模型来说实在难以理解。由于采用了Web技术,你可以将这个工具作为独立的产品来发布,而无需从头开始开发前端界面。

如果你们已经在使用Claude Desktop或Cursor,那么MCP服务器就可以把你们的知识库转化为另一个辅助工具。只需上传团队的操作手册和架构文档,然后在编辑器中使用@ragstack功能,就能立即获取所需信息,而无需切换标签页。

总结

你刚刚部署的无服务器RAG处理流程能够完成文档处理、多模态数据嵌入、元数据提取以及带有引用信息的AI聊天功能。所有这些功能在空闲时都不会占用任何资源,而且都在你的AWS账户中运行。这些工具属于“你的资产”:你的文档、你的向量数据、你的基础设施。而采用传统架构的话,每月所需的基础设施成本至少为120到500美元;而使用这套方案,花费却微乎其微。

完整的源代码可以在github.com/HatmanStack/RAGStack-Lambda找到。如果你有任何问题,可以提交issue或PR,也可以仔细研究它的架构设计。如果想进一步了解其中的技术细节,特别是过滤后的向量搜索在像S3 Vectors这样的低成本优化后端上的运行机制,那么这个话题留到下一篇文章再讨论吧。

Comments are closed.