見出し画像

Gemini2.0とStreamlitでお手軽なグラウンディング搭載の生成アプリ作成

この記事では、プロタイプ作成が簡単にできるPythonのStreamlitを用いて、Google検索を組み込んだ生成AIアプリの作り方を紹介します。Gemini2.0のAPIが最近すごく便利になってきていて、Google検索を組み込むようなシステムも簡単に作ることができます。Gemini APIを使って、生成AIのアプリを作ってみたいと思っている方に、参考になれば幸いです。(※今回使ったコードはGithubで公開しています。)

本記事は、「Ubie生成AIアドベントカレンダー」の記事です。

Gemini API

GeminiのAPIを使う方法は、2種類あります。

Google AI StudioのAPIは無料枠もあり、個人のアプリ開発やプロトタイプ作成に適しています。一方で、Vertex AIのAPIは、企業がシステムに組み込むときに適しています。(※Google AI StudioのAPIの無料枠は、入力されたプロンプトが、生成AIの学習に使われるので注意が必要です。)

今まで、この2つのAPIの利用は、異なるライブラリだったため、同じコードを流用できませんでした。しかし、最近になって、この2つのAPIを同じコードで動かせるようになりました。(ライブラリ)。下記のように、初期化の設定で、どちらかを設定すれば、後続の処理は同じコードで対応可能です。

# Google AI StudioのAPIを利用する場合
client = genai.Client(api_key='YOUR_API_KEY')

# Vertex AI APIを利用する場合
client = genai.Client(
    vertexai=True, project='your-project-id', location='us-central1'
)

# コンテンツの生成
response = client.models.generate_content(
    model='gemini-2.0-flash-exp', contents='カレーの作り方を教えて'
)
print(response.text)

本記事では、このライブラリを使って、Google検索を組み込んだ生成AIアプリの作り方を紹介します。

Streamlitによるプロトタイプ

Streamlitは、Pythonでお手軽にアプリを作成できるライブラリです。Streamlitを使って、質問をするとGoogle検索をしてくれて生成AIが回答してくれる簡単なアプリを作りたいと思います。

今回の開発に必要なライブラリは、GeminiとStreamlitのアプリなので、まずインストールします。

pip install streamlit google-genai

1. Geminiで回答作成

まずはじめに、ボタンを押したら、質問内容に答えるアプリを作ります。15行程度のコードで簡単に、生成AIのアプリができます。

「生成ボタン」を押すと、生成AIが回答してくる
import streamlit as st
from google import genai
import os 

# Google AI Studio APIの設定。
# 環境変数にGEMINI_API_KEYを設定している。
API_KEY = os.getenv("GEMINI_API_KEY")
client = genai.Client(api_key=API_KEY)

user_prompt = st.text_area("質問内容", "2025年の箱根駅伝で優勝したチームはどこ?")

generate_button = st.button("生成")
if generate_button:
    response = client.models.generate_content(
        model='gemini-2.0-flash-exp', contents=user_prompt
    )
    st.write(response.text)

2. Geminiでストリームな回答作成

先程のアプリでは、生成AIがすべての回答を完了して初めて結果が表示されるので、すこしモッサリとした形になります。Geminiではストリーム回答も対応しているので、回答生成を逐次的に表示することも可能です。

import streamlit as st
from google import genai
import os 

# Google AI Studio API
API_KEY = os.getenv("GEMINI_API_KEY")
client = genai.Client(api_key=API_KEY)

user_prompt = st.text_area("質問内容", "2025年の箱根駅伝で優勝したチームはどこ?")

generate_button = st.button("生成")
if generate_button:
    response = client.models.generate_content_stream(
        model='gemini-2.0-flash-exp',contents=user_prompt,
    )
    # ストリームによる逐次表示
    accumulated_text = ""
    placeholder = st.empty()
    for response in response:
        accumulated_text += response.text
        placeholder.markdown(accumulated_text)

さて、Geminiの回答結果を見てみると、「2025年の箱根駅伝で優勝したチームはどこ?」という質問に対して、生成AIは回答ができていません。これは、Geminiが2024年までのデータでモデルが学習されており、そのモデルの中だけで回答しようとしているためです。

そこで、この問題を解決する方法として、検索を組み合わせたRAG(検索拡張生成: Retrieval-Augmented Generation)が用いられます。検索を組み合わせることで、最新のデータや社内のデータと連携できるので、ハルシネーションの低減や最新情報の回答が可能です。

Gemini APIでもGoogle検索と組み合わせて回答生成することができます。Googleのドキュメントでは、(検索による)情報源と生成AIの生成を結びつける仕組みをグラウンディングという表現で説明しています。

3. Geminiでグラウンディング搭載の回答作成

Gemini APIでは、tools設定で、GoogleSearchを設定するとGoogle検索を実行して回答を作成してくれます。

# Google検索を利用
google_search_tool = types.Tool(google_search = types.GoogleSearch())

if generate_button:
    response = client.models.generate_content(
        model='gemini-2.0-flash-exp', contents=user_prompt,
        config=types.GenerateContentConfig(
            tools=[google_search_tool]
        ),
    )
    st.write(response.text)

Google検索をしてくれることで、2025年の箱根駅伝の優勝チームを回答することができます。

グラウンディング付きの回答

また、グラウンディングをする際に利用した検索クエリや参考サイトを教えてくれます。

コード全体はこちらになります。

import streamlit as st
from google import genai
from google.genai import types
import os 

# Google AI Studio API
API_KEY = os.getenv("GEMINI_API_KEY")
client = genai.Client(api_key=API_KEY)

user_prompt = st.text_area("質問内容", "2025年の箱根駅伝で優勝したチームはどこ?")

generate_button = st.button("生成")

# Google検索を利用
google_search_tool = types.Tool(google_search = types.GoogleSearch())

if generate_button:
    response = client.models.generate_content(
        model='gemini-2.0-flash-exp', contents=user_prompt,
        config=types.GenerateContentConfig(
            tools=[google_search_tool]
        ),
    )
    st.write(response.text)

    # グラウンディング情報の表示
    st.markdown("## グラウンディング情報")
    st.markdown("## 検索クエリ")
    st.write(", ".join(response.candidates[0].grounding_metadata.web_search_queries))
    st.markdown("## 参照元サイト")
    cites = []
    for i, grounding_chunk in enumerate(response.candidates[0].grounding_metadata.grounding_chunks):
        cites.append(f"[サイト{i+1}]({grounding_chunk.web.uri})")
    st.write(", ".join(cites))

Streamlit Cloudのデプロイ

Streamlitのアプリは、Streamlit Community Cloudを使うと、簡単にWeb上に公開することも可能です。GitHub上にコードをアップロードしておくと、そのフォルダを指定するだけで簡単に公開することが可能です。

Streamlit Cloudでの公開(GitHubのレポジトリを指定するだけ)

デプロイボタンを押すと、数分でアプリが公開されます。

まとめ

本記事では、StreamlitとGemini APIを用いて、お手軽なGoogle検索を組み込んだ生成AIアプリを紹介しました。こんなに簡単に、RAG・グラウンディングを組み込んだアプリを作れるのは、すごい時代ですね。

いいなと思ったら応援しよう!