TestcontainersがAIを活用したアプリケーション開発をいかに効率化するか

今日の速いペースで競争が激化するビジネス環境では、企業はデジタル変革プロジェクトの完了を早める方法を見つけなければなりません。新しいアプリケーションや機能の導入の遅れを最小限に抑えれば、その生産性や効率性のメリットを短時間で享受でき、競合他社よりも優位に立つことができます。しかし、新しいソフトウェアの開発やアップデートのリリースを長引かせることは、同業他社の技術革新のスピードが速くなるため、市場シェアを低下させる可能性があります。
コンテナは、アプリケーション開発の効率化を目指す企業にとって最適なテクノロジーとして登場し、開発者はより安全で堅牢、かつスケーラブルなアプリケーションを、かつてないほど短時間で構築できるようになりました。
この記事では、Zillizが最近主催した「Unstructured Data Meetup」(https://www.youtube.com/watch?v=twbHwq4hFgE&list=PLPg7_faNDlT7SC3HxWShxKT-t-u7uKr--&index=2)でのOleg Šelajev氏のこの講演に触発され、コンテナ化の概念とその重要なツールの1つであるDockerについて、そしてそれらがアプリケーション開発プロセスの複雑さをどのように軽減するのかを探ります。その後、Dockerの機能を大幅に拡張するオープンソースのフレームワークであるTestcontainersに注目し、開発者がAI搭載アプリケーションの開発を効率化できるようにします。
コンテナとは?コンテナとは、バイナリ、依存関係、ライブラリ、設定ファイルなど、どのような環境でも動作するために必要なコンポーネントをすべて含む、標準化されたアプリケーションコードのパッケージです。伝統的に、アプリケーションはモノリシックで、1つのコードベースに異なるコンポーネントが含まれていました。今日では、開発者はソフトウェアを機能やサービスに応じてコンポーネントに分割し、それぞれにコードベースと依存関係を持たせている。
コンテナの利点は以下の通り:
アプリケーションをサービスに分割することで、開発者は異なるプロジェクト部分に同時に取り組むことができる。同様に、コンテナのモジュール性により、アプリケーション全体を変更することなく更新や新機能の追加が可能になる。
スケーラビリティの向上:** アプリケーションをコンテナ内にパッケージ化できる場合、別のインスタンスを作成するには追加のコンテナをデプロイするだけでよい。一方、モジュラー・アプリケーションでは、容量が大きくなりそうなサービスに対して、チームは単純に新しいコンテナをスピンアウトすることができる。
効率性の向上:***コンテナは移植性が高く、プラットフォームに依存しないため、開発者はさまざまな環境のセットアップやメンテナンスに時間を割く必要がありません。
コストの削減:** 開発者がサーバーや環境の管理責任から解放されることで、別の場所、つまり実際のアプリケーション開発により生産性が高まります!これにより、プロジェクトを完了するのに必要な工数が削減され、コストが削減されます。
コンテナの使用例
クラウド・ネイティブ・アプリケーションの開発:**コンテナ化されたアーキテクチャは、拡張性の向上、データ・アクセスの拡大、サイバーセキュリティの強化など、クラウドの機能を完全に活用します;
アプリケーションの近代化**:コンテナは、レガシー・アプリケーションをリファクタリングしてクラウド環境との互換性を高め、パフォーマンス、リソース効率、更新性を向上させるために使用できます。
プロトタイピング:*** プラットフォームに依存しないため、コンテナは開発、テスト、ステージングなどのために異なる環境をセットアップする必要をなくし、開発者が新機能を実験しやすくします。
モノのインターネット(IoT)デバイス:**軽量でリソース効率に優れているコンテナは、制約の多いIoTハードウェアに理想的なソフトウェアデプロイメントメカニズムを提供する。
- コンテナは、一貫性のある分離された環境を作成するために使用され、アプリケーションがどこにデプロイされても同じように実行されることを保証します。
Dockerとは?
Dockerは、開発者がコンテナを作成、デプロイ、設定、管理できるプラットフォームです。Dockerはコンテナと同義語であるため、実際、コンテナは頻繁に「Dockerコンテナ」と呼ばれる。しかし実際には、人々がDockerについて言及するとき、彼らは実際にはDocker engine:コンテナが構築され実行される実行環境のことを指している。 このエンジンはコンテナの下に置かれ、ホストデバイスのオペレーティングシステム(OS)を仮想化し、CPUやメモリなどのリソースを最適な量に割り当てる。
これは、独自のOSと計算リソースを必要とする仮想マシン(VM)における同様のソリューションとは対照的だ。コンテナを環境にとらわれないものにすることに加え、Dockerを使用することで、VMよりもリソース集約的で、起動とシャットダウンが速く、移植性に優れている。
広く使われているDockerツール
Dockerが強力であるのと同様に、その人気は関連するツールやライブラリの豊富なエコシステムによるところが大きい。ここでは最も注目すべきDockerツールをいくつか紹介します。
Docker Enterprise: 重要なデプロイメント用に設計されたDockerのバージョンで、認証された本番グレードのリリース用に高度なセキュリティ、管理、オーケストレーション機能を提供します。
Docker Swarm**: Dockerのクラスタリングとオーケストレーションツールで、ユーザは複数のDockerノードを単一の仮想システムとして管理することができ、スケーリングとロードバランシングがより簡単になります。
Docker Compose**: 複雑なマルチコンテナDockerアプリケーションの開発と管理を効率化するツールです。
Kubernetes**:オープンソースのコンテナ・オーケストレーション・プラットフォームで、サーバクラスタ間での大規模なコンテナ化アプリケーションのデプロイ、スケーリング、管理を自動化します。
Dockerエコシステムについては、こちらの記事https://middleware.io/blog/understanding-the-docker-ecosystem/で詳しく説明しています。
Testcontainers:依存関係の簡易管理
Testcontainersはオープンソースのフレームワークで、データベース、ブラウザ、メッセージブローカー、その他あらかじめ設定された依存関係の軽量でモジュール化されたインスタンスを提供し、コンテナ内で動作させることができます。コンテナを操作するためのプログラムAPIのライブラリをユーザーが自由に使えるようにすることで、Testcontainersは各依存関係の複雑な詳細を抽象化し、作業を容易にします。 これにより、プロジェクトの運用コストを削減すると同時に、実験を奨励し、合理的な開発を促進します。
Testcontainersの50以上のモジュール統合のセレクション](https://assets.zilliz.com/A_selection_of_Testcontainers_s_50_modular_integrations_1ddb95e832.png)
その名前が示すように、Testcontainersは、データアクセスレイヤー、統合テスト、受け入れテストを含むアプリケーションテストに関して、最も大きな生産性の向上を提供します。
Testcontainersでアプリケーションテストを実施する利点は以下の通りです:
分離と一貫性**: コンポーネントをコンテナ化することで、各テストは新鮮で既知の状態で実行されます。例えば、データベースを分離してテストすることで、ローカルのデータベース・セットアップの違いから発生する不整合を排除します。一方、ブラウザをコンテナ化することで、ローカルのブラウザ・セットアップによって発生するばらつきを修正し、より信頼性の高いUIテストを可能にします。
環境パリティ**:開発者は、エンドツーエンドで本番環境に近い環境でテストを実施できるため、環境間の不一致を減らし、テスト結果の精度を高めることができます。
リソース管理**:コンテナは実行時間が短いため、リソースをより効率的に管理することができます。
スケーラビリティと信頼性**:その結果、利用可能なリソースを考慮することなく、テストを容易に拡張できます。
アプリケーションのテストをより簡単で効果的にするだけでなく、Testcontainers は、環境にとらわれない AI アプリケーションの開発にも役立ちます。それでは、Testcontainers が生産性を向上させるその他の主な方法をいくつかご紹介しましょう。
Milvusインスタンスの実行
Testcontainersを使用して生産性を向上させる方法の最初の例として、以下のコードサンプルに示すようにMilvusインスタンスを作成してみましょう(この記事のコードサンプルはすべてJavaで書かれていますが、TestcontainersライブラリはPython、Node.js Go、Rust、その他いくつかの言語でも利用可能です):
import io.milvus.client.MilvusServiceClient;
import io.milvus.param.ConnectParam;
public class MilvusExample { インポート
public static void main(String[] args) { 以下のようにします。
MilvusContainer milvus = new MilvusContainer("milvusdb/milvus:v2.3.9");
milvus.start();
MilvusServiceClient milvusClient = new MilvusServiceClient(
ConnectParam.newBuilder().withUri(milvus.getEndpoint()).build());
}
}
個別のMilvusインスタンスをインストールして設定し、アプリケーションと統合する代わりに、Testcontainersはコード内からインスタンスを呼び出すだけの使いやすい抽象化を提供します。
まず、Milvus コンテナの新しいインスタンスを作成し、適切なコンテナイメージをパラメータとして渡すことでバージョンを指定します。アプリケーション開発を効率化するだけでなく、更新されたイメージを指定するだけでよいため、今後のアプリケーションの更新も容易になる。そこから、.start() メソッドを使用してコンテナを実行し、コンテナ内でサービスと対話できるようにする Milvus Service Client の新しいインスタンスにコンテナをパラメータとして渡します。
わずか数行のコードでMilvusのインスタンスを作成するだけでなく、このアプローチでは、アプリケーション自身によって起動されるため、コンポーネントがアプリケーションの要件と同期しなくなることはありません。
LLM統合のためのOllamaとHuggingFaceの統合
Testcontainers が生産性を向上させる第二の方法は、アプリケーション内での LLM のような AI コンポーネントの統合を合理化することです。これにより、アプリケーションに LLM 機能を追加するためにコード内から簡単に LLM 呼び出しを行うことができ、同様に重要なこととして、AI コンポーネントを DevOps プロセスの通常の一部にすることができます。
以下のコードスニペットでは、既存の OllamaContainer を継承した OllamaHuggingFaceContainer クラスを作成し、HuggingFace からダウンロードしたディープラーニングモデルを実行する Ollama コンテナを実行するインスタンスを起動している。
Ollamaはあなたのデバイス上でローカルに推論用のモデルを提供することを可能にするプラットフォームであり、一方HuggingFaceはオープンソースのAIモデルをダウンロードするための不可欠なハブである。この2つのリソースを組み合わせることで、Ollamaでサポートされている数十のモデルや、GGUF(GPT-Generated Unified Format)のあらゆるモデル-HuggingFaceには23,000のモデルがある-にアクセスすることができます。
パッケージ org.testcontainers.huggingface;
import com.github.dockerjava.api.command.InspectContainerResponse;
public class OllamaHuggingFaceContainer extends OllamaContainer { {.OllamaHuggingFaceContainer
private final HuggingFaceModel huggingFaceModel;
public OllamaHuggingFaceContainer(HuggingFaceModel model) { { OllamaHuggingFaceContainer(HuggingFaceModel model)
super(DockerImageName.parse("ollama/ollama:0.1.44"));
this.huggingFaceModel = model;
}
AIモデルの自動デプロイメント
続いて、Testcontainersはアプリケーション内からAIモデルを呼び出すことを可能にするので、それらのモデルを配布する、より便利で自動化された方法も提示します。オープンソースのモデルはHuggingFaceから簡単に入手できますが、それらはgitリポジトリに一連のファイルとディレクトリとして保存されています。これは素人には複雑すぎるだけでなく、熟練した開発者がモデルを扱うのに最も便利な方法とはほど遠い。
典型的なHuggingFaceリポジトリ](https://assets.zilliz.com/A_typical_Hugging_Face_repository_f5eb0a3380.png)
モデルを手動で設定しデプロイする代わりに、スクリプトでプロセスを自動化することができます。これもまた、モデル自体に別の抽象化レベルを追加しながら、開発者の管理オーバーヘッドを減らします。これは、以下のコード(長いテストスクリプトからのスニペットです)で例証されており、コード内からモデルをどのように指定し設定できるかを示しています。モデルが描画されるディレクトリと使用される正確なモデルを指定するだけでなく、変数 modelfile はプロンプトのテンプレートを定義します。
public class HuggingFaceVisionModelTest { ハギング顔モデルテスト
テスト
public void visionModelWithHuggingFace() throws IOException { {.
String imageName = "vision-model-from-HuggingFace";
String repository = "xtuner/llava-phi-3-mini-gguf";
String model = "llava-phi-3-mini-int4.gguf";
String visionAdapter = "llava-phi-3-mini-mmproj-f16.gguf";
String modelfile = ""
FROM ./llava-phi-3-mini-int4.gguf
FROM ./llava-phi-3-mini-mmproj-f16.gguf
テンプレート """{{ if .システム }}<|システム|>"
{{ .システム }}<|終了|>""{{ .システム }}{ if .システム }}<|システム
終了 }}{{ if .プロンプト }}<|ユーザー|> {{ .プロンプト }}<|ユーザー
{{ .プロンプト }}<|end|> {{ end }}{ if .プロンプト }}<|end|>
終了 }}<|アシスタント|> {{ .レスポンス }}<|end
{{ .レスポンス }}<|end|> {{ .レスポンス }}<|end
"""
PARAMETER stop "<|ユーザー|>"
PARAMETER stop "<|アシスタント|>"
PARAMETER stop "<|システム|>"
PARAMETER stop "<|end|>"
PARAMETER stop "<|endoftext|>"
PARAMETER num_keep 4
PARAMETER num_ctx 4096
""";
try (
OllamaContainer ollama = new OllamaContainer(DockerImageName.parse(imageName).asCompatibleSubstituteFor("ollama/ollama:0.1.44")).withReuse(true)
){
試す {
ollama.start()を実行します;
) { catch (ContainerFetchException ex) { try
createImage(imageName, repository, model, modelelfile, visionAdapter);
ollama.start();
}
前述したように、これはOllama上のどのモデルにも適用できますし、GGUF形式で利用可能な膨大な数のモデルにも適用できます。この方法でモデルをデプロイすると、アプリケーションの将来の反復でAIモデルをアップグレードするのも簡単になります。
結論
まとめると
コンテナは、バイナリ、依存関係、ライブラリ、設定ファイルなど、あらゆる環境で実行するために必要なコンポーネントをすべて含む、アプリケーションコードの標準化されたパッケージです。
コンテナの利点は次のとおりです:
ビジネスの俊敏性の向上
拡張性の向上
効率性の向上
コスト削減
コンテナの使用例
クラウドネイティブなアプリケーションの開発
アプリケーションの近代化
プロトタイピング
IoTデバイス
デブオプス
Dockerは、開発者がコンテナを作成、デプロイ、設定、管理できるプラットフォームだ。
最も広く使われているDockerツールには以下のものがある:
Docker Enterprise
Docker Swarm
Docker Compose
Kubernetes
テストコンテナ
Testcontainersはオープンソースのフレームワークで、データベース、ブラウザ、メッセージブローカーなど、コンテナ内で実行できる設定済みの依存関係のモジュールインスタンスを提供する。
Testcontainersは以下を提供することで、アプリケーションのテストを効率化します:
分離と一貫性
環境のパリティ
資源管理
スケーラビリティと信頼性
Testcontainersが提供する生産性と効率性の向上には、他にも以下のようなものがあります:
依存関係を抽象化することで、追加のソフトウェアをインストールしたり、アプリケーションの環境を変更したりすることなく、簡単に作業できるようになります。
AIコンポーネントをシンプルに呼び出すことで、DevOpsプロセスの通常の一部とする。
LLMの抽象化と自動デプロイメント。
続きを読む
コンテナ、Docker、DevOps、そして次世代のAI駆動型ソリューションの構築におけるこれらの役割について、以下のリソースをご覧ください。
読み続けて

Democratizing AI: Making Vector Search Powerful and Affordable
Zilliz democratizes AI vector search with Milvus 2.6 and Zilliz Cloud for powerful, affordable scalability, cutting costs in infrastructure, operations, and development.

Advancing LLMs: Exploring Native, Advanced, and Modular RAG Approaches
This post explores the key components of RAG, its evolution, technical implementation, evaluation methods, and potential for real-world applications.

Beyond the Pitch: Vector Databases and AI are Rewriting the Sales Playbook
Discover how AI and vector databases are transforming sales platforms with intelligent lead matching, automated workflows, and real-time insights. Learn why 43% of sales teams use AI in 2024.
