生成 AI は研究室の外へ飛び出し、今やビジネス現場の常識を塗り替えています。SAPは全速力でその波に乗っています。このブログシリーズでは、SAP AI Core の既定モデルを最速で呼び出し、実務で使える AI エージェントへ拡張する“秒速ハンズオン”をお届けします。
お知らせ
You can find the English version here.
学習時間
各章は 10–15 分 で読める&手を動かせるを予定しています。
注記
続編は順次公開予定です。
この記事がお役に立ったら、ぜひ Kudos を押していただけると励みになります。 「ここをもっと詳しく知りたい」「別のテーマも取り上げてほしい」など、ご要望があればお気軽にコメントください!
一般的なチャット モデルは企業固有の用語や業務プロセスを十分に理解できず、回答が的外れになることがあります。前章では Google 検索ツール をエージェントに渡し、インターネット上の最新情報を参照できるようにしましたが、これだけでは社内文書やナレッジには対応できません。
そこで本章では、社内ドキュメントを SAP HANA Cloud Vector Engine にあらかじめ格納します。そして、その情報を検索・参照して回答を生成する RAG(Retrieval‑Augmented Generation) の基礎である類似度検索を構築します。
Trial 環境の注意
Trial の HANA Cloud インスタンスは 毎晩自動停止 されます。日をまたぐ作業の場合は翌日インスタンスを再起動してください。
まず RAG(Retrieval-Augmented Generation) をおさらいしましょう。
RAG は「検索 → 生成」という 2 段階構成で、
という流れを取ります。検索フェーズで 社内の確かな情報 を与えることで、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 に変更してください。
HANA Cloud Central で作成完了後、BTP Cockpit にインスタンスが表示されます。
SAP AI Core と同様に サービスキー を発行し、RAG での接続に備えます。
このセクションでは LangChain 公式コネクタ を使って HANA Cloud に接続し、インスタンス内の埋め込みモデルを呼び出せる状態までセットアップします。手順は公式ドキュメントにも載っているので、一度目を通すと流れがつかみやすくなります。
サービスキー情報を.envファイルに追加します。 “秒速で学ぶ” 方針に合わせ、ユーザーを新規作成せず DBADMIN を流用します。実運用では専用ユーザーを切り分けてください。
サービスキー項目 | .envでの環境変数例 | 設定値 |
host | HANA_DB_ADDRESS | 例: XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX.hana.trial-us10.hanacloud.ondemand.com |
port | HANA_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 に必要な類似度検索を構築します。
本章では 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)}")
このセルで何をしているか
次に、テキストチャンクを HANA Cloud のベクターストアへ格納します。以下のセルを追加します。
# ▶ Notebook Cell 9
db.delete(filter={})
db.add_documents(text_chunks)
このセルで何をしているか
それでは類似度検索を実装してみましょう。以下のセルを追加します。
# ▶ 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 チャンクを返却します。
検索結果が「セキュリティ方針」「アクセス制御」など、質問に関連した内容になっていれば成功です!
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)
比較ポイント
Part 5 RAG 基礎 ②: Retriever Toolの構築
Part 5 では、いま作成した HANA Cloud ベクターストア を RAG ツールとして LangChain Agent に組み込み、Google 検索ツールと合わせた “二刀流エージェント” を動かしてみます。お楽しみに!
本ブログに記載された見解および意見はすべて私個人のものであり、私の個人的な立場で発信しています。SAP は本ブログの内容について一切の責任を負いません。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
45 | |
24 | |
18 | |
11 | |
10 | |
7 | |
6 | |
5 | |
5 | |
5 |