LLM 機能
概要
zipunk/quden#1021 にて、LLM (生成 AI) を用いた機能の PoC を行っています。 このドキュメントでは、LLM 機能実装における裏側のアーキテクチャ、およびモジュール構成を記述します。
アーキテクチャ
NestJS のモジュール構成
LLM 機能の実装にあたり新たに追加した module たちは以下の通りです。
AssistantsModule- LLM 機能をとりまとめる root module
OpenAiModule- OpenAI API を利用するための module
- 主に Assistants API の機能を呼び出すために利用しています
AssistantChatSessionsModule- MongoDB で定義した
AssistantChatSessionを扱うための module - Chat session の作成、更新、削除などを行います
- Chat session とは、チャットの会話の単位のようなもので、LINE でいうところのトークルームに相当します
- MongoDB で定義した
AssistantChatMessagesModule- MongoDB で定義した
AssistantChatMessageを扱うための module - Chat message の作成、更新、削除などを行います
- Chat message はその名の通り1つ1つのメッセージを表します
- MongoDB で定義した
基本的に AssistantsModule が全てを取り扱うメインの module となり、その中でその他の module を利用する形をとります。 したがって、item controller などから利用する際は、原則として AssistantsModule を import し、メソッドを利用する形をとります。
Chat session ついて
今回 LLM 機能を実現するにあたり、任意のコンテキストを持った "Chat Session" (AssistantChatSessions) を作成し、適宜必要なコンテキスト情報を付与しながら、命令を送りレスポンスを得るという形を取っています。
2023年12月時点では、LLM の基盤として、OpenAI の Assistants API (GPT4-Turbo) を利用しています。 そのため、ここでいう Chat Session とは、OpenAI Assistants API の Thread に相当します。
Chat session を作成する流れ
- ユーザーが session の初期化をリクエストする
- MongoDB 上に
AssistantChatSessiondocument を作成し、session id を発行する - 基盤とする LLM をコールして session に該当するエンティティを作成する (OpenAI Assistants API であれば Thread)
- 作成した Session に関する情報を MongoDB 上の
AssistantChatSessiondocument に保存する