GenAI Stackを活用して、生成AIアプリの開発をスムーズに開始しよう

## はじめに

- DockerCon 2023で生成AIアプリの開発環境構築を容易にする[GenAI Stack](https://www.docker.com/ja-jp/blog/introducing-a-new-genai-stack/)が発表された
- GenAI Stackについて、動作確認した結果をまとめる

## GenAI stackとは

### 概要

GenAI Stackでは、生成AIによるアプリ開発に必要な開発環境がDockerコンテナで提供されており、開発者は生成AIによるアプリ開発環境をすぐに構築できる。

### できること

GenAI Stackでは主に下記のようなことが可能

- [ollama](https://ollama.ai/)を介して、[llama2](https://ai.meta.com/llama/)などのLLMモデルをローカル環境で利用
  - Windowsの場合、ollamaは非対応
- [Neo4j](https://neo4j.com/)ナレッジグラフを使用したRAG
- Amazon, OpenAIが提供する生成AIのAPI（[Amazon Bedrock](https://aws.amazon.com/jp/bedrock/)や[OpenAI API](https://openai.com/blog/openai-api)）を利用したアプリ開発


## 検証内容

下記の内容を本記事で検証する

1. ローカルで起動して、その際の手順などをまとめる
2. 構築されているアプリケーションの動作を見てみる

## 検証環境

下記のスペックのPCで検証しています。

- OS：Ubuntu 22.04 LTS on windows(WSL2)
- CPU：intel core i7 9700
- RAM：16GB
- GPU：NVIDIA GeForce RTX 2060 Super

## GenAI Stackを起動

readmeを参考に構築を進める

:::note info
OSや利用するモデル次第で設定が少々異なります。
本記事では「Ubuntu22.04」で「Ollama」から取得したモデルを利用するかつ、GPUを利用して計算する設定としています。
:::

1. GenAI stackのリポジトリをクローンする
    ```shell
    git clone https://github.com/docker/genai-stack
    cd genai-stack
    ```
2. .envファイルをenv.exampleファイルを参考にして作成する。
   

    ```diff:.env
    #*****************************************************************
    # LLM and Embedding Model
    #*****************************************************************
    LLM=llama2 #or any Ollama model tag, gpt-4, gpt-3.5, or claudev2
    EMBEDDING_MODEL=sentence_transformer #or openai, ollama, or aws

    #*****************************************************************
    # Neo4j
    #*****************************************************************
    - #NEO4J_URI=neo4j://database:7687
    - #NEO4J_USERNAME=neo4j
    - #NEO4J_PASSWORD=password
    + NEO4J_URI=neo4j://database:7687
    + NEO4J_USERNAME=neo4j
    + NEO4J_PASSWORD=password

    #*****************************************************************
    # Langchain
    #*****************************************************************
    # Optional for enabling Langchain Smith API

    #LANGCHAIN_TRACING_V2=true # false
    #LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
    #LANGCHAIN_PROJECT=#your-project-name
    #LANGCHAIN_API_KEY=#your-api-key ls_...

    #*****************************************************************
    # Ollama
    #*****************************************************************
    - #OLLAMA_BASE_URL=http://host.docker.internal:11434
    + OLLAMA_BASE_URL=http://llm-gpu:11434 # Linux かつGPUを利用する場合の設定

    #*****************************************************************
    # OpenAI
    #*****************************************************************
    # Only required when using OpenAI LLM or embedding model

    #OPENAI_API_KEY=sk-...

    #*****************************************************************
    # AWS
    #*****************************************************************
    # Only required when using AWS Bedrock LLM or embedding model

    #AWS_ACCESS_KEY_ID=
    #AWS_SECRET_ACCESS_KEY=
    #AWS_DEFAULT_REGION=us-east-1
    ```

3. GenAI Stackを起動する
    ```shell
    docker compose --profile linux-gpu up # Macの場合、docker compose up
    ```

## GenAI Stackの確認

### 確認する機能について

GenAI Stackではすでに利用できる下記のアプリケーションが提供されていることがReadmiの内容より確認できる。

| 名前 | メインファイル | コンポーズ名 | URL | 説明 |
|---|---|---|---|---|
| Support Bot | `bot.py` | `bot` | http://localhost:8501 | Pythonフルスタックのチャットボットアプリ |
| Stack Overflow Loader | `loader.py` | `loader` | http://localhost:8502 | Stack Overflowのデータをデータベースに読み込み（ベクトル埋め込みなどを作成）アプリ |
| PDF Reader | `pdf_bot.py` | `pdf_bot` | http://localhost:8503 | PDFのQAアプリ |
| Standalone Bot API | `api.py` | `api` | http://localhost:8504 | APIサーバ（Pythonバックエンド）。 |
| Standalone Bot UI | `front-end/` | `front-end` | http://localhost:8505 |フロントエンド（Vite, Svelte, Tailwind） |

### 確認結果

#### Support Bot

##### 機能概要

- http://localhost:8501にブラウザからアクセス
- Streamlitを活用したシンプルなPythonフルスタックのアプリ
- RAGが無効の場合、純粋なLLMの回答を得ることができます。
- RAGが有効の場合、ナレッジグラフ(Neo4j) を活用したRAGを利用

##### 画面

![FireShot Capture 002 - bot · Streamlit - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677305/7a0e7331-b881-5f3d-4e49-768a60430e8b.png)

##### 所感

- そのままPoCアプリとしても使えそうな機能と画面
- GPU演算を行うと、そこまで高スペックなGPUではないが推論速度は高速に感じる
- RAGが有効の場合、NEO4Jの探索に時間がかかるのか、無効に比べて大きく性能が劣化する
  - 推論中にCPU/GPUには余裕があるが、SSDの稼働率が100％張り付いていて、それがボトルネックになっているかも。

#### Stack Overflow Loader

##### 機能概要

- http://localhost:8502にブラウザからアクセス
- 特定のタグに関する最新のStack Overflowデータを知識グラフにインポートする
- Streamlitを活用したシンプルなPythonフルスタックのアプリ

##### 画面

![FireShot Capture 005 - loader · Streamlit - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677305/a8141d51-a4f0-d542-6ea8-3c14e8257418.png)

##### 所感

- 読み込み後にSupport BotのRAGありで推論したところ、Stack Overflowから検索した結果を返していること確認した
  - レスポンスが遅く、Stack Overflowから答えるような結果を見て中断
- 読み込みはかなり早く、すぐに完了する
- Neo4Jの知識不足でクライアントツールなどの使い方が不明
  - 後日、Neo4Jの知見を深めて改めて確認する

#### PDF Reader

##### 機能概要

- http://localhost:8503にブラウザからアクセス
- ImportしたPDFファイルの内容について、QA形式で質問できる
- ImportしたPDFファイルはNeo4Jに登録される

##### 画面

![FireShot Capture 008 - pdf_bot · Streamlit - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677305/41d9e4a9-cd13-2e03-f12c-2a0961d76421.png)

##### 所感

- そのままPoCアプリとしても使えそうな機能と画面
- PDFファイルの登録は早く完了する
- 質問を投げてから帰ってくるまでのかなりの時間を要する

#### Standalone Bot API & Standalone Bot UI

##### 機能概要

- <http://localhost:8505>にブラウザからアクセス
- 機能面はSupport Botと同様
- フロントエンドがVite, Svelte, Tailwind、バックエンドがPythonの構成となっている

##### 画面

![FireShot Capture 009 - Support bot application - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677305/4cd47672-f15f-fed0-f848-1b4325f6b686.png)

##### 所感

- そのままPoCアプリとしても使えそうな機能と画面
- そのままクラウドで動かすよう（AWS Amplify, ApiGateway+Lamndaなど ）に展開しやすそう

### 総括

- ローカル実行が可能ではあるが、スペックを大きく積んだPCでないと「RAG」の利用した開発は難しい
- 生成AIアプリのアーキテクチャの勉強するのにはすごくよいと感じた
- そのまま、PoCアプリとして使ってみてもいいレベルかと思う
- 前提として生成ＡＩにかかわる技術の知見がないと扱うのは難しい（Neo4J、RAGなど）

## 今後の展望

- それぞれのアプリケーションの実装を勉強して、生成AIのアプリケーションのアーキテクチャーの理解を深める
- AWSなどのクラウドで動かすアーキテクチャを考えたい
- Neo4Jのグラフデータベースの知見を深めたい
- GenAI Stackの開発環境を用いて、オリジナルの生成AIサービスを開発したい

## 参考サイト

- https://github.com/docker/genai-stack?tab=CC0-1.0-1-ov-file
- https://www.docker.com/ja-jp/blog/introducing-a-new-genai-stack/