【Docker】使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 【Docker】使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

前言

本文强调了 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 支持,开发人员可以将其部署在他们喜欢的任何云平台上。


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
6天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
6天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
131 15
|
6天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
41 23
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
225 93
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
63 17
|
1月前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
121 12