Open6
Llama Indexを試す
公式のチュートリアルに従って、Llama Indexを使ってみる
Llama Indexがどういうものかという説明は次の解説記事がわかりやすい。
記事の中程の、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を実行してみる
$ 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)