ElcamyTECH
Articles
OpenAI

LlamaIndexを使ってWebページの内容に問い合わせる

TechOpenAIChatGPTLlamaIndexLlamaindex生成AI2023/05/12

はじめに

LlamaIndexは簡単な実装で、インデックスを作成し、OpenAIのモデルを使って問い合わせることができます。そこで、今回は、Webページの内容をLlamaIndexを使って読み込ませ、ChatGPTを使って問い合わせられるようにしました。 読み込んでいくWebページはLlamaIndexライブラリに関するWebページです。ライブラリに関するWebページは英語で、多くの項目に分かれているので、見づらいことがあったり、理解しずらいので、こちらを使って試していきます。 また、Webページの内容をLlamaIndexで読み込む内容は存在するのですが、最新のLlamaIndexに対応していないものがほとんどだったので、最新バージョンに対応させたものを作成していきます。

実際にやってみる

今回の流れは以下のようになります。

  1. WebページのURLを用意する
  2. LlamaIndexを使ってWebページの内容を読み込み、インデックスを作成する
  3. LlamaIndexを使って、インデックスに問い合わせる

WebページのURLを用意する

Webページを用意する流れを紹介します。

  1. Webページに存在するURLを全て取得する

  2. 取得したURLをアクセスできる形に変える

  3. URLを取得出来たら、ファイルとして保存する

    ①Webページに存在するURLを全て取得する 今回LlamaIndexに読み込ませるWebページはLlamaIndexのドキュメントページです。

    https://gpt-index.readthedocs.io/en/latest/index.html

    image

    実際に見てみると、多くの項目に分かれていて、それぞれのURLを取ってくるのは大変です。そこで、以下のサイトを使いました。

    https://nextvitz.com/jp/extract-link-1.php このサイトにLlamaIndexのURLを入力すると、そのWebページに存在するすべてのURLを取ってくることができます! 実際にやってみると下の画像のようになります。

    image

    ②取得したURLをアクセスできる形に変える 画像を見てみると、取得したURLは相対パスになってしまっいるので、Excelを使って、アクセス可能なURLに直していきます。まずはコピー&ペーストします。

    image 次にURLの部分をドメイン + 相対パスのようにしていきます。

    = "[https://gpt-index.readthedocs.io/en/latest/](https://gpt-index.readthedocs.io/en/latest/)" & B1

    上記の数式を入力して、簡単に作ることができます。

    image

    image これで完成です。もとからアクセスできる形でURLが載っている場合もあるので、その部分は注意が必要です! 今回はURLの部分だけを取ってきて、textファイル(llamaindex_url.txt)として保存しました。

LlamaIndexを使ってWebページの内容を読み込み、インデックスを作成する

インデックスを作成するコードは以下のようになります。

import csv
import os
from llama_index import SimpleWebPageReader, LLMPredictor, GPTVectorStoreIndex, ServiceContext
from langchain.chat_models import ChatOpenAI
 
os.environ["OPENAI_API_KEY"]="OPENAI_API_KEY"
urls = []
with open('llamaindex_url.txt') as f:
    reader = csv.reader(f)
    for row in reader:
        urls.append(row[0])
 
documents = SimpleWebPageReader(html_to_text=True).load_data(urls)
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo"))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)
 
index.set_index_id("vector_index")
index.storage_context.persist('storage')

LlamaIndexを使って、インデックスに問い合わせる

インデックスに問い合わせ、回答を生成するコードは以下のようになります。

import sys
import os
from llama_index import LLMPredictor, load_index_from_storage, StorageContext, PromptHelper, ServiceContext
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate
 
os.environ["OPENAI_API_KEY"]="OPENAI_API_KEY"
 
 
template = """ 
与えられた質問に対して日本語で回答してください。
また、以下のフォーマットで答えてください。

質問: {question} 解答:

"""
prompt = PromptTemplate(
    input_variables=["question"],
    template = template,
)

max_input_size = 4096
num_output = 2048
max_chunk_overlap = 20
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", max_tokens=2048))
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, prompt_helper=prompt_helper)


storage_context = StorageContext.from_defaults(persist_dir='storage')
index = load_index_from_storage(storage_context, index_id="vector_index")
query_engine = index.as_query_engine(service_context=service_context)

args = sys.argv
question = args[1]
output = query_engine.query(prompt.format(question=question))
print(output)

実際に回答を生成する

うまく解答を生成できた例

メモ

例1) SimpleWebPageReaderのパラメータ

$ python query.py "SimpleWebPageReaderのパラメータを教えてください"
質問: SimpleWebPageReaderのパラメータを教えてください
解答: html_to_text=Trueというパラメータがあります。これは、WebページのHTMLをテキス 
トに変換するためにhtml2textがインストールされている必要があることを意味します。

実際にLlamaIndexのWebページで確認してみると

image あっていました!

メモ

例2) SimpleWebPageReaderと同じような役割をするBeautifulSoupWebReaderについて

$ python query.py "BeautifulSoupWebReaderでは何ができますか?"
質問: BeautifulSoupWebReaderでは何ができますか?
解答: コンテンツを含むWebページを読み込み、BeautifulSoupを使用してHTMLからテキストを抽出することができます。

実際にLlamaIndexのWebページで確認してみると

image 大体同じようなことが書いていました。

メモ

例3) Indexの作り方

$ python query.py "LlamaIndexを使って、ドキュメントを読み込み、GPTVectorStoreIndex 
を作成するコードを教えてください"
質問: LlamaIndexを使って、ドキュメントを読み込み、GPTVectorStoreIndexを作成するコー
ドを教えてください
解答:

from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader import logging import sys

logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

documents = SimpleDirectoryReader('data').load_data() index = GPTVectorStoreIndex.from_documents(documents)


ただし、ログを表示するためのコードが追加されました。

下記の内容を見ると、正しく生成できています。

image

image

うまく生成できなかった例

注意

例3の内容を簡潔に聞いてみた

$ python query.py "GPTVectorStoreIndexを作成するコードを教えてください"
質問: GPTVectorStoreIndexを作成するコードを教えてください
解答:
与えられた文脈情報からは、GPTVectorStoreIndexを作成するコードについての情報は得られ
ませんでした。文脈情報をもう少し詳しく提供していただければ、回答できるかもしれませ 
ん。

うまく生成できませんでした。 問い合わせる際は、詳しくプロンプトを書かなければならないようです。

注意

BeautifulSoupWebReaderのパラメータ

$ python query.py "BeautifulSoupWebReaderのパラメータを教えてください"
質問: BeautifulSoupWebReaderのパラメータを教えてください
解答: コンテキスト情報には、BeautifulSoupWebReaderの使用例が含まれておらず、パラメ 
ータに関する情報も提供されていません。したがって、この質問には回答できません。
$ python query.py "LlamaIndexのData connectorsであるBeautifulSoupWebReaderのパラメータを教えてください"
質問: LlamaIndexのData connectorsであるBeautifulSoupWebReaderのパラメータを教えてください
解答:
BeautifulSoupWebReaderは記載されておらず、代わりにSimpleDirectoryReader、NotionPageReader、GoogleDocsReader、SlackReader、DiscordReader、ApifyActorなどのデータコネク 
タが記載されています。BeautifulSoupWebReaderに関する情報は提供されていません。

なぜか生成できませんでした。プロンプトを詳しく書き換えてもうまく生成できませんでした。

注意

ChatGPTを使って聞いてみた

image

image 最新情報に対応していなかったり、コード自体が間違っていました。

from llama_index import SimpleDocument
from llama_index.readers import SimpleWebPageReader

llama_index にSimpleDocumentは存在していませんでした。また、SimpleWebPageReaderはllama_index.readersには存在しません。

まとめ

うまく生成できない場合がありますが、詳しくプロンプトを記載することで、欲しい解答を得られる確率が高いです。 また、ChatGPTを使って聞いても、最新情報に対応していないため、答えられない場合や、噓の解答をしてしまいます。ですので、最新の情報については、Webページを読み込んで、回答を生成することも1つの手段だと思います! より、正確な回答を得るために、LangChainを使ってGoogle検索をツールとして持たせてみるとより良くなるかもしれません! 今回のコードはLlamaIndexの最新バージョンに対応しているので是非参考にしてください!

参考

https://gpt-index.readthedocs.io/en/latest/index.html

https://dev.classmethod.jp/articles/llama-index-developersio-articles/

https://dev.classmethod.jp/articles/llamaindex-create-index-cdk-article-over-200/

https://qiita.com/DeepTama/items/ffb7425cefe97bb5408a

関連記事

Elcamyについて

AI・データエンジニアリング・クラウドを中心に、技術で事業課題を解決しています。 お気軽にご相談ください。