为了账号安全,请及时绑定邮箱和手机立即绑定

在AWS上部署自定义大型语言模型:以旅游指南机器人为例

如何在无服务器架构中部署自定义的LL模型

备注:LL模型是指...(此处可根据具体上下文添加简短的解释,确保读者理解)

大型语言模型(LLM)正在变得越来越好,也越来越有用。现在每个人都有了为自己定制的LLM,这简直是太离谱了。不过,个性化的大模型(自定义提示、微调开源模型、迁移学习或提取特征)真的太酷了。

这里有一个简单的指南来部署无服务器的大规模语言模型。

LLM应用:导游讲解
应用:部署为一个 Telegram 机器人,提供个性化的导游服务。

例如,我部署了一个可以通过Telegram与我互动的个性化导游。当我旅行时,我发现探索新区域之前会在Google上搜索相同的一系列初始问题。我通常寻找的内容包括:附近的景点、餐厅或交通信息等。

  • 本地适合素食者或鱼类爱好者的餐厅。
  • 该地区的历史。
  • 关于文化的有趣事实。
  • 适合工作的咖啡馆。
  • 时尚的咖啡馆、餐厅、街道或社区。
  • 标志性的地标和景点。

这些并不难找到,但需要几次谷歌搜索并在地图上标注位置——为什么不直接让一个强大的语言模型帮我做这件事呢?

为了解决这个问题,我建立了一个名为TourGuide77Bot的公共Telegram机器人,它可以按需生成个性化的旅行计划。该机器人已公开上线,你可以在Telegram上自由地与她互动。

在这篇文章里,我将解释我是如何构建TourGuide77Bot的,以此为例说明如何部署自定义的LLM模型。

这是Telegram上的TourGuide77Bot截图。

总结

我们的构建非常直接:

  1. 大模型:Google Gemini API:我使用了带有自定义提示词的Google Gemini API作为我的大模型。这是最简单的开始方式,但当然每次查询都会产生费用。如果我发现这个项目有用,可能会迁移到开源的Hugging Face模型。
  2. AWS Lambda + DockerDocker 是将应用程序(包含查询等代码)容器化的绝佳方式,而 Lambda 是托管应用程序逻辑并在请求时运行的好途径。
  3. AWS API Gateway:API Gateway 用于通过Webhook触发应用程序,并提供一定的安全层。
  4. DynamoDB:使用DynamoDB表来监控每个用户的请求,强制执行限制并防止垃圾信息(骚扰信息)。
  5. Telegram 机器人:我们需要一个界面与我们的机器人交互。Telegram 提供了一个全面的免费API,提供了一个一流的交互界面来与我们的机器人互动。
前提条件

如果你想跟着一起做的话,我建议你克隆这个开源仓库:

GitHub - ZachWolpe/TourGuide77Bot: 一个基于AI的导游机器人,部署在Telegram平台上。可以通过贡献代码来支持ZachWolpe/TourGuide77Bot的发展……github.com
    git clone https://github.com/ZachWolpe/TourGuide77Bot.git

在终端输入此命令以克隆仓库。

更详细的说明可以在GitHub上的README.md文件中找到详情请点击这里

我在用Python。你需要做以下几件事情:

  1. 设置 **_AWS账户_****_配置CLI_**,
  2. 设置 **_Gemini账户_****_生成API密钥_**,
  3. 设置 **_Telegram机器人_****_配置API密钥_**,
    GEMINI_API_KEY=<YOUR_GOOGLE_GEMINI_API_KEY>  
    BOT_API_TOKEN=<YOUR_TELEGRAM_BOT_API_TOKEN>  
    BOT_USERNAME=<YOUR_TELEGRAM_BOT_USERNAME>

请注意:请将上述各占位符替换为您的实际 API 密钥和机器人详情。

非常实用的教程

你可以在这里找到这两个教程:

步骤一. 创建大规模语言模型应用程序

我使用了Google Gemini的API,并用自定义提示作为我的LLM(大语言模型)。这个项目之所以能实现,是因为现在的大语言模型在正确的提示下能够返回非常具体的信息。

代码库的结构是这样的:

  • **lambda_function.py** : 应用程序的入口点。可以在 Lambda 和本地环境中用于测试。
  • **lambda_function_for_polling.py** : 用于轮询的 Lambda 函数。
  • **query_gemini.py** : 使用自定义提示访问 Gemini API。
  • **telegram_*.py** : 处理与 Telegram API 交互的脚本。

步骤 2:AWS Lambda + Docker(AWS Lambda + Docker)
Docker 及 AWS ECR

将我们的应用打包成 Docker 容器是运行它的最简单的方法——奉行“一次构建,到处运行”的信条。

请确保使用官方的 AWS 镜像。

    # 官方的 AWS Python 镜像是必需的。
    FROM --platform=linux/amd64 public.ecr.aws/lambda/python:3.12  

    # 复制 build/requirements.txt 文件到 ${LAMBDA_TASK_ROOT}  

    # 安装依赖包  
    RUN pip install -r requirements.txt  

    # 复制 src/*.py 文件到 ${LAMBDA_TASK_ROOT}  

    # 指定 Lambda 处理函数  
    CMD [ "lambda_function.lambda_handler" ]

将你的图片上传到 AWS ECR 以便快速集成到 Lambda。

运行该命令推送你的镜像到Amazon ECR:
```  
docker push your-account-id.dkr.ecr.your-region.amazonaws.com/<镜像名称>:<标签>  
```

## Lambda

<!-- 或者使用中文翻译为“λ” -->

通过 AWS CLI 创建一个 Lambda 函数。

使用 aws lambda create-function 命令创建指定的 AWS Lambda 函数,设置函数名称为 "指定的 AWS Lambda 函数名",设置包类型为 "镜像",代码设置为 "ImageUri=您的账户ID.dkr.ecr.您的地区.amazonaws.com/ECR 上的镜像名称:标签",设置角色为 "您的角色ARN",设置区域为 "您的地区",以创建指定的 AWS Lambda 函数。


# 步骤 3. 重新运行构建,方便一下

为了方便,你可以用一个 bash 脚本一次性完成这些更改,并将这些更改推送到构建流程中。

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com \
docker build -f build/dockerfile -t <> .
构建Docker镜像 -f build/dockerfile -t <> .
docker tag <Local-Docker-Image-Name>:<Tag> aws_account_id.dkr.ecr.us-west-2.amazonaws.com/<Image-name-on-ECR>:<Tag>
docker tag 本地Docker镜像名称:标签 aws_account_id.dkr.ecr.us-west-2.amazonaws.com/<Image-name-on-ECR>:<Tag>
docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/<Image-name-on-ECR>:<Tag>
aws lambda update-function-code --function-name <AWS-Lambda-function-name> --image-uri aws_account_id.dkr.ecr.us-west-2.amazonaws.com/<Image-name-on-ECR>:<Tag> --region 你的指定区域


# 第4步:配置 AWS API Gateway:

我们想要一个这样的服务,每次收到消息时启动一个lambda任务。实现这一点最简单的方法是启动一个EC2实例(Amazon EC2)并轮询消息。我已经在 `lambda_function_for_polling.py` 这个文件里实现了这个功能。

一个更优雅的方法是通过 API 用 Webhooks 调用 Lambda——每当有新消息发到 Telegram,就发起一次推理请求。

在 AWS API Gateway 上创建一个 `HTTP` 或 `REST` 类型的 API。将该 API 添加为 Lambda 函数触发器。
创建一个Webhook API并将其连接到您的Lambda函数:
  1. 在AWS管理控制台中进入API Gateway页面。

  2. 点击“创建API”,然后选择“HTTP API”。

  3. 在“集成”部分,选择“添加集成”,并选择:

    • 集成类型:Lambda
    • Lambda函数:选择您的Lambda函数(telegram-bot-lambda)
  4. 在“配置路由”部分:

    • 方法:POST
    • 资源路径: /telegram
    • 点击“下一步”
  5. 审核并创建:

    • API名称:TelegramBotWebhookAPI(或您喜欢的名称)
    • 点击“创建”
  6. 创建后,进入“阶段”部分:

    • 您应该看到一个默认阶段(通常命名为$default)
    • 记下“Invoke URL” - 这就是您的API的入口点
  7. 在AWS Lambda控制台中转到您的Lambda函数:
    • 在“配置”部分,点击“权限”
    • 向下滚动到“资源策略”
    • 您应该能看到一条允许API Gateway调用此函数的策略

你现在应该有端点路径了:

    https://<API-ID>.execute-api.<REGION>.amazonaws.com/<stage>/telegram

此链接指向用于与Telegram集成的API端点。

搭建一个平台然后部署API。

设置Webhook回调

将 webhook URL 设置为 API Gateway URL。

运行如下命令:
curl -X POST "https://api.telegram.org/bot<你的机器人令牌>/setWebhook?url=https://<API ID>.execute-api.<区域>.amazonaws.com/<阶段>/telegram"

步骤 5:为 DynamoDB 设置 API 流量限制

我们这里使用的是付费服务,所以你可能需要设置流量限制规则。可以创建DynamoDB表来存储lambda API的查询数据。

这在应用层实现,这样可以直接在 lambda 中进行管理。另一个选择是在 API Gateway 层进行流量限制,但由于我们使用的是 HTTP API,在 AWS 上配置这是最简单的。然而这里存在一些明显的问题,因为检查只在启动 lambda 实例之后才会进行。

我们的 lambda_function.py 包含了相关逻辑。

  1. 连接到DynamoDB。
  2. 将请求/用户名写进数据库。
  3. 检查用户是否没有超过请求限制。
  4. 如果超过限制,就终止请求。
    from datetime import datetime, timedelta, timezone  
    from dotenv import load_dotenv  
    import logging  
    import boto3  

    # 加载环境配置 --------------------------------------------------------------------------------------------->>  
    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)  
    load_dotenv()  
    DYNAMODB_TABLE: str = os.getenv("RATE_LIMIT_TABLE")  
    # 加载环境配置 --------------------------------------------------------------------------------------------->>  

    # 初始化DynamoDB客户端对象 --------------------------------------------------------------------------->>  
    dynamodb = boto3.resource('dynamodb')  
    table = dynamodb.Table(DYNAMODB_TABLE)  
    RATE_LIMIT = 10  # 每分钟允许的最大请求数  
    TIME_WINDOW = 60  # 时间窗口(秒)  
    # 初始化DynamoDB客户端对象 --------------------------------------------------------------------------->>  

    def check_rate_limit(user_id):  
        now = datetime.now(timezone.utc)  
        start_time = now - timedelta(seconds=TIME_WINDOW)  

        # 更新请求计数并记录最后请求时间  
        response = table.update_item(  
            Key={'user_id': str(user_id)},  
            UpdateExpression='SET request_count = if_not_exists(request_count, :zero) + :inc, last_request = :now',  
            ExpressionAttributeValues={  
                ':inc': 1,  
                ':now': now.isoformat(),  
                ':zero': 0,  
                ':window_start': start_time.isoformat(),  
                ':limit': RATE_LIMIT  
            },  
            ConditionExpression='attribute_not_exists(last_request) OR last_request < :window_start OR request_count < :limit',  
            ReturnValues='UPDATED_NEW'  
        )  

        # 检查更新是否成功(即未超过请求限制)  
        return 'Attributes' in response
最后一步。来看看旅游建议吧!

我们的机器人现已上线在 Telegram 上。在 Telegram 上搜索 TourGuide77Bot,并使用 /tour <地点> 命令来获取旅行推荐。

这是一个示例输出——

房库

仓库

存储库

克隆代码或查看代码。

运行这个命令来克隆仓库到你的电脑:

git clone https://github.com/ZachWolpe/TourGuide77Bot.git


克隆完成后,你可以进入该文件夹并运行相关脚本。

## [GitHub - ZachWolpe/TourGuide77Bot: AI 驱动的导游机器人,部署在 Telegram 上。加入 ZachWolpe/TourGuide77Bot 的开发,通过创建新功能。...github.com](https://github.com/ZachWolpe/TourGuide77Bot?source=post_page-----196b419a3737--------------------------------)

更多说明可在GitHub上的[ZachWolpe/TourGuide77Bot](https://github.com/ZachWolpe/TourGuide77Bot)项目的[README.md](https://github.com/ZachWolpe/TourGuide77Bot)文件中找到。

# 连接一下

这个项目是开源的,我会继续开发更多有趣的特性。如果你想提供反馈或贡献,可以通过以下方式联系我等,如通过邮件、社交媒体等方式。

邮箱: zachcolinwolpe@gmail.com
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消