paint-brush
LangServe と MinIO の統合により LangChain API を簡単に起動@minio
5,586 測定値
5,586 測定値

LangServe と MinIO の統合により LangChain API を簡単に起動

MinIO15m2024/06/21
Read on Terminal Reader

長すぎる; 読むには

この記事では、「MinIO による Langchain エージェントの強化」で説明した概念を基に、MinIO エージェントの機能を拡張して追加機能をカプセル化し、LangServe 経由でカスタム エージェントを展開します。次の手順では、MinIO と LangChain を統合するプロセスを詳しく説明します。
featured image - LangServe と MinIO の統合により LangChain API を簡単に起動
MinIO HackerNoon profile picture
0-item
1-item
2-item


LangChainの革新的な世界を旅することで、データ管理とアプリケーション機能を変革する LangChain の大きな能力が明らかになりました。


これまでの議論を通じて、LangChain の複雑な機能について探りながら、いくつかのトピックを掘り下げてきました。この記事では、「MinIO による Langchain エージェントの強化」で取り上げた概念を基に、MinIO エージェントの機能を拡張して追加機能をカプセル化し、LangServe 経由でカスタム エージェントを展開します。


  • LangChain による S3 バケット取得の革新: LangChain の S3 Loader と OpenAI API を活用してカスタム会話型 AI エージェントを作成し、データ管理のための合理的なアプローチを確立する方法について解説します。


  • MinIO による LangChain エージェントの強化: MinIO の活用について深く掘り下げ、LangChain と OpenAI の GPT を組み合わせて AI および ML データ処理の新たな領域を開拓する方法を紹介します。


これらの洞察を基に、私たちは次に焦点を合わせます。ランゲージサーブは、LangChain アプリケーションを開発からデプロイメントに移行するための極めて重要なツールであり、本番環境対応の API を起動するプロセスを簡素化します。

LangServe: LangChain アプリケーションの導入を簡素化

ランゲージサーブ開発者にとっての礎となり、API デプロイメントに従来から伴う複雑さを排除します。これにより、MinIO 統合 LangChain アプリケーションをアクセスしやすくユーザーフレンドリーな API にスムーズに移行できます。LangServe がデプロイメント環境をどのように再定義するかを次に示します。


  • 自動 API エンドポイント作成: LangServe の自動化機能により、必要な API エンドポイントが簡単に生成され、開発作業が効率化され、導入時間が大幅に短縮されます。


  • スキーマの生成と検証: LangServe はインテリジェントなスキーマ推論により、API が明確に定義されたインターフェースを提供することを保証し、より容易な統合とシームレスなユーザー エクスペリエンスを実現します。


  • カスタマイズ可能なエンドポイント構成: LangServe は、同期操作からリアルタイム更新まで、さまざまなアプリケーションのニーズに合わせてさまざまなエンドポイントを提供し、開発者に比類のない柔軟性を提供します。


  • 簡単な統合:おそらく最も魅力的な機能である LangServe は、既存の LangChain コードとシームレスに統合できるため、開発者は大幅な変更を加えることなく、現在のコードベースと専門知識を活用できます。


LangServe/FastAPI アプリの自動生成されたドキュメント /docs

LangChain と Langserve を深く掘り下げる

次の手順では、MinIO と LangChain を統合するプロセスについて詳しく説明します。


  1. langchain-cliを使用して LangChain アプリを作成します。
  2. agent.pyファイルでカスタム LangChain エージェントを開発します。
  3. LangServe API として実行するために、 server.pyにエージェントを実装します。

LangChain のコマンドライン インターフェースを使用してアプリを作成する

LangServe を使用して LangChain アプリケーションを展開すると、シームレスな統合が実現し、複雑な AI 機能と RESTful API 公開の間のギャップが埋められ、開発者は LangChain 機能のすべてを効率的に活用できるようになり、今日の急速に変化するデジタル環境でインテリジェント アプリケーションを展開するための新しい標準が確立されます。


LangChainはlangchain-cliを使用してアプリケーションを作成する便利で簡単な方法を提供しています。図書館pipでインストールできます。このパッケージは、既存のアプリケーションを利用して新しいアプリケーションを簡単に作成できるインターフェースを提供します。 LangChain アプリテンプレートまたは独自のものを作成します。


注: 必要なファイルはすべて、MinIO「blog-assets」リポジトリの「minio-langserve-deployment 」というディレクトリにあります。


新しい LangChain アプリケーションを作成するには、まず次のコマンドを実行して仮想環境を作成し、 langchain-cliパッケージをインストールします。


 mkdir minio-langserve-testing cd minio-Langserve-testing python -m venv .myenv source .myenv/bin/activate pip install langchain-cli 


langchain-cli のスクリーンショット


langchain-cliを使用して新しいアプリを作成するには、ターミナルでlangchainと入力します。次のコマンドは、 my-appという名前の新しいアプリケーション ディレクトリを作成するために記述されます。


 langchain app new my-app


上記のコマンドで作成された langchain アプリは、開発のための一貫した環境を作成することで、すべての面倒な作業を実行します。すぐに使用できる新しい LangChain アプリケーションの構造は次のようになります。


 ./my-app ├── Dockerfile ├── README.md ├── app │ ├── __init__.py │ └── server.py ⇐ (This is where we will import our agent into) ├── packages ⇐ (This directory is where we will write our agent) │ └── README.md └── pyproject.toml


次の手順では、packages/agent.py という名前の新しいファイルを作成し、 app/server.pyに変更を加えることで、新しく作成された LangChain アプリケーション ( my-app ) に変更を加えます。


この記事で説明するファイルは次のとおりです。


  • my-app/packages/agent.py
  • my-app/app/server.py

LangServe でデプロイする LangChain MinIO エージェントの開発

LangServe を使用した MinIO 統合 LangChain エージェントのデプロイメントを説明するために、まずエージェント チェーン コードをagent.pyに保存します。


まず、「play.min.io:443」パブリック サーバーに接続するminio_clientを初期化します。このファイルは最終的に LangChain のagent_executorを呼び出し、それを LangServe のadd_routeラッパーに渡すことができるようになります。


注: 前回の出版物を読むと、 MinIO ランチェーンツール「」は、LangChain と MinIO を併用した開発に関する貴重な洞察を提供します。同様の概念的アプローチに従いますが、MinIO ツール ロジックが追加されています。


まず、テキスト エディターを使用して agent.py ファイルを開きます。


 sudo nano packages/agent.py


ファイルの先頭で、 osiominioChatOpenAIなどの必要なパッケージをインポートします。


 import os import io from minio import Minio from minio.error import S3Error from langchain_openai import ChatOpenAI os.environ["OPENAI_API_KEY"] = "<<Your API Key Here>>" # Initialize llm llm = ChatOpenAI(api_key=os.environ["OPENAI_API_KEY"]) # Initialize MinIO client minio_client = Minio('play.min.io:443', access_key='minioadmin', secret_key='minioadmin', secure=True)


このコード スニペットでは、必要なパッケージをインポートし、 OPENAI_API_KEY環境変数に保存されている OpenAI API キーを使用して ChatOpenAI 言語モデルを初期化します。また、「play.min.io」パブリック サーバーに必要な接続詳細を提供して minio_client を初期化します。


次に、MinIO バケットを定義し、存在しない場合は作成します。


 # This variable will check if bucket exists bucket_name = "test" try: # Check if bucket exists if not minio_client.bucket_exists(bucket_name): # Create the bucket because it does not exist minio_client.make_bucket(bucket_name) print(f"Bucket '{bucket_name}' created successfully.") else: print(f"Bucket '{bucket_name}' already exists.") except S3Error as err: print(f"Error encountered: {err}")


ここでは、 bucket_name 「test」として定義し、 minio_client.bucket_exists()メソッドを使用して、すでに存在するかどうかを確認します。バケットが存在しない場合は、 minio_client.make_bucket()を使用して作成します。バケットがすでに存在する場合は、そのことを示すメッセージを出力します。また、処理中に発生する可能性のあるS3Errorをキャッチして出力するために、 try-except ブロックを使用したエラー処理も含めます。


基本的なセットアップが完了したら、次の手順で説明する MinIO ツール関数の定義とエージェント エグゼキュータの作成に進むことができます。

エージェントツールにLangChainの関数デコレータを使用する

Langchain と Langserve はどちらも、ロジックと機能をカプセル化する同様のアプローチを提供し、エージェントとチェーンのロジックにシームレスに統合できるようにします。これは、定義された関数内に詳細なドキュメント文字列を含む@toolデコレータを使用することで実現され、関数は AI エージェントによって利用および解釈できる再利用可能なコンポーネントとしてマークされます。


提供されているコード例を詳しく見てみましょう。


 from langchain.agents import tool @tool def upload_file_to_minio(bucket_name: str, object_name: str, data_bytes: bytes): """ Uploads a file to MinIO. Parameters: bucket_name (str): The name of the bucket. object_name (str): The name of the object to create in the bucket. data_bytes (bytes): The raw bytes of the file to upload. """ data_stream = io.BytesIO(data_bytes) minio_client.put_object(bucket_name, object_name, data_stream, length=len(data_bytes)) return f"File {object_name} uploaded successfully to bucket {bucket_name}."


upload_file_to_minio関数は@toolで装飾されており、再利用可能なコンポーネントであることを示しています。この関数は、バケット名、オブジェクト名、ファイルの生のバイトなど、ファイルを MinIO バケットにアップロードするために必要なパラメータを受け取ります。この関数は、 minio_clientを使用してファイルのアップロード操作を実行し、完了すると成功メッセージを返します。


 @tool def download_file_from_minio(file_info): """ Custom function to download a file from MinIO. Expects file_info dict with 'bucket_name', 'object_name', and 'save_path' keys. 'save_path' should be the local path where the file will be saved. """ bucket_name = file_info['bucket_name'] object_name = file_info['object_name'] save_path = file_info['save_path'] minio_client.get_object(bucket_name, object_name, save_path)


同様に、 download_file_from_minio関数も@toolでマークされています。この関数は、バケット名、オブジェクト名、ファイルを保存するローカル パスなど、MinIO バケットからファイルをダウンロードするために必要な情報を含むfile_info辞書を必要とします。この関数は、 minio_clientを使用して指定されたバケットからオブジェクトを取得し、指定されたローカル パスに保存します。


 @tool def list_objects_in_minio_bucket(file_info): """ Custom function to list objects in a MinIO bucket. Expects file_info dict with 'bucket_name' key. Returns a list of dictionaries containing 'ObjectKey' and 'Size' keys. """ bucket_name = file_info['bucket_name'] response = minio_client.list_objects(bucket_name) return [{'ObjectKey': obj.object_name, 'Size': obj.size} for obj in response.items]


@toolで修飾されたlist_objects_in_minio_bucket関数は、MinIO バケット内に存在するオブジェクトをリストする役割を担います。bucket_name bucket_nameを持つfile_info辞書が必要です。この関数は、 minio_clientを使用して指定されたバケット内のオブジェクトのリストを取得し、各オブジェクトのオブジェクト キーとサイズを含む辞書のリストを返します。


Langchain と Langserve は、これらの機能をツールとしてカプセル化することで、AI エージェントがそれらをロジックと意思決定プロセスにシームレスに組み込むことを可能にします。エージェントは、手元のタスクに基づいて適切なツールをインテリジェントに選択して実行できるため、機能が強化され、MinIO ストレージ システムとのより複雑で動的なやり取りが可能になります。

LangChain の Runnable メソッドを理解する

LangChainはカスタムロジックを構築するための無数の方法を提供していますが、その1つが「実行可能上記の実証ロジックについては、LangChain が提供する構成要素であるRunnableLambdaにより、AI エージェントのロジック内で関数を実行可能な単位として扱うことができます。


 from langchain_core.runnables import RunnableLambda upload_file_runnable = RunnableLambda(upload_file_to_minio) download_file_runnable = RunnableLambda(download_file_from_minio) list_objects_runnable = RunnableLambda(list_objects_in_minio_bucket)


ツール関数を RunnableLambda でラップすることで、実行中にエージェントによって呼び出すことができる実行可能インスタンス ( upload_file_runnabledownload_file_runnable 、およびlist_objects_runnable ) を作成します。これらの実行可能インスタンスは、対応するツール関数をカプセル化し、エージェントがそれらを操作するための統一されたインターフェースを提供します。


 tools = [upload_file_to_minio, download_file_from_minio, list_objects_in_minio_bucket] llm_with_tools = llm.bind_tools(tools)


ツール リストには、エージェントの機能の構成要素として機能する元のツール関数 ( upload_file_to_miniodownload_file_from_minio 、およびlist_objects_in_minio_bucket ) が含まれています。 llm.bind_tools(tools)行は、ツールを言語モデル ( llm ) にバインドし、モデルの推論機能とツールによって提供される特定の機能との間の接続を確立します。結果として得られるllm_with_tools 、バインドされたツールを使用するための知識と能力が強化された言語モデルを表します。


RunnableLambdaの使用とツールの言語モデルへのバインドは、強力でカスタマイズ可能な AI エージェントを作成する際の LangChain と LangServe の柔軟性と拡張性を実証しています。言語モデルのパワーとツールにカプセル化された特定の機能を組み合わせることで、AI エージェントは、MinIO へのファイルのアップロード、MinIO からのファイルのダウンロード、MinIO バケット内のオブジェクトのリストなど、複雑なタスクを実行できるようになります。

エージェントをガイドするためのプロンプトテンプレートの作成

次に、AI エージェントがユーザー入力を理解して応答できるようにガイドするプロンプト テンプレートに焦点を移します。これは、ロールとメッセージ コンテンツを含むタプルとして表されるメッセージのリストを受け取るChatPromptTemplate.from_messages()メソッドを使用して定義されます。


 from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents.format_scratchpad.openai_tools import format_to_openai_tool_messages from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser from langchain_core.messages import AIMessage, HumanMessage prompt_template = ChatPromptTemplate.from_messages([ ("system", "You are a powerful assistant equipped with file management capabilities."), ("user", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad"), ])



プロンプトは次の 3 つのメッセージで構成されます。


  1. ファイル管理機能を備えた強力なアシスタントとしての AI エージェントのコンテキストを設定する「システム」メッセージ。


  2. {input}プレースホルダーを使用して、ユーザーの入力を表す「ユーザー」メッセージ。


  3. エージェントの中間ステップと思考プロセスを保存する「agent_scratchpad」という名前のMessagesPlaceholder


format_to_openai_tool_messages関数はエージェントのスクラッチパッドを OpenAI のツールと互換性のある形式にフォーマットし、OpenAIToolsAgentOutputParser クラスはモデルの応答をエージェントが解釈できる構造化形式に解析します。


AIMessageクラスとHumanMessageクラスは、エージェントとユーザーの間で交換されるメッセージを表し、エージェントのロジック内で通信を処理するための標準化された方法を提供します。


プロンプト テンプレートを定義することで、タスクを解決する際の中間ステップと思考プロセスを追跡するために「agent_scratchpad」プレースホルダーを利用し、ユーザー入力を理解して応答するための明確な構造とコンテキストを AI エージェントに提供します。

ツールによるエージェントの定義

最後に、 agent.pyを完成させるために、エージェントを定義し、LangServe ライブラリのadd_route関数を使用してserver.pyスクリプトからインポートして呼び出すことができる AgentExecutor を作成します。


必要なコンポーネントをインスタンス化し、それらを連結して単一のエージェント変数を作成します。


 agent = ( { "input": lambda x: x["input"], "agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]), } | prompt_template | llm_with_tools | OpenAIToolsAgentOutputParser() )


エージェントは、辞書と連鎖操作の組み合わせを使用して定義されます。 input キーは、受信データからユーザー入力を抽出し、 agent_scratchpadキーはformat_to_openai_tool_messages関数を使用して、エージェントの思考プロセスの中間ステップをフォーマットします。エージェントには、プロンプト テンプレート ( prompt_template )、ツール付き言語モデル ( llm_with_tools )、および出力パーサー ( OpenAIToolsAgentOutputParser() ) も組み込まれています。

エージェントを実行するための AgentExecutor の定義

AgentExecutorを作成するには、定義済みのエージェントと使用可能なツールを提供し、詳細な出力のためにverbose=Trueを設定します。


 from langchain.agents import tool, AgentExecutor agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)


AgentExecutor 、提供されたエージェントとツールを使用してタスクを理解し、ユーザーの入力に基づいて適切なツールを選択します。エージェントは、ツールごとに個別のプロンプトを表示する代わりに、指定された入力に基づいてツールの使用方法をガイドする単一のプロンプト テンプレートを使用します。エージェントは、実行プロセス中に適切なツールを動的に選択します。

AgentExecutor で LangServe ルートを定義する

アプリケーションを LangServe と統合してセットアップすると、LangChain アプリケーションを API として展開および管理するための効率的なパスが提供されます。FastAPI は、そのパフォーマンスと使いやすさ、非同期操作のサポート、API ドキュメントの自動生成のために選択されました。


LangServe ライブラリFastAPI で構築された は、LangChain オブジェクトの REST API としての展開を簡素化し、CORS 設定用の組み込みミドルウェアを提供して、さまざまなドメインから API を安全に呼び出すことができるようにすることで、この機能を強化します。


より詳細な使用例のデモについては、 langchain-ai/langserve GitHubリポジトリのサンプルディレクトリ


 from fastapi import FastAPI app = FastAPI( title="MinIO Agent API", version="1.0", description="A conversational agent facilitating data storage and retrieval with MinIO", )


CORS ヘッダーを設定するには、セキュリティを強化するために次の行を追加できます。


 from fastapi.middleware.cors import CORSMiddleware # Set all CORS enabled origins app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], )

LangServe を使用したエージェントの実装

これで、 packages/agent.pyが完成したので、これをインポートして、 app/server.pyスクリプトで LangServe ライブラリのadd_route関数を使用できます。


 from packages.agent import agent_executor from langserve import add_routes add_routes( app, agent_executor.with_types(input_type=Input, output_type=Output).with_config( {"run_name": "agent"} ), path=”/invoke” )


add_route(app, agent_executor(…), path="/invoke")を呼び出すことで、 /invokeパスをagent_executor()関数にマップするルートをサーバー アプリケーション ( app ) に追加します。これにより、 /invokeエンドポイントにリクエストが行われたときにエージェント エグゼキュータが呼び出されるようになります。


この設定により、サーバーは受信リクエストを処理し、それをエージェント エグゼキュータに渡し、エージェントの応答をクライアントに返すことができます。エージェント エグゼキュータは、プロンプト テンプレート、ツール付き言語モデル、および出力パーサーを組み込んだ定義済みエージェントを使用して、ユーザー入力を処理し、使用可能なツールに基づいて適切な応答を生成します。

Uvicorn 経由で LangServe アプリケーションを起動する

LangServe アプリケーションを起動するには、Uvicorn を ASGI サーバーとして採用し、アプリケーションを実行するための準備を整えます。このコード スニペットは、サーバーをアクティブ化し、ユニバーサル ホストとアプリケーションのアクセス ポイントの指定ポートを指定するため、極めて重要です。


 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)


このブロックをアプリケーションのメイン エントリ内に埋め込むことで、スクリプトが直接実行されるときに Uvicorn が主導権を握り、事前定義されたホストとポートで FastAPI アプリケーションが起動するようになります。このアプローチは、デプロイメント プロセスを簡素化するだけでなく、開発環境または本番環境でアプリケーションを実行するための明確なエントリをマークします。

サーバーアプリケーションの起動

上記のコードは、「langchain-cli」ライブラリの使用、新しい langchain アプリの作成、チェーン ロジックのagent.pyへの保存、FastAPI および LangServe 実装のserver.pyへの保存を含むモジュール アプローチを示しています。


これは最後のステップなので、アプリケーションの構築を示す目的で、アプリケーション コードをserver.pyに保存します。


当社のサービスを実行する最も簡単な方法は次のとおりです。


 python server.py


このコマンドはアプリケーションを実行し、まだデバッグが必要なログやエラー メッセージを返します。


LangServe を実行している端末出力のスクリーンショット


LangServe プレイグラウンド

Python 出力では、LangServe ログは/invoke/playgroundアプリケーション エンドポイントとして識別します。これで、プレイグラウンド WebUI にアクセスでき、API の/docsパスにアクセスすることで API の自動ドキュメントも利用できます。各アプリケーション機能の [試してみる] ボタンと、WebUI から実行できる定義済みの cURL リクエストを含めることで、テストと構成のアプローチが簡素化されます。


デプロイされた LangServe Playground のスクリーンショット


その結果、MinIO 統合 LangChain エージェントは、バッチ処理からリアルタイムのインタラクションに至るまでのさまざまな機能を備えたユーザー向けに開発および拡張できる、展開可能な API に巧みに変換されました。

LangServe APIのさらなる利用

LangServe アプリケーションが起動して実行されると、エンドポイントをターゲットにして Langserve のRemoteRunnableモジュールでラップすることで、 server.pyの外部から使用できるようになります。


 from langserve import RemoteRunnable remote_runnable = RemoteRunnable("http://localhost:8000/<path>/")


追加


LangChain はライブラリ全体にわたって幅広いモジュールを誇り、開発者が高度な AI 駆動型アプリケーションを構築できるように設計された多様なツールキットを紹介しています。複雑なチェーン構造からさまざまな AI モデルとのシームレスな統合まで、LangChain のモジュール式アーキテクチャは幅広い機能を促進し、AI と機械学習の分野で高度にカスタマイズ可能な高度なソリューションの作成を可能にします。

LangServe を使用した AI パイプラインの開発

LangServe は、LangChain アプリケーションの導入プロセスをわかりやすく説明するだけでなく、大幅に簡素化します。開発と導入のギャップを埋めることで、MinIO と LangChain を活用した革新的なアプリケーションをコンセプトから現実へと迅速に移行し、より広範なエコシステムに統合してユーザー エクスペリエンスを強化できるようになります。


私たちの調査でカバーされた開発を通じて、MinIOとランチェーン絶対に可能であり、ランゲージサーブこうした高度なソリューションを導入する上で、LangServe は極めて重要な役割を果たします。AI と ML の進化する環境を今後も乗り越えていく中で、LangServe のようなツールは、最先端のテクノロジーをアプリケーション開発の最前線にもたらす上で、今後も重要な役割を果たし続けるでしょう。


MinIOでは、このテクノロジーが豊富な時代に、開発者コミュニティの創造性と可能性に刺激を受けています。コラボレーションと知識の交換にこれほど良い時期はありません。私たちはあなたとつながることを楽しみにしています!ミニオー スラック会話を継続し、一緒に新たな高みに到達するためのチャンネルです。