「LangchainとOllamaを使用したPDFチャットボットのステップバイステップガイド」

「LangchainとOllamaを使ったPDFチャットボットのステップバイステップガイド」

イントロダクション

情報との相互作用方法が技術の進化によって変化し続ける時代において、PDFチャットボットの概念は利便性と効率性を新たなレベルにもたらします。この記事では、オープンソースモデルを最小限の設定で利用できるようにするLangchainとOllamaを使用してPDFチャットボットを作成する魅力的な領域について説明します。フレームワークの選択やモデルパラメータの調整の複雑さにさようならを言い、PDFチャットボットの潜在能力を解き放つ旅に出かけましょう。Ollamaのシームレスなインストール方法、モデルのダウンロード方法、およびクエリに対して知識のある応答を提供するPDFチャットボットの作成方法を発見しましょう。技術と文書処理のエキサイティングな融合を探求し、情報の検索を今まで以上に簡単にしましょう。

学習目標

  • Ollamaをコンピュータにインストールする方法を理解する。
  • Ollamaを使用してオープンソースモデルをダウンロードおよび実行する方法を学ぶ。
  • LangchainとOllamaを使用してPDFチャットボットを作成するプロセスを発見する。

この記事はデータサイエンスブログマラソンの一環として公開されました。

前提条件

この記事を正しく理解するためには、以下が必要です:

  • Pythonの良い知識と、
  • Langchainの基本的な知識、つまりチェーン、ベクトルストアなど。

Langchainは、LLMアプリの作成にさまざまな機能を提供します。それは独立した記事そのものに値するものです。Langchainが何であるかわからない場合は、Langchainに関する記事やチュートリアルをいくつか読んでください。このビデオもご覧いただけます。this

Ollamaとは何ですか?

Ollamaは、オープンソースモデルをダウンロードしてローカルで使用する機能を提供します。最も適したソースからモデルを自動的にダウンロードします。コンピュータに専用のGPUがある場合、モデルをGPUアクセラレーションで実行します。手動で設定する必要はありません。プロンプトを変更することでモデルをカスタマイズすることもできます(そのためLangchainは必要ありません)。OllamaはDockerイメージとしても利用可能であり、独自のモデルをDockerコンテナとして展開できます。エキサイティングですね?さあ、Ollamaをコンピュータにインストールする方法を見てみましょう。

Ollamaのインストール方法

残念ながら、OllamaはMacOSとLinuxのみ利用可能です。しかし、WindowsユーザーでもOllamaを使用できる方法があります – WSL2。コンピュータにWSL2がない場合、thisの記事を読んでください。ここでは、WSL2についてすべてを説明し、VS Codeでの使用方法も説明しています。すでにインストール済みの場合は、Ubuntuを開き、ターミナルで以下のコマンドを実行します。

curl https://ollama.ai/install.sh | sh

これにより、OllamaがWSL2にインストールされます。使用しているMacOSの場合は、こちらを参照してください。これでOllamaを使用してモデルをダウンロードする準備が整いました。ターミナルを開いたままにして、まだ完了していません。

モデルのダウンロード

Ollamaはさまざまなモデルを提供しています – llama2、llama2-uncensored、codellama、orca-miniなど。利用可能なすべてのモデルについて知りたい場合は、thisのウェブサイトにアクセスしてください。ここで、orca-mini 3bモデルをダウンロードします。これは、オルカの論文で定義された手法を使用して作成されたオルカスタイルのデータセットを使用してトレーニングされたLlamaモデルです。このモデルは小さいですが(1.9GB)、良い応答を提供します。このモデルをダウンロードするには、以下のコマンドを実行します:

ollama run orca-mini

このコマンドはorca-miniモデルをダウンロードしてターミナルで実行します。このモデルを実行する前に、コンピュータに少なくとも8GBのRAMがあることを確認してください。

モデルを実行している場合は、いくつかの質問を投げかけて、どのように応答するかを見てみてください。以下は例です:

上の例からわかるように、時には関係のない情報を表示します。これを修正するには、プロンプトを変更します。チャットボットを作成する際にプロンプトを変更します。

モデルが正しく機能するようになったので、それを使用してPDFチャットボットを作成しましょう。

チャットボットの作成

プロジェクトディレクトリの設定

WSL2でプロジェクトを作成する方法がわからない場合は、こちらの記事の最後の部分を参照してください。ここではIDEとしてVS Codeを使用します。

必要なライブラリのインストール

始める前に、必要なライブラリをインストールしましょう。requirements.txtというファイルを作成し、以下の依存関係を書き込みます。

langchainpymupdfhuggingface-hubfaiss-cpusentence-transformers

その後、VS Codeでターミナルを開き、以下のコマンドを実行します。

>>> pip install -r requirements.txt

いくつかの時間がかかります。アプリであるため、Ollamaにはパッケージは必要ありません。これでチャットボットのコーディングを開始できます。

必要な関数の作成

Langchainでチャットボットを作成するには、以下の手順に従う必要があります:

  • Langchainから任意のPDFローダを使用してPDFファイルを読み込む。
  • ドキュメントが非常に大きい場合、それをより小さな部分、つまりチャンクに分割するのは良い考えです。これにより、モデルに必要な情報を適切に取得し、リソースを使いすぎずに質問に対する正しい情報を提供できます。モデルはトークン制限を持っているので、一度にすべてを与えるのではなく、必要な部分だけを提供することです。
  • その後、これらのチャンクをベクトル埋め込みに変換して、モデルがデータをよりよく理解できるようにする必要があります。その後、これらの埋め込みを格納し、必要な時に効率的に取り出せるベクターストアを作成する必要があります。ここではFAISSベクターストアを使用します。
  • これでPDFファイルにクエリを行う準備が整いました。このために、LangchainのRetrievalQAを使用します。リトリーバとしてベクターストア、使用するモデルなど、他のいくつかのパラメータも使用します。

必要なパッケージのインポート

これは基本的なPDFチャットボットの手順です。複雑なチャットボットを作成したい場合、追加の手順が必要になります。たとえば、メモリの追加、ルーティングの追加などです。今度は、テスト用にコードを繰り返し記述する必要がないように、各ステップごとにいくつかの関数を作成しましょう。まず、以下のパッケージをインポートします:

# 必要なパッケージをインポートfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.document_loaders import PyMuPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.vectorstores import FAISSfrom langchain.chains import RetrievalQAimport textwrap

その後、最初の関数を作成します。この関数はPDFファイルを読み込みます。ここでは、LangchainからPyMuPDFLoaderを使用してPDFファイルを読み込みます。

# この関数はPDFファイルを読み込みますdef load_pdf_data(file_path):    # file_pathを使用してPyMuPDFLoaderオブジェクトを作成する    loader = PyMuPDFLoader(file_path=file_path)        # PDFファイルを読み込む    docs = loader.load()        # 読み込まれたドキュメントを返す    return docs

その後、ドキュメントをいくつかのチャンクに分割する必要があります。ここでは、テキストを分割するためのLangchainで最も人気のあるRecursiveCharacterTextSplitterを使用します。

# ドキュメントをいくつかのチャンクに分割する責任を持つ関数def split_docs(documents, chunk_size=1000, chunk_overlap=20):        # chunk_sizeとchunk_overlapを指定してRecursiveCharacterTextSplitterを初期化する    text_splitter = RecursiveCharacterTextSplitter(        chunk_size=chunk_size,        chunk_overlap=chunk_overlap    )        # ドキュメントをチャンクに分割する    chunks = text_splitter.split_documents(documents=documents)        # ドキュメントのチャンクを返す    return chunks

埋め込みの時間です。まず、HuggingFaceEmbeddingを使用して埋め込みモデルをロードする必要があります。Langchainから、次にFAISSを使用してベクトルストアを作成します。埋め込みに使用されるモデルはall-MiniLM-L6-v2です。後で見ることができます。

# 埋め込みモデルをロードするための関数def load_embedding_model(model_path, normalize_embedding=True):    return HuggingFaceEmbeddings(        model_name=model_path,        model_kwargs={'device':'cpu'}, # ここではモデルをCPUのみで実行します        encode_kwargs = {            'normalize_embeddings': normalize_embedding # 類似度を計算するためにTrueに保つ        }    )# FAISSを使用して埋め込みを作成するための関数def create_embeddings(chunks, embedding_model, storing_path="vectorstore"):    # FAISSを使用して埋め込みを作成します    vectorstore = FAISS.from_documents(chunks, embedding_model)        # 現在のディレクトリにモデルを保存します    vectorstore.save_local(storing_path)        # vectorstoreを返します    return vectorstore

期待どおりに動作するようにカスタムのプロンプトテンプレートを作成しましょう。orca-miniモデルのデフォルトのプロンプトは以下の通りです。

prompt = """### システム:あなたは非常によく指示に従うAIアシスタントです。できるだけお手伝いします。### ユーザー:{prompt}### 応答:"""

そのようにプロンプトのフォーマットを保つことで、より良い応答が得られます。修正されたプロンプトテンプレートは次のとおりです。

template = """### システム:あなたは敬意を持ち、正直なアシスタントです。以前の会話を思い出すことなく、ユーザーの質問に回答する必要があります。答えがわからない場合は、わからないと言ってください。答えを作り上げようとしないでください。### 文脈:{context}### ユーザー:{question}### 応答:"""

今度は質疑応答チェーンを作成する必要があります。ここでは、LangchainからRetrievalQAを使用します。 RetrievalQAは、チャットボットのメモリを持たず、質問に答えるだけで以前の会話を覚えません。

# 質問応答のチェーンを作成するdef load_qa_chain(retriever, llm, prompt):    return RetrievalQA.from_chain_type(        llm=llm,        retriever=retriever, # ベクトルストアをリトリーバとして使用しています        chain_type="stuff",        return_source_documents=True, # 出力にソースドキュメントを含めます        chain_type_kwargs={'prompt': prompt} # プロンプトをカスタマイズします    )

また、レスポンスを見やすくする関数も作成します。以下はそのコードです。

# レスポンスを整形するdef get_response(query, chain):    # チェーンからのレスポンスを取得    response = chain({'query': query})        # Jupyter Notebookでの出力を良くするためにテキストを折り返します    wrapped_text = textwrap.fill(response['result'], width=100)    print(wrapped_text)

必要なすべての関数を作成したので、チャットボットを作成する時間です。

Jupyter Notebookの作成

まず、ディレクトリにJupyter Notebookを作成します。これには、拡張子.ipynbの新しいファイルを作成する必要があります。また、jupyterをpipからインストールすることを忘れないでください。そうしないと、ノートブックは実行されません。以下のコマンドを実行してjupyterをインストールしてください。

>>> pip install jupyter

VS CodeがJupyter Notebookのカーネルを検出しない場合、右上に「カーネルを選択」というオプションが表示されます。以下の画像のようにいくつかのオプションが表示されます。

Python Environmentsを選択します。また、さらにいくつかのオプションが表示されます。

「Starred」の環境を選択します。その後、Jupyter Notebookを使用する準備が整います。

必要なライブラリのインポート

では、必要なライブラリをインポートしていきましょう。ここでは3つのライブラリをインポートします:

  • 私たちはすべての関数を書くPythonスクリプトです。ファイル名はlang_funcs.pyとしました。
  • langchain.llmsからOllama、
  • langchainからPromptTemplate。

以下のライブラリをインポートしましょう。

from lang_funcs import *from langchain.llms import Ollamafrom langchain import PromptTemplate

モデルの読み込み

今、orca-miniモデルとall-MiniLM-L6-v2という埋め込みモデルを読み込む必要があります。この埋め込みモデルは小さくて効果的です。

# Ollamaからorca-miniを読み込むollm = Ollama(model="orca-mini", temperature=0)# 埋め込みモデルの読み込みembed = load_embedding_model(model_path="all-MiniLM-L6-v2")

Ollamaモデルはローカルホストのポート11434にあります。すでにlangchainのOllama()クラスで指定されているため、特に指定する必要はありません。埋め込みモデルがコンピュータにダウンロードされていない場合は、Huggingfaceから自動的にダウンロードされます。しばらくお待ちください。

データの読み込みとベクトルストアの作成

データを読み込んで埋め込みを作成する時間です。ここでは、MLのPDF書籍を使用します。

# ドキュメントの読み込みと分割docs = load_pdf_data(file_path="data/ml_book.pdf")documents = split_docs(documents=docs)# ベクトルストアの作成vectorstore = create_embeddings(documents, embed)# ベクトルストアをリトリーバーに変換retriever = vectorstore.as_retriever()

埋め込みの作成には時間がかかりますので、お待ちください。プログラミングは忍耐力のあるものですよね?

もうすぐです!

長い道のりでしたね。では、チャットボットを作成してテストを開始しましょう。

# 以前に作成したテンプレートからプロンプトを作成prompt = PromptTemplate.from_template(template)# チェーンの作成chain = load_qa_chain(retriever, llm, prompt)

これで、チャットボットのテストの準備が整いました。

チャットボットのテスト

さあ、チャットボットにいくつかの質問をしてみましょう。以下はいくつかの例です。

>>>get_response("ランダムフォレストとは何ですか?", chain)>>> ランダムフォレストは、新しい分類器を作成するために基本分類器として決定木を使用するアンサンブル学習手法です。複数の決定木を組み合わせて、最終モデルの精度を向上させるために使用されます。ランダムフォレストアルゴリズムは、ノードを分割する際に最適な特徴量を探すのではなく、木を成長させる際に追加のランダム性を導入します(通常の決定木とは異なります)。これにより、より多様な木が生成され、バイアスを高める代わりに分散を低く抑えることができます。他のアンサンブル学習手法(バギングやブースティングなど)に比べても計算効率が高くなっています。>>>get_response("ボーティング分類器とは何ですか?", chain)>>> ボーティング分類器は、複数の分類器の多数決に基づいて、与えられた入力データポイントのクラスを予測する機械学習アルゴリズムの一種です。つまり、複数の異なる分類器の予測結果を参照し、最も多くの票を獲得したクラスを予測します。このアプローチは、異なる分類器からの予測の多様性を利用して機械学習モデルの精度を向上させるために使用することができます。ハードボーティング分類器は、このアプローチの単純な実装です。一方、ランダムフォレストは、アンサンブル学習手法であり、決定木を基本分類器として使用します。各木はランダムに選択されたトレーニングデータのサブセットから成長させられます。ランダムフォレスト分類器は、ボーティング分類器よりも決定木に便利で最適化されており、一般的に全体的に優れたモデルを提供します。

それは本当に良い応答を与えます。どのように応答するかを確認するため、さらに質問をしてみてください。

結論

LangchainとOllamaを使用してPDFチャットボットを作成する方法について、今では明確に理解していると思います。Ollamaはこの分野の新たな進化であり、私たちの生活を本当に簡単にしてくれます。初期化したorca-miniモデルをたった1行で見たことがお分かりいただけると思います。それ以外の場合、LangchainからHuggingfacePipelineを使用する必要があります。

キーポイント

  • Ollamaによるモデル展開の簡素化: Ollamaはオープンソースモデルの展開を簡単にするため、それらをダウンロードしてローカルコンピューター上で実行する簡単な方法を提供します。
  • PDFチャットボット開発: PDF文書の読み込み、分割、およびチャットボットチェーンの作成など、PDFチャットボットの作成に関わる手順を学びましょう。
  • より良い応答のカスタマイズ: チャットボットの応答を改善するためにプロンプトとテンプレートをカスタマイズする方法を理解してください。

この記事で使用されたすべてのコードはこちらで入手できます。

よくある質問

この記事で表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。

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

人工知能

ベイリー・カクスマー、ウォータールー大学の博士課程候補 - インタビューシリーズ

カツマー・ベイリーは、ウォータールー大学のコンピュータ科学学部の博士課程の候補者であり、アルバータ大学の新入教員です...

人工知能

Aaron Lee、Smith.aiの共同設立者兼CEO - インタビューシリーズ

アーロン・リーさんは、Smith.aiの共同創業者兼CEOであり、AIと人間の知性を組み合わせて、24時間365日の顧客エンゲージメン...

人工知能

「スノーケルAIのCEO兼共同創設者、アレックス・ラットナー - インタビューシリーズ」

アレックス・ラトナーは、スタンフォードAIラボを母体とする会社、Snorkel AIのCEO兼共同創設者ですSnorkel AIは、手作業のAI...

人工知能

「Ami Hever、UVeyeの共同創設者兼CEO - インタビューシリーズ」

עמיר חבר הוא המנכל והמייסד של UVeye, סטארט-אפ ראיה ממוחשבת בלמידה עמוקה, המציבה את התקן הגלובלי לבדיקת רכבים עם זיהוי...

人工知能

「コマンドバーの創設者兼CEO、ジェームズ・エバンスによるインタビューシリーズ」

ジェームズ・エバンズは、CommandBarの創設者兼CEOであり、製品、マーケティング、顧客チームを支援するために設計されたAIパ...

データサイエンス

「3つの質問:ロボットの認識とマッピングの研磨」

MIT LIDSのLuca CarloneさんとJonathan Howさんは、将来のロボットが環境をどのように知覚し、相互作用するかについて議論し...