Zenn
🔥

Genkit ベースの社内向け AI チャット「internal AI」を OSS として公開しました!

2025/02/17に公開

はじめに

社内向けの AI チャットを手軽かつ低コストで運用できる internal AI を OSS で公開しました!

先日、Firebase Genkit の 1.0 系がリリースされ、安定して利用できるようになりました。Genkit を使えば、生成 AI を活用したアプリケーションを簡単に構築できます。しかし、Genkit 自体には UI は含まれていません。そこで、社内向け AI チャットのユースケースとして、internal AI を OSS として公開しました。

internal AI はユーザー単位の課金ではなく、利用した分だけ支払う従量課金なので、コストを最適化できます。さらに、Genkit の拡張性を活かせば、RAG や Function Calling を組み合わせて、社内のニーズに合わせたカスタマイズも可能です。これにより、業務に特化した情報検索や業務フローの自動化など、より実用的な AI 活用が実現できます!

https://github.com/tanabee/internal-ai

internal AI - Chat interface

主な特徴

  • OSS プロジェクトであり、組織のニーズに合わせてカスタマイズ可能
  • Genkit による生成 AI とのインターフェースの抽象化
  • Firebase にデプロイ可能
  • Firebase AI Monitoring を使用した生成 AI へのリクエストをモニタリング
  • 特定のドメインに利用を制限する機能
  • ユーザー数に基づかず、使用量ベースの課金

OSSプロジェクトであり、組織のニーズに合わせてカスタマイズ可能

internal AI はボイラープレートとして公開しており、組織のニーズに応じて Fork して自由にカスタマイズできます。

Genkit は、RAG(Retrieval-Augmented Generation)を活用した社内情報へのアクセスや、Google Search を用いた Grounding など、多様な拡張が可能です。今回は、最小限の実装で扱いやすくするため、Gemini 2.0 と通信するだけのシンプルな構成 にしています。

functions/src/genkit/chatFlow.ts
const ai = genkit({
  // ...
  model: gemini20Flash001,
})

export const chatFlow = ai.defineFlow(
  // ...
  async (messages) => {
    const response = await ai.generate({ messages })
    return response.messages
  },
)

Genkit による生成 AI とのインターフェースの抽象化

今回は Genkit で Vertex AI を用いた構成にしましたが、ニーズに合わせて接続先やモデルを変更可能です。

Genkit では genkitx-* という形式でコミュニティプラグインを開発する方針となっているので、 公式プラグインで用意されていないモデルは npm から検索すると見つかるかもしれません。

Firebase にデプロイ可能

Firebase へのデプロイを前提としました。以下のサービス群を利用していますが、管理機能には全て Firebase Console からアクセスできます。また、Firebase Emulator でローカル起動もできるので、全ての挙動をローカル環境で確認できます。

  • Firestore: データベースとして利用。チャット履歴とユーザー情報を管理
  • Cloud Functions for Firebase: サーバーサイドコードの実行環境として利用
  • Firebase Authentication: 認証
  • Firebase Hosting: Web アプリケーションのホスティング先
  • Firebase Genkit: 生成 AI とのインターフェース、生成 AI リクエストのモニタリング

Firebase AI Monitoring を使用した生成 AI へのリクエストをモニタリング

Genkit を用いた生成 AI へのリクエストをモニタリングできます。成功率やトークン消費量などを確認できます。

internal AI - Firebase AI Monitoring

特定のドメインに利用を制限する機能

社内で利用を制限できるように、Firebase Authentication の Blocking Function を使ってメールアドレスのドメイン制限を設定できます。また、制限のロジックはソースコードで自由に修正可能です。そのため、複数のドメインに対応したり、個人利用として特定のユーザーのみ許可したりするなど、ニーズに応じたカスタマイズができます。

functions/src/auth/beforeUserCreated.ts
export const beforeusercreated = beforeUserCreated(async (event) => {
  // 省略

  // TODO: Replace with your company domain
  const domain = '@tanabee.dev'
  if (!user?.email?.includes(domain)) {
    throw new HttpsError('permission-denied', 'Unauthorized email')
  }

  // 省略
})

また、管理者のみアクセス可能な Admin console も用意しているので、ニーズに合わせてメニューを増やせるようにしています。

internal AI - Admin console

ユーザー数に基づかず、使用量ベースの課金

internal AI はユーザー単位の課金ではなく、利用量に応じた従量課金となります。そのため、必要な分だけコストが発生し、ほとんどの組織にとってコスト削減につながると考えています。

また、Firebase の利用料も追加でかかりますが、小規模な組織であれば無料枠内で運用できる可能性が高く、非常に低コストで導入が可能です。

LLM との接続には Vertex AI を利用しているため、課金はすべて GCP プロジェクトに紐づき、コストを一元管理できます。

デザインについての感謝

internal AI の UI デザインは Tayama さんに作っていただきました!シンプルかつ直感的で、使いやすいデザインに仕上げていただき、本当にありがとうございます!おかげで、internal AI をより多くの方が快適に使えるプロジェクトになったと思います!

おわりに

気になる方は internal AI インストールガイド を用意しましたので Fork して社内で利用してみてください!社内にエンジニア体制がないなどの理由で導入が難しい場合はお手伝いできるかもしれないので 問い合わせフォーム よりご連絡ください。

関連記事

Discussion

ログインするとコメントできます