去年の年末、急に日本語のオープンソースLLMが色々登場した。Qwen14Bをベースにしたrinna社のNekomata、Llama2ベースのElyzaの13Bのヤツ、これまたQwen14BをベースにしたQarasuなど。

私はローカル環境でLLMを動かしてゲームとかに統合するのは結構有望な活用方法だと思っていたが、去年の前半はそれなりの賢さを持ったオープンな日本語LLMは存在しなかった。ゲームに統合するとしたら英語のLLMを使って、その回答をFugu-MTあたりで日本語に翻訳する…という二度手間をかけるしかないな…と思っていた。

PCのリソース的にLLMと翻訳モデルの二つ動かすのもハードル高いし、なんか萎えたのでローカルLLMで何か作る話は寝かせていた。

しかし最近はLlama-2やQwenのような優秀なベースモデルに日本語で継続事前学習すればちゃんと日本語出来て賢いAIになると分かったので、そういうモデルがジャンジャン出てきてくれている。

また、最近はLlama.cppがLLMを扱う環境としてデファクトスタンダードになりつつあり、周辺環境が整備されてかなり扱いやすくなってるし、最適化が進んでGPUオフロードもできるようになって相当爆速で推論できるようになってるという状況もある。

で、日本語LLMをリリースしてくれた各社の心意気に答えてさっそくこれらの日本語LLMをとりまUE5に統合しよう!と考えた。

そうして予想通りというべきか、思ったより大変だったので年末年始がこの作業で潰れてしまい、悲惨な正月となった。

こういう、「できるかどうかやってみないと分からんけど、とは言えできなきゃ困る」系の作業は一番しんどい。何とか上手く行く手段を探り当てるまで、ずーっとコードと格闘し続けるハメになる。まだ誰もやっとらんからググってもやり方が出てこない領域である。その分上手く行ったらそれなりに達成感があるかもしれない。

まずLLMをUE5に組み込むのに何を使うか?というと、やはりLlama.cppを使う。

Llama.cppをどんな風にUE5に組み込むの?というと、まあUnrealはC++でコードを書けるし、Llama.cppはC++なんだから、直接統合すりゃいいでしょ?と一見思うかもしれない。

だが、Llama.cppをC++からどうやって直接使えばいいのか、残念な事に全然分からない。Llama.cppを直接扱ってる記事とかあんま見た事ない。

ちなみにmika314という方がUEにLlama.cppを直接統合するプラグインを作ってくれている。↓

https://github.com/mika314/UELlama

https://www.youtube.com/watch?v=j_r5xWm3Xl8

これ使えばいんじゃね?と思うかもしれないが、まず最終コミットが3~4ヶ月前で更新が滞ってるのが気になる。また、Grammarを使った文法制約機能を使いたいが、このプラグインではサポートされていない。だからコードを見てみたけど何が何だか分からずに弄れない。(この動画以外にドキュメントはない)ついでに言えばLlama.cppのmain.exeを直接実行した時に比べて生成速度が遅いようだ。(GPUのCuda使用率が50%くらいしかない)

というわけで、このプラグインは弄り方が分からんし、直接C++でLlama.cppを統合する方法も分からんし、その辺は一旦諦めた。それよりPythonを組み込めば、Llama-cpp-python(Llama.cppのPythonラッパー)やGuidance(Llama-cpp-pythonを統合してる)から簡単にLlama.cppを扱えるので、その方法を使おうと考えた。