大規模言語モデルと検索・画像機能を統合したロマンチックなアシスタントの構築

記念日のシーン演出において、常に斬新なアイデアを生み出し続けることは容易ではありません。本記事では、大規模言語モデル(LLM)を基盤としたアプリケーションに、画像処理やWeb検索機能を統合し、ユーザーに寄り添った提案を行うシステムの実装手法を解説します。以前の基礎的なチャットボットの構築から一歩進み、外部ツールと連携した応用的なアーキテクチャを見ていきましょう。

画像アップロード機能の実装

LLMと対話しながら、ユーザーが手元の画像をアップロードし、画像生成APIやスタイル変換モデルに入力できるようなUIを構築します。Streamlitを用いる場合、セッション状態(Session State)を活用することで、画面再描画時にも画像データを維持し、レイアウトの一貫性を保つことが可能です。以下に、サイドバーを活用してアップロード画面を実装し、画像をプレビューするコード例を示します。

import streamlit as st

# セッション状態の初期化
if "source_image" not in st.session_state:
    st.session_state.source_image = None

# サイドバーにアップロードインターフェースを配置
with st.sidebar:
    st.subheader("素材のアップロード")
    uploaded_asset = st.file_uploader(
        "画像を選択してください",
        type=["png", "jpg", "jpeg", "gif"],
        help="加工用の元画像をアップロードします"
    )

    if uploaded_asset is not None:
        # バイト列をセッション状態に保存
        st.session_state.source_image = uploaded_asset.getvalue()
        
        # 画像のプレビュー表示
        st.image(uploaded_asset, caption="アップロードされた画像", use_column_width=True)
        st.success("画像の読み込みに成功しました")
        
        # ここに画像生成APIへのリクエスト処理を記述可能
        # generate_image(uploaded_asset)

この実装により、ユーザーはチャット画面を離れることなく、スムーズに画像を入力できます。サイドバーへの配置により、メインの会話領域を広く保ちつつ、必要なリソースを常に確認できる設計としています。

外部情報検索の統合

LLMの回答精度を高めるため、RAG(検索拡張生成)のアプローチを取り入れます。Google検索をプログラムから実行し、最新のトレンドや具体的な店舗情報などを取得してコンテキストとしてLLMに渡す機能を追加します。ここでは、APIキーを必要としないライブラリを用いて、検索クエリを実行する汎用的な関数を実装します。

from googlesearch import search
import urllib.parse

def retrieve_search_context(query, max_results=5):
    """
    指定されたクエリでGoogle検索を実行し、結果を返却します。
    
    Args:
        query (str): 検索文字列
        max_results (int): 取得する最大件数
        
    Returns:
        list: 検索結果(URL)のリスト
    """
    # クエリをURLエンコード
    encoded_query = urllib.parse.quote_plus(query)
    
    search_context = []
    try:
        # 検索の実行(プロキシ設定が必要な環境は適宜追加してください)
        # 注意: googlesearchライブラリはURL文字列をイテレータとして返します
        for url in search(
            encoded_query,
            num=max_results,
            stop=max_results,
            pause=2,
            lang="jp"
        ):
            search_context.append({
                "link": url,
                "relevance": "high" # 簡易的なスコアリングが必要な場合はここで追加
            })
            
    except Exception as err:
        print(f"検索処理中にエラーが発生: {err}")
        
    return search_context

# 実行例
# results = retrieve_search_context("2024年 人気 デートプラン 東京")
# print(results)

この検索機能により、LLMは学習データのみに依存せず、リアルタイムな情報に基づいた具体的なアドバイス(例:「今年の流行のプレゼント」や「近隣のレストラン情報」など)を生成できるようになります。

LLMとの連携と効率化

画像アップロードと検索機能という2つのツールをLLMに認識させる場合、自作で関数呼び出し(Function Calling)のロジックを組むことも可能ですが、LangChainなどのフレームワークが提供する「エージェント(Agent)」パターンを利用する方が、ツールの選択や実行順序の制御が効率的です。エージェントはユーザーの意図を解釈し、必要に応じて検索ツールや画像生成ツールを自動的に選択して処理を進めるため、開発工数を大幅に削減できます。シンプルな構造を維持しつつ、高度な処理をエージェントに委ねる設計が推奨されます。

タグ: LLM Streamlit Python GoogleSearch RAG

7月18日 16:55 投稿