Skip to content

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 でいうところのトークルームに相当します
  • AssistantChatMessagesModule
    • MongoDB で定義した AssistantChatMessage を扱うための module
    • Chat message の作成、更新、削除などを行います
    • Chat message はその名の通り1つ1つのメッセージを表します

基本的に 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 を作成する流れ

  1. ユーザーが session の初期化をリクエストする
  2. MongoDB 上に AssistantChatSession document を作成し、session id を発行する
  3. 基盤とする LLM をコールして session に該当するエンティティを作成する (OpenAI Assistants API であれば Thread)
  4. 作成した Session に関する情報を MongoDB 上の AssistantChatSession document に保存する