モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

llama-indexのopenai 1.x系への対応

Pythonでllama-indexを使っているのですが、開発環境からテスト環境へ移して実行しようとしたところ、SimpleNodeParserのところで、以下のようにエラーが発生しました。

    node_parser = SimpleNodeParser.from_defaults(text_splitter=text_splitter)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: SentenceSplitter.from_defaults() got an unexpected keyword argument 'text_splitter'

pyproject.tomlに

dependencies = [
    "openai>=0.28.0",
    "llama-index>=0.8",
...

という感じに書いていたため、openaiが1.3.xに、llama-indexが0.9.xになっており、llama-index 0.9系だと動かないようです。

そこでllama-indexを0.8のままにしておくよう、以下のように「<0.9」の指定を追加してやることでこのエラーは回避しました。

dependencies = [
    "openai>=0.28.0",
    "llama-index>=0.8, <0.9",
...

しかし今度はopenaiが1.xだと古い使い方だと動かないと言われました。

openai.lib._old_api.APIRemovedInV1:

You tried to access openai.Completion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.

You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface.

Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742

github.com

今後Assistant APIとか使うことを考えると、openaiは早めに1.xに移行しておきたいところです。
しかし実はすでに他のコードは1.xに移行しており、これはllama-indexの中で発生しているエラーでした。

ちなみにどのバージョンからllama-indexがopenai 1.xに対応したのだろう?と思って調べてみたところ、0.8.5x台までは

openai = ">=0.26.4"

だったのが、
2023/11/8 の 0.8.64 から

openai = ">=1.1.0"

となっていました。
なので0.9.xからというわけではなく、0.8.xの途中からopenai 1.x系への対応がされたようです。

ただ今後のことを考えると、なんにしても0.8.xから0.9.xへの移行をしといたほうが良さそうに思いました。
で0.8->0.9への移行の情報を探したところnpakaさんの記事がありました。
note.com

ここの「4. ノード解析・テキスト分割・メタデータ抽出のインターフェース変更」のところに、これまでの一旦「SimpleNodeParser」を作る方法から変更されたことが書いてありました。

これまでの「0.8.x」の場合

node_parser = SimpleNodeParser(
    text_splitter=SentenceSplitter(chunk_size=512)
)
nodes = node_parser.get_nodes_from_documents(documents)


今後「0.9.x」の場合

node_parser = SentenceSplitter(chunk_size=512)
nodes = node_parser(documents)

このため、これまでnode_parserを入れたSimpleNodeParserを生成していた部分を、単にそのままこれまで使っていたSentenceSplitterを入れることで動くようになりました。