メインコンテンツへスキップ
見出し画像

LlamaIndex v0.7 クイックスタートガイド

    「LlamaIndex v0.7」をはじめる方法をまとめました。

    ・LlamaIndex v0.7

    【最新版の情報は以下で紹介】

    1. LlamaIndex

    「LlamaIndex」は、専門知識を必要とする質問応答チャットボットを簡単に作成できるライブラリです。

    2. ドキュメントの準備

    今回は、マンガペディアの「ぼっち・ざ・ろっく!」のあらすじのドキュメントを使います。

    ・bocchi.txt

    画像

    3. Colabでの実行

    Google Colabでの実行手順は、次のとおりです。

    (1) パッケージのインストール。

    # パッケージのインストール
    !pip install llama-index==0.7

    (2) 環境変数の準備。
    以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)

    import os
    os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"

    (3) ログレベルの設定。

    import logging
    import sys
    
    # ログレベルの設定
    logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)

    ・DEBUG : デバッグ情報の出力
    ・INFO : 想定通りのことが発生
    ・WARNING : 想定外のことが発生
    ・ERROR : 実行の続行不能なことが発生

    (4) Colabにdataフォルダを作成してドキュメントを配置。
    左端のフォルダアイコンでファイル一覧を表示し、右クリック「新しいフォルダ」でdataフォルダを作成し、ドキュメントをドラッグ&ドロップします。

    画像

    (5) ドキュメントの読み込み。

    from llama_index import SimpleDirectoryReader
    
    # ドキュメントの読み込み
    documents = SimpleDirectoryReader("data").load_data()

    (6) インデックスの作成。
    「インデックス」は、ドキュメントの情報を保持するモジュールです。ドキュメントをチャンクに分割し、チャンク毎に埋め込みに変換して保持ます。チャンクは類似検索の対象となるデータ単位になります。

    from llama_index import VectorStoreIndex
    
    # インデックスの作成
    index = VectorStoreIndex.from_documents(documents)
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: 結束バンド 後藤ひとりは友達を作れない陰キャでいつも一人で過ごしていたが、中学時代にテレビのイ...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  文化祭ライブ 夏休みに入り、後藤ひとりは知り合いも増えていたが、自分から遊びに誘うことができ...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  デモ審査 未確認ライオットに参加するためには、デモ審査、ウェブ投票、ライブ審査を通過して、最...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  後藤ひとり(ごとうひとり)...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: 秀華高校に通う女子。桃色の髪を無造作に伸ばし、いつもジャージを身につけている。自他共に認める引...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: ばし放題で前髪で目をつねに隠している。それに加えて野暮ったいジャージ姿でいるため気づかれていな...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: 下北沢高校に通う女子。後藤ひとりより1学年上。ライトイエロー色の髪をサイドテールにセットし、派...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  山田リョウ(やまだりょう) 下北沢高校に通う女子。後藤ひとりより1学年上。中性的な雰囲気を漂...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  喜多郁代(きたいくよ) 秀華高校に通う女子。後藤ひとりとは同学年。ウェーブの入った赤い髪をセ...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  廣井きくり(ひろいきくり) 実力派サイケデリックロックバンド「SICKHACK(シックハック...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  後藤ふたり(ごとうふたり) 後藤ひとりの妹。年齢は5歳。姉とは正反対の天真爛漫(らんまん)で...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  内田幽々(うちだゆゆ) メタルバンド「SIDEROS(シデロス)」に所属する少女。ベースを担...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: 佐々木次子(ささきつぐこ) 秀華高校に通う3年生の女子。進級した後藤ひとりとクラスメートとなる...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  佐藤愛子(さとうあいこ) フリーライターとして活動する女性。ペンネームは「ぽいずん♥やみ」。...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  ひとりの父(ひとりのちち) 後藤ひとりの父親。本名は不明で、素顔もなぜか毎回明かされていない...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  吉田銀次郎(よしだぎんじろう) ライブハウス「FOLT」の店長を務める男性。年齢は37歳。見...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk: 下北沢のライブハウス「STARRY(スターリー)」の店長を務める女性。誕生日を迎えて30歳にな...
    DEBUG:llama_index.node_parser.node_utils:> Adding chunk:  ギターヒーロー 後藤ひとりが動画配信の際に用いるハンドルネーム。ひとりは「ギターヒーロー」の...

    (7) クエリエンジンの作成。
    「クエリエンジン」は、ユーザー入力(クエリ)と関連する情報をインデックスから取得し、それをもとに応答を生成するモジュールです。

    # クエリエンジンの作成
    query_engine = index.as_query_engine()

    (8) 質問応答。

    # 質問応答
    print(query_engine.query("ぼっちちゃんの得意な楽器は?"))
    後藤ひとりの得意な楽器はギターです。

    4. インデックスの保存

    作成したインデックスは保存しておくと、次回に再作成する必要がなくなります。

    (1) インデックスの保存。

    # インデックスの保存
    index.storage_context.persist()

    (2) インデックスの読み込み。

    from llama_index import StorageContext, load_index_from_storage
    
    # インデックスの読み込み
    storage_context = StorageContext.from_defaults(persist_dir="./storage")
    index = load_index_from_storage(storage_context)

    5. LlamaHub

    「LlamaIndex」がドキュメントとして読み込めるのは、テキストだけではありません。「LlamaHub」で提供しているデータコネクタを利用することで、さまざまなファイル (PDF、ePub、Word、PowerPoint、Audioなど) やWebサービス (Twitter、Slack、Wikipediaなど) をドキュメントのデータソースとして利用できます。

    今回は、「Fast Zero Shot Object Detection with OpenAI CLIP」のYoutube動画についてLlamaIndexで質問応答してみます。

    (1) 「LlamaHub」で目的のデータコネクタを探す。
    今回は、「youtube_transcript」をクリックします。

    (2) llama_hubパッケージのインストール。

    !pip install llama_hub

    (3) サンプルコードを元に、ドキュメントを読み込む。

    from llama_index import download_loader
    
    YoutubeTranscriptReader = download_loader("YoutubeTranscriptReader")
    
    loader = YoutubeTranscriptReader()
    documents = loader.load_data(ytlinks=['https://www.youtube.com/watch?v=i3OYlaoj-BM'])

    (4) インデックスとクエリエンジンの作成。 

    from llama_index import VectorStoreIndex
    
    # インデックスの作成
    index = VectorStoreIndex.from_documents(documents)
    
    # クエリエンジンの作成
    query_engine = index.as_query_engine()

    (5) 質問応答。
    日本語で答えてくれない時は、「日本語で答えて」をつけると良いです。

    # 質問応答
    print(query_engine.query("この動画で伝えたいことはなんですか?日本語で答えて"))
    この動画では、オープンAIのCLIPを使用して、画像分類、オブジェクトローカリゼーション、オブジェクト検出をゼロショットで行う方法を紹介しています。また、これらのタスクを切り替えるためにモデルを微調整する必要がないことも示しています。さらに、スコアを計算し、画像全体の平均を取り、それを現在のスコアから引くことで、低いスコアをゼロにクリップする方法も紹介しています。これにより、より良いローカリゼーシ

    6. しくみとカスタマイズ

    「LlamaIndex v0.7」はチュートリアルレベルの使い方はv0.6と同じですが、内部のしくみとカスタマイズ方法は変更がありました。
    詳しくは、次の記事を参照。



     
     

    npaka

     
     
    プログラマー。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガジェット。年2冊ペースで技術書を執筆。アニソン / カラオケ / ギター / 猫 twitter : @npaka123

    あなたへのおすすめ