Toilを無くして徒然なるままに日暮し硯に向かひたい

生成AIアプリケーション開発などを行うエンジニアのブログです。

生成AI RAGアプリ開発ハンズオン

shu-kob.hateblo.jp

↑前回の復習をしていきます。前回参加していない方も大丈夫です。

PDFをディレクトリに配置して、取り込む作業が面倒なので、画面からPDFをアップロードできるようにしましょう。

  • chainlit_upload_pdf.py
import os
import chainlit as cl
from langchain_community.chat_models import ChatOpenAI
from langchain_community.document_loaders import PyMuPDFLoader
from langchain_community.embeddings import OpenAIEmbeddings
from langchain.prompts import PromptTemplate
from langchain.schema import HumanMessage
from langchain.text_splitter import SpacyTextSplitter
from langchain_community.vectorstores import Chroma


embeddings = OpenAIEmbeddings(
  model="text-embedding-ada-002"
)

chat = ChatOpenAI(model="gpt-3.5-turbo")

prompt = PromptTemplate(template="""文章を元に質問に答えてください。

文章:
{document}

質問: {query}
""", input_variables=["document", "query"])

text_splitter = SpacyTextSplitter(chunk_size=300, pipeline="ja_core_news_sm")

@cl.on_chat_start
async def on_chat_start():
  files = None

  while files is None:
    files = await cl.AskFileMessage(
      max_size_mb=20,
      content="PDFを選択してください",
      accept=["application/pdf"],
      raise_on_timeout=False,
    ).send()
  file = files[0]

  if not os.path.exists("tmp"):
    os.mkdir("tmp")
  
  documents = PyMuPDFLoader(file.path).load()
  splitted_documents = text_splitter.split_documents(documents)

  database = Chroma(
    embedding_function=embeddings,
    # 今回はpersist_directoryを指定しないことでデータベースの永続化を行わない
  )

  database.add_documents(splitted_documents)

  cl.user_session.set(
    "database",
    database
  )

  await cl.Message(content=f"`{file.name}`の読み込みが完了しました。質問を入力してください。").send()

@cl.on_message
async def on_message(input_message):
  print("入力されたメッセージ: " + input_message.content)

  database = cl.user_session.get("database")

  documents = database.similarity_search(input_message.content)

  documents_string = ""

  for document in documents:
    documents_string += f"""
  -------------------------
  {document.page_content}
  """

  result = chat([
    HumanMessage(content=prompt.format(document=documents_string, 
    query=input_message.content))
  ])
  await cl.Message(content=result.content).send()
  • 前回の記事に書いた「prepare_db.py」を実行してDBを作っておく必要があります。

  • Chainlitアプリを実行し、PDFをアップロードし、PDFの内容について質問可能

chainlit run chainlit_upload_pdf.py -w

使ってみたいPDFをアップロードしてみましょう

なお、パスワード保護されているファイルは使えないはず

IPAが多数のPDFファイルを公開しているので、これらも使ってみましょう。

PDFに書かれていることがインプットされているかを確認するために、PDFの中身に関する質問をしてみましょう。

なぜ下流工程で問題が顕在化しやすいのでしょうか?
下流工程で問題が顕在化しやすい理由は、それまでの工程に起因する品質不良が下流工程に入り込みやすいためです。また、下流工程では問題が露呈しやすく、対応のための時間や手段が限定されているため、問題が早期に発見されても迅速に対処することが難しい状況にあるからです。そのため、下流工程での品質管理や問題解決には特に注意が必要とされています

定性的見える化アプローチのチェックシートの使い方を教えてください。
定性的見える化アプローチのチェックシートは、プロジェクトマネージャが自己評価を行うためのツールです。上流、中流、下流のそれぞれに対して35、38、40項目が設定されており、自己評価を行う際にそれぞれの項目に対してスコアをつけることで自己チェックを行います。また、専門家チーム(PMO)によるヒアリングシートもあり、上流、中流、下流それぞれに対して74、78、85項目が設定されています。専門家の客観的なチェックを受けることで、マネジメントの過不足を把握し、対策を検討することができます。自己評価と専門家の診断の差を認識し、専門家からの対策案を受け取ることで、プロジェクトの見える化を促進することができます。

色んな質問をしてみたり、様々なPDFをアップロードしてみましょう。

実際に体験してもらったところで、↓RAGなどの技術について過去資料を用いて解説したいと思います。

speakerdeck.com

参考文献