生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っています。このブログシリーズでは、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI エージェントへ拡張する“秒速ハンズオン”をお届けします。
お知らせ
今回から 日本語版 と 英語版 を分けて公開します。英語版はこちらです。
本シリーズで学べること
SAP AI Core 上でカスタム AI エージェントを “秒速” で動かす方法LangChain・Google 検索ツール・RAG・Streamlit を使った実装エージェントを REST API 化し、UI を SAPUI5/Fiori に載せ替える手順
学習時間
各章は 10–15 分 で読める&手を動かせるを予定しています。
️ 連載ロードマップ
Part 0 Prologue / プロローグPart 1 Env Setup: SAP AICore & AI Launchpad / 環境構築: SAP AI CoreとAI LaunchpadPart 2 Building a Chat Model with LangChain / LangChain でチャットモデルを構築Part 3 Agent Tools: Integrating Google Search / Agentツール: Google 検索を統合Part 4 RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理 [現在のブログ]Part 5 RAG Basics ②: Retriever Tool / RAG 基礎 ②: Retriever Toolの構築Part 6 Streamlit UI Prototype / Streamlit でチャットUIPart 7 Expose as a REST API / AI Agent を REST API 化Part 8 Rebuild the UI with SAPUI5 / SAPUI5 でチャットUI を再構築
注記
続編は順次公開予定です。
この記事がお役に立ったら、ぜひ Kudos を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!
RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理
1|はじめに
一般的なチャット モデルは企業固有の用語や業務プロセスを十分に理解できず、回答が的外れになることがあります。前章では Google 検索ツール をエージェントに渡し、インターネット上の最新情報を参照できるようにしましたが、これだけでは社内文書やナレッジには対応できません。
そこで本章では、社内ドキュメントを SAP HANA Cloud Vector Engine にあらかじめ格納し、エージェントがその情報を検索・参照して回答を生成する RAG(Retrieval‑Augmented Generation) の基礎である類似度検索を構築します。
2 | 事前準備
BTP sub-account / BTP サブアカウントSAP AI Core instance / SAP AI Core インスタンスSAP AI LaunchPad Subscription / SAP AI LaunchpadのサブスクリプションPython 3.13 and pip / Python 3.13環境 & pipVSCode, BAS or any IDE / VSCodeやBASなどのIDE
Trial 環境の注意
Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。
3 | HANA Cloud インスタンスを作成する
まず RAG(Retrieval-Augmented Generation) をおさらいしましょう。
RAG は「検索 → 生成」という 2 段階構成で、
Retrieve(検索) – クエリに近い文書をベクター類似度で取り出すGenerate(生成) – 取り出した文書を LLM のプロンプトに添えて回答を生成する
という流れを取ります。検索フェーズで 社内の確かな情報 を与えることで、LLM の幻覚を抑えつつ企業特有のナレッジに対応できる——それが RAG を使う大きなメリットです。
RAG に必要不可欠な ベクターストア を用意するため、まずは SAP HANA Cloud のインスタンスを BTP Trial 環境にプロビジョニングします。ここで立ち上げたデータベースに後続ステップで生成する埋め込みベクターを保存し、エージェントが高速に検索できる土台を整えます。
チュートリアル Provision an Instance of SAP HANA Cloud, SAP HANA Database に従い、HANA Cloudインスタンスを作成します。
HANA Cloudインスタンスの作成時には、チュートリアルとは別に以下の設定をしてください。
Runtime Environment を Cloud Foundry に変更してください。
Additional Features にて Natural Language Processing (NLP) を ON にしてください
また、Connection にて Allowed Connections を Allow all IP addresses に変更してください。
HANA Cloud Central で作成完了後、BTP Cockpit にインスタンスが表示されます。
SAP AI Core と同様に サービスキー を発行し、RAG での接続に備えます。
4 | LangChain で HANA Cloud とやり取りする
このセクションでは LangChain 公式コネクタ を使って HANA Cloud に接続し、インスタンス内の埋め込みモデルを呼び出せる状態までセットアップします。手順は公式ドキュメントにも載っているので、一度目を通すと流れがつかみやすくなります。
サービスキー情報を.envファイルに追加します。 “秒速で学ぶ” 方針に合わせ、ユーザーを新規作成せず DBADMIN を流用します。実運用では専用ユーザーを切り分けてください。
サービスキー項目.envでの環境変数例設定値hostHANA_DB_ADDRESS例: XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX.hana.trial-us10.hanacloud.ondemand.comportHANA_DB_PORT例: 443ユーザーHANA_DB_USER今回は簡易化のためDBADMINパスワードHANA_DB_PASSWARD インスタンス作成時に設定したパスワード
必要なライブラリをインストールします。ターミナルで次のコマンドを実行します。
pip install langchain-hana hdbcli –quiet
langchain-hana は HANA Cloud Vector Store & 内部 Embedding にアクセスするライブラリです。
また、hdbcli は SAP HANA Database Client を Python上で扱うライブラリです。
HANA Cloud内蔵の埋め込みモデルを呼び出してみましょう。2024 Q4 から HANA Cloud は 内部 Embedding モデル を提供しています。インスタンス作成時に Additional Features → Natural Language Processing (NLP) を ON にしていれば利用可能です。
以下のセルを追加します。
# Notebook Cell 6
from langchain_hana import HanaInternalEmbeddings
embeddings = HanaInternalEmbeddings(
internal_embedding_model_id=”SAP_NEB.20240715″
)
最後にベクターストア(テーブル)を初期化します。テーブル名は”TEST_TABLE”として、以下のセルを追加します。
# Notebook Cell 7
from langchain_hana import HanaDB
from hdbcli import dbapi
import os
connection = dbapi.connect(
address=os.getenv(“HANA_DB_ADDRESS”),
port=os.getenv(“HANA_DB_PORT”),
user=os.getenv(“HANA_DB_USER”),
password=os.getenv(“HANA_DB_PASSWORD”),
sslValidateCertificate=False,
autocommit=True,
)
db = HanaDB(
embedding=embeddings,
connection=connection,
table_name=”TEST_TABLE”
)
print(“ HANA Vector Store is ready!”)
これで LangChain から HANA Cloud へ接続し、内部埋め込みモデルとベクターストアを利用する準備が整いました。次のステップでは テキストファイル をチャンク化 → 埋め込み生成 → TEST_TABLE に格納し、RAG に必要な類似度検索を構築します。
5 | RAG の基礎 – 類似度検索で関連ドキュメントを取り出す
本章では Retrieve パートを作り、質問に関連するテキストを 2 件表示できる 類似度検索 までを実装します。
まずは、類似度検索の材料となるテキストファイルを読み込み、Embedding に最適なサイズ(約 100 文字)の テキストチャンク に分割します。
下記リンクからテキストファイル sap_jp_corpus.txt をダウンロードし、ノートブックと同じフォルダに置いてください。https://drive.google.com/drive/folders/1wYLPcKrsgUs6P7JqDgHS30qoGE-gt3Av?usp=sharing
その上で、以下のセルを追加します。
# Notebook Cell 8
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
text_documents = TextLoader(“sap_jp_corpus.txt”).load()
text_splitter = CharacterTextSplitter(
chunk_size=100,
chunk_overlap=0,
)
text_chunks = text_splitter.split_documents(text_documents)
print(f”Number of document chunks: {len(text_chunks)}”)
このセルで何をしているか
TextLoader: テキストファイルを 1 文書として読み込むことができます。CharacterTextSplitter: 100 文字ずつチャンク化します。結果は text_chunks(Document オブジェクトのリスト)に格納します。
次に、テキストチャンクを HANA Cloud のベクターストアへ格納します。以下のセルを追加します。
# Notebook Cell 9
db.delete(filter={})
db.add_documents(text_chunks)
このセルで何をしているか
db.delete(filter={}): 既存行を削除することで、デモ用テーブルを初期化します。add_documents: テキストチャンクを埋め込み処理して TEST _TABLE に書き込みます。
それでは類似度検索を実装してみましょう。以下のセルを追加します。
# Notebook Cell 10
query = “セキュリティ体制を知りたい”
docs = db.similarity_search(query, k=2)
for doc in docs:
print(“-” * 80)
print(doc.page_content)
ここでは、ユーザーが入力したクエリ文を 同じ Embedding モデル でベクトル化します。そして、HANA Cloud に格納していたベクトルと類似度の高い 2 チャンクを返却します。
検索結果が「セキュリティ方針」「アクセス制御」など、質問に関連した内容になっていれば成功です!
6|チャレンジ – 独自埋め込みモデルで精度を比べよう
Part 2 のチャレンジで OpenAI Embedding モデル をデプロイしていました。そのモデルを使って 同じデータ、同じクエリ で結果を比較してみましょう。
# Notebook Cell 11
from gen_ai_hub.proxy.langchain.openai import OpenAIEmbeddings
from langchain_hana import HanaDB
from hdbcli import dbapi
import os
# Embedding を差し替える
openai_embed = OpenAIEmbeddings(
deployment_id=os.getenv(“EMBED_DEPLOYMENT_ID”) # Part2 で控えた ID
)
# 別テーブルに保存して比較しやすく
db_alt = HanaDB(
embedding=openai_embed,
connection=connection,
table_name=”TEST_TABLE_OAI”
)
db_alt.delete(filter={})
db_alt.add_documents(text_chunks)
# 同じクエリで検索
alt_docs = db_alt.similarity_search(query, k=2)
print(“n=== OpenAI Embedding の結果 ===”)
for doc in alt_docs:
print(“-” * 80)
print(doc.page_content)
比較ポイント
HANA 内蔵モデル vs. OpenAI モデル でヒットするチャンクがどう変わるか試してみましょう。短文の質問 / 長文の質問など、複数パターンで試すと差が見えやすいはずです。
7|次回予告
Part 5 RAG 基礎 ②: Retriever Toolの構築
Part 5 では、いま作成した HANA Cloud ベクターストア を RAG ツールとして LangChain Agent に組み込み、Google 検索ツールと合わせた “二刀流エージェント” を動かしてみます。お楽しみに!
免責事項
免責事項 – 本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。
生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っています。このブログシリーズでは、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI エージェントへ拡張する“秒速ハンズオン”をお届けします。お知らせ今回から 日本語版 と 英語版 を分けて公開します。英語版はこちらです。 本シリーズで学べることSAP AI Core 上でカスタム AI エージェントを “秒速” で動かす方法LangChain・Google 検索ツール・RAG・Streamlit を使った実装エージェントを REST API 化し、UI を SAPUI5/Fiori に載せ替える手順学習時間各章は 10–15 分 で読める&手を動かせるを予定しています。
連載ロードマップPart 0 Prologue / プロローグPart 1 Env Setup: SAP AICore & AI Launchpad / 環境構築: SAP AI CoreとAI LaunchpadPart 2 Building a Chat Model with LangChain / LangChain でチャットモデルを構築Part 3 Agent Tools: Integrating Google Search / Agentツール: Google 検索を統合Part 4 RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理 [現在のブログ]Part 5 RAG Basics ②: Retriever Tool / RAG 基礎 ②: Retriever Toolの構築Part 6 Streamlit UI Prototype / Streamlit でチャットUIPart 7 Expose as a REST API / AI Agent を REST API 化Part 8 Rebuild the UI with SAPUI5 / SAPUI5 でチャットUI を再構築注記続編は順次公開予定です。この記事がお役に立ったら、ぜひ Kudos を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!RAG 基礎 ①: HANA Cloud VectorEngineと埋め込み処理1|はじめに一般的なチャット モデルは企業固有の用語や業務プロセスを十分に理解できず、回答が的外れになることがあります。前章では Google 検索ツール をエージェントに渡し、インターネット上の最新情報を参照できるようにしましたが、これだけでは社内文書やナレッジには対応できません。そこで本章では、社内ドキュメントを SAP HANA Cloud Vector Engine にあらかじめ格納し、エージェントがその情報を検索・参照して回答を生成する RAG(Retrieval‑Augmented Generation) の基礎である類似度検索を構築します。 2 | 事前準備BTP sub-account / BTP サブアカウントSAP AI Core instance / SAP AI Core インスタンスSAP AI LaunchPad Subscription / SAP AI LaunchpadのサブスクリプションPython 3.13 and pip / Python 3.13環境 & pipVSCode, BAS or any IDE / VSCodeやBASなどのIDETrial 環境の注意Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。 3 | HANA Cloud インスタンスを作成するまず RAG(Retrieval-Augmented Generation) をおさらいしましょう。RAG は「検索 → 生成」という 2 段階構成で、Retrieve(検索) – クエリに近い文書をベクター類似度で取り出すGenerate(生成) – 取り出した文書を LLM のプロンプトに添えて回答を生成するという流れを取ります。検索フェーズで 社内の確かな情報 を与えることで、LLM の幻覚を抑えつつ企業特有のナレッジに対応できる——それが RAG を使う大きなメリットです。RAG に必要不可欠な ベクターストア を用意するため、まずは SAP HANA Cloud のインスタンスを BTP Trial 環境にプロビジョニングします。ここで立ち上げたデータベースに後続ステップで生成する埋め込みベクターを保存し、エージェントが高速に検索できる土台を整えます。チュートリアル Provision an Instance of SAP HANA Cloud, SAP HANA Database に従い、HANA Cloudインスタンスを作成します。HANA Cloudインスタンスの作成時には、チュートリアルとは別に以下の設定をしてください。Runtime Environment を Cloud Foundry に変更してください。Additional Features にて Natural Language Processing (NLP) を ON にしてくださいまた、Connection にて Allowed Connections を Allow all IP addresses に変更してください。HANA Cloud Central で作成完了後、BTP Cockpit にインスタンスが表示されます。SAP AI Core と同様に サービスキー を発行し、RAG での接続に備えます。 4 | LangChain で HANA Cloud とやり取りするこのセクションでは LangChain 公式コネクタ を使って HANA Cloud に接続し、インスタンス内の埋め込みモデルを呼び出せる状態までセットアップします。手順は公式ドキュメントにも載っているので、一度目を通すと流れがつかみやすくなります。サービスキー情報を.envファイルに追加します。 “秒速で学ぶ” 方針に合わせ、ユーザーを新規作成せず DBADMIN を流用します。実運用では専用ユーザーを切り分けてください。サービスキー項目.envでの環境変数例設定値hostHANA_DB_ADDRESS例: XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX.hana.trial-us10.hanacloud.ondemand.comportHANA_DB_PORT例: 443ユーザーHANA_DB_USER今回は簡易化のためDBADMINパスワードHANA_DB_PASSWARD インスタンス作成時に設定したパスワード 必要なライブラリをインストールします。ターミナルで次のコマンドを実行します。pip install langchain-hana hdbcli –quietlangchain-hana は HANA Cloud Vector Store & 内部 Embedding にアクセスするライブラリです。また、hdbcli は SAP HANA Database Client を Python上で扱うライブラリです。 HANA Cloud内蔵の埋め込みモデルを呼び出してみましょう。2024 Q4 から HANA Cloud は 内部 Embedding モデル を提供しています。インスタンス作成時に Additional Features → Natural Language Processing (NLP) を ON にしていれば利用可能です。以下のセルを追加します。 #
Notebook Cell 6
from langchain_hana import HanaInternalEmbeddings
embeddings = HanaInternalEmbeddings(
internal_embedding_model_id=”SAP_NEB.20240715″
) 最後にベクターストア(テーブル)を初期化します。テーブル名は”TEST_TABLE”として、以下のセルを追加します。# Notebook Cell 7
from langchain_hana import HanaDB
from hdbcli import dbapi
import os
connection = dbapi.connect(
address=os.getenv(“HANA_DB_ADDRESS”),
port=os.getenv(“HANA_DB_PORT”),
user=os.getenv(“HANA_DB_USER”),
password=os.getenv(“HANA_DB_PASSWORD”),
sslValidateCertificate=False,
autocommit=True,
)
db = HanaDB(
embedding=embeddings,
connection=connection,
table_name=”TEST_TABLE”
)
print(“ HANA Vector Store is ready!”) これで LangChain から HANA Cloud へ接続し、内部埋め込みモデルとベクターストアを利用する準備が整いました。次のステップでは テキストファイル をチャンク化 → 埋め込み生成 → TEST_TABLE に格納し、RAG に必要な類似度検索を構築します。 5 | RAG の基礎 – 類似度検索で関連ドキュメントを取り出す本章では Retrieve パートを作り、質問に関連するテキストを 2 件表示できる 類似度検索 までを実装します。まずは、類似度検索の材料となるテキストファイルを読み込み、Embedding に最適なサイズ(約 100 文字)の テキストチャンク に分割します。下記リンクからテキストファイル sap_jp_corpus.txt をダウンロードし、ノートブックと同じフォルダに置いてください。
https://drive.google.com/drive/folders/1wYLPcKrsgUs6P7JqDgHS30qoGE-gt3Av?usp=sharingその上で、以下のセルを追加します。#
Notebook Cell 8
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
text_documents = TextLoader(“sap_jp_corpus.txt”).load()
text_splitter = CharacterTextSplitter(
chunk_size=100,
chunk_overlap=0,
)
text_chunks = text_splitter.split_documents(text_documents)
print(f”Number of document chunks: {len(text_chunks)}”)このセルで何をしているかTextLoader: テキストファイルを 1 文書として読み込むことができます。CharacterTextSplitter: 100 文字ずつチャンク化します。結果は text_chunks(Document オブジェクトのリスト)に格納します。 次に、テキストチャンクを HANA Cloud のベクターストアへ格納します。以下のセルを追加します。# Notebook Cell 9
db.delete(filter={})
db.add_documents(text_chunks)このセルで何をしているかdb.delete(filter={}): 既存行を削除することで、デモ用テーブルを初期化します。add_documents: テキストチャンクを埋め込み処理して TEST _TABLE に書き込みます。 それでは類似度検索を実装してみましょう。以下のセルを追加します。# Notebook Cell 10
query = “セキュリティ体制を知りたい”
docs = db.similarity_search(query, k=2)
for doc in docs:
print(“-” * 80)
print(doc.page_content)ここでは、ユーザーが入力したクエリ文を 同じ Embedding モデル でベクトル化します。そして、HANA Cloud に格納していたベクトルと類似度の高い 2 チャンクを返却します。検索結果が「セキュリティ方針」「アクセス制御」など、質問に関連した内容になっていれば成功です! 6|チャレンジ – 独自埋め込みモデルで精度を比べようPart 2 のチャレンジで OpenAI Embedding モデル をデプロイしていました。そのモデルを使って 同じデータ、同じクエリ で結果を比較してみましょう。# Notebook Cell 11
from gen_ai_hub.proxy.langchain.openai import OpenAIEmbeddings
from langchain_hana import HanaDB
from hdbcli import dbapi
import os
# Embedding を差し替える
openai_embed = OpenAIEmbeddings(
deployment_id=os.getenv(“EMBED_DEPLOYMENT_ID”) # Part2 で控えた ID
)
# 別テーブルに保存して比較しやすく
db_alt = HanaDB(
embedding=openai_embed,
connection=connection,
table_name=”TEST_TABLE_OAI”
)
db_alt.delete(filter={})
db_alt.add_documents(text_chunks)
# 同じクエリで検索
alt_docs = db_alt.similarity_search(query, k=2)
print(“n=== OpenAI Embedding の結果 ===”)
for doc in alt_docs:
print(“-” * 80)
print(doc.page_content)比較ポイントHANA 内蔵モデル vs. OpenAI モデル でヒットするチャンクがどう変わるか試してみましょう。短文の質問 / 長文の質問など、複数パターンで試すと差が見えやすいはずです。 7|次回予告Part 5 RAG 基礎 ②: Retriever Toolの構築Part 5 では、いま作成した HANA Cloud ベクターストア を RAG ツールとして LangChain Agent に組み込み、Google 検索ツールと合わせた “二刀流エージェント” を動かしてみます。お楽しみに! 免責事項免責事項 – 本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。 Read More Technology Blog Posts by SAP articles
#SAP
#SAPTechnologyblog