🦜

格安でChatGPTにpdfを要約させる方法

2023/12/18に公開

格安でChatGPTにpdfを要約させる方法

ChatGPTを使用してPDFの要約や内容の説明をしてみたいと考えている人は多いと思います。ただ、GPT Plusの料金は月20ドル…。そこまで使用頻度がない場合は高いですよね。そこで今回はOpenAIのAPIとLangChainを使ってなるべく安くpdfの内容をChatGPTに読み込ませたいと思います。

LangChainとは

LangChainは大規模言語モデルを様々な分野に活用できるライブラリです。ChatGPT以外にもLlamaやGPT4ALLなどの無料モデルも使えます。LangChainを使えばGPTに検索させたりSlackのボットを作れたり様々なことができるようです。
こちらの記事ではLangChainの概要を分かりやすくまとめてくださっています。
https://zenn.dev/umi_mori/books/prompt-engineer

LangChainでpdfを読み込ませるには?

LangChainにはPyPDFLoaderというPDFを読み取る関数が用意されています。これを使ってpdfを文章に変換し、pdfの内容を特徴ベクトルに落とし込みます。その後、chatgptが落とし込んだ特徴ベクトルを探索しつつそれっぽい回答をしてくれます。大変そうなことをしていますが、LangChainでは数行書くだけで簡単に実装できます。
今回はgoogle colabでコードを配布していますので、ぜひ遊んでみてください。
https://colab.research.google.com/drive/1auCpcRlzhmMZKXLtKDPXwi5xNbTHGWSp?usp=sharing
ただし、OpenAIのAPIKEYが必要になります。
OpenAI APIの使い方はこちらの記事をお読みください。
https://qiita.com/Isaka-code/items/b50983796636503b44c5

以降はコードの解説になります。興味のある方はご覧ください。

1. ライブラリインストール

!pip install openai #OpenAI APIを使うのに必要
!pip install chromadb #pdfを言語モデルに読み込む際に必要
!pip install langchain
!pip install pypdf #pdfを読み込む際に必要
!pip install tiktoken #pdfをChatGPTに読み込む際に必要

2. ライブラリのインポート

import os
import platform

from google.colab import files
import openai
import chromadb
import langchain

from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader

from langchain.chat_models import ChatOpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.callbacks import get_openai_callback

3. pdfファイルのアップロード&読み込み

今回はテストとして、auが出しているpixel8のカタログpdfを読み込んでみました。
文章を確認したい場合は文章確認用のコードのコメントアウトを解除してください。
PyPDFLoaderは文章のみ対応で画像は読み込まれないのでそこだけ注意が必要です。

uploaded = files.upload()
loader = PyPDFLoader(list(uploaded.keys())[0])
pages = loader.load_and_split()
#文字数カウント
counts = 0
for p in pages:
  counts += len(p.page_content)
print(f"pdfの文字数:{counts}")
#文章確認用
# for p in pages:
#   print(p.page_content)

4. モデル読み込み

自分のAPI KEYを入力して言語モデルを選んでください。
料金はこちらを参照してください。
https://openai.com/pricing

#あなたのAPI KEYを入力してください
os.environ["OPENAI_API_KEY"] = "Your OpenAI API KEY"
openai.api_key = os.getenv("OPENAI_API_KEY")

#gpt-4やgpt-3.5-turboなどを選んでください
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()

vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()
pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)

5. pdf内容参照

queryにchatGPTに尋ねたいことを書いてください。日本語だと一語で1~3トークンなので高くなりやすいです。入力と出力は英語にしたほうが安くなるので、用途によってはそっちのほうがいいかもしれませんね。
with get_openai_callback() as cb:を使うとchatGPTの使用料金などを可視化してくれます。

query = "Please summarize the pixel8 in Japanese"
chat_history = []
with get_openai_callback() as cb:
    result = pdf_qa({"question": query, "chat_history": chat_history})
    print(cb)
print(result["answer"])
出力結果
Tokens Used: 3677
	Prompt Tokens: 3401
	Completion Tokens: 276
Successful Requests: 1
Total Cost (USD): $0.0056535000000000005
Google Pixel 8は、パワフルな実用性を持つAIスマートフォンです。カラーはObsidian、Rose、Hazelがあります。重量は約187gで、バッテリー容量は4,575mAhです。OSはAndroidTM 14で、CPUはGoogle Tensor G3です。内蔵メモリはROM 128GB※1/RAM 8GBで、外部メモリは推奨最大容量はありません。ディスプレイは約6.2インチで、動画撮影サイズは最大3,840×2,160(4K)です。防水(IPX8)/防塵(IP6X)対応で、おサイフケータイも利用できます。また、Wi-Fi®やBluetooth®にも対応しています。最大通信速度は受信最大4.1Gbps※2/送信最大218Mbps※2です。5Gにも対応していますが、一部エリアでの提供となります。

出力内容は大体あってそうですね。
Total Cost (USD)が全体でかかった料金になります。GPT3.5-turboの場合は0.0056ドルになりました。0.0056ドルは2023年12月18日では約0.80円らしいです。ほとんどの場合で性能はGPT3.5で十分なので一か月20ドルを払うより、遥かに安くなりそうですね。

まとめ

今回はLangChainを使ってpdfの内容を読み取り、要約してもらいました。今回は要約をしましたが、LangChainはその他にも文章ではなく情報のみを取得したり、他のアプリと連携したりできます。
その他の機能についても今後記事にできればと思います。
御清聴ありがとうございました!

Discussion