前言
本文强调了 Docker 为 AI/ML 项目带来的价值 - 部署的速度和一致性、一次构建并随处运行的能力,以及 Docker Desktop 中提供的可加速整体开发工作流程的省时工具。
在本文中,我们将探索使用 LangChain、OpenAI API 和 Streamlit 框架创建聊天应用程序的过程。我们将演示如何使用 Docker 和Docker Compose在内部或云服务器上轻松部署应用程序。
我们在 Streamlit 公共云和 Google App Engine 上创建并部署了一个演示应用程序(图 1),以便进行快速预览。
图 1:聊天应用程序截图:LangChain 演示。
聊天应用程序组件和技术
我们将简要描述用于创建模板应用程序的应用程序组件和框架。
LangChain Python框架
LangChain框架使开发人员能够使用强大的大型语言模型(LLMs)创建应用程序。我们的演示聊天应用程序是基于Python框架构建的,其中OpenAI模型是默认选项。但是,用户可以灵活选择他们喜欢的任何LLM。
LongChain框架轻松管理输入提示,并在LLMs API生成的响应之间建立连接。
开放人工智能模型
出于演示目的,我们使用 OpenAI API 在提交提示时生成响应。
前端 Streamlit UI
Streamlit是一种轻量级且更快的构建和共享数据应用程序的方式。开发了一个带有 Streamlit 框架的简单 UI 来与聊天应用程序交互。
使用 Docker 进行部署
Docker可用于开发应用程序并将其部署到任何服务器,而无需担心依赖项和环境。在演示应用程序开发完成并在本地运行良好后,我们添加了 Docker 支持。
FROM python:3.10-slim-bullseye ENV HOST=0.0.0.0 ENV LISTEN_PORT 8080 EXPOSE 8080 RUN apt-get update && apt-get install -y git COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt WORKDIR app/ COPY ./demo_app /app/demo_app COPY ./.streamlit /app/.streamlit CMD ["streamlit", "run", "demo_app/main.py", "--server.port", "8080"]
前面的代码显示了用于生成演示应用程序的 Docker 映像的 Dockerfile 的内容。为了构建图像,我们使用:
docker build -t langchain-chat-app .
Docker 优化以实现轻量级和快速构建
在为企业应用程序部署应用程序时,我们必须注意所利用的资源以及执行/部署生命周期计算。
我们还解决了如何优化 Docker 构建过程以解决镜像大小问题并在每次源代码更改迭代时快速构建的问题。
# 用于构建虚拟环境的构建器镜像 FROM python:3.11-buster as builder RUN apt-get update && apt-get install -y git RUN pip install poetry==1.4.2 ENV POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_IN_PROJECT=1 \ POETRY_VIRTUALENVS_CREATE=1 \ POETRY_CACHE_DIR=/tmp/poetry_cache ENV HOST=0.0.0.0 ENV LISTEN_PORT 8080 EXPOSE 8080 WORKDIR /app #COPY pyproject.toml ./app/pyproject.toml #COPY poetry.lock ./app/poetry.lock COPY pyproject.toml poetry.lock ./ RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR # 用于仅运行提供的代码及其虚拟环境的运行时镜像 FROM python:3.11-slim-buster as runtime ENV VIRTUAL_ENV=/app/.venv \ PATH="/app/.venv/bin:$PATH" COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} COPY ./demo_app ./demo_app COPY ./.streamlit ./.streamlit CMD ["streamlit", "run", "demo_app/main.py", "--server.port", "8080"]
在此 Dockerfile 中,我们有两个运行时映像标签。在第一个中,我们创建一个 Poetry 环境来形成一个虚拟环境。尽管应用程序在第二运行时映像中运行,但应用程序是在激活第一步中创建的虚拟环境后运行的。
接下来,我们将使用 构建 Docker 映像DOCKER_BUILDKIT,它提供了现代工具来快速安全地创建 Docker 映像。
DOCKER_BUILDKIT=1 docker build --target=runtime . -t langchain-chat-app:latest
Docker-compose.yaml 文件
为了运行该应用程序,我们还包含docker-compose.yml
以下内容:
version: '3' services: langchain-chat-app: image: langchain-chat-app:latest build: ./app command: streamlit run demo_app/main.py --server.port 8080 volumes: - ./demo_app/:/app/demo_app ports: - 8080:8080
要在本地服务器上运行该应用程序,请使用以下命令:
docker-compose up
基础设施
借助对 Docker 的支持,可以按照基本指南将该应用程序部署到任何云基础设施。我们在以下基础设施上部署了该应用程序
Streamlit 公共云
使用 GitHub 帐户和存储库在其公共云上部署 Streamlit 应用程序
谷歌应用引擎
我们尝试使用 Docker 在 Google App Engine 上部署应用程序。该存储库包含一个app.yaml
用于部署以下内容的配置文件:
# 使用Dockerfile runtime: custom env: flex # 运行此示例会产生 App Engine 弹性环境的费用。 # 下面的设置是为了在测试期间降低成本,不适用于生产环境。 manual_scaling: instances: 1 resources: cpu: 1 memory_gb: 0.5 disk_size_gb: 10
为了在 Google App Engine 上部署聊天应用程序,我们在安装 gcloud Python SDK 后使用了以下命令:
gcloud app create --project=[YOUR_PROJECT_ID] gcloud config set project [YOUR_PROJECT_ID] gcloud app deploy app.yaml
可以通过以下方式访问部署在 Google App Engine 上的示例应用程序:
使用 Google Cloud Run 部署应用
我们还可以使用GCP的Cloud Run服务将应用程序部署在Google Cloud上。使用 Cloud Run 部署应用程序比 Google App Engine 更快。
以下是采用该方法的相关特点:
将应用程序打包在容器中。
将容器推送到工件注册表。
从推送的容器部署服务。
让我们逐步了解使用 Google Cloud Run 部署应用程序所遵循的步骤。我们假设已经在 Google Cloud 上创建了一个项目。
1.启动服务
可以使用以下方式启用服务gcloud sdk
:
gcloud services enable cloudbuild.googleapis.com gcloud services enable run.googleapis.com
2. 创建角色并将其添加到服务帐户
使用以下命令集,我们创建一个服务帐户并设置适当的权限。修改服务SERVICE_ACCOUNT and PROJECT_ID
:
gcloud iam service-accounts create langchain-app-cr \ --display-name="langchain-app-cr" gcloud projects add-iam-policy-binding langchain-chat \ --member="serviceAccount:langchain-app-cr@langchain-chat.iam.gserviceaccount.com" \ --role="roles/run.invoker" gcloud projects add-iam-policy-binding langchain-chat \ --member="serviceAccount:langchain-app-cr@langchain-chat.iam.gserviceaccount.com" \ --role="roles/serviceusage.serviceUsageConsumer" gcloud projects add-iam-policy-binding langchain-chat \ --member="serviceAccount:langchain-app-cr@langchain-chat.iam.gserviceaccount.com" \ --role="roles/run.admin"
3.生成并推送Docker镜像
使用以下命令,我们可以生成镜像并将其推送到ArtifactsRegistry。但是,如果这是第一次,我们需要创建具有 Docker 占位符权限的存储库:
DOCKER_BUILDKIT=1 docker build --target=runtime . -t australia-southeast1-docker.pkg.dev/langchain-chat/app/langchain-chat-app:latest docker push australia-southeast1-docker.pkg.dev/langchain-chat/app/langchain-chat-app:latest
以下是生成工件存储库和分配权限所需的命令:
gcloud auth configure-docker australia-southeast1-docker.pkg.dev gcloud artifacts repositories create app \ --repository-format=docker \ --location=australia-southeast1 \ --description="A Langachain Streamlit App" \ --async
现在将部署该应用程序。
结论
本文深入探讨了开发和部署由 LangChain、OpenAI API 和 Streamlit 提供支持的聊天应用程序所需的各种工具和技术。在此过程中还利用了Docker框架。
该应用程序演示可在 Streamlit 公共云和 Google App Engine 上使用。由于 Docker 支持,开发人员可以将其部署在他们喜欢的任何云平台上。