「LangChainを使用して、強力な大規模言語モデルを使用してデータフレームをクエリしてください」

LangChainを使用して、データフレームをクエリするための強力な大規模言語モデルを使用してください

Hugging Faceの大規模言語モデルを使用して、ベクトルデータベースとLangChainを使って自分のデータを準備しましょう!

Image By Author, generated with Dall-e 2

前の記事では、ChromaDBのようなベクトルデータベースを使用して情報を保存し、それを使ってHugging Faceの大規模言語モデルに対してパワードプロンプトを作成する方法について説明しました。

この記事では、同じタスクにLangChainを使用する方法について見ていきます。LangChainは、ChromaDBに保存された情報を検索し、それを使用して言語モデルに直接渡すタスクを処理します。

これにより、モデルの微調整を行う必要なしに大規模言語モデルでデータを使用できます

Hugging Faceモデルを使用するため、それを独自のサーバーまたはプライベートクラウドスペースにダウンロードしてホストすることができるため、情報はOpenAIなどの企業を経由する必要はありません

この記事では、以下の手順を説明します:

  1. ChromaDBまたはLangChainなど、必要なライブラリのインストール
  2. データセットをロードし、LangChainを使用してドキュメントを作成する
  3. データベースに保存するための埋め込みを生成する
  4. 情報を含むインデックスを作成する
  5. LangChainが情報を取得するために使用するリトリーバを設定する
  6. Hugging Faceモデルをロードする
  7. 言語モデルとリトリーバを使用してLangChainパイプラインを作成する
  8. パイプラインを使用して質問を行う

どの技術を使用していますか?

使用するベクトルデータベースはChromaDBです。これは、オープンソースのベクトルデータベースの中でも最もよく知られたオプションです。

モデルには、Hugging Faceライブラリの2つを選びました。最初のモデルはdolly-v2–3bで、もう一つはflan-t5-largeです。これらは異なる機能のために訓練された2つの異なるモデルであることに注意してください。

T5はテキストからテキストへの生成モデルファミリーであり、学習データセットに基づいてテキストを生成するために設計されています。テキスト生成に使用することもできますが、その応答はあまり創造的ではないかもしれません。

一方、Dollyは純粋なテキスト生成ファミリーです。これらのモデルは、より創造的で包括的な応答を生成する傾向があります。

主要なライブラリはLangChainで、大規模言語モデルのパワーを利用した自然言語アプリケーションの作成を可能にするオープンソースのプラットフォームです。これにより、これらのモデルと他のライブラリや製品(データベースやさまざまなプラグインなど)との間で入出力をチェーンすることができます。

LangChainでプロジェクトを始めましょう。

コードはKaggleのノートブックで利用可能です。この記事とノートブックは、私のGitHubプロファイルで利用可能な大規模言語モデルを使用したアプリケーションの作成に関するコースの一部です。

新しいレッスンや既存のコンテンツの更新を見逃したくない場合は、リポジトリをフォローするのが最善です。私はレッスンが完成すると公開リポジトリに新しいレッスンを投稿します。

LangChain、VectorDB、HFを使用してドキュメントに質問してみましょう

Kaggleノートブックで機械学習コードを探索して実行する | 複数のデータソースからデータを使用する

www.kaggle.com

GitHub – peremartra/Large-Language-Model-Notebooks-Course

GitHubでアカウントを作成して、peremartra/Large-Language-Model-Notebooks-Courseの開発に貢献しましょう。

github.com

ライブラリのインストールとロード

個人の環境で作業しており、すでにこれらのテクノロジーをテストしている場合は、何もインストールする必要はありません。ただし、KaggleまたはColabを使用している場合は、次のライブラリをインストールする必要があります:

  • langchain:大規模な言語モデルを使用したアプリケーションの作成を可能にする革命的なライブラリ。
  • sentence_transformers:ベクトルデータベースに格納するテキストの埋め込みを生成するために、このライブラリが必要です。
  • chromadb:使用するベクトルデータベース。特に、ChromaDBは使いやすいインターフェースで知られています。
!pip install chromadb!pip install langchain!pip install sentence_transformers

これらのライブラリに加えて、データサイエンスで最もよく使用される2つのPythonライブラリもインポートします:pandasnumpy

import numpy as np import pandas as pd

データセットの読み込み

先に述べたように、このノートブックは2つの異なるデータセットで動作するように準備されています。これらのデータセットは、RAG(Retrieval Augmented Generation)の前の例で使用されたものと同じです。

RAGは、大規模な言語モデルを使用してデータを利用することを意味し、一般的には「ドキュメントの問い合わせ」と呼ばれます。

両方のデータセットは表形式であり、ニュースに関連する情報を含んでいます:

  1. トピックラベル付きニュースデータセット。
  2. 2023年までに公開されたMIT AIニュース。

両方のデータセットの内容は似ていますが、列名と格納されている情報は異なります。個人的には、複数のデータセットを使用することで、異なるデータソースでの結果を検証し一般化することができる良い価値を提供できると考えています。

ノートブックの完成後に、第3の異なるデータセットを探索し、その機能を複製することは有益です。

Kaggleではリソースが制限されているため、メモリ制約に注意することが重要です。したがって、Kaggleのメモリ制限(GPUを使用しない場合は30 GB)を超えないよう、データセット全体ではなく、より小さなサブセットで作業します。

データセットの小さなサブセットで作業することで、LangChainの機能を効果的に探索しデモンストレーションすることができます。

topic-labeled-news-datasetの最初の2つのレコードを見てみましょう。

最初のデータセットでは、title列をドキュメントとして使用します。テキストは非常に長くないかもしれませんが、完璧な例として役立ちます。これを使用して、特定のトピックについて議論している記事をデータベースから検索することができます。

news = pd.read_csv('/kaggle/input/topic-labeled-news-dataset/labelled_newscatcher_dataset.csv', sep=';')MAX_NEWS = 1000DOCUMENT="title"TOPIC="topic"#news = pd.read_csv('/kaggle/input/bbc-news/bbc_news.csv')#MAX_NEWS = 500#DOCUMENT="description"#TOPIC="title"#Because it is just a course we select a small portion of News.subset_news = news.head(MAX_NEWS)

データセットから一部のニュースを含むsubset_newsというDataFrameを作成しました。

使用するデータセットは、そのデータセットを使用するための行のコメントを外すだけで簡単です。各場合において、データとして使用する列の名前と、サブセットが含むレコードの数を調整しました。このアプローチにより、データセット間を簡単に切り替えることができます。

DataFrameからドキュメントを生成する

ドキュメントを作成するために、LangChainを使用し、そのローダーの1つを使用します。この例では、DataFrameLoaderを使用しますが、CSV、テキストファイル、HTML、JSON、PDFなどのさまざまなソース向けに利用可能なさまざまなローダーがあります。

from langchain.document_loaders import DataFrameLoaderfrom langchain.vectorstores import Chroma

ライブラリをロードしたら、ローダーを作成する必要があります。これには、データフレームと文書の内容として使用する列の名前を指定します。この情報は、応答を生成する際に言語モデルによって使用され、ベクトルデータベースであるChromaDBに保存されます。

df_loader = DataFrameLoader(subset_news, page_content_column=DOCUMENT)

ドキュメントを作成するためには、単にローダーのload関数を呼び出すだけです。

df_document = df_loader.load()display(df_document)

ドキュメントの内容を見てみましょう:

[Document(page_content="A closer look at water-splitting's solar fuel potential", metadata={'topic': 'SCIENCE', 'link': 'https://www.eurekalert.org/pub_releases/2020-08/dbnl-acl080620.php', 'domain': 'eurekalert.org', 'published_date': '2020-08-06 13:59:45', 'lang': 'en'}), Document(page_content='An irresistible scent makes locusts swarm, study finds', metadata={'topic': 'SCIENCE', 'link': 'https://www.pulse.ng/news/world/an-irresistible-scent-makes-locusts-swarm-study-finds/jy784jw', 'domain': 'pulse.ng', 'published_date': '2020-08-12 15:14:19', 'lang': 'en'}),

見るとわかるように、指定された列のレコードの内容に対応するページごとのドキュメントが作成されています。さらに、他のデータも「metadata」フィールドに含まれ、列名とともにラベル付けされています。

他のデータセットを試して、データの見た目を確認してみることをお勧めします。

埋め込みの作成。

まず、必要であれば、埋め込みとは何かを理解しましょう。それは単にデータの数値表現です。具体的な場合、それは保存されるテキストの数値表現です。

この数値表現は、ベクトルの形で表されます。ベクトルは単に多次元空間上の点の表現です。言い換えれば、私たちが普段見慣れている二次元または三次元の平面上で点を視覚化する必要はありません。ベクトルは任意の次元で点を表現することができます。

私たちにとっては、それは複雑で想像しにくいかもしれませんが、数学的には、2次元、3次元、または任意の次元にある2点間の距離を計算する際には、あまり違いはありません。

これらのベクトルにより、それらの間の違いや類似性を計算することができ、非常に効率的に類似情報を検索することができます。

トリックは、どの単語にどのベクトルを割り当てるかを決定することです。つまり、意味が似ている単語は、より異なる意味を持つ単語よりも距離が近いことを望んでいます。Hugging Faceライブラリがこの側面を扱ってくれるので、あまり心配する必要はありません。単にすべてのデータとクエリのために一貫した変換を確保する必要があります。

いくつかのライブラリをインポートしましょう:

  1. CharacterTextSplitter:このライブラリを使用して情報をブロックにグループ化します。
  2. HuggingFaceEmbeddingsまたはSentenceTransformerEmbedding:ノートブックでは両方を使用していますが、どちらにも違いは見つかりませんでした。これらのライブラリは、データの埋め込みを実行するモデルを取得する責任があります。
from langchain.text_splitter import <a></a><a>CharacterTextSplitter#from langchain.embeddings import HuggingFaceEmbeddings

ドキュメントをブロックに分割する100%正しい方法はありません。重要な考慮事項は、より大きなブロックはモデルにより多くの文脈情報を提供することです。ただし、大きなブロックを使用すると、ベクトルストアのサイズが大きくなり、メモリ使用量が増える可能性があります。

文脈のサイズとメモリ使用量のバランスを見つけて、アプリケーションのパフォーマンスを最適化することが重要です。

私は、ブロックサイズを250文字、オーバーラップを10としました。これは比較的小さなブロックサイズですが、扱っている情報のタイプには十分です。

text_splitter = CharacterTextSplitter(chunk_size=250, chunk_overlap=10)texts = text_splitter.split_documents(df_document)

さて、テキストで埋め込みを作成できるようになりました。

from langchain.embeddings.sentence_transformer import SentenceTransformerEmbeddingsembedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")#embedding_function = HuggingFaceEmbeddings(#    model_name="sentence-transformers/all-MiniLM-L6-v2"#)  

ご覧の通り、SentenceTransformerEmbeddingsを使用しています。HuggingFaceEmbeddingsの代わりに簡単に変更できます。

両方のライブラリでは、埋め込みを生成するために同じ事前学習モデルを呼び出すことができます。私は両方でall-MiniLM-L6-v2を使用しています。したがって、それぞれのライブラリによって生成される埋め込みにはわずかな違いがあるかもしれませんが、それは最小限であり、性能には影響しません。

初めに、SentenceTransformerEmbeddingsは文を変換することに特化しており、HuggingFaceEmbeddingsはより一般的で、段落や文書全体の埋め込みを生成することができます。

実際、私たちのドキュメントの性質を考慮すると、どちらのライブラリを使用しても違いはないと予想されます。

生成された埋め込みを使用して、インデックスを作成できます。

chromadb_index = Chroma.from_documents(    texts, embedding_function, persist_directory='./input')

このインデックスは、質問をするために使用するものであり、非常に効率的に設計されています!この努力の末、遅くて不正確なものになってほしくありません :-).

LangChainの使用を開始しましょう!

さあ、楽しい部分です。LangChainを使用して、大規模な言語モデルを使用した最初の小さなアプリケーションを作成します!

このアプリケーションは非常にシンプルで、2つのステップと2つのコンポーネントから構成されています。最初のステップでは、リトリーバーが関与します。このコンポーネントは、ドキュメントまたはドキュメントとして提供されたテキストからユーザーのクエリに関連する情報を取得するために使用されます。私たちがChromaDBに保存している埋め込みを使用して、類似性に基づいた検索を実行します。

2番目の最終ステップでは、リトリーバーによって返された情報を受け取る言語モデルが関与します。

したがって、リトリーバーとパイプラインを作成するためのライブラリをインポートする必要があります。

from langchain.chains import RetrievalQAfrom langchain.llms import HuggingFacePipeline

さて、以前に作成した埋め込みのインデックスを使用してリトリーバーを作成できるようになりました。

retriever = chromadb_index.as_retriever()

私たちは、チェーンまたはパイプラインの最初のステップを完了しました。では、2番目のステップ、つまり言語モデルに進んでみましょう。

ノートブックでは、Hugging Faceで利用可能な2つの異なるモデルを使用しました。

最初のモデルはdolly-v2–3bで、Dollyファミリーの中で最も小さいモデルです。私は個人的にこのモデルがとても好きです。他の一部のモデルほど人気はありませんが、生成される応答はGPT-2よりもはるかに優れており、OpenAIのGPT-3.5と同等のレベルに達します。30億のパラメータを持つため、Kaggleにロードできるメモリ制限に近いです。このモデルはテキスト生成のためにトレーニングされており、洗練された応答を生成します。

2番目のモデルはT5ファミリーからです。このモデルはテキスト対テキストの生成に特化しているため、より簡潔で短い応答が生成されます。

どちらのモデルも少なくとも試してみてください。

model_id = "databricks/dolly-v2-3b" #私のお気に入りのテキスト生成モデル(テスト用)task="text-generation"#model_id = "google/flan-t5-large" #素敵なテキスト対テキストモデル#task="text2text-generation"

完璧です!パイプラインを作成するために必要なものはすべてそろいました!さあ、やってみましょう!

hf_llm = HuggingFacePipeline.from_model_id(    model_id=model_id,    task=task,    model_kwargs={        "temperature": 0,        "max_length": 256    },)

各パラメータの意味を見てみましょう:

  1. model_id:Hugging Faceでのモデルの識別子です。Hugging Faceから取得でき、通常はモデル名の後にバージョンが続きます。
  2. task:ここでは、モデルを使用するタスクを指定します。一部のモデルは複数のタスクのためにトレーニングされています。特定のモデルのサポートされているタスクは、モデルのHugging Faceのドキュメントで確認できます。
  3. model_kwargs:このパラメータを使用して、モデル固有の追加の引数を指定できます。この場合、温度(モデルの創造性の度合い)と応答の最大長を指定しています。

さあ、モデルとリトリーバーを使用してパイプラインを設定する時がきました。

document_qa = RetrievalQA.from_chain_type(    llm=hf_llm, chain_type="stuff", retriever=retriever)

変数chain_typeでは、チェーンの動作方法を指定し、4つのオプションがあります:

  1. stuff:最もシンプルなオプションで、適切と思われるドキュメントを取得し、モデルに渡すプロンプトで使用します。
  2. refine:異なるドキュメントを使用してモデルに複数回呼び出し、より洗練された応答を取得しようとします。モデルへの呼び出し回数が多くなる可能性があるため、注意して使用する必要があります。
  3. map reduce:複数のイテレーションを通じて、すべてのドキュメントを1つに減らそうとします。ドキュメントを圧縮して統合し、モデルに送られるプロンプトに収まるようにします。
  4. map re-rank:各ドキュメントに対してモデルを呼び出し、ランキングし、最終的に最も優れたドキュメントを返します。`refine`と似ていますが、予想される呼び出し回数によってはリスクがある場合があります。

これで新しく作成したチェーンを使用して質問をすることができます。データフレームのデータがベクトルデータベースの一部になっているため、質問に対して回答されます。

# newscatcherデータセットのサンプル質問。
response = document_qa.run("Can I buy a Toshiba laptop?")
# BBCデータセットのサンプル質問。
# response = document_qa.run("Who is going to meet boris johnson?")
display(response)

したがって、得られる回答は使用されるデータセットとモデルによって明らかに異なります。Toshibaのノートパソコンを購入できるかどうかの質問に対して、モデルによって非常に異なる回答が得られます:

Dolly:「いいえ、Toshibaは2023年に公式にノートパソコンの製造を終了しました。伝説のToshibaは正式にノートパソコンの製造を終了しました。 Toshibaは35年後に公式にノートパソコンの製造を終了しました。 Toshibaは2023年に公式にノートパソコンの製造を終了しました。」

T5:「いいえ。」

ご覧の通り、各モデルは回答に独自の個性を加えています!

結論と継続的な学習!

実際には、思っているよりもはるかに簡単でした。大規模な言語モデルの爆発とLangChainのようなツールの登場により、以前よりもはるかに簡単になりました。

データフレームに事前に読み込んだデータを保存するために、ベクトルデータベースを使用しました。ただし、他のデータソースを使用することもできます。

Hugging Faceで利用可能ないくつかの言語モデルに入力として使用し、モデルがDataFrameの情報を考慮して応答を提供するのを観察しました。

ただし、ここで止まらず、ノートブックを自分自身で変更し、発生する可能性のある問題を解決してください。いくつかのアイデアは次のとおりです:

  • 両方のデータセットを使用し、できれば3番目のデータセットを検索してください。さらに良いのは、それを履歴書を読むように適応できると思いますか?少しの調整で達成できると思います。
  • 第三のHugging Faceモデルを試してみてください。
  • データソースを変更してみてください。テキストファイル、Excelファイル、またはConfluenceのようなドキュメントツールである場合もあります。

Large Language Modelsに関する完全なコースはGitHubで利用できます。新しい記事の更新情報を受け取るために、リポジトリをフォローするか、スターをつけてください。これにより、新しいコンテンツが追加されるたびに通知を受け取ることができます。

GitHub – peremartra/Large-Language-Model-Notebooks-Course

GitHubでアカウントを作成して、peremartra/Large-Language-Model-Notebooks-Courseの開発に貢献してください。

github.com

この記事は、Large Language Modelsの実践的な応用について探求するシリーズの一部です。残りの記事は以下のリストで見つけることができます:

Pere Martra

Large Language Models実践的なコース

リスト3のストーリーを表示する

私はディープラーニングと機械学習について定期的に記事を書いています。新しい記事のアップデートについては、VoAGIでフォローしてください。また、もちろんLinkedInで私とつながることも歓迎です。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more