Langchainとwatsonx.aiを使用してエージェント型チャンキングを実装し、LLMインプットを最適化。

著者

Shalini Harkar

Lead AI Advocate

エージェント型チャンキングとは

言語モデルがテキストを処理しセグメント化する方法は、従来の静的なアプローチから、より優れた、より応答性の高いプロセスに変化しています。エージェント型チャンキングでは、固定点で大きな文書をチャンク化する従来の固定サイズチャンキングとは異なり、AIベースの技術を用いて動的プロセスでコンテンツを分析し、テキストをセグメント化する最適な方法を決定します。

エージェント型チャンキングでは、AIベースのテキスト分割手法、再帰的チャンク化、チャンク・オーバーラップ手法を利用し、これらの手法が同時に働き、チャンク化能力を洗練させ、注目すべきアイデア間のリンクを最適化しながら、コンテキスト・ウィンドウをリアルタイムで最適化します。エージェント型チャンキングにより、各チャンクはメタデータで強化され、検索の精度と全体的なモデル効率が向上します。これは、データのセグメンテーションが検索品質と応答の一貫性に直接影響を与える可能性があるRAGアプリケーションでは特に重要です。意味のあるコンテキストはすべての小さなチャンクに保存されるため、このアプローチはチャットボット、知識ベース、生成AIのユースケースにとって非常に重要です。LangchainやLlamaIndexなどのフレームワークでは、検索効率がさらに向上するため、この方法は非常に効果的です。

エージェント型チャンキングの主要な要素

1. 適応型チャンキング戦略:コンテンツの種類、クエリの背後にある意図、検索のニーズに基づいて最適なチャンク化方法を動的に選択し、効果的なセグメンテーションを実現します。

2. 動的チャンク・サイジング:固定トークンの制限に固執するのではなく、意味構造とコンテキストを考慮することでチャンク・サイズをリアルタイムで変更します。

3. 文脈保持型オーバーラップ:チャンク間のオーバーラップをスマートに評価し、文脈の一貫性を維持しつつ重要な情報を失わないようにすることで、検索効率を向上させます。

 

The DX Leaders

AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。

ご登録いただきありがとうございます。

ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。

従来の方法と比較したエージェント型チャンキングの利点

エージェント型チャンキングには、従来のチャンキングに比べて次のようなメリットがあります。

a. 文脈の維持:不要な中断なしで重要な情報を保持します。

b. スマートサイジング:意味と重要性に応じてチャンクの境界を調整します。

c. クエリー最適化:特定のクエリーに合わせてチャンクを継続的に改善します。

d. 効率的な検索:不要な断片化を最小限に抑えることで、検索およびRAGシステムの出力を改善します。

 

このチュートリアルでは、watsonx.ai®で現在利用可能なIBM® Granite-3.0-8B-Instructモデルを使用して、エージェント型チャンキング戦略を試します。全体的な目標は、効率的なチャンク化を実行して、RAGを効果的に実装することです。

前提条件

watsonx.aiプロジェクトを作成するには、IBM® Cloudのアカウントが必要です。

ステップ

ステップ1.環境を設定する

いくつかのツールから選択することはできますが、このチュートリアルでは、Jupyter Notebookを使用するためにIBMアカウントを設定する方法について説明します。

  1. IBM Cloudアカウントを使用して、watsonx.aiにログインします。

  2. watsonx.aiプロジェクトを作成します。
    プロジェクトIDは、プロジェクト内から取得できます。[管理]タブをクリックします。次に、「一般」ページの「詳細」セクションからプロジェクトIDをコピーします。本チュートリアルでは、このIDが必要となります。

  3. Jupyter Notebookを作成します。

このステップでは、このチュートリアルのコードをコピーできるノートブック環境を開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。さらにGranite®のチュートリアルを表示するには、 IBM® Granite Communityをご覧ください。このJupyter Notebookと使用されるデータセットはGitHubで見つかります。

ステップ2. watsonx.aiのランタイム・インスタンスとAPIキーを設定する

  1. watsonx.ai Runtimeサービス・インスタンスを作成します(適切なリージョンを選択し、無料インスタンスであるLiteプランを選択)。

  2. APIキーを生成します。

  3. watsonx.ai Runtimeサービス・インスタンスを、 watsonx.aiで作成したプロジェクトに関連付けます。

ステップ3. 関連ライブラリーをインストールしてインポートし、認証情報を設定する

このチュートリアルでは、いくつかのライブラリーとモジュールが必要になります。以下のコンポーネントを必ずインポートしてください。インストールされていない場合は、pipをクイックインストールすることで問題が解決されます。

注:このチュートリアルはPython 3.12.7を使用して構築されています

!pip install -q langchain langchain-ibm langchain_experimental langchain-text-splitters langchain_chroma transformers bs4 langchain_huggingface sentence-transformers
import getpass
import requests
from bs4 import BeautifulSoup
from langchain_ibm import WatsonxLLM
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import WebBaseLoader
from langchain.schema import SystemMessage, HumanMessage
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import Chroma
from langchain.tools import tool
from langchain.agents import AgentExecutor
from langchain.memory import ConversationBufferMemory
from transformers import AutoTokenizer
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain.chains.combine_documents import create_stuff_documents_chain



 

認証情報を設定するには、「WATSONX_APIKEY」「WATSONX_PROJECT_ID」が必要です。また、APIのエンドポイントとして機能するURLも設定します。

load_dotenv(os.getcwd()+"/.env", override=True)
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com",
    "apikey": os.getenv("WATSONX_APIKEY", ""),
}
project_id = os.getenv("PROJECT_ID", "")

ステップ4. 言語モデルを初期化する。

このチュートリアルでは、同様の成果を得るために、LLMとしてIBMのGranite-3.0-8B-Instructモデルを使用することを推奨します。使用するAIモデルの選択は自由です。watsonxを通じて入手可能な基盤モデルは、こちらからご覧いただけます。

llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials.get("url"),
    apikey=credentials.get("apikey"),
    project_id=project_id,
    params={
        GenParams.DECODING_METHOD: "greedy",
        GenParams.TEMPERATURE: 0,
        GenParams.MIN_NEW_TOKENS: 5,
        GenParams.MAX_NEW_TOKENS: 250,
        GenParams.STOP_SEQUENCES: ["Human:", "Observation"],
    },
)

ステップ5. ドキュメントを読み込む

この関数は、機械学習に関するIBMの説明ページからテキスト・コンテンツを抽出します。この関数は、不要なHTML要素(スクリプト、スタイル)を削除し、クリーンで読みやすいテキストを返します。

def get_text_from_url(url):
    response = requests.get(url)
    if response.status_code != 200:
        raise ValueError(f"Failed to fetch the page, status code: {response.status_code}")
    soup = BeautifulSoup(response.text, "html.parser")
    for script in soup(["script", "style"]):
        script.decompose()
    return soup.get_text(separator="\n", strip=True)
url = "https://www.ibm.com/jp-ja/think/topics/machine-learning"
web_text = get_text_from_url(url)
web_text

固定長のチャンクキング方法を使用する代わりに、LLMを使用し意味に基づいてテキストを分割しました。この関数は、LLMを活用して、トピックに基づいてテキストを意味論的に意味を持つチャンクにインテリジェントに分割します。

def agentic_chunking(text):
    """
    Dynamically splits text into meaningful chunks using LLM.
    """
    system_message = SystemMessage(content="You are an AI assistant helping to split text into meaningful chunks based on topics.")
    
    human_message = HumanMessage(content=f"Please divide the following text into semantically different, separate and meaningful chunks:\n\n{text}")

    response = llm.invoke([system_message, human_message]) # LLM returns a string
    return response.split("\n\n") # Split based on meaningful sections
chunks = agentic_chunking(web_text)
chunks

出力構造をよりよく理解するために、チャンクをプリントしてみましょう。

for i, chunk in enumerate(chunks,1):
    print(f"Chunk {i}:\n{chunk}\n{'-'*40}")

成功です。チャンクはエージェントによってアウトプットにおいて正常に作成されました。

ステップ6:ベクトル・ストアを作成する

テキストのエージェント型チャンキングについて実験ができました。次は、RAGの実装に進みましょう。

このチュートリアルでは、エージェントによって生成されたチャンクを選択し、ベクトル埋め込みに変換します。使用できるオープンソースのベクトル・ストアはChroma DBです。langchain_cromaパッケージを通じてChroma機能に簡単にアクセスできます。Chromaベクトル・データベースを初期化し、埋め込みモデルを指定して、エージェント型チャンキングによって生成されたドキュメントを追加してみましょう。

embeddings_model = HuggingFaceEmbeddings(model_name="ibm-granite/granite-embedding-30m-english")
 

Chromaベクトル・データベースを作成します

vector_db = Chroma(
    collection_name="example_collection",
    embedding_function=embeddings_model
)

各テキストチャンクをドキュメントオブジェクトに変換します

documents = [Document(page_content=chunk) for chunk in chunks]

ドキュメントをベクトル・データベースに追加します。

vector_db.add_documents(documents)

ステップ7:プロンプト・テンプレートを構造化する

これで、LLMのプロンプト・テンプレートを作成できます。このテンプレートを使用すると、一貫したプロンプト構造を維持しながら、複数の質問をすることができます。さらに、ベクトル・ストアをレトリーバーとして統合し、RAGフレームワークを完成させることができます。

prompt_template = """<|start_of_role|>user<|end_of_role|>Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}
Question: {input}<|end_of_text|>
<|start_of_role|>assistant<|end_of_role|>"""
qa_chain_prompt = PromptTemplate.from_template(prompt_template)
combine_docs_chain = create_stuff_documents_chain(llm, qa_chain_prompt)
rag_chain = create_retrieval_chain(vector_db.as_retriever(), combine_docs_chain)

ステップ8:RAGチェーンのプロンプト

RAGワークフローでこれらのエージェント型チャンキングを使用して、ユーザー・クエリーを開始しましょう。1つ目は、構築したベクトル・ストアから追加のコンテキストを必要とせずにモデルを戦略的にプロンプトすることができ、モデルが組み込みの知識を使用しているか、それとも純粋なRAGコンテキストを使用しているのかをテストすることができます。IBMの機械学習の解説を利用して、ここで質問をしてみましょう。

output = llm.invoke("What is Model optimization process")
output

明らかに、モデルはモデルの最適化プロセスに関する情報に基づいてトレーニングされておらず、外部ツールや情報がなければ、正しい情報を提供することはできません。モデルはハルシネーションを起こします。それでは、構築したエージェント型チャンクを使用して同じクエリーをRAGチェーンに提供してみましょう

rag_output = rag_chain.invoke({"input": "What is Model optimization process?"})
rag_output['answer']

成功です。Graniteモデルは、エージェント型のRAGチャンクをコンテキストとして正しく使用し、意味論上の一貫性を維持しながら、モデルの最適化プロセスに関する正しい情報を提供してくれました。

概要

このチュートリアルでは、チャンク化プロセスでAIエージェントを使用して比較的小規模な関連情報を生成し、検索拡張生成(RAG)パイプラインを構築しました。

この方法では、人工知能と自然言語処理(NLP)を使用して、情報検索とコンテキスト・ウィンドウの最適化が改善されます。OpenAIのGPTモデルのような大規模言語モデル(LLM)を活用する際に、データ・チャンクを合理化して検索効率を高め、より良い成果を得ることができます。

関連ソリューション
IBMのAIエージェント開発

開発者が、IBM watsonx.aiを使用してAIエージェントの構築、デプロイ、および監視を行えるようにします。

watsonx.aiの詳細はこちら
IBMのAIエージェントとアシスタント

業界で最も包括的な機能セットの1つを使用して、企業がAIエージェントとアシスタントを構築、カスタマイズ、管理できるようにすることで、生産性を飛躍的に向上させます。

AIエージェントの詳細はこちら
IBM Granite

開発者の効率性を考慮したGraniteの小型オープンモデルで、コストを90%以上削減します。エンタープライズ対応モデルは、安全性ベンチマークに対して、さらにサイバーセキュリティーからRAGまでの幅広い企業タスクに対して優れたパフォーマンスを発揮します。

Graniteの詳細はこちら
次のステップ

包括性で業界でも屈指の機能セットを使用して、複雑なワークフローを自動化し、生産性を飛躍的に向上させましょう。企業がAIエージェントとアシスタントを構築、カスタマイズ、管理するのに役立つ機能セットです。

watsonx.aiエージェントの開発の詳細はこちら watsonx Orchestrateの詳細はこちら