見出し画像

ChatGPT API×LangChainでPDFドキュメントからデータ検索してみた!

1.はじめに

  • 「ChatGPTが人間のように長期記憶を獲得し、過去の記憶を基にユーザと会話できたら面白そうだなぁ」と思って色々調べてみると、以下のように先行実装されている方の記事を見つけました。↓↓↓

  • どうやらLangChainという便利なライブラリをChatGPT APIと組み合わせることで私のやりたいことを実現できそうだったので、上記の記事を参考にさせて頂き、以前作ったGUIチャットボット上で実装してみました。

2.コード生成

今回作成したコードは、以下のように動作します。

  1. CドライブからPDFを読み込み、ページごとに分割-このプロセスでは、指定した場所に保存されたPDFファイルをLangChainのPyPDFLoaderを使って読み込みます。ファイルはページごとに分割され、テキストが抽出されます。これにより、PDFドキュメントの内容がテキストとして扱いやすくなります。

  2. PDFテキストのベクトル化とベクトルデータベースへの保存-抽出されたテキストは、OpenAIEmbeddingsを通じてベクトル化されます。これらのベクトルは、Chromaベクトルデータベースに格納され、後で検索や分析が可能になります。このステップにより、テキスト間の関連性が数値的に管理され、質問に対する答えを見つけやすくなります。

  3. LangChainとChatGPTによるPDF解析-ユーザーがGUIを介して質問を入力すると、ConversationalRetrievalChainがその質問に最も関連する情報をベクトルデータベースから検索します。その後、ChatGPT APIがこれらの情報を基に回答を生成し、ユーザーに表示されます。この一連の流れにより、PDFドキュメントの内容に関する質問に対して迅速かつ正確な回答が得られます。

# 必要なライブラリのインポート
import tkinter as tk
from tkinter import scrolledtext
import os
import openai
import langchain

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

# APIキー環境変数の設定
openai.api_key = os.getenv("API_KEY")


loader = PyPDFLoader("C:\\pdf_box\\mydoc.pdf")
pages = loader.load_and_split()
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo-0125")
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()


def send_request():
    user_query = entry.get()
    pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)
    chat_history = []
    result = pdf_qa({"question": user_query, "chat_history": chat_history})

    text_area.configure(state='normal')
    text_area.delete('1.0', tk.END)
    text_area.insert(tk.INSERT, result["answer"])  # 応答のテキスト部分を挿入
    text_area.configure(state='disabled')

# GUIウィンドウの作成
window = tk.Tk()
window.title("ベクターストア(外付け記憶)から情報を検索するテスト")

entry = tk.Entry(window, width=50)
entry.pack(pady=10)

send_button = tk.Button(window, text="Send", command=send_request)
send_button.pack(pady=5)

text_area = scrolledtext.ScrolledText(window, width=60, height=10, state='disabled')
text_area.pack(pady=10)

window.mainloop()

PDF内容(抜粋)

PDFドキュメントには、以下のように筆者が試しに作ったChatGPTが知らない情報を書き込みました。↓↓↓

※マキラは王道スマホRPG「グランブルーファンタジー」に登場するキャラクターです。

3.結果

実行結果は以下となります。


(ゆら所感)
前回のGUIチャットボット作成から打って変わり、ChatGPTからポン出しで上手くコードが生成されず、色々と難儀しましたが、プログラミングにおける生成AIの使い方のコツが少し掴めたので、今回の経験は好意的に受けて止めています。創造力を形に出来るこの「魔法の箱」を使いこなせるよう、今後も使い込んでいきたいと思います。


この記事が気に入ったらサポートをしてみませんか?