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
882

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

お知らせ
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 を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!


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

1|はじめに

一般的なチャット モデルは企業固有の用語や業務プロセスを十分に理解できず、回答が的外れになることがあります。前章では Google 検索ツール をエージェントに渡し、インターネット上の最新情報を参照できるようにしましたが、これだけでは社内文書やナレッジには対応できません。
そこで本章では、社内ドキュメントを SAP HANA Cloud Vector Engine にあらかじめ格納します。そして、その情報を検索・参照して回答を生成する RAG(Retrieval‑Augmented Generation) の基礎である類似度検索を構築します。

 

2 | 事前準備

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

Trial 環境の注意
Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。

 

3 | HANA Cloud インスタンスを作成する

まず RAG(Retrieval-Augmented Generation) をおさらいしましょう。
RAG は「検索 → 生成」という 2 段階構成で、

  1. Retrieve(検索) – クエリに近い文書をベクトル類似度で取り出す
  2. 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 EnvironmentCloud Foundry に変更してください。

    Ryota_Ito_0-1747133948260.png
  • Additional Features にて Natural Language Processing (NLP) を ON にしてください
    また、Connection にて Allowed Connections を Allow all IP addresses に変更してください。
    Ryota_Ito_2-1747134051290.png

HANA Cloud Central で作成完了後、BTP Cockpit にインスタンスが表示されます。
SAP AI Core と同様に サービスキー を発行し、RAG での接続に備えます。

HANA Cloud Service Key.png

 

4 | LangChain で HANA Cloud とやり取りする

このセクションでは LangChain 公式コネクタ を使って HANA Cloud に接続し、インスタンス内の埋め込みモデルを呼び出せる状態までセットアップします。手順は公式ドキュメントにも載っているので、一度目を通すと流れがつかみやすくなります。

サービスキー情報を.envファイルに追加します。 “秒速で学ぶ” 方針に合わせ、ユーザーを新規作成せず DBADMIN を流用します。実運用では専用ユーザーを切り分けてください。

サービスキー項目.envでの環境変数例設定値
hostHANA_DB_ADDRESS例: XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX.hana.trial-us10.hanacloud.ondemand.com
portHANA_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)}")

このセルで何をしているか

  1. TextLoader: テキストファイルを 1 文書として読み込むことができます。
  2. CharacterTextSplitter: 100 文字ずつチャンク化します。
  3. 結果は text_chunks(Document オブジェクトのリスト)に格納します。

 

次に、テキストチャンクを HANA Cloud のベクターストアへ格納します。以下のセルを追加します。

# ▶ Notebook Cell 9
db.delete(filter={})
db.add_documents(text_chunks)

このセルで何をしているか

  1. db.delete(filter={}): 既存行を削除することで、デモ用テーブルを初期化します。
  2. 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 チャンクを返却します。

検索結果が「セキュリティ方針」「アクセス制御」など、質問に関連した内容になっていれば成功です!

Ryota_Ito_3-1747134861794.png

 

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 は本ブログの内容について一切の責任を負いません。