写し
こんにちは、Docker GenAI スタックに関するこの技術トーク セッションへようこそ。 議題については、いくつかのリマインダーとともに簡単に紹介します。 Docker GenAI Stackを紹介し、スタックのコアコンポーネントについて説明し、2つのデモを使用して独自のDocker GenAI Stackを実行する方法について説明します。 したがって、このプレゼンテーションを理解するためにデータ サイエンティストである必要はありません。 開発者の視点でやっています。
目次
- 開発者は毎日AIを使用しています (0:38)
- ジェネレーティブAIとは (1:59)
- Docker Gen AIスタック入門 (2:53)
- Docker GenAIスタックのコアコンポーネント (4:10)
- Ollama は LLM を実行できます (5:36)
- RAG: Retrieval-Augmented Generation (8:39)
- Docker GenAIスタックを作成する (14:03)
- デモンストレーション 1 (18:19)
- デモンストレーション 2 (24:36)
- さらに詳しく
開発者は毎日AIを使用しています (0:38)
ですから、開発者として、私たちは毎日AIを使用しています。 古い開発者としての私の側では、VSCodeのCopilotのようなAIコードの提案はあまり好きではありませんが、Copilot ChatやGemini、ChatGPTなどのAIサイドキックは本当に好きです。 もし、自分たちでAIの相棒や他のAIアプリケーションを簡単に開発できるとしたらどうでしょうか。 このプレゼンテーションに対する私の視点は、繰り返しになりますが、開発者の視点です。
私の日常的なAIの個人的な使用は数多く、さまざまです。 私はGrammarlyをよく使います。 (GrammarlyはAIを使用しています)、英語のドキュメントを書くために。 フランス語から英語、英語からフランス語への翻訳によく使います。 私はよくチャットGPTやGeminiに頼んで、特定のトピックに関するソースコードサンプルを生成してもらいます。 例えば、ドキュメントのようなものです。 私はそれをいくつかの概念を説明するための要約をしたり、私のアイデアをガーデニングしたりするために使用します。
ジェネレーティブAIとは (1:59)
ジェネレーティブAI(またはジェネレーティブ人工知能)とは、テキスト、画像、音楽、ビデオなどの新しいコンテンツの作成に焦点を当てたAIの一分野を指します。 これは主に大規模な言語モデルに基づいています。 チャットボット、コンテンツ作成ツール、コード生成ツールなど、多くのユースケースを見つけることができます。 医学研究などにもお使いいただけます。 よく知られている例としては、画像を生成するMidjourney(ミッドジャーニー)があります。 もちろん、GitHub Copilot、GitLab Duo、Codeium。 私のお気に入りは、GitHub Copilot Chatです。 派手なプレゼンテーションなどを生成するためのガンマアプリケーション。
Docker Gen AIスタック入門 (2:53)
次に、Docker AIスタックについて話しましょう。 昨年 2023年のDockerconでは、DockerのCTOであるJustin Cormack氏が登壇し、GenAI Stackプロジェクトを発表しました。 GenAI Stackプロジェクトは、Docker、Neo4j、LangChain、Ollamaのコラボレーションで、GenAIアプリケーションの開発を促進します。 それでは、Docker GenAI Stackを使用する利点について話しましょう。 Docker GenAI Stack は、GenAI 開発プロジェクトのさまざまなコンポーネントを調整するために作成された Docker Compose プロジェクトです。 だから、あなたはクイックスターターを持っているでしょう。 GenAI Stackにより、Dockerは開発者がAIプロジェクトを迅速に開始できるようにし、多様なテクノロジーの融合に関連する一般的な障害を排除します。 包括的なコンポーネントのセットがあります。 このスタックには、さまざまな事前構成済みコンポーネントがバンドルされており、すぐにコーディングできるように準備されています。 そして、イノベーションを育てることができます。 あなたはあなたのプロジェクトにより速くストラップをブートします。 つまり、イノベーションにより多くの時間を割き、多くの実験をすることができます。
Docker GenAIスタックのコアコンポーネント (4:10)
Docker GenAI スタックのコア コンポーネントについて。 Docker GenAI Stack は、GenAI アプリケーションの開発とデプロイを容易にするために設計されたツールとリソースの包括的なセットです。 言い換えれば、これは Docker Compose プロジェクトであり、Ollama、Neo4j、および LangChain を使用して GenAI プロジェクトを開始するのに役立ちます。 また、Docker Composeを知らない場合、Docker Composeは、YAMLファイルを使用してマルチコンテナDockerアプリケーションを定義および実行し、すべてのアプリケーションサービスを構成するためのツールです。 Docker Compose には Docker Desktop が付属しています。 Ollama について – Ollama は、Llama 2、 3、Mistral、Gemma などの LLM のローカル展開と実行を支援するオープン ソース アプリケーションです。 Ollamaを使用すると、APIインターフェースが得られます。 OpenAIに準拠しており、GenAIアプリケーションの作成に使用します。 Neo4jは、グラフとベクトルのデータベースであり、非常に柔軟性があります。 これにより、LLMの取得拡張生成またはLLMのRAGが有効になります。 RAGについては、後ほどお話しします。
Ollama は LLM を実行できます (5:36)
しかし、最初にオラマがどのように機能するかを見てみましょう。 つまり、Ollama はワークステーション上の Chat GPT のようなものです。 ほとんどの場合、プロンプトと質問があり、LLM APIのおかげでOllamaとLLMに質問を送信します。 Ollama は LLM にクエリを実行し、回答を返します。 そこで、この例では「ロビン・フッドは誰だったのか」と問いかけます。 オラマは私の質問でLLMに問い合わせ、「ロビン・フッドはイギリスの民間伝承に登場する伝説的な人物で、英雄的な無法者としての有名人だ」などと答えます。 しかし、「彼の親友は誰なのか」という2つ目の質問をしても、それは魔法ではありません。 多くの場合、「何ですか?」という答えが得られるはずです。 なぜなら、実際には、オラマとLLMは前の質問と最後の質問を結びつけていなかったからです。 つまり、より詳細なプロンプトを提供する必要があります。 したがって、プロンプトに最初の質問「ロビンフッドは誰でしたか?」を入れます。 最終的には最初の答えを追加し、次に最後の質問「彼の親友は誰ですか?」を追加します。 この場合、LLM は 2 つの質問をリンクできます。 だから、「ところで、ロビン・フッドにはリトル・ジョンとフライアー・タックという2人の親友がいるんだよ」と答えるでしょう。 もちろん、これは一例にすぎません。
しかし、それだけでは不十分な場合もあります。 プロンプトに質問のリストがあります。 毎回、各質問と回答のプロンプトを更新します。 しかし、すぐに、オラマとLLMはすべての情報、すべてのデータを持っているわけではないので、「申し訳ありませんが、この情報は持っていません」と答えます。 そのため、プロンプトにさらにデータを追加する必要があります。 たとえば、ドキュメントの抜粋を追加したり、LLM の既存のデータを完成させたりします。 そして、オラマは「ロビンフッドの最悪の敵はノッティンガムの保安官だ」と答えることができるようになる。 したがって、プロンプトでより多くのコンテキストを提供する必要があります。 ただし、プロンプトのサイズには制限があります。 プロンプトにすべてを入れることはできません。
RAG: Retrieval-Augmented Generation (8:39)
さて、RAGについてお話しします。 つまり、検索拡張生成のためのRAGです。 RAGは、LLMが実際の作業コンテキストを理解するのを支援しています。 これにより、LLM はより正確な回答を生成できます。 そのため、ドキュメント、インターネット、その他のプロジェクトドキュメントなど、さまざまなソースからデータを取得できます。 データを変更し、その結果をデータベースに格納します。 Docker GenAIスタックの場合、Neo4jを使用しています。 また、アプリケーションに新しい質問を求めると、アプリケーションは最初にデータベース内のいくつかの類似点を検索します。 その後、アプリケーションは質問に関連するすべてのチャンクを取得します。 また、アプリケーションは、LLMにクエリを実行するためのよりスマートなプロンプトを作成できるようになります。 そのためには、埋め込みを計算する必要があります。 それはあなたの質問のために、すべてのチャンクのベクトル座標のようなものです。 また、データベースまたはアプリケーションは、質問に関連するチャンクを見つけるために、一種の距離計算を行うことができます。 そのため、この部分を最初から行う必要がある場合、この部分が複雑になる場合があります。
そのために、LangChainのようなプログラミングフレームワークがいくつかあります。 LangChainは、ジェネレーティブAIアプリケーションの開発を簡素化するために設計された強力なフレームワークです。 さまざまなツールやテクノロジーをシームレスに組み合わせるのに役立ち、Pythonなどのさまざまなプログラミング言語をサポートします。 また、LangChain用の公式PythonSDKがあります。 JavaScript 用の SDK があります。 繰り返しになりますが、これは公式のSDKです。 ただし、LangChain4Jなど、LangChainによって直接作成されていない他のフレームワークを見つけて、GenAIアプリケーションの開発に役立てることができます。 しかし、この場合はJavaで。 そして、デモンストレーションではLangChain4Jを使用します。
Docker GenAI スタックに再び戻りましょう。 Docker GenAI Stack プロジェクトでは、Python GenAI アプリケーションのサンプルがいくつか見つかります。 繰り返しになりますが、Docker Compose は GenAI コンポーネントのオーケストレーターです。 したがって、このプロジェクトをGitHubでクローンします。 そして、簡単なDocker Composeコマンドで、すべてのスタックとアプリケーションを起動できるようになります。 そのため、Compose Stack には、API を提供する Ollama サーバーがあります。 デフォルトでは、スタックは Ollama モデルをダウンロードします。 RAGサンプル用のNeo4jデータベースがあります。 そして、サンプルは最初にStack Overflowからいくつかの情報を取得するローダーです。 そして、ボットは 2 番目のサンプルをサポートします。 Stack Overflow と Neo4j のデータを使用します。これは、ローダーが Neo4j 内にデータを配置するためです。 ボットはこの情報を使用して、正確な回答を提供します。 つまり、これは技術的なボットであり、Stack Overflowのデータを使用して話し、技術的なトピックについてあなたと会話をします。 PDFボットもあるので、PDFドキュメントをボットにアップロードできます。 その後、ボットはドキュメントに関する情報を提供できるようになります。 これは、ドキュメントとチャットしているようなものです。 また、他にも 2 つのサンプルがあり、1 つは API です。 そのため、API を使用して Ollama サーバーに接続できます。 また、独自のPythonアプリケーションに使用できます。 また、API を使用しているフロントエンドのサンプル プロジェクトの例があります。 そのため、サンプルがたくさんあり、特にPythonアプリケーションを実行している場合は、それを使用して独自のプロジェクトを開始できます。
Docker GenAIスタックを作成する (14:03)
それでは、もちろん、Docker Composeを使用してDocker GenAIスタックを作成する方法を見てみましょう。 必要に応じて、特にPythonを使用している場合は、既存のGenAIスタックをハックできます。 私はPythonの開発者ではありません。 既存のプロジェクトのソースコードである公式のDocker GenAI Stackからアイデアやヒントを見つけたり、お気に入りの言語で自分だけのスタックを一から始めることができます。 例えば、私はVert-xとLangChain4Jで小さなチャットボットを作りました。 最初はJavaScriptの開発者ですが、Golangのような他のプログラミング言語も学びたいと思っています。 そして、私を助けてくれる小さな先生が必要です。 この GenAI アプリケーションを作成するために、Docker GenAI Stack ブループリントと同じロジックを使用しました。 Docker Composeの構造は全く同じですが、今回はJava、LangChain、J4を使用します。 そして、小さなLLMのdeepseekコーダーを使用します。 このアプリケーションを使用すると、モデルを変更することができます。 だから私はすべてのdeepseek-coderを使います。 Deepseek-coderは、タスクの開発に適しています。 ただし、TinyLlamaを使用することはできます。 これも小さなLLMであり、実際には、マシンにGPUがなくてもGenAIアプリケーションを起動できます。
そのため、私の Compose プロジェクトは 3 つのサービスに分割されています。 1つはオラマサービスなので、コンテナ内でオラマを起動します。 2つ目は、LLMがラップトップに存在しない場合にLLMをダウンロードすることです。 そして最後に、3つ目は私のWebアプリケーションで、LangChain4JとVert-xでそれを行いました。
別の注意点:コンテナ内でOllamaを実行できます。 したがって、このURLを使用して外部からOllamaにアクセスできるため、localhost:11434. また、ブラウザで localhost:8888 ポートを使用してアプリケーションにアクセスできます。 そして、コンテナ内では、Composeスタック、WebアプリケーションはOllamaサービスと通信し、このURLを使用して、サービスの名前はComposeファイルで定義されます。 しかし、Ollamaを実行する別の方法があります。 コンテナの外部のワークステーションでローカルに実行し、コンテナから使用できます。 したがって、この場合、コンテナで実行されているWebアプリケーションのみがあります。 そして、このDNS名host.local.internalを使用して、実行中の外部Ollamaにアクセスします。 つまり、私のラップトップで実行されているOllamaは、たとえば、MacBook Pro M2を使用しています。 したがって、このように使用すると、ラップトップのGPUの恩恵を受けることができます。
デモンストレーション 1 (18:19)
では、最初のデモのソースコードを見てみましょう。 私は3つのサービスでComposeファイルを作成し、1つはOllamaのLLMをダウンロードし、もう1つはWebアプリケーション用です。 プロファイルのおかげで、一部のサービスしか開始できません。 たとえば、ワークステーションで直接実行されている Ollama のみを使用する場合は、Web アプリ サービスを使用します。 それ以外の場合は、コンテナ サービスを使用して 3 つのサービスを読み込みます。 したがって、Dockerfileは単純です。 つまり、WebアプリケーションをDocker化するためのものです。 アプリケーションを構築する最初の段階、Javaランタイムを構築するための第2段階、およびJavaランタイムとJava Webアプリケーションを使用して新しいイメージを作成する第3段階があります。 LangChainのソースコードは読みやすいです。 モデルの名前であるOllamaのURLが必要です。 私はストリーミングモデルと呼んでいるものを開始します。 つまり、モデルの回答をクライアントにストリーミングできるオブジェクトです。 このオブジェクトを使用して、ユーザーと LLM の間の会話のメモリを管理します。 そして最後に、質問、モデルのシステム命令、最終的にはコンテキストを投稿するための特定のルートスラッシュプロンプトがあります。 これで、メッセージとメモリメッセージのリストを作成します。 そして、モデルにプロンプトを送信できるようになります。 また、ストリーミング応答ハンドラを使用して、モデルの回答をクライアントにストリーミングできるようになります。
それでは、デモンストレーションを始めましょう。 そこで、deepseekコーダーモデルを使用します。 そして、私はラップトップでローカルに実行されているOllamaを使用します。 では、Docker Desktop に切り替えて、すべてが実行されているかどうかを確認しましょう。 はい。 だから私はここから私のウェブアプリに到達することができます。 そこで、ブラウザに切り替えます。 だからあなたは私のウェブアプリを見ることができます。 その後、モデルにいくつかの指示を与えることができます。 Webアプリから投稿することも、ソースコードJavaの裏側にこの指示を書くこともできます。 このデモには文脈は必要ありません。 そして、私の質問はここにあります、実際には、私はGolangの「hello world」プログラムについての簡単な説明が必要です。 だから私は私のプロンプトを提出します。 したがって、プロンプトは人間の質問とシステム命令です。 したがって、LLM が "hello world" プログラムを生成できたことがわかります。 もっといろんなことをお願いします。 例えば、私は同じ指示を守っています。 そして、次のフィールドを持つ構造「human」を追加するように依頼します。 名前も、年齢も必要だ。 そして、私は再び服従します。 つまり、LLMは人間の構造でメインコマンドをアドレス指定できたことがわかります。 そして、新しい構造体を使用できます。 最後の質問をしてみます。 「構造体にgreetingsメソッドを追加できますか?」 そして、もう一度送信をクリックします。 そして、LLMがgreetメソッドを追加し、それをmain関数で呼び出すことがわかります。 開発者ツールを開いた場合は、ここをクリックしてください。 コンソールに事前の会話の要約をクリックします。 実際、私はすべての会話を記憶に残していることがわかります。 そして、モデルはすべての質問をリンクさせることができます。 それが最初のデモンストレーションでした。 それでは、2 番目のデモンストレーションのプレゼンテーションに戻りましょう。
デモンストレーション 2 (24:36)
2 番目のデモは RAG に関するもので、これも Vert-x と LangChain4J を使用します。 Compose ファイルは、前のプレゼンテーションとほぼ同じです。 しかし、今回は別のモデルを使用します。 ジェマを使っていきます。 Google DeepMindの小型モデルです。 埋め込みの概念を使用します。 ただし、Compose ファイルは同じです。 新しいデモのソース コードを見てみましょう。 Compose ファイルは、最初のデモの前の Compose ファイルと非常によく似ています。 アプリケーションの Dockerfile についても同じことを言っています。 Javaのソースコードを何か変更しました。 実際、このアプリケーションは、ロールプレイングゲームのルールについて何らかの答えを出すことができる一種のボットです。 ルールは非常に短いです。 次に、アプリケーションはドキュメントをチャンク化し、ドキュメントをベクターストア内のドキュメントの埋め込みに配置します。 そして、LLMにプロンプトを送信するための類似性検索を行うことができます。 ドキュメントに何かを追加します。 キーゴーグという名前の新しいモンスターを追加します。 実際、Twitterでは私のアンダーです。 そのため、KeegorgはDockerのシニアソリューションアーキテクトです。 このようにルールを編集していきます。 ここでは、ドキュメントの最後に詳細を追加します。 ドキュメントを保存します。
それでは、Javaのソースコードを見てみましょう。 繰り返しになりますが、vert-x と LangChain4J を使用します。 実際、LangChain4Jには、非常に興味深いツールが付属しています。 ということで、ルール文書を読んでみます。 それはただのJavaソースコード、古典的なJavaソースコードです。 ただし、ドキュメント スピッターを使用してチャンクを作成します。 つまり、ドキュメントスピッターはLangChain4Jのオブジェクトです。 After LangChainには、メモリ内埋め込みモデルが付属しています。 そのため、RAGを試すためのアプリケーションを作成するのは非常に簡単です。 したがって、埋め込みモデル.embedallを使用します メソッドを使用すると、ドキュメントのすべてのチャンクに対してすべての埋め込みを作成できます。 その後、再び、LangChain4Jにはインメモリベクトルデータベースが付属していました。 繰り返しになりますが、実験には非常に便利です。 その後、実際のアプリケーションでは、たとえばNeo4jやユーザーデータベースを使用する必要があります。 また、すべての埋め込みをインメモリベクターストアに追加できます。 もう 1 つのオブジェクト、コンテンツ レトリーバーがあります。 繰り返しになりますが、LangChain4J. また、コンテンツレトリーバーを使用すると、質問に近いドキュメント内のすべての類似点を見つけることができます。
その後、LLM オブジェクトを作成します。 そして、プロンプトルートで使用します。 ですので、Webアプリページからの質問やシステムデータや値から、システム指示やヒューマンメッセージを作成できるようになります。 その類似性を生かして、文脈メッセージを作成します。 したがって、すべての類似性を使用して、いくつかのレコードを作成します。 実際、文脈の中で。 システム命令からのすべてのメッセージ、会話メモリ、コンテキストメッセージ、および人間のメッセージを使用して、プロンプトを作成します。 また、ストリーミング参照ハンドラを使用すると、LLMの回答をWebクライアントにストリーミングできます。 そこで、Gemma モデルでアプリケーションを開始します。 ラップトップでローカルに実行されているOllamaインスタンスを再度使用します。
それでは、アプリケーションを起動しましょう。 Docker デスクトップに移動します。 したがって、アプリケーションが実行されていることがわかります。 だから私は私のアプリケーションに移動するためにブラウザを起動することができます。 これは私の新しいWebアプリケーションです。 システムの説明書を見ることができます。 モデルにはダンジョンマスターだと説明します。 そして、彼の仕事はルール文書に関する情報を提供することです。 そして、これが私のプロンプトです。 私は何か、例えば、ゲームのプレーヤーのリストを尋ねることができます。 そして、「送信」をクリックします。 だから私はリストを持っています。 そして今、私は同じ質問を試みます。 しかし、ゲームのモンスターと一緒に、私はそれを再び提出します。 つまり、あなたはすべてのモンスターと私を持っており、Docker ComposeとKubernetesに関する私の知識についての知識と私の奇妙な英語を持っています。 このように、AIはさまざまなユースケースを使用することができます。 RAGは、プロジェクトのドキュメントやこのようなゲームなどに使用できるため、正直なところ非常に興味深いものです。 ご清聴ありがとうございました。
さらに詳しく
- ドッカーは初めてですか? 始めましょう。
- 注目のガイドでDocker製品を深く掘り下げます。
- Docker Newsletter を購読してください。
- Docker デスクトップの最新リリースを入手します。
- 質問がありますか? Docker コミュニティがお手伝いします。