Langchain を使用した PDF とのインタラクティブな会話
PDF の操作が面倒で時間のかかる時代は終わりました。ユーザーは、Adobe Reader などのソフトウェアを使用して文書を手動で開き、文書全体を読むか、特定の情報を見つけるために重要な検索機能を使用する必要がありました。しかし、LangChain の統合により、AI アシスタントとのチャットが簡単になりました。ユーザーは PDF を LangChain 対応 LLM アプリケーションにアップロードし、光学式文字認識 (OCR) と呼ばれるプロセスを通じて数秒以内に正確な回答を受け取ることができます。
これは、会社のポリシー、文書、またはレポートとのカスタマイズされた対話を必要とする企業にとって有益です。研究者や学生が重要な部分を特定し、本や研究論文全体を読まなくても済むようにすることもできます。
PDF アナライザーの概要
1.ドキュメントの処理と埋め込み: PyPDFLoader などの適切なローダーを使用して PDF ドキュメントをロードします。テキスト データを整理して構造化します (ヘッダー/フッターの削除、特殊文字の処理、テキストの段落またはセクションへの分割)。このステップでは、トークン化 (テキストを単語に分割する)、ステミング/見出し語化 (単語を原形に戻す)、またはストップワードの削除 (「the ‘」や「a ‘」などの一般的な単語を削除する) を行うこともあります。 2. ベクトルの埋め込みと取得: これには、PDF から抽出されたテキスト チャンクのベクトル表現の作成が含まれます。これらのベクトルは、意味論的な意味と単語間の関係を捉えます。チャットボットはクエリのベクトルを生成し、ユーザーのクエリ中にそれを保存されたドキュメント ベクトルと比較します。最も近いベクトル一致を持つドキュメントが、ユーザーの質問に最も関連していると見なされます。 Gensim や Faiss などのライブラリは、このアプローチに使用できます。 3.言語生成パイプライン: AutoModelForSeq2SeqLM と AutoTokenizer を使用して言語生成パイプラインを設定します。 4.レトリバーの作成と LLM との統合: RetrievalQA を使用してカスタム レトリバーを開発し、クエリに基づいて関連ドキュメントを取得します。 5.チェーンのクエリ: PDF コンテンツに関連する質問でチェーンをクエリしてシステムをテストします。
前提条件
- Python 環境: Python 3.7 以降をインストールし、仮想環境をセットアップします。
- LangChain ライブラリ: LangChain をインストールします (
pip install langchain
)。 - テキスト抽出:
PyPDF2
やpdfplumber
などの PDF テキスト抽出用のライブラリをインストールします。 - ベクトル データベース: 埋め込み用のベクトル データベース (FAISS、Pinecone など) をインストールして構成します。
今日の PDF の操作
PDF の内容を理解するのが非常に簡単になりました。 PDF を LLM アプリケーションにアップロードし、PDF のコンテンツについて質問するだけです。 ChatGPT でのチャットと同じですが、ユーザーは PDF を直接アップロードできます。
カスタマイズされたドキュメントの処理
企業は文書処理システムをカスタマイズして、PDF 形式の社内文書、ポリシー、またはレポートをより正確に操作できるようになりました。 PDF ドキュメントの膨大なリポジトリを従業員向けに準備し、LLM をそれについてトレーニングすることができます。ユーザーは文書をアップロードするだけで、わかりやすい言葉で「会社の病気休暇ポリシーは何ですか?」と質問することができます。 」を参照したり、営業チームが PDF カタログやマニュアルから最新の技術仕様や製品情報をすばやく照会したりできます。
動的なコンテンツの取得
RAG (Retrieval Augmented Generation) 技術により、外部データをリアルタイムで組み込むことができます。これは、LLM を利用したアプリケーションを使用する企業が、RAG 技術を使用して企業データベースから最新の情報にアクセスできることを意味します。これにより、生成された応答が確実に最新のものとなり、意思決定に役立ちます。営業チームが製品の入手可能性について尋ねているところを想像してください。最新の在庫状況を提供するために、LLM は PDF マニュアルから情報を取得するだけでなく、会社の在庫データベースにもアクセスします。
安全かつ効率的な情報抽出
金融サービスや法律サービスなどの分野では、機密保持が非常に重要です。 LLM は、コンテキスト全体を公開することなく機密 PDF ドキュメントから情報を提供し、許可された情報のみがアクセスされるようにすることで、プライバシーとセキュリティを維持できます。
ナレッジベースでの応用
新しいポリシーや手順が PDF としてアップロードされると、LLM は PDF をスキャンして情報を抽出し、それに応じて FAQ を更新することでナレッジ ベースを更新できます。 LangChain には、Redis などの一般的なストレージ ソリューションとの機能統合が組み込まれています。
顧客満足度の向上
PDF インタラクション チャットボットを統合することで、顧客はパーソナライズされたインタラクションを実現し、関連情報に迅速にアクセスできます。たとえば、チャットボットは、IKEA の家具の組み立てを顧客にガイドできます。 PDF ユーザーマニュアルを参照して段階的な説明を提供し、顧客のスムーズなショッピング体験を保証します。
以下では、Langchain を使用した PDF インタラクションのデモを試してみました。 しかし、なぜ Langchain を使用するのでしょうか?
Lanchain は、検索システム、ドキュメント ローダー、LLM 統合ツールなどの事前構築されたコンポーネントを提供します。 LangChain コンポーネントは、ドキュメントとアラームを効果的に操作できるようにすでにテストされています。これにより、開発プロセスの全体的な効率が向上し、エラーのリスクが軽減されます。
デモコード
このデモでは、事前にトレーニングされたハグ顔モデル「flan-t5-large」を使用しました。 FastChatT5 3b モデルや Falcon 7b モデルなどの他のオープンソース モデルもこれに使用できます。 GPU を選択し、リポジトリのクローンを作成して、Gradient Notebook を開始します。このリポジトリにはrequirements.txtがなかったため、依存関係は個別にインストールされました。
モデルとドキュメントのロード
Embedding_Model = "hkunlp/instructor-xl"
LLM_Model = "google/flan-t5-large"
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("/content/langchain/qna_from_pdf_file_with_citation_using_local_Model/pdf_files/TRANSFORMERS.pdf") #path to PDF document
documents = loader.load_and_split()
- 「hkunlp/instructor-xl」は Embedding_Model で、「google/flan-t5-large」はそれぞれテキスト埋め込みと言語生成用の事前トレーニング済みモデルを定義する LLM_Model として使用されます。この事前トレーニング済みモデルは HuggingFace から取得されています。
- PyPDFLoader は、PDF ドキュメントへのパスを指定して PDF ファイルをロードします。ここでは、PDF ドキュメントを 1 つだけロードします。複数の PDF ドキュメントをフォルダーにロードでき、フォルダーへのパスを指定することもできます。
- ローダーの
load_and_split
メソッドは、PDF コンテンツを読み取り、処理のために個々のセクションまたはドキュメントに分割します。
埋め込みメカニズムのテスト
from langchain_community.embeddings import HuggingFaceInstructEmbeddings
instructor_embeddings = HuggingFaceInstructEmbeddings(model_name=Embedding_Model)
text = "This is a test document."
query_result = instructor_embeddings.embed_query(text)
PDF ドキュメントを処理する質問応答システムなど、より大きなシステムに埋め込み生成プロセスを統合する前に、埋め込み生成プロセスをテストするのが一般的です。選択した埋め込みモデルを使用して、HuggingFaceInstructEmbeddings
のインスタンスが作成されます。
3. 言語生成パイプライン
import torch
import transformers
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from transformers import pipeline
from langchain.llms import HuggingFacePipeline
tokenizer = AutoTokenizer.from_pretrained(LLM_Model)
model = AutoModelForSeq2SeqLM.from_pretrained(LLM_Model, torch_dtype=torch.float32)
pipe = pipeline(
"text2text-generation",
model=model,
tokenizer=tokenizer,
max_length=512,
temperature=0,
top_p=0.95,
repetition_penalty=1.15
)
llm = HuggingFacePipeline(pipeline=pipe)
AutoTokenizer.from_pretrained(LLM_Model) - これは、テキストをモデルが理解できる形式に変換します。
AutoModelForSeq2SeqLM.from_pretrained(LLM_Model, torch_dtype=torch.float32)
: このコード行は、自然言語処理 (NLP) タスク用の Transformers ライブラリを使用する Python スクリプトで使用される可能性があります。AutoModelForSeq2SeqLM
: コードのこの部分は、シーケンス間の学習タスク用に特別に設計された事前トレーニングされたモデル アーキテクチャを参照します。機械翻訳、要約、テキスト生成などのタスクに使用されます。.from_pretrained(LLM_Model)
: このセクションでは、トランスフォーマー ライブラリのモデル ハブから事前トレーニングされた LLM (大規模言語モデル) を読み込みます。torch_dtype=torch.float32
:torch.float32
は、モデルが 32 ビット浮動小数点精度を使用することを示します。pipe=Pipeline
: モデルでテキストを生成するためのテキスト間生成パイプラインを作成します。
パイプラインのパラメータ:
- モデル、トークナイザー: 使用するモデルとトークナイザーを指定します。
- max_length: 生成されるテキストの最大長を 512 トークンに制限します。
- 温度 (0): 生成時のランダム性を制御します (0 は決定性を意味します)。
- top_p (0.95): 可能性の高い次のトークンをフィルタリングして、より可能性の高い応答を求めます。
- repetition_penalty (1.15): テキストの繰り返し生成を防止します。
4. インデックスからレトリーバーを作成し、LLM と統合します。
from langchain_core.retrievers import BaseRetriever
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from typing import List
class CustomRetriever(BaseRetriever):
def _get_relevant_documents(
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
) -> List[Document]:
return [Document(page_content=query)]
retriever = CustomRetriever()
retriever.get_relevant_documents("bar")
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True)
question = "explain Power Transformers?"
このコードは、クエリに基づいて関連ドキュメントを取得し、それらのドキュメントを使用して質問に対する回答を生成します。取得したコンポーネントを LangChain フレームワークの QA パイプラインと統合します。
5. チェーンをクエリする
question = "Ideal transformers can be characterized as?"
generated_text = qa(question)
Generated_text
qa(question)
はリアルタイムで呼び出すか、LangChain フレームワークと直接対話して出力を生成します。
このチャット機能をアプリケーションに統合するには、まずトレーニングと微調整が必要です。 GPU はそのプロセスを高速に追跡できます。 PDF ドキュメントを使用したリアルタイム チャットの場合、顧客の応答までの待ち時間が非常に長くなるため、CPU の使用だけでは不十分です。その場合、高出力の GPU も必要になります。
最後に
RAG 技術を統合すると、チャットボットの会話が合理化され、PDF ドキュメントから安全かつ最新の情報を取得できるようになります。 PDF 分析をさらに強化することができます。たとえば、OCR テクノロジーを活用して PDF や手書きの文書を効果的にスキャンし、出典の引用を伝えます。 高度な PDF 分析とチャットボット インタラクションの世界に飛び込んでください。