备注:LL模型是指...(此处可根据具体上下文添加简短的解释,确保读者理解)
大型语言模型(LLM)正在变得越来越好,也越来越有用。现在每个人都有了为自己定制的LLM,这简直是太离谱了。不过,个性化的大模型(自定义提示、微调开源模型、迁移学习或提取特征)真的太酷了。
这里有一个简单的指南来部署无服务器的大规模语言模型。
LLM应用:导游讲解 应用:部署为一个 Telegram 机器人,提供个性化的导游服务。例如,我部署了一个可以通过Telegram与我互动的个性化导游。当我旅行时,我发现探索新区域之前会在Google上搜索相同的一系列初始问题。我通常寻找的内容包括:附近的景点、餐厅或交通信息等。
- 本地适合素食者或鱼类爱好者的餐厅。
- 该地区的历史。
- 关于文化的有趣事实。
- 适合工作的咖啡馆。
- 时尚的咖啡馆、餐厅、街道或社区。
- 标志性的地标和景点。
这些并不难找到,但需要几次谷歌搜索并在地图上标注位置——为什么不直接让一个强大的语言模型帮我做这件事呢?
为了解决这个问题,我建立了一个名为TourGuide77Bot的公共Telegram机器人,它可以按需生成个性化的旅行计划。该机器人已公开上线,你可以在Telegram上自由地与她互动。
在这篇文章里,我将解释我是如何构建TourGuide77Bot的,以此为例说明如何部署自定义的LLM模型。
这是Telegram上的TourGuide77Bot截图。
总结我们的构建非常直接:
- 大模型:Google Gemini API:我使用了带有自定义提示词的Google Gemini API作为我的大模型。这是最简单的开始方式,但当然每次查询都会产生费用。如果我发现这个项目有用,可能会迁移到开源的Hugging Face模型。
- AWS Lambda + Docker:
Docker
是将应用程序(包含查询等代码)容器化的绝佳方式,而Lambda
是托管应用程序逻辑并在请求时运行的好途径。 - AWS API Gateway:API Gateway 用于通过Webhook触发应用程序,并提供一定的安全层。
- DynamoDB:使用DynamoDB表来监控每个用户的请求,强制执行限制并防止垃圾信息(骚扰信息)。
- Telegram 机器人:我们需要一个界面与我们的机器人交互。Telegram 提供了一个全面的免费API,提供了一个一流的交互界面来与我们的机器人互动。
如果你想跟着一起做的话,我建议你克隆这个开源仓库:
GitHub - ZachWolpe/TourGuide77Bot: 一个基于AI的导游机器人,部署在Telegram平台上。可以通过贡献代码来支持ZachWolpe/TourGuide77Bot的发展……github.com git clone https://github.com/ZachWolpe/TourGuide77Bot.git
在终端输入此命令以克隆仓库。
更详细的说明可以在GitHub上的README.md文件中找到详情请点击这里。
我在用Python。你需要做以下几件事情:
- 设置
**_AWS账户_**
并**_配置CLI_**
, - 设置
**_Gemini账户_**
并**_生成API密钥_**
, - 设置
**_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 交互的脚本。
将我们的应用打包成 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函数:
-
在AWS管理控制台中进入API Gateway页面。
-
点击“创建API”,然后选择“HTTP API”。
-
在“集成”部分,选择“添加集成”,并选择:
- 集成类型:Lambda
- Lambda函数:选择您的Lambda函数(telegram-bot-lambda)
-
在“配置路由”部分:
- 方法:POST
- 资源路径:
/telegram
- 点击“下一步”
-
审核并创建:
- API名称:TelegramBotWebhookAPI(或您喜欢的名称)
- 点击“创建”
-
创建后,进入“阶段”部分:
- 您应该看到一个默认阶段(通常命名为$default)
- 记下“Invoke URL” - 这就是您的API的入口点
- 在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
包含了相关逻辑。
- 连接到DynamoDB。
- 将请求/用户名写进数据库。
- 检查用户是否没有超过请求限制。
- 如果超过限制,就终止请求。
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章