見出し画像

GPT Index の使用方法

「GPT Index」の使用方法をまとめました。

前回

1. GPT Index

「GPT Index」は、LLMと外部データを簡単に接続できるインデックスを作成するためのライブラリです。

特徴は、次のとおりです。

・LLMのプロンプトのサイズ制限に関する懸念を取り除く。
・LLMアプリの一般的な使用パターンの抽象化。
・一般的なデータソースへのコネクタを提供。
・コストの確認および削減するためのツールを提供。

用途は、次のとおりです。

・質疑応答
・要約
・テキスト生成

使用手順は、次のとおりです。

(1) ドキュメントの読み込み
(2) インデックスの作成
(3) 【オプション】 インデックスの上にインデックスを作成
(4) インデックスの照会 (質問応答)

2. ドキュメントの読み込み

ドキュメントはload_data()で読み込み、Document[]で保持します。

from gpt_index import SimpleDirectoryReader

# ドキュメントの読み込み
documents = SimpleDirectoryReader('data').load_data()

Document[]を手動で作成することもできます。

from gpt_index import Document

# 手動でドキュメントを作成
text_list = [text1, text2, ...]
documents = [Document(t) for t in text_list]

3. インデックスの作成

3-1. インデックスの作成

インデックスのコンストラクタに Document[] を渡すことで、インデックスを作成できます。

from gpt_index import GPTSimpleVectorIndex

# インデックスの作成
index = GPTSimpleVectorIndex(documents)

3-2. ドキュメントの挿入

インデックスの作成後に、insert()でドキュメントを挿入することができます。

from llama_index import GPTSimpleVectorIndex

# インデックスの作成
index = GPTSimpleVectorIndex([])

# ドキュメントの挿入
for doc in documents:
    index.insert(doc)

3-3. インデックスのカスタマイズ

インデックスのパラメータの「llm_predictor」でLLM、「prompt_helper」でプロンプト、「embed_model」で埋め込みの設定をカスタマイズすることができます。

from gpt_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper

...

# LLMPredictorの準備
llm_predictor = LLMPredictor(llm=OpenAI(
    temperature=0, # 温度
    model_name="text-davinci-002" # モデル名
))

# PromptHelperの準備
prompt_helper=PromptHelper(
    max_input_size=4000,  # LLM入力の最大トークン数
    num_output=256,  # LLM出力のトークン数
    chunk_size_limit=2000,  # チャンクのトークン数
    max_chunk_overlap=0,  # チャンクオーバーラップの最大トークン数
    separator="。"  # セパレータ
),

# インデックスの作成
index = GPTSimpleVectorIndex(
    documents,  # ドキュメント
    llm_predictor=llm_predictor,  # LLMPredictor
    prompt_helper=prompt_helper  # PromptHelper
)

3-4. コスト予測

インデックスの作成、インデックスへの挿入、インデックスの照会には、OpenAI APIのトークンを使用します。以下のように随時、LLMで使用したトークン数と、埋め込みに使用したトークン数が表示されます。index.llm_predictor.last_token_usage で取得することもできます。

> [query] Total LLM token usage: 3234 tokens
> [query] Total embedding token usage: 19 tokens

3-4. インデックスの保存

インデックスの保存は index.save_to_disk() 、読み込みは GPTSimpleVectorIndex.load_from_disk() を使います。

# インデックスの保存
index.save_to_disk('index.json')

# インデックスの読み込み
index = GPTSimpleVectorIndex.load_from_disk('index.json')

4. 【オプション】 インデックスの上にインデックスを作成

インデックスの上にインデックスを構築することもできます。複数のデータソースのインデックスを参照したい場合に役立ちます。

from gpt_index import GPTSimpleVectorIndex, GPTListIndex

# index1とindex2の作成
index1 = GPTSimpleVectorIndex(documents1)
index2 = GPTSimpleVectorIndex(documents2)

# index1とindex2の要約の設定
index1.set_text("summary1")
index2.set_text("summary2")

# index1とindex2の上にindex3を作成
index3 = GPTListIndex([index1, index2])

5. インデックスの照会

5-1. インデックスの照会

作成したインデックスに対して照会 (質問応答) することができます。

# インデックスの照会
response = index.query("ぼっちちゃんの得意な楽器は?")
print(response)

5-2. インデックスの照会のパラメータ

インデックスの種類ごとに、様々なインデックスの照会のパラメータが用意されています。

5-3. インデックスの照会のレスポンス

インデックスの照会のレスポンスでは、response.responseで回答、response.source_nodesでその回答を生成する際に利用したソースを取得できます。

# レスポンス
print("response:", response.response, "\n")

# ソース
print("source_nodes:", response.source_nodes, "\n")
response: ぼっちちゃんの得意な楽器はギターです。
source_nodes: [SourceNode(source_text=' 後藤ひとり(ごとうひとり) 秀華高校に通う女子。...ロックを始めた経緯がある。  喜多郁代(きたいくよ)', doc_id='00c98051-6cd5-456d-99c4-bf910ee73faa', extra_info=None, node_info={'start': 1892, 'end': 4067}, similarity=0.8312072528223037)]

6. ノートブックの例

公式で提供されている ノートブックの例 は、次のとおりです。

・paul_graham_essay : ポール・グレアムのエッセイ (HelloWorld)
・cost_analysis : コスト分析
・vector_indices : ベクトルインデックス
・data_connectors : データコネクタ (Google Docs、Slackなど)
・composable_indices : 他のインデックスの上にインデックスを構築
・data_connectors : 構造体インデックス
・test_wiki : Wiki
・gatsby : Gatsby

次回



この記事が気に入ったらサポートをしてみませんか?