MinIO is a high-performance, cloud-native object store that runs anywhere (public cloud, private cloud, colo, onprem).
Walkthroughs, tutorials, guides, and tips. This story will teach you how to do something new or how to do something better.
This story contains new, firsthand information uncovered by the writer.
This writer has a vested interest be it monetary, business, or otherwise, with 1 or more of the products or companies mentioned within.
LangChainの革新的な世界を旅することで、データ管理とアプリケーション機能を変革する LangChain の大きな能力が明らかになりました。
これまでの議論を通じて、LangChain の複雑な機能について探りながら、いくつかのトピックを掘り下げてきました。この記事では、「MinIO による Langchain エージェントの強化」で取り上げた概念を基に、MinIO エージェントの機能を拡張して追加機能をカプセル化し、LangServe 経由でカスタム エージェントを展開します。
これらの洞察を基に、私たちは次に焦点を合わせます。
自動 API エンドポイント作成: LangServe の自動化機能により、必要な API エンドポイントが簡単に生成され、開発作業が効率化され、導入時間が大幅に短縮されます。
スキーマの生成と検証: LangServe はインテリジェントなスキーマ推論により、API が明確に定義されたインターフェースを提供することを保証し、より容易な統合とシームレスなユーザー エクスペリエンスを実現します。
カスタマイズ可能なエンドポイント構成: LangServe は、同期操作からリアルタイム更新まで、さまざまなアプリケーションのニーズに合わせてさまざまなエンドポイントを提供し、開発者に比類のない柔軟性を提供します。
簡単な統合:おそらく最も魅力的な機能である LangServe は、既存の LangChain コードとシームレスに統合できるため、開発者は大幅な変更を加えることなく、現在のコードベースと専門知識を活用できます。
LangServe/FastAPI アプリの自動生成されたドキュメント /docs
次の手順では、MinIO と LangChain を統合するプロセスについて詳しく説明します。
langchain-cli
を使用して LangChain アプリを作成します。agent.py
ファイルでカスタム LangChain エージェントを開発します。server.py
にエージェントを実装します。LangServe を使用して LangChain アプリケーションを展開すると、シームレスな統合が実現し、複雑な AI 機能と RESTful API 公開の間のギャップが埋められ、開発者は LangChain 機能のすべてを効率的に活用できるようになり、今日の急速に変化するデジタル環境でインテリジェント アプリケーションを展開するための新しい標準が確立されます。
LangChainはlangchain-cli
を使用してアプリケーションを作成する便利で簡単な方法を提供しています。pip
でインストールできます。このパッケージは、既存のアプリケーションを利用して新しいアプリケーションを簡単に作成できるインターフェースを提供します。
注: 必要なファイルはすべて、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 を使用した MinIO 統合 LangChain エージェントのデプロイメントを説明するために、まずエージェント チェーン コードをagent.py
に保存します。
まず、「play.min.io:443」パブリック サーバーに接続するminio_client
を初期化します。このファイルは最終的に LangChain のagent_executor
を呼び出し、それを LangServe のadd_route
ラッパーに渡すことができるようになります。
注: 前回の出版物を読むと、
まず、テキスト エディターを使用して agent.py ファイルを開きます。
sudo nano packages/agent.py
ファイルの先頭で、 os
、 io
、 minio
、 ChatOpenAI
などの必要なパッケージをインポートします。
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 と 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はカスタムロジックを構築するための無数の方法を提供していますが、その1つが「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_runnable
、 download_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_minio
、 download_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 つのメッセージで構成されます。
ファイル管理機能を備えた強力なアシスタントとしての AI エージェントのコンテキストを設定する「システム」メッセージ。
{input}
プレースホルダーを使用して、ユーザーの入力を表す「ユーザー」メッセージ。
エージェントの中間ステップと思考プロセスを保存する「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
を作成するには、定義済みのエージェントと使用可能なツールを提供し、詳細な出力のためにverbose=True
を設定します。
from langchain.agents import tool, AgentExecutor agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
AgentExecutor
、提供されたエージェントとツールを使用してタスクを理解し、ユーザーの入力に基づいて適切なツールを選択します。エージェントは、ツールごとに個別のプロンプトを表示する代わりに、指定された入力に基づいてツールの使用方法をガイドする単一のプロンプト テンプレートを使用します。エージェントは、実行プロセス中に適切なツールを動的に選択します。
アプリケーションを LangServe と統合してセットアップすると、LangChain アプリケーションを API として展開および管理するための効率的なパスが提供されます。FastAPI は、そのパフォーマンスと使いやすさ、非同期操作のサポート、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=["*"], )
これで、 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
エンドポイントにリクエストが行われたときにエージェント エグゼキュータが呼び出されるようになります。
この設定により、サーバーは受信リクエストを処理し、それをエージェント エグゼキュータに渡し、エージェントの応答をクライアントに返すことができます。エージェント エグゼキュータは、プロンプト テンプレート、ツール付き言語モデル、および出力パーサーを組み込んだ定義済みエージェントを使用して、ユーザー入力を処理し、使用可能なツールに基づいて適切な応答を生成します。
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 を実行している端末出力のスクリーンショット
Python 出力では、LangServe ログは/invoke/playground
アプリケーション エンドポイントとして識別します。これで、プレイグラウンド WebUI にアクセスでき、API の/docs
パスにアクセスすることで API の自動ドキュメントも利用できます。各アプリケーション機能の [試してみる] ボタンと、WebUI から実行できる定義済みの cURL リクエストを含めることで、テストと構成のアプローチが簡素化されます。
デプロイされた LangServe Playground のスクリーンショット
その結果、MinIO 統合 LangChain エージェントは、バッチ処理からリアルタイムのインタラクションに至るまでのさまざまな機能を備えたユーザー向けに開発および拡張できる、展開可能な API に巧みに変換されました。
LangServe アプリケーションが起動して実行されると、エンドポイントをターゲットにして Langserve のRemoteRunnable
モジュールでラップすることで、 server.py
の外部から使用できるようになります。
from langserve import RemoteRunnable remote_runnable = RemoteRunnable("http://localhost:8000/<path>/")
追加
LangChain はライブラリ全体にわたって幅広いモジュールを誇り、開発者が高度な AI 駆動型アプリケーションを構築できるように設計された多様なツールキットを紹介しています。複雑なチェーン構造からさまざまな AI モデルとのシームレスな統合まで、LangChain のモジュール式アーキテクチャは幅広い機能を促進し、AI と機械学習の分野で高度にカスタマイズ可能な高度なソリューションの作成を可能にします。
LangServe は、LangChain アプリケーションの導入プロセスをわかりやすく説明するだけでなく、大幅に簡素化します。開発と導入のギャップを埋めることで、MinIO と LangChain を活用した革新的なアプリケーションをコンセプトから現実へと迅速に移行し、より広範なエコシステムに統合してユーザー エクスペリエンスを強化できるようになります。
私たちの調査でカバーされた開発を通じて、MinIOと
MinIOでは、このテクノロジーが豊富な時代に、開発者コミュニティの創造性と可能性に刺激を受けています。コラボレーションと知識の交換にこれほど良い時期はありません。私たちはあなたとつながることを楽しみにしています!