Technology Blog Posts by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Ryota_Ito
Product and Topic Expert
Product and Topic Expert
1,213

生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っており、Joule という AI Agent を公開しました。このブログシリーズでは、AI Agent が裏側でどうなっているかを理解するため、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI Agent へ拡張する“秒速ハンズオン”をお届けします。

お知らせ
You can find the English version here.

 

📖本シリーズで学べること

  • SAP AI Core 上でカスタム AI Agent を “秒速” で動かす方法
  • LangChain・Google 検索ツール・RAGを使った実装
  • AI Agent を REST API 化し、SAPUI5/Fiori の UI に載せ、Cloud Foundryにデプロイする手順

学習時間
各章は 10–15 分 で読める&手を動かせるを予定しています。

 

🗺️ 連載ロードマップ

注記
続編は順次公開予定です。

この記事が気に入っていただけたら、ぜひ「Kudos」をお願いします!皆さんの応援が本当に励みになります。また、もっと知りたいことがあれば、ぜひコメントを残してください!


Agentツール: Google 検索を統合

1 | はじめに

AI Agent は、単なるチャットモデルではありません。2022年に Yao らが提唱した ReAct(Reason + Act)パラダイムに従い、LLMが推論過程を生成し、さらに具体的な行動(ツール呼び出し)も実行できるようになりました。例えば、Google 検索やデータベース参照などの行動を実行し、その結果を再び LLM に渡すことで、次の思考が常に最新情報に基づくものになります。この仕組みによって、ハルシネーションを抑え、より精度の高い生成が期待できる AI Agent が実現しました。

LangChain には “ReAct Agent” パターンが標準搭載されています。google_search などのツールを登録するだけで、実行時にモデルが「思考すべきか/行動すべきか」を自律的に判断します。

 

2 | 事前準備

  • BTP サブアカウント
  • SAP AI Core インスタンス
  • SAP AI Launchpadのサブスクリプション
  • Python 3.13環境 & pip
  • VSCodeやBASなどのIDE

 

3 | Google API キーを取得する

LangchainでGoogleの検索ツールを使用できるようにするためには、Google API キーとカスタム検索エンジン(CSE)ID が必要です。これは、AI Agent に Web にアクセスするためのバッジを与えるようなものだと考えてください。

公式ドキュメント : LangChain の Google Search Tool 解説ページ

Google Cloud コンソールを開きます。Google Cloud Console画面.png

プロジェクトを選択または新規作成して 「認証情報を作成 → API キー」 をクリックします。ダイアログに新しいキーが表示されます。
APIキー作成画面.png
Tip: 後で識別しやすいようにキー名を変更しておくと便利です。

Programmable Search Engine の作成画面へ移動します。任意の検索エンジン名を入力し、検索対象を「ウェブ全体」に設定して 「作成」 をクリックします。スクリーンショット 2025-04-22 15.25.22.png

すると下記のような HTML スニペットと管理画面が表示されます。

<script async src="https://cse.google.com/cse.js?cx=GOOGLE_CSE_ID">
</script>
<div class="gcse-search"></div>​

新しい検索エンジン作成完了画面.png

2 つの値をプロジェクト直下の .env に追記し、ソースコードへベタ書きしないようにしましょう。

GOOGLE_CSE_ID = "your GOOGLE_CSE_ID"
GOOGLE_API_KEY = "your GOOGLE_API_KEY"​

Agentが google_search ツールを呼び出す際に Google へ認証できる準備が整いました!

 

4 |  Google検索ツールを実装する

Google の JSON API を LangChain Tool にラップし、エージェントが LLM と同じ感覚で google_search を呼べるようにします。

Part 2 のノートブックを開きます。そして、次のセルを追加します。

# ▶ Notebook Cell 3
from langchain.tools import Tool
from langchain_community.utilities import GoogleSearchAPIWrapper

search = GoogleSearchAPIWrapper(k=5) # return top‑5 results

google_tool = Tool.from_function(
    name="google_search",
    description="Search Google and return the first results",
    func=search.run
)

このステップで何をしているか?

  • GoogleSearchAPIWrapper: Agent が入力した検索クエリに応じて、検索結果の文字列を返すクラスです。
  • Tool.from_function: 任意の Python 関数に namedescription を付けて LangChain Tool 化します。
  • description: Agent は各ツールの説明文を読むことで、「いつ・どのようにツールを使うか」を判断します。これは、モデルにとっての“取扱説明書”のような役割を果たします。

 

5 | LangChain エージェントを構築

Part 2 で作った チャットモデルGoogle ツール を合体させ、必要に応じて外部情報を取りに行く Agent を作成します。

# ▶ Notebook Cell 4
from langchain.agents import initialize_agent, AgentType

agent = initialize_agent(
    tools=[google_tool],
    llm=chat_llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True,
)

agent.invoke("Who won the Tokyo Marathon in 2025, and what was the finishing time?")

このステップで何をしているか?

  • initialize_agent: LLM・ツール群・メモリをまとめて 1 つの Agent に組み上げます。
  • tools=[google_tool]: Agentにツールボックスを渡します。現時点では Google Search だけですが、後で追加可能です。
  • agent=AgentType.OPENAI_FUNCTIONS: 今回は OpenAI の LLM を使用するため、OpenAI モデルに対応したツール呼び出し(Function Calling)の仕様を選択します。

google_search 呼び出しログとともに、優勝者とタイムが表示されれば OK です!

Ryota_Ito_0-1745313803663.png

 

6 | チャレンジ – オリジナルツールを追加しよう

LangChain の「ツールの作り方(How to create tools)」を参考にしながら、おみくじを引く Agent を作ってみましょう。

# ▶ Notebook Cell 5
import random

def omikuji(_: str) -> str:
    return random.choice([
        "XXXXXX"
    ])

omikuji_tool = Tool.from_function(
    name="xxxxxx",
    description="......",
    # ?????
)

omikuji_agent = initialize_agent(
    tools=XXXXXXXX,
    llm=chat_llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True,
)

omikuji_agent.invoke("おみくじを引いてください")

agent.invoke("おみくじを引いてください") が、指定した結果のいずれかを返せば合格です!

Ryota_Ito_1-1745314553623.png

自分だけのツールをどんどん追加して遊んでみましょう!

 
 

7 | 次回予告

Part 4 RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理

Part 4 では PDF をアップロードし HANA Cloud Vector Engine にベクトル化。エージェントが自社文書を引用して回答する RAG の第一歩に進みます。

 

免責事項

本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。