PDFを読み込んだ ChatGPT が質問に答えてくれるアプリ
PDF文書の中から質問に関連しそうな箇所を類似度検索をかけて抽出。質問文と合わせてプロンプトとして送信し、応答をリアルタイムで表示する。
- PDFファイルと質問文がフォームからフロント側から Submit されたらサーバーサイドで 2〜4 の処理を開始
- Next.js 13.4 の Server Actions を用いてサーバー側の関数をフロント側から直接実行
- PDFをパースして3000文字 (欧文)/1000文字 (和文) ごとのドキュメントに分割
- 和文か欧文かを判定して自動で分割する文字数を出し分け。和文はトークン数が多くなってしまうので
- 入力された質問文に関連していそうなドキュメントをPDFの中から抽出
- Langchain.js の Embedding1 を用いてドキュメントをベクトル化し、質問文とのコサイン類似度が高い上位5件を抽出
- 内部的には OpenAI の
text-embedding-ada-002
(Embedding に特化したモデル)が呼ばれている
- 入力された質問文と関連するドキュメント5件をプロンプトテンプレートに流し込み、プロンプトを作成
- 「以下に与えられた質問と長文の抜粋部分から最終的な答えを作りなさい。英語での質問には英語で、日本語には日本語で答えなさい」
- サーバー側で生成されたプロンプトをフロント側で受け取り、Next.js の API Route による API エンドポイントにプロンプトを POST
- ここで
chatgpt-3.5-turbo-16k
モデルにプロンプトを投げる
- ここで
- 本家 ChatGPT 同様、レスポンスがストリームで(1文字づつリアルタイムで)フロント側に返ってくる
- Vercel の AI SDK を用いて実装した
- この API エンドポイントはエッジランタイムに(内部的には Cloudflare に)デプロイされているので、通常のサーバーレス関数と異なり、レスポンス開始から30秒間バックグラウンドで非同期処理を返しつづけることができる
PDFには拙論 サルトル想像論における「準観察」のテーゼ――想像と知覚の差異について を使用。
Footnotes
-
Embedding (埋め込み):文章を数値化して計算可能な対象にすること。ここではPDFドキュメントは 1536 次元のベクトル表現に変換され、質問文のベクトルと同じ方向を向いている度合いが高い=コサインが 1 に近いほど類似度が高いことになる。 ↩