PDFとのチャット | PythonとOpenAIによるテキストの対話力の向上

PDFとチャット | PythonとOpenAIによるテキスト対話力の向上

イントロダクション

情報に満ちた世界で、PDFドキュメントは貴重なデータを共有および保存するための必須アイテムとなっています。しかし、PDFから洞察を抽出することは常に簡単ではありませんでした。それが「Chat with PDFs」が登場する理由です。この革新的なプロジェクトは、私たちがPDFと対話する方法を変革します。

この記事では、言語モデルライブラリ(LLM)のパワーとPyPDFのPythonライブラリの多様性を組み合わせた「Chat with PDFs」という魅力的なプロジェクトを紹介します。このユニークな融合により、PDFドキュメントと自然な会話を行うことができ、質問をすることや関連のある回答を得ることが容易になります。

学習目標

  • 言語モデルライブラリ(LLM)についての洞察を得る。これは人間の言語パターンを理解し、意味のある応答を生成する高度なAIモデルです。
  • PyPDFを探求し、PDFの操作におけるテキスト抽出、マージ、分割などの機能を理解する。
  • 言語モデルライブラリ(LLM)とPyPDFの統合により、PDFとの自然な会話を可能にする対話型チャットボットの作成方法を認識する。

この記事はData Science Blogathonの一環として公開されました。

言語モデルライブラリ(LLM)の理解

「Chat with PDFs」の中心にあるのは、言語モデルライブラリ(LLM)です。これは大量のテキストデータで訓練された高度なAIモデルです。これらは言語の専門家のような存在であり、人間の言語パターンを理解し、意味のある応答を生成することができます。

私たちのプロジェクトでは、LLMは対話型チャットボットの作成において重要な役割を果たしています。このチャットボットは、あなたの質問を処理し、PDFから必要な情報を理解することができます。PDFに隠された知識を活用して、役立つ回答と洞察を提供することができます。

PyPDFs – あなたのPDFスーパーアシスタント

PyPDFは、PDFファイルとのやり取りを簡素化する多機能なPythonライブラリです。テキストの抽出、結合、分割など、さまざまな機能を利用できます。このライブラリは、PDFの処理と分析を効率化するために私たちのプロジェクトにおいて重要な役割を果たしています。

PyPDFを使用することで、PDFファイルをロードし、そのテキストを抽出することができます。これにより、効率的な処理と分析の準備が整いました。この強力なアシスタントを使用して、PDFとの対話をスムーズに行うことができます。

「Chat with PDFs」は、言語モデルライブラリ(LLM)とPyPDFを組み合わせることで、PDFドキュメントを静的な状態から解放します。これにより、貴重な情報を抽出し、意味のある対話を行うことができます。学術論文からビジネスレポートまで、「Chat with PDFs」はPDFとの対話を楽しい体験にします。

では、「Chat with PDFs」プロジェクトの魅力的な世界にダイブしましょう。

プロジェクト

# 必要なライブラリのインポートとAPIキーの設定
import os
import pandas as pd
import matplotlib.pyplot as plt
from transformers import GPT2TokenizerFast
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
from langchain.chains import ConversationalRetrievalChain

from key import openaiapi_key
os.environ["OPENAI_API_KEY"] = openaiapi_key

上記のコードは、「Chat with PDFs」プロジェクトを開始するために必要なライブラリをインポートし、APIキーを設定しています。オペレーティングシステムとのやり取りには「os」ライブラリを使用し、データ操作には「pandas」を使用し、グラフのプロットには「matplotlib」を使用しています。「transformers」ライブラリは「GPT2TokenizerFast」クラスを提供しており、テキストのトークン化に不可欠です。「langchain」モジュールには、PDFのロード(「PyPDFLoader」)、テキストの分割(「RecursiveCharacterTextSplitter」)、埋め込み(「OpenAIEmbeddings」)、ベクトルストレージ(「FAISS」)、質問応答チェーン(「load_qa_chain」)、言語モデル(「OpenAI」)、対話チェーン(「ConversationalRetrievalChain」)に必要なクラスが含まれています。

PyPDF Loader

次に、「PyPDFLoader」クラスを使用してPDFファイルをロードし、個々のページに分割します。最後に、PDFの正常なロードと分割を確認するために最初のページの内容を印刷します。

# シンプルな方法 - ページごとに分割する
loader = PyPDFLoader("story.pdf")  
# 'PyPDFLoader'クラスのインスタンスを作成し、作業するPDFファイルのファイルパスを渡しています。
pages = loader.load_and_split()
print(pages[0])  

このセクションでは、PDFドキュメントのロードと分割について説明します。2つの方法が示されています。ページごとにPDFを分割するシンプルな方法と、PDFをテキストに変換し、より小さなチャンクに分割する高度な方法です。

# 高度な方法 - チャンクごとに分割する

# ステップ1:PDFをテキストに変換する
import textract
doc = textract.process("story.pdf")

# ステップ2:.txtファイルに保存して再オープンする(問題を防ぐのに役立ちます)
with open('story.txt', 'w') as f:
    f.write(doc.decode('utf-8'))

with open('story.txt', 'r') as f:
    text = f.read()

# ステップ3:トークン数をカウントする関数を作成する
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")

def count_tokens(text: str) -> int:
    return len(tokenizer.encode(text))

# ステップ4:テキストをチャンクに分割する
text_splitter = RecursiveCharacterTextSplitter(
    # 本当に小さなチャンクサイズを設定して表示するだけです。
    chunk_size = 512,
    chunk_overlap  = 24,
    length_function = count_tokens,
)

chunks = text_splitter.create_documents([text])

PDFを分割する手順

高度な方法では、より効率的な処理のためにPDFをより小さなチャンクに分割します。以下の手順でこれを実現します:

ステップ1: 「textract」ライブラリを使用してPDFファイルからテキストを抽出し、「doc」という変数に保存します。

ステップ2: 抽出されたテキストをテキストファイル(「story.txt」)に保存し、潜在的な問題を防ぐために読み取りモードで再オープンします。「text」変数にコンテンツが格納されます。

ステップ3: 「count_tokens」という名前の関数を定義して、与えられたテキストのトークン数をカウントします。この関数は、「GPT2TokenizerFast」クラスを使用してテキストをトークン化します。

ステップ4: 「RecursiveCharacterTextSplitter」クラスを使用して、「text」をより小さな「chunks」に分割し、各チャンクには最大トークン制限があります。

# テキストを埋め込み、埋め込みを保存する
# 埋め込みモデルを取得
embeddings = OpenAIEmbeddings()  
# ベクトルデータベースを作成
db = FAISS.from_documents(chunks, embeddings)  

OpenAI埋め込み

このセクションでは、「OpenAIEmbeddings」クラスを使用してテキストを数値表現(埋め込み)に変換します。これらの埋め込みは、テキストデータの効率的な保存と分析を可能にします。次に、「FAISS」クラスを使用して、テキストの「chunks」とそれに対応する埋め込みを組み込んだベクトルデータベースを作成します。

# 検索関数の設定
# 類似性検索が動作していることを確認する
query = "著者の名前は何ですか?" 

docs = db.similarity_search(query)  

docs[0]  

この部分では、検索関数を設定します。ベクトルデータベース(「db」)を使用して、サンプルクエリを使用して類似性検索を実行できます。変数「query」にはチャットボットに尋ねたい質問が含まれ、変数「docs」にはクエリの文脈を含む関連ドキュメントが格納されます。そして、類似性検索から返された最初のドキュメントを印刷します。

chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
query = "著者の名前は何ですか?"  

docs = db.similarity_search(query) 

chain.run(input_documents=docs, question=query)  

このセグメントでは、類似性検索をユーザーのクエリと統合する質問応答チェーン(「chain」)を作成します。 「OpenAI」言語モデルをロードし、温度を0に設定して確定的な応答を得ます。検索されたドキュメント(「docs」)とユーザーの質問(「query」)をチェーンに渡すことで、知識ベースに基づいた回答を取得します。

# チャットメモリを持つチャットボットを作成する
from IPython.display import display 
import ipywidgets as widgets 
qa = ConversationalRetrievalChain.from_llm(OpenAI(temperature=0.1), db.as_retriever()) 

chat_history = [] 
def on_submit(_):  
    query = input_box.value  
    input_box.value = ""  

    if query.lower() == 'exit':  
        print("Chat with PDFsチャットボットのご利用ありがとうございました!")
        return

    result = qa({"question": query, "chat_history": chat_history})  

    chat_history.append((query, result['answer'])) 

    display(widgets.HTML(f'<b>ユーザー:</b> {query}'))  
    display(widgets.HTML(f'<b><font color="blue">チャットボット:</font></b>{result["answer"]}')) 

print("Chat with PDFsチャットボットへようこそ!終了するには「exit」と入力してください。")  

input_box = widgets.Text(placeholder='質問を入力してください:')  
input_box.on_submit(on_submit)  
display(input_box)  

最後のセクションでは、ユーザーは質問を入力して回答を得ることができるチャットボット機能を紹介します。

まとめ

この記事では、魅力的な「Chat with PDFs」プロジェクトとそのステップバイステップの実装について紹介しました。Language Model Libraries(LLM)とPyPDFsという2つの重要なコンポーネントについて詳しく説明しました。これにより、PDFドキュメントを簡単に処理し、有益な情報を抽出し、チャットボットとの対話を楽しむことができるようになります。研究者、学生、プロフェッショナルにとって、「Chat with PDFs」はPDFとのやり取り方法を革新し、AIの力で以前は静的だったドキュメントを活気づけました。PDFの探索を楽しんでください!

キーポイント

  1. LLMは、ユーザーのクエリに正確で文脈に即した応答を提供するためのチャットボットの力を高めます。
  2. PyPDFは、複雑なドキュメントを扱いやすくすることで、PDFの操作を簡素化します。
  3. コードの構造は、テキスト埋め込みと類似度検索機能のスムーズな統合を保証します。
  4. PyPDFを使用すると、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

データサイエンス

オープンAIによるこの動きは、AGIへの道を開くだろう

人工知能(AI)の能力向上を目指した画期的な取り組みの一環として、OpenAIはデータパートナーシップイニシアチブを発表しま...

人工知能

2023年10月:オクタが新しいアイデンティティイノベーションを発表して、AI時代のセキュリティを確保します

アイデンティティの脅威保護、AI開発者の生産性向上、パスワードレス認証、認証および資格情報の解決策

データサイエンス

「Transformerの簡略化:あなたが理解する言葉を使った最先端のNLP — part 3 — アテンション」

「トランスフォーマーは、AIの分野で、おそらく世界中で重大な影響を与えていますこのアーキテクチャはいくつかのコンポーネ...

人工知能

AIの革新的なイノベーションが開発者を強化する

SAPは、Build CodeやHANA Cloudなどの複数の生成AI機能を導入し、開発者が迅速にデータから価値を生み出し、革新するのを支援...

データサイエンス

なぜハイプが重要なのか:AIについて現実的な考え方が必要

ELIZAはChatGPTにいくつかの類似点を持つ初期のチャットボットでしたなぜこの興奮が重要なのでしょうか?船を発明すると、船...

機械学習

AIによる生産性向上 生成AIが様々な産業において効率の新たな時代を開く

2022年11月22日、ほとんど仮想的な瞬間が訪れ、それは地球上のほぼすべての産業の基盤を揺るがしました。 その日、OpenAIは史...