はじめに
ARISE analyticsの奥井です。普段は通信セキュリティに関する研究開発を行っています。
今回の記事は、Large Language Models(以降LLM)を用いて論文PDFに対するQ&Aについて試してみたことを紹介します。
未経験分野に挑戦する際は、不明点が多く何を行うにも困難が伴うと思います。特に、技術開発や研究では論文を読むことが多く、知らない単語や概念に躓いてしまい理解に時間がかかってしまうことは多いです。特に、通信セキュリティなど必要なドメイン知識が深い場合は、キャッチアップコストがかなり高いと感じています。ドメイン知識が深い内容についてキャッチアップや業務を効率化するできないかということをモチベーションに、今回はLLMを使って論文に対するQ&Aを行ってみました。
通信セキュリティ領域で用いられる「YAF」と呼ばれるツールについての解説論文を題材とし、論文のPDFをインプットにQ&Aを行うことで理解が深められるかを検証します。
まずは論文PDFに対するQ&Aを行う際のフローとその実装について簡単に解説し、実際にQ&Aを試してみた結果について解説します。今回は以下の3つの項目のQ&Aを行いました。
- Q&A No.1 : 論文の要約
- Q&A No.2 : 表形式の出力
- Q&A No.3 : 図についての解説
それぞれのQ&Aについて、LLMに入力するPromptの実装・出力例・評価考察をまとめます。評価考察については、LLMによる回答が適切かどうかを私自身が定性評価するという形で行いたいと思います。
フロー
Retrieval Augmented Generation (RAG) と呼ばれる手法を用いてQ&Aを実現します。RAGについての詳細な解説はRAG (Retrieval Augmented Generation) を活用!LLMで外部データを参照する方法を解説 | 株式会社ARISE analytics(アライズ アナリティクス)をご参照ください。
論文PDFに対するQ&Aは以下のようなフローで実現します。
- Document Loading:
- ∟論文PDFのデータをロードする。
- Splitting:
- ∟ドキュメントを指定サイズのスプリットに分割する。
- Storage:
- ∟分割されたドキュメントをVectorStoreに格納する。
- Retrieval:
- ∟ストレージからスプリットを取得する(例えば、多くの場合、入力された質問と同様の埋め込みを持つ)。
- Output:
- ∟LLMが質問と検索されたデータを含むプロンプトを使用して答えを生成する。
- Answer:
- ∟LLMが生成した回答が得られる。
参考:Question Answering | 🦜️🔗 Langchain
実装パート
PDFを読み込み、RAGを用いてPDFの内容についてQ&Aを行うまでの実装コードを簡単に紹介します。
まずは、LangChainのPyPDFLoaderを用いて、PDFドキュメントを読み込みます。
## PDFデータのロード
### ライブラリの読み込み
import os
import openai
from langchain.llms import OpenAI
from langchain.document_loaders import PyPDFLoader
### API keysのセット
openai.api_key = os.getenv("OPENAI_API_KEY") # OpenAIのAPIキーを入れる
### pdfファイルのロード
loader = PyPDFLoader("yaf.pdf")
pages = loader.load_and_split() #PDFからテキストを抽出、抽出したテキストをページごとに分割
次に、文章の分散表現を作成するEmbeddingモデルを作成します。
## Embedding
### ライブラリの読み込み
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
### Embedding & Indexing
faiss_index = FAISS.from_documents(
pages,
OpenAIEmbeddings()# 文章の分散表現を作成するEmbeddingモデル
)
faiss_index.save_local("../database/faiss_index")
最後に、Q&Aを実施します。FAISSのベクターを読み込み、質問の意図に近い文章を上位から3件抽出し、抽出した複数文章を1つにまとめます。
## Q&A
### ライブラリの読み込み
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
### FAISS vectorのロード
vectoreStore = FAISS.load_local("../database/faiss_index/", OpenAIEmbeddings())
## Retriever
retriever = vectoreStore.as_retriever(search_type="similarity", search_kwargs={"k":3})
### プロンプト(Q&A)
qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(), chain_type="stuff", retriever=retriever, return_source_documents=False)
query ="""
hogehoge
"""
ans = qa({"query": query})
print("Query: \n", query)
print("Ans: \n", ans["result"])
```
以上が、今回利用した実装コードになります。
Q&A
今回は、「YAF:Yet Another Flowmeter」に関する論文pdfを用いてQ&Aを試します。日本語の方が英語より理解が早いため、質問は英語でしつつ日本語で回答してもらうようにしました。以下三点のQ&Aを行い、それぞれのQ&Aの実装コード・出力例・評価考察をまとめます。
- Q&A No.1 : 論文の要約
- Q&A No.2 : 表形式の出力
- Q&A No.3 : 図についての解説
参照した論文はこちら:YAF: Yet Another Flowmeter
Q&A No.1 : 論文の要約
まずは、定番の論文の要約を聞いてみます。
実装コード
query ="""
Summary this paper.
Answer in Japanese within 150 words.
"""
ans = qa({"query": query})
print("Query: \n", query)
print("Ans: \n", ans["result"])
出力例
この論文は、ネットワークフローデータの収集と分析に関するものです。著者は、YAFというソフトウェアツールを紹介し、その特徴や利点について説明しています。YAFは、IPFIXフロープロトコルを使用してフローデータを収集し、セキュリティやネットワーク分析などの目的に使用するためのものです。YAFは、高いパフォーマンスと安定性を持ちながら、大規模なネットワークのモニタリングを可能にするために開発されました。また、YAFは他のフローメータリングプロセスと比較して、パケット転送の性能に影響を与えることなく高いデータ信頼性を提供します。さらに、YAFは柔軟なネットフローとの統合も可能であり、さまざまなアプリケーションに適用することができます。この論文では、YAFの利用事例として、セキュリティスイートやプライバシー保護ネットワークモニタリングアーキテクチャなどが紹介されています。
評価考察
参考に、論文のアブストラクトを確認します。
A flow meter generates flow data – which contains information about each connection observed on a network – from a stream of observed packets. Flow meters can be implemented in standalone measurement devices or inline on packet forwarding devices, such as routers. YAF (Yet Another Flowmeter) was created as a reference implementation of an IPFIX Metering and Exporting Process, and to provide a platform for experimentation and rapid deployment of new flow meter capabilities. Significant engineering effort has also gone into ensuring that YAF is a high performance, flexible, stable, and capable flow collector. This paper describes the some of the issues we encountered in designing and implementing YAF, along with some background on some of the technologies that we chose for implementation. In addition we will describe some of our experiences in deploying and operating YAF in large-scale networks.
論文のアブストラクトの内容と比較すると、アブストラクトを参照して回答しているだけではなく本文の内容も含めて要約しているようです。例えば、回答の「この論文では、YAFの利用事例として、セキュリティスイートやプライバシー保護ネットワークモニタリングアーキテクチャなどが紹介されています。」については、Introductionの「We then describe a few existing applications of YAF in section 5, including its application with SiLK [12] within the NetSA Security Suite and its use in the middle tier of PRISM [11], a multi-stage privacy-preserving network monitoring architecture.」部分を引用しているように思えます。全体としても、私が論文を読んだ限りは回答としては間違っていないように思えます。ただし、プロンプトで「Answer in Japanese within 150 words.
」と文字制限を要求したつもりが、388文字で出力され制限はできていませんでした。
Q&A No.2 : 表形式の出力
業務において、論文を読んだ上でいくつかの手法について観点を表で整理するという場面があります。これをLLMで整理できるか試してみます。今回は論文中で関連するフローデータの形式がいくつか解説されていたので、それらの内容について概要を表形式まとめることを試みました。今回はMarkdown形式で出力するように指定します。
実装コード
query ="""
Explain various protocols in use for exporting flows.
Explain Netflow v5, Netflow v9, and IPFIX in markdown table format (e.g., method | item of explanation | references ) in japanese.
"""
ans = qa({"query": query})
print("Query: \n", query)
print("Ans: \n", ans["result"])
出力例 (出力をプレーンテキストとして張り付けています)
| プロトコル | 説明 | 参考文献 | | ———- | ———————————————————————————————————————————————————————————————————————————- | ——– | | NetFlow v5 | プロトコルおよびネットワークフローデータの保存形式。IPv4フローと16ビットの自律システム番号をサポート。 | [4] | | NetFlow v9 | NetFlow v5の後継プロトコル。IPv6および新しいレコードタイプの柔軟な定義をサポート。 | [7] | | IPFIX | テンプレートベースのバイナリエクスポート形式。メッセージにはヘッダーとセットが含まれ、セットはテンプレートまたはデータレコードを含む。テンプレートは情報要素の順序付きリストであり、情報要素はデータタイプごとにエンコードされる。 | [14] |
pythonのprint出力のため、プレーンテキストとして扱われますが、markdownファイルとして再保存した上で表示すると、正しい表として出力されます。csv形式の場合も試しましたが、同様に表形式に出力ができていました。
プロトコル | 説明 | 参考文献 |
NetFlow v5 | プロトコルおよびネットワークフローデータの保存形式。IPv4フローと16ビットの自律システム番号をサポート。 | [4] |
NetFlow v9 | NetFlow v5の後継プロトコル。IPv6および新しいレコードタイプの柔軟な定義をサポート。 | [7] |
IPFIX | テンプレートベースのバイナリエクスポート形式。メッセージにはヘッダーとセットが含まれ、セットはテンプレートまたはデータレコードを含む。テンプレートは情報要素の順序付きリストであり、情報要素はデータタイプごとにエンコードされる。 | [14] |
評価考察
まず、参考文献について引用が正しいかを確認しました。どのプロトコルについても、論文中で引用されている番号を正しく抽出できていました。説明については、回答に書かれている内容は論文中(2章)でも記載されていることであり間違いではありませんでした。
一方で、IPFIXの説明に対しては違和感を覚えました。論文中ではIPFIXについては2.3章で解説されています。2.3章は4段落で構成されており、1段落目で概要、2段落目以降で詳細を解説しています。IPFIXについての説明の回答の「テンプレートは情報要素の順序付きリストであり、情報要素はデータタイプごとにエンコードされる。」の部分は、2段落目で回答されている詳細な部分の内容であり、概要の説明としては過剰であると感じました。
Q&A No.3 : 図についての解説
文献紹介などの際には、論文中の図を説明できるようになっておけると良いとよく聞きます。LLMを用いてそれが実施できるか確認してみます。今回は論文中のFigure1について解説してもらいます。Figure1はYAFのワークフローを示した図になります。
実装コード
query ="""
Explain important components in Figure1: Basic Data Flow in YAF.
Answer in japanese.
"""
ans = qa({"query": query})
print("Query: \n", query)
print("Ans: \n", ans["result"])
出力例
図1の基本データフローでは、YAFの重要なコンポーネントが示されています。
1. de-encapsulation(デカプセレーション):YAFは、様々なソースからパケットデータを受け取ります。これには、libpcapダンプファイル、ライブキャプチャ(libpcapを介した一般的なインターフェースや特殊なデバイス)、Endace DAGカードなどが含まれます。YAFは、これらのソースからレイヤー2以上の情報を取得し、IPヘッダーにたどり着くまでエンカプセレーションを再帰的に解除します。
2. Decoding(デコード):デエンカプセレーションされたパケットは、レイヤー3および4のデコードレイヤーに渡され、パケットデータからフローキーとカウンターを抽出します。YAFでは、フローキーは伝統的な「5タプル」(ソースと宛先のアドレス、ソースと宛先のポート、プロトコル)にIPバージョン番号(4または6)を加えたもので構成されます。
3. The Flow Table(フローテーブル):YAFのフローテーブルは、ハッシュテーブルでインデックス付けされたピッカブルキューとして実装されています。このデータ構造は、ハッシュテーブルを介したフローテーブル内の任意のエントリへのランダムアクセスを可能にします。フローテーブルの先頭にある最も最近見られたエントリにも定数アクセスが可能です。これにより、アイドルなフローのタイムアウトを効率的に実装することができます。
4. encode and export(エンコードとエクスポート):フローレコードは、フローテーブル内のフローが完了したと判断されたときにエンコードされ、エクスポートされます。エンコードされたフローレコードは、IPFIXプロトコルを使用してエクスポートされ、コレクタまたはIPFIXファイルに送信されます。
これらのコンポーネントは、YAFの基本的なデータフローを実現するために重要な役割を果たしています。
評価考察
Figure1は、論文の3章の前半で解説されています。1-3までの回答は、3.1章 Recursive De-encapsulation、3.2章 Decoding、3.3章 The Flow Tableの内容を元に回答しているようです。それぞれの章の最初の段落を引用して回答しているようでした。内容的にも誤りはなさそうです。4の回答については、Introductionの部分「exports IPFIX flows to a collector or to an IPFIX file [25].」を引用しているように見えます。全体を通してみると、図の解説については大まかには合っているが、完全に正しく回答しているわけでは無いのかと思います。文献紹介で図の解説をする場合は、人の手による確認・修正が必要そうです。(とはいえ、概要を簡単にまとめる分には利用できるレベルだという所感です)
今回のQ&Aとしては以上になります。
まとめ
実際に触ってみて、第一の感想としては大変便利だと感じました。pdfを用意してクエリを投げるだけで、ある程度の情報を得ることができますし、アウトプットする際にも表形式など簡単に欲しいフォーマットにまとめることができます。予備知識が少ない初学者にとってはありがたいツールになりそうです。
一方で、LLMによる回答が適切ではない場合もあるということを認識する必要があります。LLMの回答は正しくない場合もあるということを念頭に置いたうえで、論文を読んだ後にLLMで出力した要約を読んで内容が合っているかどうかチェックする(あるいはその逆)など対応すべきだと感じます。とはいえ、簡単に情報を整理抽出できるので、課題は一定あるものの使い方を工夫していけば理解や業務の効率化につながるのではないでしょうか。
今回は深堀しませんでしたが、プロンプトの書き方も難しさはあると感じました。巷でも言われていることですが、実行の度に出力が変わったり、文字制限が守られていなかったり(論文の要約は、「150文字で答えて」と要求したつもりが、実は、388文字だった)など意図と異なる部分も多くありました。工夫する余地はありそうです。
おわりに
今回は、LLMを用いた論文pdfのQ&Aについて紹介しました。個人には、実際に使ってみて便利ではあるもののまだまだ改善余地はあると感じました。今後とも様々な観点で検証を進めていきたいと思います。
今回紹介した内容や、その他弊社の取り組みに興味がございましたら、ぜひお声がけください。