ChatGPT APIでPDFの内容を問い合わせる方法

# はじめに

OpenAIが開発したGPTという大規模な言語モデルを活用して、自然言語でPDFドキュメントの内容について問い合わせ回答を得る。この方式は既に多くの人々によって試みられている。先人の調査を踏まえて、具体的にOpenAI APIを用いて巨大なPDFドキュメントの内容を自然言語で問い合わせる手法やポイントを確認する。

対象としたのはHbbTV2.0.4の規格書。テレビ放送とインターネットを組み合わせたハイブリッドなテレビ視聴体験を提供するための主に欧州で利用されている規格だ。その詳細な内容はPDFドキュメントで公開されており、それらを理解し、利用するためには深く解析したい。こうしたテクニカルな内容を短時間で、そしてより理解しやすく解析するための一つのアプローチについて掘り下げてみる。

:::note info
今回の検証に利用するようなPDFドキュメントのサイズは十分に小さい。そのような場合には、全てのテキストデータを参考にする情報としてChatGPTに渡し、その内容について問い合わせることでより良い回答が得られるだろう。今回は、PDFドキュメントの内容が大きくその全てをGPTに渡せない場合について検討する。
:::

# 結論
複雑なPDFドキュメントを効率的に理解するために、OpenAIが開発したGPTを活用し、PDFドキュメントの内容について特定の質問に対してGPTが適切な回答を生成することを確認した。

ベクターストアを用いることで、大量のテキスト情報を効率的に管理し、特定の質問に対する最も関連性のある情報を素早く取得することが可能となる。PDFドキュメントの大部分を直接GPTに渡す必要がなく、膨大な情報を効率的に処理できることを確かめた。

:::note
今回のような手法ではテキストデータの一部をGPTに渡して処理する。GPTに渡すべき最適なテキストデータを用意する処理の最適化が差別化要素となる。
:::

# 用意するもの
本記事では実行環境として Google Colab 上で Python コードを書き、ChatGPT と LangChain の Python API を呼び出すこととします。

Google Colab アカウント　: https://colab.research.google.com/?hl=ja
OpenAI API キー : https://openai.com/blog/openai-api
PDFドキュメント:　[hbbtv2.0.4 explained](https://www.hbbtv.org/wp-content/uploads/2023/03/HbbTV-SPEC-01235-002-hbbtv204-explained.pdf)

# 前提
このページに記載していることは省く

https://qiita.com/hiroki_okuhata_int/items/7102bab7d96eb2574e7d

# PDFファイルをGoogle Colabへのアップロード
[hbbtv2.0.4 explained](https://www.hbbtv.org/wp-content/uploads/2023/03/HbbTV-SPEC-01235-002-hbbtv204-explained.pdf)　を Google Colab へアップロードする
![スクリーンショット 2023-05-21 19.57.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/5938128d-bc38-236c-55de-8f5ebbdf886a.png)

# ソースコード

```python:Google Colab　commands

%%writefile requirements.txt
openai
chromadb
langchain
pypdf
tiktoken

%pip install -r requirements.txt
```

```python: source code
import os
import platform

import openai
import chromadb
import langchain

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader

# load HbbTV2.0.4 specification pdf file
loader = PyPDFLoader("HbbTV-SPEC-01235-002-hbbtv204-explained.pdf")
pages = loader.load_and_split()

# Preprocessing for using Open　AI
os.environ["OPENAI_API_KEY"] = '<Your API Key>'
openai.api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()

# Stores information about the split text in a vector store
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()

# IF for asking OpenAI
pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)

# Question1
query = "What are key features in HbbTV 2.0.4? Answer in bullet points.　Anser witin 200 words in Japanese"
chat_history = []
result = pdf_qa({"question": query, "chat_history": chat_history})
print(result["answer"])
```

```python: 異なる質問の場合の回答も確認する
# Question2
query = "What are 3 key features for the future in HbbTV 2.0.4? Answer in bullet points. 
```



# 二種類の質問文とその回答

|質問| Question 1 | Question 2 |
|:-:|:-|:-|
| 所見| PDFに含まれるHbbTV 2.0.4の機能を洗い出して回答できている | "for the tuture" というキーワードを元にPDFに含まれる将来的にむけた機能を洗い出して回答できている | 
| 質問文| What are key features in HbbTV 2.0.4? Answer in bullet points.　Anser witin 200 words in Japanese |  What are 3 key features for the future in HbbTV 2.0.4? Answer in bullet points. Anser witin 200 words in Japanese |
| 回答文|HbbTV 2.0.4の主な特徴は以下の通りです。<br/>- テレビまたはSTBが提供するアクセシビリティ機能との統合<br/>- DVB-IおよびDVB-DASHを使用したブロードバンドを介したライブ/リニアサービスの統合<br/>- AlexaやGoogleアシスタントなどの音声アシスタントの統合<br/>- オーディオミキシングの強化<br/>- HbbTVアプリからの終了時のアナリティクスレポートのサポート<br/>- Webプラットフォームのアップデート<br/>- 1920x1080グラフィックスの正しいサポート<br/>- アプリがサポートできる座標空間を示すシグナルの提供<br/>また、HbbTV 2.0.4には、小規模な追加機能、非推奨機能、および誤りの修正も含まれています。　| HbbTV 2.0.4では、将来的に3つの主要な機能が統合されることが定義されています。それらは以下の通りです：<br/> - TVまたはSTBが提供するアクセシビリティ機能の統合<br/> - DVB-IおよびDVB-DASHを使用したブロードバンドを介したライブ/リニアサービスの統合<br/> - AlexaやGoogleアシスタントなどの音声アシスタントの統合<br/>また、HbbTV 2.0.4には、いくつかの小規模な変更も含まれています。これらには、追加の機能、非推奨機能、誤り訂正などが含まれます。追加の機能には、オーディオミキシングの強化、HbbTVアプリからの終了時のアナリティクスレポートのサポート、Webプラットフォームの更新、1920x1080グラフィックスの正しいサポートなどがあります。HbbTV 2.0.4は、広範な機能の統合と小規模な改善を通じて、より優れた視聴体験を提供することを目的としています。|

# 回答作成に利用したPDFドキュメントの参照内容
上記の回答作成のためにGPTに渡したテキストデータはPDFドキュメント全体ではない。PDFドキュメントのごく一部(4ページ分)を渡している。GPTが回答作成に利用したPDFドキュメントの参照ページとその参照内容を確認する。

Question1の場合とQuestion2の場合で参照しているPDFの内容は順番は異なるが同一の４ページ分の内容を利用している。同一の参照データを元にして、GPTがそれぞれの質問文に対応した適切な回答を生成している。

```python: 回答の元データを確認する
# Review the original set of texts related to the above responses.
for doc in result['source_documents']:
  print(doc.page_content)
  print(doc.metadata)
```


|質問| Question 1 | Question 2 |
|:-:|:-|:-|
|参照先1| {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 0}| {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 2} |
| 参照文1 | HbbTV 2.0.4 Explained | Summary<br/>•2.0.4 defines how HbbTV can integrate with 3 key features for the future<br/>–Accessibility features provided by the TV or STB<br/>–Live/linear services via broadband using DVB -I and DVB -DASH<br/>–Voice assistants such as Alexa and Google Assistant<br/>•Also some smaller changes<br/>–Smaller additional features<br/>–Deprecations<br/>–Errata<br/>HbbTV Association \| Copyright © HbbTV 3<br/>|
|参照先2| {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 2} | {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 0}|
| 参照文2 | Summary<br/>•2.0.4 defines how HbbTV can integrate with 3 key features for the future<br/>–Accessibility features provided by the TV or STB<br/>–Live/linear services via broadband using DVB -I and DVB -DASH<br/>–Voice assistants such as Alexa and Google Assistant<br/>•Also some smaller changes<br/>–Smaller additional features<br/>–Deprecations<br/>–Errata<br/>HbbTV Association \| Copyright © HbbTV 3<br/>| HbbTV 2.0.4 Explained<br/>|
|参照先3| {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 1} | {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 1}<br/>|
| 参照文3 |Contents<br/>•Summary<br/>•New features<br/>–Accessibility integration<br/>–DVB-I integration<br/>–Voice assistant integration<br/>–Smaller additions<br/>•Deprecations<br/>•Errata<br/>•What next<br/>HbbTV Association \| Copyright © HbbTV 2<br/>| Contents<br/>•Summary<br/>•New features<br/>–Accessibility integration<br/>–DVB-I integration<br/>–Voice assistant integration<br/>–Smaller additions<br/>•Deprecations<br/>•Errata<br/>•What next<br/>HbbTV Association \| Copyright © HbbTV 2<br/>|
|参照先4| {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 7} | {'source': 'HbbTV-SPEC-01235-002-hbbtv204-explained.pdf', 'page': 7} |
| 参照文4 | Smaller additions<br/>•Audio mixing enhancements<br/>–Mixing between broadcast audio and audio clips via Web Audio API becomes required<br/>•Allow analytics reporting on exit from an HbbTV app<br/>–Support for W3C Beacon API<br/>•Web platform update<br/>–Update from alignment with 2018 desktop browsers to alignment with 2021 desktop browsers<br/>•Properly support 1920x1080 graphics<br/>–2.0.3 has partial support for 1920x1080 graphics –coordinate space is always 1280x720 even if underlying graphics are 1920x1080<br/>–2.0.4 permits coordinate spaces of 1920x1080 and higher<br/>•App signals what coordinate spaces it can support<br/>HbbTV Association \| Copyright © HbbTV 8<br/> |Smaller additions<br/>•Audio mixing enhancements<br/>–Mixing between broadcast audio and audio clips via Web Audio API becomes required<br/>•Allow analytics reporting on exit from an HbbTV app<br/>–Support for W3C Beacon API<br/>•Web platform update<br/>–Update from alignment with 2018 desktop browsers to alignment with 2021 desktop browsers<br/>•Properly support 1920x1080 graphics<br/>–2.0.3 has partial support for 1920x1080 graphics –coordinate space is always 1280x720 even if underlying graphics are 1920x1080<br/>–2.0.4 permits coordinate spaces of 1920x1080 and higher<br/>•App signals what coordinate spaces it can support<br/>HbbTV Association \| Copyright © HbbTV 8<br/> |


# ベクターストアで大量の情報を効率的に管理する

ベクターストアを使用すると、大量のテキスト情報を効率的に管理でき、特定の質問に対する最も関連性のある情報を素早く取得することができる。ベクターストアは、テキストデータの高次元表現（通常は埋め込みと呼ばれる）を格納し、特定のクエリに最も近い（つまり、最も関連性のある）情報を高速に検索することができる。

この仕組みはOpenAIのモデルが最適な情報を使用して質問に応答できるようにするために重要となる。モデルが一度に大量の情報を処理するのではなく、ベクターストアを使用して最も関連性のある情報だけを取得できるので、処理速度が向上し、必要なリソースが節約される。これによりモデルがより的確で情報量の多い応答を生成する可能性が高くなる。


# 参考
https://qiita.com/hiroki_okuhata_int/items/7102bab7d96eb2574e7d

https://book.st-hakky.com/docs/langcain-intro/

https://qiita.com/windows222/items/232f05bafa95a9c8874e