実現したいこと
chainlitでpdfファイルを読み込み、その書類についてLLMが回答してくれるチャットbotを作りたいと思っています。下記のサイトを参考にしています。
https://www.salesanalytics.co.jp/datascience/datascience173/#PDFapp_pdfpy
コードはサイトそのままでディレクトリ構造は以下の通りです。
chatbot----pycache
|--app_pdf.py
|_doc
|_doc.pdf
発生している問題・分からないこと
chainlitを起動し、ファイルをドロップするところまでは問題ないですが、ファイルの読み込みでエラーが起こってしまいます
エラーメッセージ
error
1AttributeError: 'AskFileResponse' object has no attribute 'content'
該当のソースコード
app_pdf.py
1# 必要なモジュールの読み込み 2import os 3import shutil 4from PyPDF2 import PdfReader 5import chainlit as cl 6from langchain.embeddings.openai import OpenAIEmbeddings 7from langchain.text_splitter import RecursiveCharacterTextSplitter 8from langchain.vectorstores import Chroma 9from langchain.chains import RetrievalQAWithSourcesChain 10from langchain.chat_models import ChatOpenAI 11# 定数設定 12OPENAI_API_KEY = "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" 13TEMP_PDF_PATH = "./doc/doc.pdf" 14CHUNK_SIZE = 500 15CHUNK_OVERLAP = 10 16DB_PATH = './.chroma' 17MODEL_NAME = "gpt-4" 18# OpenAI APIキーの設定 19os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY 20# PDFファイルを開いてテキストを抽出する関数 21async def process_pdf(file): 22 file = file[0] if isinstance(file, list) else file 23 with open(TEMP_PDF_PATH, 'wb') as f: 24 f.write(file.content) 25 reader = PdfReader(TEMP_PDF_PATH) 26 return ''.join(page.extract_text() for page in reader.pages) 27# テキストを分割し、埋め込みを作成してデータベースを作成する関数 28async def create_db(text): 29 text_splitter = RecursiveCharacterTextSplitter(chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP) 30 docs = text_splitter.split_text(text) 31 metadatas = [{"source": f"{i}-pl"} for i in range(len(docs))] 32 embeddings = OpenAIEmbeddings() 33 db = Chroma.from_texts(docs, embeddings, metadatas=metadatas) 34 return db, docs 35# チャットボットの初期化処理 36@cl.on_chat_start 37async def init(): 38 file = None 39 while file is None: 40 file = await cl.AskFileMessage(content="PDFファイルをアップロードしてください!", accept=["pdf"]).send() 41 # データベースの初期化 42 shutil.rmtree(DB_PATH, ignore_errors=True) 43 # ファイルからテキストを抽出し、データベースを作成 44 text = await process_pdf(file) 45 db, docs = await create_db(text) 46 chain = RetrievalQAWithSourcesChain.from_chain_type( 47 ChatOpenAI(model=MODEL_NAME,temperature=0), 48 chain_type="stuff", 49 retriever=db.as_retriever(), 50 ) 51 # テキストをユーザーセッションに保存 52 cl.user_session.set("texts", docs) 53 file_name = file[0].name if isinstance(file, list) else file.name 54 await cl.Message(content=f"`{file_name}` の準備が完了しました!").send() 55 return chain 56# 応答を処理する関数 57@cl.on_message 58def process_response(res): 59 texts = cl.user_session.get("texts") 60 sources = res["sources"].strip().split(',') 61 source_elements = [cl.Text(content=texts[int(s[:s.find('-pl')])], name=s) for s in sources if s] 62 response = f"{res['answer']} 出典: {res['sources']}" 63 cl.Message(content=response, elements=source_elements).send() 64
試したこと・調べたこと
上記の詳細・結果
Googleで調べたのですが、理解できませんでした。どなたか解決方法がわかる方がいたら教えていただきたいです。
補足
特になし
0 コメント