Gemini Enterpriseのカスタムコネクタの正体とはいかに!
さあカスタムコネクタを使うぞ!と思って、Google Cloudコンソールを開きました。さて、どこで作るんだろう?
Vertex AIのページ?Cloud Runのページ?...あれ?見つからない。
公式ドキュメントを読むと、Data Store作って、コード書いて...という手順が並んでます。でも「カスタムコネクタを作成する」というステップが、見つけられない...。
ということで、この記事では、カスタムコネクタの正体を分解しながら見ていきます!
Gemini Enterprise カスタムコネクタ公式
https://docs.cloud.google.com/gemini/enterprise/docs/custom-connector
カスタムコネクタの目的
さて、ずばり。
カスタムコネクタは、外部データソースをGemini Enterpriseに繋ぐためのものです。
ひとことで、言ってしまえばこれだけシンプルですね。
で、す、が!これがめちゃくちゃ便利で!
社内の色々なツールのデータを、一箇所でまとめて検索できるようになるんです。
例えば、Backlogの課題、docbaseのドキュメント、社内Wikiの情報...今まで別々に探してたデータを、Gemini Enterpriseで横断検索できるようになります。一つの検索窓で全部見つかるって、かなり楽ですよね。
当然、横断検索は、Gemini Enterpriseの強みですよね。
その上で、重要なのが、Gemini Enterpriseのデータソースとして開発者が自由にコードで実装できるのは、今のところカスタムコネクタだけなんです!
Gemini Enterpriseには標準コネクタもあります。Confluence、Jira、Box、Microsoft 365等ですね。でも、全てのSaaSが標準対応してるわけじゃない。対応してないものは自分で繋ぐしかありません。
そこで、カスタムコネクタ!
私は試しに、Backlogを繋いでみたんですが、
「私が担当している課題を教えて」ってGemini Enterpriseに聞くと、Backlogのデータから回答が返ってきました。感動しました。
色々、見せられないよ!な情報ですが、上記のように回答してくれます。
雰囲気だけもお楽しみください...!
じゃあ、早速、カスタムコネクタを分解して中身を見ていきましょう!
カスタムコネクタを分解する
全体像
カスタムコネクタを理解するために、まず全体像を見てみましょう。
外部データソースのデータが、Gemini Enterpriseで検索できるようになるまで。
大きくこんな仕組みで動きます。
- 外部データソースからデータを取得する
- 取得したデータを、Data Storeに格納できる形式に変換する
- 変換したデータを、Data Storeに保存する
- Gemini Enterpriseが、Data Storeのデータを検索対象にする
この1から4までの仕組み全体が、「カスタムコネクタ」ですね!
ステップ1から3は、自分で実装します。ステップ4では、Gemini EnterpriseとData Storeの接続設定することで、あとは、内部でよしなにやってくれます。
これで、Gemini Enterpriseから検索対象として認識してくれます。便利。
では、この仕組みを実現するには何が必要なんでしょうか?
2つの要素
この仕組みを、2つの要素に分けて説明していきます。
① フロー:データを動かす処理
外部データをGemini Enterpriseで検索できるようにするには、Data Storeに入れる必要があります。でも、どうやって?取得して、変換して、保存する。この処理がフロー。自分でコードを書きます。
② コンポーネント:データを置く場所
変換したデータを、どこに置くのか。それがData Storeです。Gemini Enterpriseが検索する対象のデータを保管する場所ですね。これがコンポーネント。Google Cloudリソースとして作成します。
フローとコンポーネント。この2つで、カスタムコネクタの正体に迫っていきます!
① フロー:データを動かす処理
フローは、外部データをData Storeに運ぶ役割を担います。
具体的には3つのステップに分かれます。Fetch、Transform、Sync。それぞれ見ていきましょう!
Fetch(取得)
外部データソースからデータを取得します。API、データベース、ファイルシステム...コードで接続できるものなら、基本何でもOKです。
ということで、認証方法、接続方法、データ形式。それぞれの外部データソースに合わせて、自分でコードを書いて実装する必要があります。
Transform(変換)
取得したデータを、Data Storeに格納できる形式に変換します。
変換では、大きく2つのことをやります。
1つ目、データ構造の変換です。外部データソースのデータを、Discovery Engine Document形式に変換します。例えばBacklogの課題なら、課題IDやタイトル、説明などを、Document形式に詰めていきます。
2つ目、アクセス制御の設定です。ACL(アクセス制御)の情報を付与します。誰がこのドキュメントを検索できるのか。ドキュメントごとに、メールアドレスを使ってユーザーやグループの情報を設定します(Pure ACLs方式)。
Sync(同期)
変換したデータを、Data Storeに保存します。
TransformステップでDiscovery Engine Document形式に変換したデータを、実際にData Storeへ送り込む処理ですね。
さらに、定期的に実行する仕組みも必要ですよね。外部データソースのデータって日々更新されますもんね。ということで、これに追従するために、定期的にFetch → Transform → Syncを実行が必要になりますね。そのため、例えばCloud Run jobs等を使って実装して、定期実行すると良さそうですね。
フローは、全部自分で実装します。その分、自由度が高いんです!
② コンポーネント:データを置く場所
次に、コンポーネント。ここではGoogle Cloudリソースとして作成するものを指しています。
Data Store(必須)
Data Storeは、データの保管場所です。Gemini Enterpriseが検索する対象のデータを、ここに置きます。カスタムコネクタには必ず必要なリソースです!
Gemini Enterpriseは、検索するたびに外部APIを呼びません。データを事前に取り込んでおいて、そこから検索するんです。これがData Storeの役割なんですね。
これ、単なるエージェント(Agent Engine等)のfunction callingとは違いますね!
もちろん、実装の方法にもよりますが、function callingは、検索のたびに外部APIを呼びます。リアルタイムでデータを取得することが多いですよね。
一方、カスタムコネクタは、Data Storeにデータを溜めておきます。だから、APIを毎回叩かない!レスポンスが速いし、外部APIの負荷も減ります。けっこう大事な違いですよね!
Identity Store(オプション)
もう一つ、Identity Storeというコンポーネントもあります。これはオプションなので、必要に応じて使います!
Identity Storeは、アクセス制御のもう一つの方式であるIdentity mappingで必要になります。外部IDシステムを使う場合、外部IDグループとIDPユーザーをマッピングする役割を担います!
ちなみに、Transformで説明したのは、メールアドレスを直接使う方式(Pure ACLs)。この場合は、Identity Storeは不要です。
まとめ
ここまで、カスタムコネクタを2つの要素に分けて見てきました。
フロー(Fetch/Transform/Sync)
データを取得して、変換して、保存する処理。自分でコードを書きます。
コンポーネント(Data Store、Identity Store)
データを保管する場所。Google Cloudリソースとして作成します。
さて、ここでこのブログの主題「カスタムコネクタの正体」に戻りましょう。
ここまで「カスタムコネクタ」の詳細を見てきましたが、では改めて、「カスタムコネクタ」というGoogle Cloudリソースは?
そう、ないですよね!どこでも作ってないんです!
ということで、カスタムコネクタの正体は、実装パターンの総称。
Data Store(リソース)+ フロー(コード)で構成されているんですね。
さて、最後に実際のコードで確認してみましょう。
実例で確認
カスタムコネクタの具体的なコード例で見てみましょう!
# 1. Data Store作成
data_store = discoveryengine.DataStore(
display_name="my_data_store",
industry_vertical=discoveryengine.IndustryVertical.GENERIC
)
# 2. Fetch: 外部データソースからデータ取得
data = requests.get(f"{DATA_SOURCE_URL}/api/endpoint").json()
ここで、例えばBacklogやその他の外部データソースからデータを取得します。
# 3. Transform: Discovery Engine形式に変換
documents = [
discoveryengine.Document(
id=str(item["id"]),
json_data=json.dumps(item),
acl_info=discoveryengine.Document.AclInfo(
readers=[{
"principals": [
{"user_id": "xxx@xxx.com"}
]
}]
),
) for item in data
]
# 4. Sync: Data Storeに取り込み
request = discoveryengine.ImportDocumentsRequest(
parent=parent,
inline_source=discoveryengine.ImportDocumentsRequest.InlineSource(
documents=documents,
),
)
client.import_documents(request=request)
カスタムコネクタは、実装パターンの総称だったということがわかりましたね!
このコード例を見ても、「カスタムコネクタ」というリソースを作成する処理は、どこにもありませんよね。
さいごに
カスタムコネクタの正体、明らかになりましたね!?
外部データソースをGemini Enterpriseに繋ぐための、実装パターンの総称でした。
Data Store(リソース)+ フロー(コード)で構成されていて、
「カスタムコネクタ」という単体のリソース、Google Cloudコンソールには存在しません。
ですが、それがいいんですよね!フローとData Storeを組み合わせて、自分で作り上げる楽しさがありまよね!
ぜひ、Gemini Enterpriseに自分の好きなデータソースを繋いで、自由自在な横断検索を楽しんでください!
参考情報
Gemini Enterprise カスタムコネクタ公式
https://docs.cloud.google.com/gemini/enterprise/docs/custom-connector



