第1章: はじめに
1-1. この記事でわかること
こんにちは!Pythonは使ったことあるけど、ChatGPT APIやLangChainはたぶんわからない…そんな人が対象の記事です。
今日は、PDFやExcelの文書を読み込んで、その内容に基づいた質問にChatGPTが答えてくれる「質問応答アプリ」を作ります。
しかも、その答えがまちがっている場合は、ChatGPT自身が自分で検証して、再度答えを考えなおしてくれる『自己再評価機能』つきです。
本記事では、派手なデモというよりも「RAG(検索拡張生成)」の基本的な仕組みを、実装ベースで淡々と確認していきます。
1-2. 想定読者
- Pythonはインストールされている
- ChatGPTは使ったことあるけどAPIは初めての方
- LangChainも使用したことがない方
- PDF/EXCELのマニュアルや説明書をAIに読ませるツールを作成したい方
そんな人に、身近なシーンを通して「AIツール作り」を体感してもらうための記事にしています。
第2章: どんなことができるの?【概要編】
2-1. 作るアプリの機能
作るのは、たった1本のPythonプログラムで、以下のような機能を持ったツールです:
機能 | 説明 |
---|---|
文書読み込み | PDF/マニュアルExcelを読む |
質問入力 | GUIから質問を入力 |
答えの生成 | ChatGPTが読んだ文書から答えを作る |
答えの再評価 | ChatGPT自身が「その答えで良かったか?」を検証 |
実行も簡単 | ボタンを押すだけで開始 |
プログラムの中身は、どんどん次の章で解説しますが、先に「なにができるのか」を実感してもらいましょう。
2-2. 実行例のデモ
例として、ある会社の就業規則を読み込ませて、その内容について質問し、AIが回答する様子を動画にしました。以下の流れです。
- 「RAG株式会社就業規則.pdf」を読み込む
- 「有休は何日まで持ち越せる?」と入力
- ChatGPTが「有休の最大持ち越し期間は…です」と答える
- ChatGPT自身が「読んだ資料に基づく答えとして妥当か」か検証
このPDFファイルには以下のように記載されています。これに対してどのように回答するかご覧ください。

第3章: 使っている技術の解説
3-1. ChatGPT API(OpenAI)
本アプリでは、OpenAIが提供するGPT-4o-miniというモデルを利用しています。これは、文章の理解力が非常に高く、人間のような自然な回答を生成できるAIです。
- 質問に対して適切な回答を生成
- 回答の妥当性を自己評価し、間違いを自動で検出して再回答する
3-2. LangChain
LangChainはAIを使った自然言語処理アプリを作るためのフレームワークです。
- ドキュメントを読み込み、AIモデル(ここではGPT)で利用可能な形に整える
- テキストをベクトル化して類似検索できるようにする
- 複雑な処理(ドキュメント読み込み、質問応答、再評価など)を簡単に実装可能
3-3. Chroma(ベクトルDB)
Chromaはベクトルデータベースで、ドキュメントをベクトル形式で保持し、類似する文章を高速に検索します。
- 質問内容に最も近いドキュメントを検索
- 必要な情報だけを抜き出して回答の精度を向上させる
3-4. SpacyTextSplitter
ドキュメントを適切なサイズに分割するためのツールです。
- ドキュメントを細かく分割して、ベクトル化の精度を向上
- コンテキストを維持しつつ情報を効率よく検索可能にする
第4章: コードの内容を単項目で解説
4-1. 文書読み込み
- PyMuPDFLoader: PDFファイルを読み込む
- UnstructuredExcelLoader: Excelファイルを読み込む
- ファイル形式に応じて適切な読み込み方法を選択
if filepath.endswith(".pdf"):
loader = PyMuPDFLoader(filepath)
elif filepath.endswith(".xlsx"):
loader = UnstructuredExcelLoader(filepath)
documents = loader.load()
4-2. ベクトルデータベース作成
- 読み込んだドキュメントをSpacyTextSplitterで分割し、Chromaに格納
- 検索可能なベクトルデータベースとして情報を管理
def rebuild_vector_db():
global vector_db, last_refresh_time
splitted_docs = text_splitter.split_documents(all_documents)
vector_db = Chroma.from_documents(splitted_docs, embeddings, persist_directory=None)
last_refresh_time = time.time()
4-3. 質問処理と回答生成
- 入力された質問をベクトル検索して関連性の高い文章を抽出
- GPTモデルを利用して回答を生成
- 自動で最大10回まで再試行し、妥当性を検証
docs = vector_db.similarity_search(query, k=5)
context = "\n\n".join(doc.page_content for doc in docs)
for attempt in range(1, max_attempts + 1):
prompt = prompt_template.format(document=context, query=query)
response = llm.invoke([HumanMessage(content=prompt)])
answer = response.content.strip()
review_prompt = f"""..."""
review_response = llm.invoke([HumanMessage(content=review_prompt)])
review_text = review_response.content.strip()
if "✅" in review_text:
break
4-4. GUI(Tkinter)
- ユーザーが直感的に操作できるインターフェースを提供
- ボタンやテキストボックスで簡単に操作可能
root = tk.Tk()
root.title("LangChain 質問アシスタント(再評価付き)")
load_button = tk.Button(root, text="PDF/Excelを読み込み", command=load_document)
input_box = tk.Text(root, width=80, height=5)
ask_button = tk.Button(root, text="質問する", command=ask_question)
output_box = scrolledtext.ScrolledText(root, width=100, height=20)
第5章: 実行方法・準備手順
5-1. 必要なパッケージ(pip install)
本アプリを動かすには、以下のPythonパッケージをインストールする必要があります。
pip install openai langchain langchain-community chromadb pymupdf
※Tkinterは標準ライブラリなので、別途インストールは不要です。
5-2. 実行の流れ
プログラムは別の記事で紹介します。
- 必要なパッケージをインストール後、プログラムを実行しアプリを起動します。
- アプリが起動したら「PDF/Excelを読み込み」ボタンでファイルを選択
- 質問を入力して「質問する」をクリック
- ChatGPTが自動で回答を生成し、画面に表示されます
第6章: 応用アイデアと今後の展望
6-1. これを応用して何が出来るか?
以下のような用途が考えられますね
- 自社資料に答えてくれるFAQアプリが簡単に作れる
- マニュアルや仕様書に関する問い合わせの自動応答システムを手軽に構築可能
- LLMによる「自己チェック機能」で回答の精度が高く、安心して利用できる
6-2. 今後の応用・改良案
- 回答内容をログとして自動保存する機能
- 複数ファイルをまとめて読み込む機能
- StreamlitやGradioを利用してWebアプリとして公開することも可能
第7章: まとめ
LangChainとChatGPTを組み合わせることで、私のような初心者でも実用的なAIツールが簡単に作れるようになりました。文書の読み込みから質問応答までの一連の流れをたった1本のPythonスクリプトで実現でき、手軽に導入できる時代になっています。
まだ課題は多いと思いますが、今後の技術の発展で、より高性能なツールができることが期待されます。
プログラムをすべて見たい方は、こちらへ

コメント