LlamaIndex
LlamaIndexのデフォルトでHTMLParserが使われますよね?
これってHTMLのタグを解析してノードツリーを構成してくれるんじゃなかったでしたっけ?
これがGPTVectorStoreIndexに格納されると思いますので、それをTreeIndexで表示してみて本当にノードのツリー構造が構成されているか確認するのがまずは必要かなと思います。
ノードツリーになっているのなら、ベクトル検索でヒットしたノードの上位ノードと兄弟ノードも含めてリトリーバの出力として採用すれば良いのではないでしょうか。
PDFParserもページやセクションを理解してノードツリーを作ってくれるという記述を見かけましたが、どの程度の精度なのかはやったことがないのでわかりません。
Teamsでもらったメッセージでは <h2> タグに着目するとのことでしたが、これって自前でパーサを書いて切り分けようとしてます?
もしLlamaIndexのデフォルトのHTMLParserがツリー構造でインデックスを作ってくれるなら任せてしまってもよいと思います。
自分でHTMLパーサを書くのは面倒なので。
こんな感じでツリーインデックスって中身を見ることができませんか?
code:TreeIndex
from llama_index import SimpleDirectoryReader, GPTVectorStoreIndex, TreeIndex
# Read HTML files
reader = SimpleDirectoryReader()
documents = reader.load_data("input_directory")
# Create an index
index = GPTVectorStoreIndex.from_documents(documents)
# Create a TreeIndex from the GPTVectorStoreIndex
tree_index = TreeIndex.from_index(index)
# Print the tree structure
tree_index.print_tree()
LlamaIndexではHTMLファイルやPDFファイル以外のファイル形式に対してもパーサを持っているようなのですが、使ったことがありません。
でも使えそうです。登録しておけばSimpleDirectoryReaderが拡張子から自動的に判定して使ってくれませんかね?
code:DEFAULT_FILE_EXTRACTOR
".pdf": PDFParser(),
".docx": DocxParser(),
".pptx": PptxParser(),
".jpg": ImageParser(),
".png": ImageParser(),
".jpeg": ImageParser(),
".mp3": VideoAudioParser(),
".mp4": VideoAudioParser(),
".csv": PandasCSVParser(),
".epub": EpubParser(),
".md": MarkdownParser(),
".mbox": MboxParser(),
}
クエリをリトリーバに入力した結果、つまりそれはLlamaIndexのノードの集合ということになりますが、 response.source_nodes を見ればどのノードを参考にしたかは分かります。多分それをもとにデータ源のURLをリトリーバーの結果に含めているんですよね?
関連論文
Improving the Domain Adaptation of Retrieval Augmented Generation (RAG) Models for Open Domain Question Answering
Evaluating RAG Part I: How to Evaluate Document Retrieval
Multi-Vector Retriever for RAG on tables, text, and images
Llama Index 0.9.17dev1 Beta Multi-modal models Query Your Own Documents with LlamaIndex and LangChain