ノート:

OCIをOCIデータ・サイエンス・ノートブック内のOpenSearchおよびLangChainと統合

イントロダクション

OpenSearchは近年、特に企業が大規模な言語モデル(LLM)を採用してデータ・インサイトを推進し、カスタム・ビジネス・ユース・ケースにインテリジェント検索機能を活用するようになったことで、急速に採用されています。最新のAI/ML機能とのシームレスな統合を実現するというOpenSearchの継続的なコミットメントにより、企業は強力な可観測性、検索、分析エンジンを構築できました。これは、LLMの使用量の増加に伴って不可欠です。Oracle Cloud Infrastructure Search with OpenSearch (OCI with OpenSearch)では、生成AI(GenAI)アシスタントやランキング学習などの最新のAI/ML機能を活用して、戦略的な問題を解決することに、すでに注目されています。

OpenSearch 2.11リリースのOCIでは、ハイブリッド検索、セマンティック検索、および検索拡張生成(RAG)を使用した会話型検索を実行するためのコンソールおよびコマンドライン・インタフェース(CLI)機能が提供されています。しかし、顧客から収集した重要な問題点のいくつかは、会話型検索ワークフロー/RAGパイプラインの構成を中心に展開していましたが、さらに重要なのは、大量の非構造化または構造化を前処理して取り込むためのアルゴリズムの複雑さです。特に、PDF、CSV、EXCEL、WORD、DATA LAKESなどの多数の形式からのデータで、情報の取得に速度と精度の両方を必要とするLLM駆動アプリケーションにアクセスできるようにします。したがって、LangChainとOCIをOpenSearchと統合することは、効率的な問合せ処理と取得拡張生成(RAG)を容易にし、LLMをよりコンテキスト的で正確な応答で可能にするため、非常に重要になっています。

LangChainは、複雑なLLMワークフローを作成および管理するための使いやすいフレームワークを提供し、開発者はLLMとOpenSearchの統合を合理化できます。この組合せにより、言語モデルが膨大なデータ・ストアから最も関連性の高い情報を取得できるようになり、エンド・ユーザーのレスポンス品質が向上するため、検索の関連性が向上します。

さらに、OCI Data ScienceおよびOCI Generative AIとの統合により、最小限の労力とコードでエンタープライズAIのユース・ケースの開発と本番デプロイメントを大幅に高速化できます。OCI Data Scienceは、データ・サイエンティストが最小限の摩擦でモデルを構築、トレーニング、導入するための包括的なツール・スイートを提供し、データ準備とモデル・ライフサイクル管理に関連する多くの面倒な作業を自動化します。OCI Data ScienceをOpenSearchおよびLangChainと統合することで、AIを効率的に運用し、より少ないリソースで高度なデータ・インサイトを活用できます。

読みやすくするために、この最初のチュートリアルでは、OCIをOpenSearchで設定し、OCI Data Scienceサービスとの通信を構成し、LangChainを構成し、OCIとOpenSearchを統合してセマンティック検索を実行することに重点を置きます。次のチュートリアルでは、LangChain、OCIとOpenSearch、Oracle Cloud Infrastructure Data Science AI Quick Actions (AI Quick Actions)、OCI Generative AIサービスのシームレスな統合を活用して、LLMアプリケーション開発を加速する方法について説明します。

目的

タスク1: OpenSearchクラスタの作成およびテナンシのOCIデータ・サイエンス・ノートブックの設定

テナンシにOCI Data Science Notebookを設定するには、インターネット・アクセスによるVCNの作成および構成、グループ、動的グループの設定、およびOCI Data Scienceがテナンシ内の特定のリソースを管理できるようにするために必要なOracle Cloud Infrastructure Identity and Access Management (OCI IAM)ポリシーの付与など、いくつかのステップが必要です。わかりやすくするために、1_Setup_Data_Science_Notebook_In_Your_Tenancy.ipynbのすべてのステップをコンパイルしました。

OCI Data Scienceチームには、提供するすべての機能に関する詳細なドキュメントもあります。詳細は、データ・サイエンスの概要を参照してください。

ノート:すでにOpenSearchクラスタがあり、テナンシのノートブックがすでに構成されている場合は、このチュートリアルのLangChain統合部分にスキップして、セマンティック検索のユース・ケースを試すことができます。

新しいOCIデータ・サイエンス・プロジェクト自体を作成しても、追加のコンピュート・リソースはスピンアップされず、データ・サイエンス・プロジェクトの下に作成する各ノートブック・セッションは、独自のコンピュート・リソースをスピンします。

タスク1.1: Virtual Cloud Network (VCN)の構成

テナンシ内にVCNを作成し、データ・サイエンス操作のためのセキュアな通信を許可するように適切なサブネットおよびセキュリティ・リストが設定されていることを確認します。

ウィザードを使用して、「インターネット接続性を持つVCNの作成」をクリックします。

なし: 非常に重要なステップの1つは、VCNのプライベート・サブネットに適切なイングレスおよびエグレス・ルールを追加することです。これらのルールがないと、ノートブックがインターネットにアクセスできなくなる可能性があります。これにより、重要なライブラリおよび依存関係をインストールできなくなります。既存のVCNがすでにある場合は、プライベート・サブネットのセキュリティ・リストを編集して、次のイングレス・ルールを追加できます。

VCNを示すイメージ。 図1.a: VNC構成ウィザード

イメージ・イングレス・ルール構成 図1.b: プライベート・サブネットのイングレス・ルールの構成

タスク1.2: OpenSearchクラスタの作成

2.11以上のイメージを持つOpenSearchクラスタが必要になります。

既存のクラスタがまだない場合は、OpenSearchを使用したOracle Cloud Infrastructure Searchを使用したデータの検索およびビジュアル化を参照してください。タスク1.1で作成したものと同じVCNを使用して、クラスタを作成します。

または

使用する既存のクラスタがすでにある場合は、クラスタのプライベート・サブネットに移動し、前述のエグレス・ルールをセキュリティ・リストに追加してください。

タスク1.3: 必要なグループおよび動的グループの作成

データ・サイエンティストのグループと、OCI Data Scienceリソースの動的グループを定義します。これにより、OCI内でデータ・サイエンス・アクティビティを実行するための適切な権限が有効になります。必要なグループおよび動的グループの手動構成の詳細は、データ・サイエンティスト・ユーザー・グループの作成を参照してください。

また、OCI Resource Managerスタックを使用して、これらのリソースを動的に作成することもできます。

  1. OCIコンソールに移動し、「開発者サービス」「リソース・マネージャ」に移動し、「スタック」をクリックします。

  2. 「スタックの作成」をクリックし、ウィザードに従ってOCI Data Scienceテンプレートからスタックを作成します。

    ノート:データ・サイエンス・テンプレートは、「サービス」タブの下にある「テンプレートの選択」をクリックすると表示されます。

タスク1.4: ノートブックのOCI IAMポリシーの構成

グループおよび動的グループに権限を付与し、OCI Data Scienceサービスがテナンシ内の特定のリソースを管理できるようにするには、一部のOCI IAMポリシーを構成する必要があります。ポリシーがネットワーク通信およびデータ・アクセス権限をカバーしていることを確認します。詳細は、モデル・デプロイメント・ポリシーを参照してください。

タスク1.5: AIクイック・アクション用のOCI IAMポリシーの構成

テナンシでAIクイック・アクションの力を活用してモデルのトレーニング、評価およびデプロイメントを自動化および高速化する場合は、テナンシ内の適切なリソースへのアクセス権を付与するために、一連のOCI IAMポリシーおよび動的グループを構成する必要があります。これらの必須ポリシーを構成しない場合、AIクイック・アクションはノートブック・セッションで機能しません。詳細は、AIクイック処理ポリシーを参照してください。

Define tenancy datascience as ocid1.tenancy.oc1..aaaaaaaax5hdic7xxxxxxxxxxxxxxxxxnrncdzp3m75ubbvzqqzn3q
Endorse any-user to read data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}
Endorse any-user to inspect data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}
Endorse any-user to read object in tenancy datascience where ALL {target.compartment.name='service-managed-models', target.bucket.name='service-managed-models'}

ルート・コンパートメントにOCI IAMポリシー・ドキュメントを作成することが重要です。必要なすべてのルールを同じポリシー・ドキュメントに追加できます。わかりやすくするために、このチュートリアルで使用するノートブックとAIクイック・アクションの両方のすべてのOCI IAMポリシーのセットがあります。詳細は、data-science-iam-policiesを参照してください。

ノート:グループ名および動的グループ名およびコンパートメント名を更新してください。設計に基づいて、これらのポリシーをさらに制限したり、オープンにすることができます。

タスク2: OCI Data ScienceでのJupyter Notebookの起動

ノートブック・セッションを起動するには、データ・サイエンス・プロジェクトを作成する必要があります。このプロジェクトでは、複数のノートブックを作成できます。各ノートブックには独自の仮想マシン(VM)があり、個別に起動できます。各ノートブック・セッションでは、複数のモデルのデプロイと管理、既存のGitHubまたはBitbucketリポジトリのリンク、新しいリポジトリの作成と管理、複数のJupyterノートブックの開発、完全なアプリケーションの構築、または機械学習ワークフロー全体のオーケストレーションを行うことができます。

  1. OCIコンソールに移動し、「データ・サイエンス」「プロジェクト」に移動して、「プロジェクトの作成」をクリックします。

    ノート:わかりやすくするために、すべてのリソースを同じコンパートメントに作成します。VCNおよびOpenSearchクラスタを作成したのと同じコンパートメントを必ず選択してください。

    VCNを示すイメージ。

    図2: 新しいデータ・サイエンス・プロジェクトの作成

  2. 新しいノートブック・セッションを作成します。

    1. 「プロジェクトの詳細」ページで、「ノートブック・セッション」および「ノートブック・セッションの作成」をクリックします。

      VCNを示すイメージ。

    2. 目的のコンピュート・シェイプを選択し、必要なデータ・ソースをアタッチできます。ノートブック・セッションの作成時に、OpenSearchクラスタに使用したものと同じVCNおよびプライベート・サブネットを必ず選択する必要があります。

      VCNを示すイメージ。

      図3: 新しいノートブック・セッションの作成

  3. 「Open」をクリックして、ノートブック・セッションを起動します。pipを使用してノートブック・インタフェースから直接、必要なライブラリ(LangChainおよびOpenSearch Pythonクライアントを含む)をインストールできるようになりました。

    VCNを示すイメージ。

    VCNを示すイメージ。

    図4: ノートブック・セッションの起動

タスク3: Jupyter Notebookを使用したLangChainの構成

LangChainをJupyter Notebook環境またはスクリプトに他のライブラリとともにインストールし、OCIとOpenSearch、HuggingFace、OCI生成AIサービスなどとのシームレスな統合を活用して、セマンティック検索または会話検索を実行します。

Jupyter Notebookの最上部に次のコードを追加します。

!pip install -U langchain langchain-community opensearch-py pypdf  sentence-transformers oci  langchain-huggingface oracle_ads

ノートブック・セッション内で作成する各Jupyter Notebookでこれらのパッケージを毎回再インストールする必要を回避するために、conda環境を作成してアクティブ化し、すべての依存関係をインストールすることをお薦めします。これにより、この環境を複数のJupyterノートブックで再利用できます。ランチャには、事前構成されたconda環境がいくつかあります。これらの事前構成済の環境を自由に選択してターミナルにインストールし、追加のライブラリを上部にインストールしてください。インストールが完了したら、ノートブックのカーネルをこのアクティブなconda環境に設定します。

  1. 新しい端末を起動します。「ファイル」「新規」に移動し、「端末」をクリックします。

    VCNを示すイメージ。

    図5: 新しい端末を起動する

  2. 次のコマンドを実行してconda環境を作成します。

    odsc conda install -s python_p310_any_x86_64_v1
    conda activate <environment name>
    
  3. 次のコマンドを実行して、ターミナルでpipを使用してLangChainをインストールします。

    pip install  -U oracle_ads oci langchain langchain-community opensearch-py pypdf  sentence-transformers oci  langchain-huggingface oracle_ads
    

タスク4: LangChainを使用したドキュメントの処理

LangChainのノートの強みの1つは、構造化データや非構造化データなど、大量のドキュメントを効率的かつ最小限のコーディングで処理する機能を提供することです。必要なドキュメント処理クラスをインポートするだけで、その使用に最も適したクラスをインポートし、ロード・メソッドを起動してドキュメントを処理できます。次のコマンドを実行します

import os
from langchain.document_loaders import PyPDFLoader, CSVLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Step 1: Load PDF and CSV Documents
def load_documents():
    # Load PDF Document
    pdf_loader = PyPDFLoader("data/sample_document.pdf")
    pdf_documents = pdf_loader.load()

    # Load CSV Document
    csv_loader = CSVLoader(file_path="data/sample_data.csv")
    csv_documents = csv_loader.load()

    # Combine both sets of documents
    all_documents = pdf_documents + csv_documents
    return all_documents

# Step 2: Split the documents into smaller chunks for better processing
def split_documents(documents):
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=100
    )
    split_docs = text_splitter.split_documents(documents)
    return split_docs


# Load and process documents
documents = load_documents()
split_docs = split_documents(documents)

noteBook環境にLangChainをインストールしたら、LangChainとのOpenSearch統合でOCIを活用して、複数のAPIコールでステップOpenSearchの長いガイドに従ってコードを最初から記述するよりも、単純にセマンティック検索を実行できます。

  1. タスク4に示すように、LangChainドキュメント・ライブラリを使用して、非構造化データを処理およびチャンク化します。

  2. 取込み時にデータの埋込みを自動的に生成するために使用する埋込みモデルを定義します。再度、HuggingFaceとのLangChain統合を利用すると、1行のコードで事前トレーニング済のHuggingFaceモデルをデプロイできます。使用する埋め込みモデルの名前を指定するだけです。この目的のために、カスタム・ファインチューニング・モデルを使用することもできます。次のコマンドを実行します

    from langchain.embeddings import HuggingFaceEmbeddings
    embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L12-v2")
    
  3. LangChainを使用して、索引名、認証方法および使用する埋込みモデルを指定して、OpenSearchを使用してOCIへの接続を作成します。このメソッドでは、指定された索引名の索引がデータの取込み時に作成されるか、索引がすでに存在する場合は新しいデータで更新されます。次のコマンドを実行します

    from langchain.vectorstores import OpenSearchVectorSearch
    import oci
    
    # set up your script to use Resource principal for authentication
    auth_provider = oci.auth.signers.get_resource_principals_signer()
    auth = ("username", "password")
    AUTH_TYPE="RESOURCE_PRINCIPAL"
    opensearch_url="https://amaaaaaallb3......................opensearch.us-ashburn-1.oci.oraclecloud.com:9200"   // replace this whole value your opensearch url. Be sure sure to have the :9200 port in your url
    
    # Initialize OpenSearch as the vector database
    vector_db = OpenSearchVectorSearch(opensearch_url=opensearch_url,
                               index_name="<YOUR-INDEX-NAME>",
                               embedding_function=embedding_model,
                               signer=auth_provider,
                               auth_type="RESOURCE_PRINCIPAL",
                               http_auth=auth)
    
  4. LangChainを使用して、処理されたデータ・チャンクをOpenSearchクラスタに直接取り込むこともできます。次の例は、処理済ドキュメント・チャンクのリストで一括取込みをバッチで実行する方法を示しています。tqdmライブラリを使用して、データ収集の進行状況を追跡します。次のコマンドを実行します

    from langchain.vectorstores import OpenSearchVectorSearch
    import oci
    from tqdm import tqdm
    
    batch_size=100
    documents = load_documents() # function defined above feel free to or define a new one to process documents
    document_chunks = split_documents(documents) // function defined above feel free to edit
    index_name= <YOUR-INDEX-NAME>
    
    # Ingest documents in batches
    for i in tqdm(range(0, len(document_chunks), batch_size), desc="Ingesting batches"):
    batch = document_chunks[i:i + batch_size]
    vector_db.add_texts(texts=batch,
                      bulk_size=batch_size,
                      embedding=embedding_model,
                      opensearch_url=opensearch_url,
                      index_name= index_name,
                      signer=auth_provider,
                      auth_type=AUTH_TYPE,
                      http_auth=("username", "password"))
    
    #refresh index
    vector_db.client.indices.refresh(index=index_name)
    
  5. データが取り込まれたら、次のコマンドを実行して索引に対してセマンティック検索を実行します。

    # Generate topK documents with scores
    query = "what can you tell me about picasso?"
    search_results = vector_db.similarity_search_with_score_by_vector(embedding_model.embed_query(query), k=5)
    
    # Iterate over the search results and print the text along with the relevance scores
    for document, score in search_results:
       print(f"Score: {score}")
       print(f"Document: {document.page_content}\n")
    

次のステップ

LangChainおよびOCI Data ScienceとのOpenSearch統合によるOCIは画期的な変革であり、セマンティック検索とLLMに関するビジネス・ユース・ケースのエンタープライズ・アプリケーション開発を大幅にスピードアップします。このチュートリアルでは、テナンシでOpenSearchおよびOCI Data Scienceを使用してOCIを設定し、LangChainを利用してセマンティック検索を実行するための例を示す完全なガイドを提供します。

次のチュートリアル: チュートリアル2: LangChain、OCI Data Science Notebook、OCIをOpenSearchと統合し、OCI生成AIをRAGおよび会話型検索のLLM開発を加速させるでは、LangChain、OCI Data Science、AI Quick ActionおよびOCI Generative AIサービス間のシームレスな統合を活用して、独自のカスタムLLMアプリケーションを開発する方法について説明します。エンタープライズ・ビジネスAI/MLのユース・ケースとして、OpenSearchでOCIを試してみることをお薦めします。

コードは、次のGitHubリポジトリにあります。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。