kyonenya / next-langchain-pdf

PDFを読み込んだChatGPTが質問に答えてくれるアプリ
https://pdf-question.vercel.app
0 stars 0 forks source link

chore: READMEの追加 #5

Closed kyonenya closed 1 year ago

kyonenya commented 1 year ago

PDF Question AI

PDFを読み込んだAIが質問に答えてくれるアプリ

処理フロー

  1. PDFファイルと質問文がフォームからフロント側から Submit されたらサーバー側で 2〜4 の処理を開始
    • Next.js 13.4 の Server Actions を用いてサーバー側の関数をフロント側から直接実行
  2. PDFをパースして3000文字 (欧文)/1000文字 (和文) ごとのドキュメントに分割
    • 和文か欧文かを判定して自動で分割する文字数を出し分け
    • chatgpt-3.5-turbo モデルの最大トークン数である 4096 トークンを超えないようにするため
  3. 入力された質問文に関連していそうなドキュメントをPDFの中から抽出
    • Langchain.js の Embedding[^embedding] を用いてドキュメントをベクトル化し、質問文とのコサイン類似度が高い上位5件を抽出
    • 内部的には OpenAI の text-embedding-ada-002(Embedding に特化したモデル)が呼ばれている
  4. 入力された質問文と関連するドキュメント5件をプロンプトテンプレートに流し込み、プロンプトを作成
    • 「以下に与えられた質問と長文の抜粋部分から最終的な答えを作りなさい。答えが分からない場合は分からないと答えなさい、答えを作ろうとしないように」
  5. サーバー側で生成されたプロンプトをフロント側で受け取り、Next.js の API Route による API エンドポイントに作成したプロンプトを POST
    • ここで chatgpt-3.5-turbo モデルにプロンプトを投げる
  6. 本家 ChatGPT 同様、レスポンスがストリームで(1文字づつリアルタイムで)フロント側に返ってくる
    • Vercel の AI SDK を用いて実装した
    • この API エンドポイントはエッジランタイムに(内部的には Cloudflare に)デプロイされているので、通常のサーバーレス関数と異なり、レスポンス開始から30秒間バックグラウンドで非同期処理を返しつづけることができる

[^embedding]: Embedding (埋め込み):文章を数値化して計算可能な対象にすること。ここではPDFドキュメントは 1536 次元のベクトル表現に変換され、質問文のベクトルと同じ方向を向いている度合いが高い=コサインが 1 に近いほど類似度が高いことになる

使い方

Animation_quasi-observation

PDFには 拙論 を使用

kyonenya commented 1 year ago

2. next-langchain-pdf

PDFを読み込んだChatGPTが質問に答えてくれるアプリ

kyonenya commented 1 year ago

Animation_quasi-observation

kyonenya commented 1 year ago

done.