使用容器进行生成式 AI 开发
先决条件
概述
在本节中,您将学习如何设置开发环境以访问生成式 AI (GenAI) 应用程序所需的所有服务。这包括:
- 添加本地数据库
- 添加本地或远程 LLM 服务
注意您可以在 GenAI Stack 演示应用程序中查看更多容器化 GenAI 应用程序的示例。
添加本地数据库
您可以使用容器来设置本地服务,例如数据库。在本节中,您将更新 `compose.yaml` 文件以定义一个数据库服务。此外,您将指定一个环境变量文件来加载数据库连接信息,而不是每次都手动输入信息。
要运行数据库服务
在克隆的仓库目录中,将 `env.example` 文件重命名为 `.env`。此文件包含容器将使用的环境变量。
在克隆的仓库目录中,使用 IDE 或文本编辑器打开 `compose.yaml` 文件。
在 `compose.yaml` 文件中,添加以下内容:
- 添加运行 Neo4j 数据库的指令
- 在服务器服务下指定环境文件,以便传入连接的环境变量
以下是更新后的 `compose.yaml` 文件。所有注释已删除。
services: server: build: context: . ports: - 8000:8000 env_file: - .env depends_on: database: condition: service_healthy database: image: neo4j:5.11 ports: - "7474:7474" - "7687:7687" environment: - NEO4J_AUTH=${NEO4J_USERNAME}/${NEO4J_PASSWORD} healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1"] interval: 5s timeout: 3s retries: 5注意要了解有关 Neo4j 的更多信息,请参阅 Neo4j 官方 Docker 镜像。
运行应用程序。在 `docker-genai-sample` 目录中,在终端中运行以下命令。
$ docker compose up --build访问应用程序。打开浏览器并在 https://:8000 查看应用程序。您应该会看到一个简单的 Streamlit 应用程序。请注意,向 PDF 提问会导致应用程序失败,因为 `.env` 文件中指定的 LLM 服务尚未运行。
停止应用程序。在终端中,按 `ctrl`+`c` 停止应用程序。
添加本地或远程 LLM 服务
示例应用程序同时支持 Ollama 和 OpenAI。本指南提供了以下场景的说明:
- 在容器中运行 Ollama
- 在容器外部运行 Ollama
- 使用 OpenAI
虽然所有平台都可以使用上述任何一种场景,但性能和 GPU 支持可能会有所不同。您可以使用以下准则来帮助选择合适的选项:
- 如果您使用 Linux 且安装了原生 Docker Engine,或者 Windows 10/11 且使用 Docker Desktop,并且您有 CUDA 支持的 GPU,并且您的系统至少有 8 GB 内存,则可在容器中运行 Ollama。
- 如果您使用 Apple 芯片 Mac,则在容器外部运行 Ollama。
- 如果上述两种情况都不适用于您,请使用 OpenAI。
为您的 LLM 服务选择以下选项之一。
在容器中运行 Ollama 时,您应该拥有一个支持 CUDA 的 GPU。虽然您可以在没有受支持 GPU 的情况下在容器中运行 Ollama,但性能可能无法接受。只有 Linux 和 Windows 11 支持容器访问 GPU。
要在容器中运行 Ollama 并提供 GPU 访问
安装先决条件。
- 对于 Linux 上的 Docker Engine,请安装 NVIDIA Container Toolkit。
- 对于 Windows 10/11 上的 Docker Desktop,请安装最新的 NVIDIA 驱动程序,并确保您正在使用 WSL2 后端
在 `compose.yaml` 中添加 Ollama 服务和卷。以下是更新后的 `compose.yaml`:
services: server: build: context: . ports: - 8000:8000 env_file: - .env depends_on: database: condition: service_healthy database: image: neo4j:5.11 ports: - "7474:7474" - "7687:7687" environment: - NEO4J_AUTH=${NEO4J_USERNAME}/${NEO4J_PASSWORD} healthcheck: test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1", ] interval: 5s timeout: 3s retries: 5 ollama: image: ollama/ollama:latest ports: - "11434:11434" volumes: - ollama_volume:/root/.ollama deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] volumes: ollama_volume:注意有关 Compose 指令的更多详细信息,请参阅使用 Docker Compose 启用 GPU 访问。
将 ollama-pull 服务添加到您的 `compose.yaml` 文件中。此服务使用基于 GenAI Stack 的 pull_model.Dockerfile 的 `docker/genai:ollama-pull` 镜像。该服务将自动为您的 Ollama 容器拉取模型。以下是 `compose.yaml` 文件中更新的部分:
services: server: build: context: . ports: - 8000:8000 env_file: - .env depends_on: database: condition: service_healthy ollama-pull: condition: service_completed_successfully ollama-pull: image: docker/genai:ollama-pull env_file: - .env # ...
要在容器外部运行 Ollama
- 在您的主机上安装并运行 Ollama。
- 将 `.env` 文件中的 `OLLAMA_BASE_URL` 值更新为 `http://host.docker.internal:11434`。
- 使用以下命令将模型拉取到 Ollama。
$ ollama pull llama2
重要使用 OpenAI 需要一个 OpenAI 账户。OpenAI 是第三方托管服务,可能会收取费用。
- 将 `.env` 文件中的 `LLM` 值更新为 `gpt-3.5`。
- 取消注释并更新 `.env` 文件中的 `OPENAI_API_KEY` 值为您的 OpenAI API 密钥。
运行您的 GenAI 应用程序
此时,您的 Compose 文件中包含以下服务:
- 用于主 GenAI 应用程序的服务器服务
- 将向量存储在 Neo4j 数据库中的数据库服务
- (可选)用于运行 LLM 的 Ollama 服务
- (可选)ollama-pull 服务,用于自动为 Ollama 服务拉取模型
要运行所有服务,请在 `docker-genai-sample` 目录中运行以下命令:
$ docker compose up --build
如果您的 Compose 文件包含 ollama-pull 服务,ollama-pull 服务可能需要几分钟才能拉取模型。ollama-pull 服务将持续更新控制台中的状态。拉取模型后,ollama-pull 服务容器将停止,您可以访问应用程序。
应用程序运行后,打开浏览器并访问 https://:8000。
上传一个 PDF 文件,例如 Docker CLI Cheat Sheet,然后向 PDF 提问。
根据您的系统和您选择的 LLM 服务,可能需要几分钟才能回答。如果您正在使用 Ollama 并且性能不可接受,请尝试使用 OpenAI。
摘要
在本节中,您学习了如何设置开发环境以提供 GenAI 应用程序所需的所有服务。
相关信息
后续步骤
请参阅 GenAI Stack 演示应用程序 中更多 GenAI 应用程序的示例。