生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っています。このブログシリーズでは、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI エージェントへ拡張する“秒速ハンズオン”をお届けします。
お知らせ
英語版はこちらで確認できます。
📖 本シリーズで学べること
SAP AI Core 上でカスタム AI エージェントを “秒速” で動かす方法LangChain・Google 検索ツール・RAG・Streamlit を使った実装エージェントを REST API 化し、UI を SAPUI5/Fiori に載せ替える手順
学習時間
各章は 10–15 分 で読める&手を動かせるを予定しています。
🗺️ 連載ロードマップ
Part 0 プロローグPart 1 環境構築: SAP AI CoreとAI LaunchpadPart 2 LangChain でチャットモデルを構築Part 3 Agentツール: Google 検索を統合Part 4 RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理Part 5 RAG 基礎 ②: Retriever Toolの構築 [現在のブログ]Part 6 Streamlit 基礎Part 7 Streamlit でチャットボットの構築Part 8 AI Agent を REST API 化Part 9 SAPUI5 でチャットUI を再構築 前編Part 8 SAPUI5 でチャットUI を再構築 後編
注記
続編は順次公開予定です。
この記事がお役に立ったら、ぜひ Kudos を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!
RAG 基礎 ②: Retriever Toolの構築
1|はじめに
前章では社内ドキュメントを SAP HANA Cloud VectorEngine に格納し、ベクトルによるクエリ(質問文)と社内ドキュメントとの類似度検索を実行するところまで完了しました。本章では、その検索ロジックを AI Agent が呼び出せるツール化(Retriever Tool 化)します。これにより、AI Agent は「社内ベクターストア → Web 検索」の二段ロケットで回答を組み立てられるようになります。
2 | 事前準備
BTP サブアカウントSAP AI Core インスタンスSAP AI LaunchpadのサブスクリプションPython 3.13環境 & pipVSCodeやBASなどのIDE
Trial 環境の注意
Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。
3 | Retriever Tool の作成
Retriever とは「クエリと内容が似ているテキストチャンクを返すオブジェクト」で、LangChain の RAG パイプラインで最初に呼ばれます。前章で作った dbインスタンスには既にベクトルとメタデータが保存されているため、これをそのまま Retriever へ昇格させます。
まず、前章で埋め込み処理&格納したデータを HANA Cloud Explorer 上で確認してみましょう。TEST_TABLE テーブルを開くと、テキスト列とベクトル列が格納されているのが確認できます。
LangChain における Retriever は .as_retriever() で簡単に生成できます。前章で作った db インスタンス(ベクターストア)をそのまま再利用しましょう。
# ▶ Notebook Cell 11
retriever = db.as_retriever()
# テストクエリを投げて 1 件だけ確認
retriever.invoke(“Tell me about SAP security”)[0]
続いて、Retriever を ツール化 します。create_retriever_tool に Retriever 本体・ツール名・説明文を渡すだけです。説明文は LLM が読んで使用可否を判断する重要パラメータなので、目的を明確に書きましょう。説明文には「何を検索できるか」「いつ使うべきか」を含めることをオススメします。
# ▶ Notebook Cell 12
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever=retriever,
name=”hana_vectorengine”,
description=(
“Use this tool to search internal SAP documents stored in HANA Cloud Vector Engine when the user asks about company-specific policies, security, or best practices.”
),
)
4 | AI Agent に組み込んで動かす
これで Google Search と HANA VectorEngine の 2 本立てツールセットが揃いました。
initialize_agent() で両方を渡して agent インスタンスを作成します。そして、複雑な質問を AI Agent に投げてみましょう!
# ▶ Notebook Cell 13
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(
tools=[google_tool, retriever_tool],
llm=chat_llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
)
result = agent.invoke(“RISE with SAP のサービス内容と、2025 年時点でのクラウド移行市場シェア(他社比較)をあわせて解説してください。”)
“verbose=True”と指定すると、AI Agent の『Thought → Action → Observation』の流れがそのまま出力されます。下のスクリーンショットにおける、
Invoking: hana_vectorengine with {‘query’: ‘RISE with SAP サービス内容’}
で、まず HANA Cloud VectorEngine で社内ドキュメント検索を行っていることが分かります。
続く赤枠、
Invoking: google_search with {‘query’: ‘2025 クラウド移行市場シェア SAP 他社比較’}
で、Google Search による最新市場データの取得を表しています。
(環境によって実行順やクエリ文字列は多少変わる場合があります。)
最後に、エージェントの最終回答を Markdown として表示しましょう。
これで本章のゴール――「検索ツールと HANA Cloud VectorEngine による Retriever を併用する AI Agent」の完成です!!
# ▶ Notebook Cell 14
from IPython.display import Markdown, display
display(Markdown(result[“output”]))
5|チャレンジ – AI Agent に メモリ を付けてみよう
今回までに作った AI Agent は会話履歴を保持しません。これでは「さっきの質問を踏まえて答える」「ユーザ名を覚える」といった自然な対話ができないため、LangChain の従来メモリクラス ConversationBufferMemory を使って履歴を保存できるように拡張します。
将来的な移行について
ConversationBufferMemory は LangChain 0.3 系で非推奨となり、今後は LangGraph を用いたメモリ実装が推奨されています。
本シリーズではまず “秒速” で動くことを優先し、今回は従来クラスで実装します。後日 Part 5.5 で LangGraph 版の AI Agent + メモリ実装 をあらためて作成し、移行手順まで詳しく取り上げる予定です。
# ▶ Notebook Cell 15
from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain_core.prompts import MessagesPlaceholder
from langchain.agents import initialize_agent, AgentType
agent_kwargs = {
“extra_prompt_messages”: [MessagesPlaceholder(variable_name=”memory”)],
}
memory = ConversationBufferMemory(memory_key=”memory”, return_messages=True)
agent_with_memory = initialize_agent(
tools=[google_tool, retriever_tool],
llm=chat_llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
agent_kwargs=agent_kwargs,
memory=memory,
)
上のセルでは ①履歴を保持する ConversationBufferMemory を生成し、②initialize_agent に memory 引数として渡しています。MessagesPlaceholder を追加したことで、履歴がプロンプトに自動で差し込まれる仕組みになりました。
続いて動きを確認します。
result1 = agent_with_memory.invoke(“私の名前は伊藤です。”)
result2 = agent_with_memory.invoke(“私の名前は?”)
print(result2[“output”])
2 回目の呼び出しで「あなたの名前は伊藤さんですね」など前の発話を反映した答えが返ってくれば、メモリが機能しています。出力から履歴が連鎖している様子を確認してみてください。
メモリ付きになったことで、同じセッション内でのフォローアップ質問や、HANA Cloudでの検索結果・Google 検索結果を踏まえた追加質問が自然に行えるようになります。ぜひ色々試してみてください!
6|次回予告
Part 6 Streamlit 基礎
Part 6 では、まず Streamlit そのものを “秒速” で体験します。チャット欄・送信ボタン・メッセージ履歴といった UI の土台だけ を作り、「ローカルで Web アプリが立ち上がる」ことを確認するところまでを扱います。お楽しみに!
免責事項
免責事項 – 本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。
生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っています。このブログシリーズでは、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI エージェントへ拡張する“秒速ハンズオン”をお届けします。お知らせ英語版はこちらで確認できます。 📖 本シリーズで学べることSAP AI Core 上でカスタム AI エージェントを “秒速” で動かす方法LangChain・Google 検索ツール・RAG・Streamlit を使った実装エージェントを REST API 化し、UI を SAPUI5/Fiori に載せ替える手順学習時間各章は 10–15 分 で読める&手を動かせるを予定しています。 🗺️ 連載ロードマップPart 0 プロローグPart 1 環境構築: SAP AI CoreとAI LaunchpadPart 2 LangChain でチャットモデルを構築Part 3 Agentツール: Google 検索を統合Part 4 RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理Part 5 RAG 基礎 ②: Retriever Toolの構築 [現在のブログ]Part 6 Streamlit 基礎Part 7 Streamlit でチャットボットの構築Part 8 AI Agent を REST API 化Part 9 SAPUI5 でチャットUI を再構築 前編Part 8 SAPUI5 でチャットUI を再構築 後編注記続編は順次公開予定です。この記事がお役に立ったら、ぜひ Kudos を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!RAG 基礎 ②: Retriever Toolの構築1|はじめに前章では社内ドキュメントを SAP HANA Cloud VectorEngine に格納し、ベクトルによるクエリ(質問文)と社内ドキュメントとの類似度検索を実行するところまで完了しました。本章では、その検索ロジックを AI Agent が呼び出せるツール化(Retriever Tool 化)します。これにより、AI Agent は「社内ベクターストア → Web 検索」の二段ロケットで回答を組み立てられるようになります。 2 | 事前準備BTP サブアカウントSAP AI Core インスタンスSAP AI LaunchpadのサブスクリプションPython 3.13環境 & pipVSCodeやBASなどのIDETrial 環境の注意Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。 3 | Retriever Tool の作成Retriever とは「クエリと内容が似ているテキストチャンクを返すオブジェクト」で、LangChain の RAG パイプラインで最初に呼ばれます。前章で作った dbインスタンスには既にベクトルとメタデータが保存されているため、これをそのまま Retriever へ昇格させます。まず、前章で埋め込み処理&格納したデータを HANA Cloud Explorer 上で確認してみましょう。TEST_TABLE テーブルを開くと、テキスト列とベクトル列が格納されているのが確認できます。 LangChain における Retriever は .as_retriever() で簡単に生成できます。前章で作った db インスタンス(ベクターストア)をそのまま再利用しましょう。# ▶ Notebook Cell 11
retriever = db.as_retriever()
# テストクエリを投げて 1 件だけ確認
retriever.invoke(“Tell me about SAP security”)[0]続いて、Retriever を ツール化 します。create_retriever_tool に Retriever 本体・ツール名・説明文を渡すだけです。説明文は LLM が読んで使用可否を判断する重要パラメータなので、目的を明確に書きましょう。説明文には「何を検索できるか」「いつ使うべきか」を含めることをオススメします。# ▶ Notebook Cell 12
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever=retriever,
name=”hana_vectorengine”,
description=(
“Use this tool to search internal SAP documents stored in HANA Cloud Vector Engine when the user asks about company-specific policies, security, or best practices.”
),
) 4 | AI Agent に組み込んで動かすこれで Google Search と HANA VectorEngine の 2 本立てツールセットが揃いました。initialize_agent() で両方を渡して agent インスタンスを作成します。そして、複雑な質問を AI Agent に投げてみましょう!# ▶ Notebook Cell 13
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(
tools=[google_tool, retriever_tool],
llm=chat_llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
)
result = agent.invoke(“RISE with SAP のサービス内容と、2025 年時点でのクラウド移行市場シェア(他社比較)をあわせて解説してください。”) “verbose=True”と指定すると、AI Agent の『Thought → Action → Observation』の流れがそのまま出力されます。下のスクリーンショットにおける、Invoking: hana_vectorengine with {‘query’: ‘RISE with SAP サービス内容’}で、まず HANA Cloud VectorEngine で社内ドキュメント検索を行っていることが分かります。続く赤枠、Invoking: google_search with {‘query’: ‘2025 クラウド移行市場シェア SAP 他社比較’}で、Google Search による最新市場データの取得を表しています。(環境によって実行順やクエリ文字列は多少変わる場合があります。) 最後に、エージェントの最終回答を Markdown として表示しましょう。これで本章のゴール――「検索ツールと HANA Cloud VectorEngine による Retriever を併用する AI Agent」の完成です!!# ▶ Notebook Cell 14
from IPython.display import Markdown, display
display(Markdown(result[“output”])) 5|チャレンジ – AI Agent に メモリ を付けてみよう今回までに作った AI Agent は会話履歴を保持しません。これでは「さっきの質問を踏まえて答える」「ユーザ名を覚える」といった自然な対話ができないため、LangChain の従来メモリクラス ConversationBufferMemory を使って履歴を保存できるように拡張します。将来的な移行についてConversationBufferMemory は LangChain 0.3 系で非推奨となり、今後は LangGraph を用いたメモリ実装が推奨されています。本シリーズではまず “秒速” で動くことを優先し、今回は従来クラスで実装します。後日 Part 5.5 で LangGraph 版の AI Agent + メモリ実装 をあらためて作成し、移行手順まで詳しく取り上げる予定です。# ▶ Notebook Cell 15
from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain_core.prompts import MessagesPlaceholder
from langchain.agents import initialize_agent, AgentType
agent_kwargs = {
“extra_prompt_messages”: [MessagesPlaceholder(variable_name=”memory”)],
}
memory = ConversationBufferMemory(memory_key=”memory”, return_messages=True)
agent_with_memory = initialize_agent(
tools=[google_tool, retriever_tool],
llm=chat_llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
agent_kwargs=agent_kwargs,
memory=memory,
)上のセルでは ①履歴を保持する ConversationBufferMemory を生成し、②initialize_agent に memory 引数として渡しています。MessagesPlaceholder を追加したことで、履歴がプロンプトに自動で差し込まれる仕組みになりました。続いて動きを確認します。result1 = agent_with_memory.invoke(“私の名前は伊藤です。”)
result2 = agent_with_memory.invoke(“私の名前は?”)
print(result2[“output”])2 回目の呼び出しで「あなたの名前は伊藤さんですね」など前の発話を反映した答えが返ってくれば、メモリが機能しています。出力から履歴が連鎖している様子を確認してみてください。 メモリ付きになったことで、同じセッション内でのフォローアップ質問や、HANA Cloudでの検索結果・Google 検索結果を踏まえた追加質問が自然に行えるようになります。ぜひ色々試してみてください! 6|次回予告Part 6 Streamlit 基礎Part 6 では、まず Streamlit そのものを “秒速” で体験します。チャット欄・送信ボタン・メッセージ履歴といった UI の土台だけ を作り、「ローカルで Web アプリが立ち上がる」ことを確認するところまでを扱います。お楽しみに! 免責事項免責事項 – 本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。 Read More Technology Blog Posts by SAP articles
#SAP
#SAPTechnologyblog