💬

Agentic RAGを活用したAIアシスタントの仕組み

に公開

つくったもの

先日 CULTIBASE の AIアシスタント機能(β版)を公開しました (以下URLから利用可能です)。
https://cultibase.jp/chat

この機能は Agentic RAG(Retrieval-Augmented Generation)という手法を活用しています。Agentic RAG とは、LLM自身がツールを使い分けながら動的に検索・回答を行う仕組みです。従来のシンプルなRAGと異なり、初期検索→分析→最適化された検索という段階的なプロセスをLLMが自律的に実行します。

例えば「1on1の質を上げるには?」と入力をすると以下のような結果が得られます。

CULTIBASE AIアシスタント画面イメージ
CULTIBASE AIアシスタント画面イメージ

ユーザー入力からどのように応答を生成しているか仕組みを紹介したいと思います。

システム構成図

システム構成図
システム構成図

全体の流れは以下のようになります。

  1. ユーザー入力 → Vercel
  2. Vercel → Gemini:各インデックス用の検索キーワード生成
  3. Vercel → OpenAI Embeddings:各検索キーワードのベクトル化
  4. Vercel → ベクトルDB:3つのインデックスから並列検索
  5. Vercel → Gemini:取得したコンテンツをもとに回答生成
  6. Vercel → ユーザー:回答を返却

以降のセクションでは、各ステップの詳細を説明していきます。

ベクトルデータベースができるまで

CULTIBASE のコンテンツを検索可能にするため、3種類のインデックスを作成しています。データは PostgreSQL データベースと Sanity CMS から取得し、CSV ファイルとして保存した後、ベクトル化して Cloudflare Vectorize に格納します。

1. 記事の本文

Sanity CMS から記事コンテンツを取得し、チャンク分割してベクトル化します。

記事の本文を800文字のチャンクに分割します。これは、LLMのコンテキストウィンドウを効率的に使用するためと、検索精度を高めるためです。

各チャンクに対して OpenAI の Embeddings API を使用してベクトル化します。

2. 動画・音声の書き起こし

PostgreSQL データベースから動画・音声の文字起こしテキストを取得し、記事と同様に800文字のチャンクに分割してベクトル化します。

これにより、動画コンテンツ内で話されている内容もキーワード検索できるようになります。

3. スライドの解説文

以前の記事(LLMを活用した画像検索の仕組み)で紹介した手法で生成されたスライドの解説文をベクトル化します。
https://zenn.dev/yuzame/articles/2e52f67763fc57

  • 動画からスライド画像を抽出
  • 各スライドに対して GPT-4o などのビジョンモデルで解説文を生成
  • 生成された解説文をベクトル化

これらすべてのベクトルを Cloudflare Vectorize に格納します。

入力から応答が生成されるまで

ユーザーが質問を入力してから応答が返されるまでの流れを説明します。

Step1: ユーザーがメッセージを入力する

ユーザーが質問を入力します。例:「1on1の質を上げるには?」

この入力がクライアントから Vercel 上のエージェントに送信されます。

Step2: メッセージから各インデックス用の検索キーワードを生成する

ユーザーのメッセージをそのまま検索に使用するのではなく、2段階のプロセスで各インデックス毎に最適化された検索キーワードを生成します。

まず、ユーザーの質問を元に書き起こしのインデックスから関連コンテンツを抽出します。次に、この検索結果を Vertex AI Gemini 2.5 Flash Lite で分析し、各インデックス用のキーワードを生成します。

生成された検索キーワードの例:

  • 記事検索用: 「1on1 マネジメント 質向上 フィードバック」
  • 書き起こし検索用: 「1on1 進め方 コミュニケーション 対話」
  • スライド検索用: 「1on1 フレームワーク モデル 手法」

このステップで、画面イメージに表示されている「書き起こし検索」「記事検索」「スライド検索」それぞれに適した検索キーワードが生成されます。

Step3: インデックスごとに検索を行い回答を生成する

生成された検索キーワードを使用して、各インデックスに対して並列で検索を実行します。

3-1. 各インデックスでの検索実行

各検索キーワードをベクトル化し、対応するインデックスから類似度の高いコンテンツを取得します。

# 記事インデックスから検索
article_results = search_vector_db(
    index="articles",
    query_embedding=embed(記事検索用キーワード),
    top_k=3
)

# 書き起こしインデックスから検索
transcript_results = search_vector_db(
    index="transcripts",
    query_embedding=embed(書き起こし検索用キーワード),
    top_k=3
)

# スライドインデックスから検索
slide_results = search_vector_db(
    index="slides",
    query_embedding=embed(スライド検索用キーワード),
    top_k=3
)

3-2. コンテキストの構築と回答生成

検索で取得したすべてのコンテンツを統合してプロンプトを構築し、Vertex AI Gemini 2.5 Flash Lite に送信します。

context = f"""
【記事から】
{article_results}

【動画・音声から】
{transcript_results}

【スライドから】
{slide_results}

【ユーザーの質問】
{user_message}

上記の参考情報をもとに、ユーザーの質問に回答してください。
"""

response = gemini.generate(context)

Gemini が生成した回答は、引用元の情報とともにユーザーに返されます。

まとめ

以上、CULTIBASE AIアシスタントの仕組みを紹介しました。

CULTIBASE は組織開発やイノベーション、リーダーシップなど様々なテーマを扱っており、中には過去の研究や理論など利用者が検索キーワードを思いつかないようなコンテンツも存在します。今回のAIアシスタント機能では、質問内容から関連しそうなキーワードを探索する処理を加えることで、ユーザー自身が想像していなかったコンテンツとの思いがけない出会いが生まれるよう工夫しています。次に見たいコンテンツが見つからなかったり、働く中で感じるモヤモヤなどをAIアシスタントに問い合わせていただくと、きっと何か新しい発見があるのではないかと思います。

Discussion