🦙

OpenAI APIとLlamaIndexを使って、任意のテキストを読み込んで回答するチャットボットを作る

2023/05/04に公開

はじめに

前回、OpenAI APIとLangChainを使って、テキストを読み込んで回答するチャットボットを作りました。
今回はこれと同じようなものをLlamaIndexで実装しようと思います。
https://zenn.dev/aerialstairs/articles/f792caca1e91ee

LlamaIndexとは

LlamaIndexは、外部データを連携させるのに特化したものです。
様々なローダーが用意されており、PDF、Gmail、Twitter、Slackなど様々なプラットフォームからデータを取得し、Chatの応答に使うことができます。
質問したらPDFの内容を参照しながら答えるChatBotが作れるということです。
こちらに使えるライブラリの一覧が書かれていますが、すでに多数の連携が可能になっています。
https://llamahub.ai/

Indexとは、高速に検索できるように事前にIndex化するということです。
Index化の方法は、単純なリストや意味的ベクトルで検索する方法などいくつか用意されています。
https://gpt-index.readthedocs.io/en/latest/guides/primer/index_guide.html

実装

パッケージインストール

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

API Keyを設定

import os
os.environ["OPENAI_API_KEY"] = "Your API Key"

データ連携

チェンソーマンのwikiからデンジの説明部分をテキストにして読み込んでいます。
sourceの中に、denji.txtというファイルが入っています。

from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader('./source').load_data()
index = GPTVectorStoreIndex.from_documents(documents)

実行

query_engine = index.as_query_engine()
query = "チェンソーの悪魔とはなんですか?"
response = query_engine.query(query)
print(response)

出力1

チェンソーの悪魔とは、マキマと対峙した圧倒的な強さを持つ存在である。肉体能力は常人を凌駕し、自身の肉体各部から突き出ている刃を高速回転させ、対象を荒々しく斬り刻む攻撃を得意とする。また、数々の戦いを通じて肉体から突き出る刃の制御や出し入れ、伸ばしたチェーンを利用した移動や拘束などの応用もできるようになっている。悪魔から恐れられる更

カスタマイズ

出力文字数がオーバーしてしまったので、LLMの出力トークン数を少し増やしたいと思います。
indexを作る部分にもう少し細かい設定を加えます。
実行部分は同じです。

from llama_index import LLMPredictor, GPTVectorStoreIndex, PromptHelper, ServiceContext
from langchain import OpenAI

llm_predictor = LLMPredictor(llm=OpenAI(
    temperature=0,
    model_name="gpt-3.5-turbo",
    max_tokens=512 #デフォルトは256
))

prompt_helper = PromptHelper(
    max_input_size = 4096,
    num_output = 256,
    max_chunk_overlap = 20
)

service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, prompt_helper=prompt_helper)

index = GPTVectorStoreIndex.from_documents(
    documents, service_context=service_context
)

出力2

チェンソーの悪魔は、チェンソーマンという存在の以前の姿であり、腕だけに鎧が備わったような見た目をしている。常人離れした身体能力に加え、自身の肉体各部から突き出ている刃を高速回転させ、対象を荒々しく斬り刻む攻撃を得意とする。また、肉体から突き出る刃の制御や出し入れ、伸ばしたチェーンを利用した移動や拘束などの応用もできるようになっている。

参考

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

Discussion