Open6

Llama Indexを試す

やんまーやんまー

公式のチュートリアルに従って、Llama Indexを使ってみる

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

Llama Indexがどういうものかという説明は次の解説記事がわかりやすい。

https://recruit.gmo.jp/engineer/jisedai/blog/llamaindex-chatgpt-tuning/

記事の中程の、Llamaindex 処理フローに丁寧に書いてある。主に以下のことをやっているらしい。

  • 事前に与えられた知識となる文章を適切に分割し、embeddingでベクトル化しておく
  • 質問文をembeddingし、ベクトルの類似性を元に、関連の文章を取り出して、LLMに一緒に渡す。
やんまーやんまー

まずは、Pythonをインストールしておく

私はrtxを使っているので、~/.config/rtx/config.tomlに以下の記述をして、$ rtx iを実行した

[tools]
python = ['latest']

インストールされたPythonのバージョンは3.11.3

$ python --version
Python 3.11.3

次に、jupyter notebook と、 llama indexをインストールしておく

$ pip install llama-index
$ pip install jupyter
やんまーやんまー

最初の、ポールグレアムに関するjupyter notebookを実行してみる

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

$ git clone https://github.com/jerryjliu/llama_index.git
$ cd examples/paul_graham_essay
$ jupyter notebook

TestEssay.ipynb を選んで、INSERT OPENAI KEYの部分をOpenAI API Keyに置き換えて、順番に実行をしていく。クリックしてから結果が出力されるまで10秒ぐらいかかるセクションもある。

やんまーやんまー

次に、スクリプトを作って実行するのを試してみる

以下のような.pyファイルを新しく作る

from llama_index import VectorStoreIndex, SimpleDirectoryReader

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

query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)

んで、以下のように実行

$ export OPENAI_API_KEY=xxxx
$ python new.py

The author grew up writing essays, learning Italian, exploring Florence, painting people, working with computers, attending RISD, living in a rent-controlled apartment, building an online store builder, editing code, launching software, publishing essays online, writing essays, painting still life, working on spam filters, cooking for groups, and buying a building in Cambridge.
やんまーやんまー

スクリプトの前方に以下の記述をつけておくと、ログ出力されるそう

import logging
import sys

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

たしかにめちゃくちゃログが出力された

$ python new.py
INFO:numexpr.utils:NumExpr defaulting to 8 threads.
NumExpr defaulting to 8 threads.
DEBUG:llama_index.readers.file.base:> [SimpleDirectoryReader] Total files added: 1
> [SimpleDirectoryReader] Total files added: 1
DEBUG:llama_index.node_parser.node_utils:> Adding chunk:

What I Worked On

February 2021

Before col...
> Adding chunk:

What I Worked On

February 2021

Before col...
DEBUG:llama_index.node_parser.node_utils:> Adding chunk: documentary that showed Terry Winograd using SH...
> Adding chunk: documentary that showed Terry Winograd using SH...
DEBUG:llama_index.node_parser.node_utils:> Adding chunk: Science is an uneasy alliance between two halve...
> Adding chunk: Science is an uneasy alliance between two halve...
(長いので以下略)
やんまーやんまー

embeddingした結果をメモリではなくファイルに書き出して永続化するには、以下のようにする

# save.py
import logging
import sys

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

from llama_index import VectorStoreIndex, SimpleDirectoryReader

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

index.storage_context.persist()

永続化されたファイル (./storage/vector_store.json など) を用いるには、以下のようにする

# reload.py
from llama_index import StorageContext, load_index_from_storage

# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="./storage")
# load index
index = load_index_from_storage(storage_context)

query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)