ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
Oracle Digital Assistant、OCI Data Science、LangChain、Oracle Database 23aiによるエンタープライズ・チャットボットの作成
イントロダクション
今日のデジタル環境では、チャットボットはよりインテリジェントで応答性が高く、複雑なインタラクションを処理できるように進化しています。このチュートリアルでは、AIクイック・アクションやモデル・デプロイメント、Mistral-7B-Instruct-v0.2、Oracle Database 23ai、LangChain、Oracle Digital AssistantなどのOracle Cloud Infrastructure (OCI) Data Science機能のパワーを活用して、次世代のチャットボットの作成について説明します。これらの各テクノロジーは、独自の強みを備えており、ユーザー・クエリを理解して対応できるだけでなく、シームレスで魅力的な会話体験を提供するチャットボットを構築できます。
Oracle Database 23aiの優れた機能の1つは、高度なベクトル検索機能です。この技術により、テキストを高次元ベクトルに変換し、関連性を比較することで、情報を効率的に取得できます。取得拡張生成(RAG)パイプラインに統合されると、Oracle Database 23aiのベクトル検索により、膨大なデータセットから最も関連性の高い情報にアクセスして配信するチャットボットの機能が強化されます。これにより、生成されるレスポンスは、コンテキスト上正確であるだけでなく、ユーザーの問合せにも非常に関連性があります。
Oracle Digital Assistantは、会話型AIソリューションを構築、導入、管理するための堅牢なプラットフォームを提供することで、チャットボットの機能をさらに高めます。事前構築済みのコネクタ、自然言語理解(NLU)および対話管理を提供し、開発プロセスを合理化し、スムーズなユーザー・エクスペリエンスを実現します。Oracle Digital AssistantとRAGパイプラインを組み合せることで、チャットボットは複雑なインタラクションを処理し、自然な会話の流れを維持できるため、ユーザーのエンゲージメントと満足度が向上します。
開発者は、RAGパイプライン内でOracle Database 23aiとOracle Digital Assistantの相乗効果を活用することで、取得精度と会話流動性の両方に優れるチャットボットを作成できます。この統合アプローチにより、高度なチャットボットの構築に必要な時間と労力を削減するだけでなく、スケーラブルで効率的かつ優れたユーザー・エクスペリエンスを提供できるソリューションを実現できます。あなたが開発者であれ、技術の熱狂者であれ、顧客エンゲージメントの強化を目指すビジネスリーダーであれ、このチュートリアルでは、混雑したデジタル分野で際立つ高度なチャットボットを構築するための知識とツールを提供します。
プロセスのステップ・バイ・ステップのウォークスルーは、AIサンプルGitHubリポジトリを参照してください。
使用例
次に、これが役立つ例をいくつか示します。
-
パーソナライズされたカスタマー・サポート:ガイドブックと顧客履歴の両方に問い合わせることで、顧客の問題をより的確に把握し、問題の診断と解決を迅速に行うことができます。
-
サプライ・チェーン最適化:ベンダー・データを社内のビジネス注文または出荷データで問い合せると、意思決定が向上し、サプライ・チェーンの変化に迅速に対応できます。
-
営業の最適化: CRMデータを問い合せて、潜在的なリードを特定し、取引成立の可能性を高める戦略を提案します。
Oracle AI Vector Searchのメリット
Oracle Databaseは、運用データとエンタープライズ・データの主要なリポジトリです。通常、エンタープライズ・アプリケーションでは、ビジネス・データと非構造化データの組合せを検索する必要があります。たとえば、小売Webサイトでは、自然言語の製品説明およびターゲット製品イメージに基づく検索を、価格、店舗の場所、製造業者および現在の可用性などの他のフィルタとともに機能できます。この検索では、非構造化カタログ・データ(製品の説明とイメージ)、構造化カタログ・データ(価格、店舗の場所、製造業者)およびリアルタイム・トランザクション・データ(現在の在庫など)を同時に検索する必要があります。
高レベル・アーキテクチャ・ソリューションの概要
図: RAGパイプラインの高レベル・アーキテクチャ
次の図は、Mistral-7B-Instruct-v0.2、Oracle Database 23ai、RAG、LangChainおよびOracle Digital Assistantを使用して高度なチャットボットを構築するアーキテクチャとワークフローを示しています。次に、次のアーキテクチャに関連する詳細なステップを示します。
-
ユーザー・インタラクション:ユーザーは、Oracle Digital Assistantインタフェースを介してチャットボットにリクエストを送信します。
-
リクエスト処理: Oracle Digital Assistantはリクエストを受信し、OCI Data Scienceインフラストラクチャに転送します。
-
問合せ処理: 2つのステップがあります。
- OCIデータ・サイエンス内では、リクエストはLangChainにルーティングされます。これは、様々なモデル・デプロイメント間の相互作用を管理するためのオーケストレータとして機能します。
- LangChainは、リクエストを処理し、外部ドキュメントおよびエンタープライズ・データからの情報取得の必要性を識別します。
-
ベクトル化:このステップには、次のサブプロセスが含まれます。
- リクエストは埋込みモデル・デプロイメントに送信され、問合せは高次元のベクトル表現に変換されます。
- このベクトル化された問合せは、ベクトル検索のためにOracle Database 23aiに送信されます。
-
データ取得:このステップには、次のサブプロセスが含まれます。
- Oracle Database 23aiは、PDFおよびHTML形式のドキュメントの形式で非構造化データに対して類似性検索を実行し、その検索をデータベース内の他のビジネス・データに対して通常の検索と組み合せます。
- 関連するドキュメントまたはチャンクが取得され、次のステップに送信されてさらに処理されます。
-
再ランク付け:
- 生成されたレスポンスは、再ランク・モデル・デプロイメントによってさらに絞り込むことができます。
- 再ランク・モデルでは、応答を評価およびランク付けして、最も関連性が高く正確な応答が選択されるようにします。
-
外部モデルの問合せ:このステップでは、データが取得され、レスポンスが生成されます。
- 取得された情報は、OCIデータ・サイエンスのAIクイック・アクション機能を使用してプロビジョニングされたMistral-7B-Instruct-v0.2モデル・デプロイメントの問合せを生成するために使用されます。
- Mistral-7B-Instruct-v0.2モデルでは、問合せが処理され、そのトレーニングおよび取得されたコンテキストに基づいてレスポンスが生成されます。
-
レスポンス生成:リファイン・レスポンスは、最終出力を統合するLangChainに返されます。
-
ユーザーへのレスポンスの送信:
- 最終レスポンスがデジタル・アシスタントに返されます。
- Oracle Digital Assistantは、ユーザーにレスポンスを配信します。
目的
- AIクイック・アクションやモデル・デプロイメント、Mistral-7B-Instruct-v0.2、Oracle Database 23ai、LangChain、Oracle Digital Assistantなど、OCI Data Science機能の最新テクノロジを活用してチャットボットを構築します。基本的なAIモデルの設定から、シームレスな会話エクスペリエンスへの統合まで、各ステップをガイドします。このチュートリアルを終えるまでには、これらの高度なツールを活用して、自然で魅力的な方法でユーザーを理解し、対話できるインテリジェントで応答性が高く、非常に効果的なチャットボットを作成する方法についての包括的な理解があります。
前提条件
OCI Data Science Serviceで分散ファインチューニング・プロセスの実行に進む前に設定する必要がある主な前提条件。
-
次のポリシーが必要です。
-
セキュリティ・リストを使用してカスタム・サブネットを構成し、サブネットのCIDRブロック内で発生したIPからの任意のポートへのイングレスを許可します。これは、サブネット上のホストが分散トレーニング中に相互に接続できるようにするためです。詳細は、ネットワーキングを参照してください。
-
OCI Data Scienceサービス・リソースがOCI Object Storageバケット、ネットワーキングなどにアクセスできるようにするポリシーを設定します。詳細は、OCIポリシーを参照してください。
-
HuggingFaceからトークンにアクセスして、Mistral-7B-Instruct-v0.2モデルをダウンロードします。モデルを微調整するには、まず事前トレーニング済モデルにアクセスする必要があります。事前トレーニング済モデルは、HuggingFaceから取得できます。このチュートリアルでは、HuggingFaceアクセス・トークンを使用して、HuggingFaceから事前トレーニング済モデルをダウンロードします(
HUGGING_FACE_HUB_TOKEN
環境変数を設定します)。 -
OCIロギング・サービスからのログ・グループおよびログ。これは、トレーニングの進行状況を監視するために使用されます。
-
OCIロギング・サービスに移動し、「ログ・グループ」を選択します。
-
既存のログ・グループのいずれかを選択するか、新しいログ・グループを作成します。
-
ログ・グループで、2つのログ(1つの予測ログと1つのアクセス・ログ)を作成します。
- 「カスタム・ログの作成」をクリックします。
-
名前の指定(予測) access)使用するログ・グループを選択します。 - 「エージェント構成の作成」で、「後で構成の追加」を選択します。
- 「エージェント構成の作成」をクリックします。
-
-
分散トレーニングを開始し、ファインチューニング・モデルにアクセスするために使用されるノートブック・セッション。詳細は、ノートブック・セッションを参照してください。
-
Oracle Accelerated Data Science (ADS)の最新バージョンをインストールします
pip install oracle-ads[opctl] -U
タスク1: 必要なモデルのデプロイ
タスク1.1: Mistral-7B-Instruct-v0.2モデルのデプロイ
AIクイック処理モデル・デプロイメント機能を活用して、数回のクリックでMistral-7B-Instruct-v0.2をデプロイします。AIクイック・アクション・モデル・デプロイメントにより、ユーザーは数回のクリックでMistral-7B-Instruct-v0.2をデプロイし、ユーザーにエンドポイントを提供できます。
タスク1.2: Jina埋込みモデルのデプロイ
-
ノートブックで、Jine Embeddingモデル・ファイルをhttps://huggingface.co/jinaai/jina-embeddings-v2-base-en/tree/mainから
ads_embedding_model_dir
ディレクトリにコピーします。 -
score.py
ファイルを現在のディレクトリ(/home/datascience/
など)にアップロードします。 -
次のコードを実行します。
import tempfile import ads from ads.model.generic_model import GenericModel from config import CONDA_PACK_PATH, LOG_GROUP_ID, EMBEDDING_MODEL_ACCESS_LOG_LOG_ID, EMBEDDING_MODEL_PREDICT_LOG_LOG_ID ads.set_auth("resource_principal") embedding_model = GenericModel( model_file_name="model-w-mean-pooling.onnx" ,artifact_dir="ads_embedding_model_dir",estimator=None, serialize=False) embedding_model.summary_status() embedding_model.prepare( inference_conda_env=CONDA_PACK_PATH, inference_python_version = "3.9", model_file_name="model.onnx", score_py_uri= "score.py", force_overwrite=True ) op=embedding_model.verify(['Can you please give some overview on Oracle Database 23.4']) print(op['embeddings']); embedding_model.save(display_name="jina-embedding") embedding_md = embedding_model.deploy( display_name = "Jina Embedding Model Deployment", deployment_log_group_id = LOG_GROUP_ID, deployment_access_log_id = EMBEDDING_MODEL_ACCESS_LOG_LOG_ID, deployment_predict_log_id = EMBEDDING_MODEL_PREDICT_LOG_LOG_ID, ) output = embedding_md.predict(['Can you please give some overview on Oracle Database 23.4']) print(output['embeddings']);
タスク1.3: Bge-Rerankerモデルのデプロイ
次のコードを実行します。
import ads
from FlagEmbedding import FlagReranker
from ads.model.generic_model import GenericModel
from ads.model.model_metadata import MetadataCustomCategory
from config import CONDA_PACK_PATH, LOG_GROUP_ID, RERANKER_MODEL_ACCESS_LOG_LOG_ID, RERANKER_MODEL_PREDICT_LOG_LOG_ID
#
# This custom class wrap the reranker model
#
class Reranker:
def __init__(self, model_id):
self.model_id = model_id
self.reranker = FlagReranker(self.model_id, use_fp16=True)
def predict(self, x):
# x is expected as a list of list of str
# [["x1", "x2"]] -> y = [score12]
scores = self.reranker.compute_score(x)
return scores
reranker_model = Reranker(model_id="BAAI/bge-reranker-large")
reranker_payload = [
["what is panda?", "It is an animal living in China. In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
["what is panda?", "The giant panda is a bear species endemic to China.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by.In the future model input will be serialized by"],
]
reranker_model.predict(reranker_payload)
reranker_generic_model = GenericModel(estimator=reranker_model, artifact_dir="./reranker_dir")
reranker_generic_model.summary_status()
reranker_generic_model.prepare(
reload=False,
inference_conda_env=CONDA_PACK_PATH,
inference_python_version="3.9",
model_file_name="reranker.pkl",
force_overwrite=True
)
reranker_generic_model.save(
display_name="reranker2-baai-large",
bucket_uri="oci://reranker_bucket@bigdatadatasciencelarge/reranker/",
ignore_introspection=True
)
reranker_md = reranker_generic_model.deploy(
display_name = "reranker2-baai-large",
deployment_log_group_id = LOG_GROUP_ID,
deployment_access_log_id = RERANKER_MODEL_ACCESS_LOG_LOG_ID,
deployment_predict_log_id = RERANKER_MODEL_PREDICT_LOG_LOG_ID,
deployment_instance_shape="VM.Standard2.4",
)
タスク2: Oracle Database 23aiの設定
Oracle Database 23aiの最新機能、特にOracle AI Vector Searchをユースケースに活用します。このシナリオでは、データセットから生成された埋込みをOracle Database 23aiにインポートします。ユーザーがRAGを使用して問い合せると、LLMに追加のコンテキストを提供することでレスポンスが拡張されます。次の図は、Oracle Database 23aiを使用する利点の一部を示しています。
図: Oracle Database 23aiの検索機能(ソース)の図
これにより、知識が増大し、より正確で顧客の問い合わせに関連する回答が得られます。Oracle Database 23aiを設定するには、前述のオプションに従います。
-
コンテナ・インスタンスの使用。詳細は、Oracle Autonomous Database Free Container Imageの使用を参照してください。
-
Pythonクライアントの使用
Oracle Database 23aiのホスト・インスタンスを使用して、Oracle AI Vector Searchの強力な機能をデモンストレーションします。
タスク3: Oracle Database 23aiへの解析、チャンク化および格納の埋込み
次のコード・スニペットでは、ドキュメントの解析方法、ドキュメントのチャンクへの変換方法、およびOracle Database 23aiでの埋込みの格納方法の概要を示します。詳細は、oda-oci-data-science-oracledb-23ai-llmを参照してください。
Oracle Database 23aiの初期化
def load_documents(embedding_model):
# connect to db
# Configure logging
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info("Connecting to Oracle DB...")
DSN = f"{DB_HOST_IP}/{DB_SERVICE}"
with oracledb.connect(user=DB_USER, password=DB_PWD, dsn=DSN) as connection:
logging.info("Successfully connected to Oracle Database...")
num_pages = []
for book in INPUT_FILES:
logging.info(f"Processing book: {book}...")
if ENABLE_CHUNKING is False:
# chunks are pages
logging.info("Chunks are pages of the book...")
nodes_text, nodes_id, pages_num = read_and_split_in_pages([book])
num_pages.append(len(nodes_text))
else:
logging.info(f"Enabled chunking, chunck_size: {MAX_CHUNK_SIZE}...")
nodes_text, nodes_id, pages_num = read_and_split_in_chunks([book])
# create embeddings
# process in batch (max 96 for batch, chosen BATCH_SIZE, see above)
logging.info("Computing embeddings...")
embeddings = compute_embeddings(embedding_model, nodes_text)
# determine book_id and save in table BOOKS
logging.info("Registering document...")
book_id = register_document(book, connection)
# store embeddings
# here we save in DB
save_embeddings_in_db(embeddings, nodes_id, connection)
# store text chunks (pages for now)
save_chunks_in_db(nodes_text, nodes_id, pages_num, book_id, connection)
# a txn is a book
connection.commit()
タスク4: Mistral-7B-Instruct-v0.2 AIクイック・アクションLLMへの接続
AIクイック・アクションを使用してモデル・デプロイメントを作成し、そこからモデル・デプロイメント・エンドポイントを取得します。次のコードを実行してLLMに接続します。
import ads
ads.set_auth("resource_principal")
command_md = OCIModelDeploymentVLLM(
endpoint="https://modeldeployment.eu-frankfurt-1.oci.customer-oci.com/ocid1.datasciencemodeldeployment.oc1.<ocid>/predict",
model="odsc-llm"
)
タスク5: RAGの設定
次のRAGアーキテクチャは、次のステップで構成されます。
タスク5.1: 23ai Vectorデータベースへのアップロード
class CustomRetriever(BaseRetriever):
def _get_relevant_documents(
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
) -> List[Document]:
matching_documents = []
#Embedding model
rps = oci.auth.signers.get_resource_principals_signer()
prediction = requests.post(EMBEDDING_MD_ENDPOINT, data=f'["{query}"]', auth=rps)
#Search in DB
q_result = test_oracle_query(prediction.json()['embeddings'][0], TOP_K, True, False)
text_list = []
for n, id, sim in zip(q_result.nodes, q_result.ids, q_result.similarities):
text_list.append(n.text)
paired_list = [[query, text] for text in text_list]
print(f'Reranker payload: {paired_list}')
#ReRanker model
reranker_results = requests.post(RERANKER_MD_ENDPOINT, data=json.dumps(paired_list), auth=rps) # make a prediction request
max_value = max(reranker_results.json()['prediction'])
if max_value < -3:
return matching_documents;
# Find the index of the maximum value
max_index = reranker_results.json()['prediction'].index(max_value)
print(f"The maximum value is: {max_value}")
print(f"The index of the maximum value is: {max_index}")
doc = Document(page_content=paired_list[max_index][1], metadata={"source": "local"})
matching_documents.append(doc)
return matching_documents
customRetriever = CustomRetriever()
chain = RetrievalQA.from_chain_type(
llm=command_md,
retriever=customRetriever
)
prompt = "Can you please give some overview on Oracle Database 23.4?"
res = chain(prompt)
print('Output::')
print(res['result'])
Langchainが提供するプロンプト・テンプレートとQAチェーンを使用してチャットボットを作成します。これは、コンテキストと質問をLLMに直接渡すのに役立ちます。
タスク5.2: LangChainモデルのデプロイ
import tempfile
import ads
from ads.model.generic_model import GenericModel
from config import CONDA_PACK_PATH, LOG_GROUP_ID, LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID, LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID
ads.set_auth("resource_principal")
langchain_model = GenericModel( artifact_dir="langchain_model",estimator=None, serialize=False)
langchain_model.summary_status()
#Copy required python scripts to artifact dir
langchain_model.prepare(
inference_conda_env=CONDA_PACK_PATH,
inference_python_version = "3.9",
model_file_name="test",
score_py_uri= "score_langchain_final.py",
force_overwrite=True
)
op=langchain_model.verify('Can you please give some overview on Oracle Database 23.4?')
model_id = langchain_model.save(display_name="langchain-model")
deploy = langchain_model.deploy(
display_name="Langchain Model Deployment",
deployment_log_group_id = LOG_GROUP_ID,
deployment_access_log_id = LANGCHAIN_MODEL_ACCESS_LOG_LOG_ID,
deployment_predict_log_id = LANGCHAIN_MODEL_PREDICT_LOG_LOG_ID,
environment_variables={"CRYPTOGRAPHY_OPENSSL_NO_LEGACY":"1"},
deployment_instance_shape="VM.Standard2.4",
)
deploy.predict('Can you please give some overview on Oracle Database 23.4?')
タスク6: RAGをホストするチャットボット・アプリケーション用のOracle Digital Assistantを使用したデジタル・アシスタントの作成
タスク6.1: モデル・デプロイメント・エンドポイントの取得およびポリシーの追加
モデルのプロバイダをコールするインスタンスにRESTサービスを追加します。Oracleモデル・デプロイメントを例として使用していますが、任意のLLMにRESTサービスを使用できます。
Oracle Digital Assistantがモデル・デプロイメントの予測エンドポイントにアクセスできるように、ポリシーを追加します。「アイデンティティとセキュリティ」、「ポリシー」に移動し、「ポリシーの作成」をクリックします。
動的グループのポリシー
Allow any-user to {DATA_SCIENCE_MODEL_DEPLOYMENT_PREDICT} in compartment Demo where request.principal.id='ocid1.odainstance.oc1.iad.<ocid>'
ポリシーが作成されると、Oracle Digital Assistantを起動してブラウザで開くことができます。
タスク6.2: LLMプロバイダRESTサービスの作成
-
Oracle Digital Assistantに移動し、「設定」、「APIサービス」、「LLMサービス」に移動して、+Add「LLMサービス」をクリックします。
-
「LLMサービスの作成」ページで、次の情報を入力してプロバイダのエンドポイントへのポスト操作を作成し、「作成」をクリックします。
- 名前:サービスの識別しやすい名前を入力します。この名前は後で参照します。
- エンドポイント:モデル・デプロイメント・エンドポイントをコピーして貼り付けます。
- メソッド: 「POST」を選択します。
-
APIキー、およびリクエストとレスポンスのペイロード・サンプルを追加して、サービスを完了します。
-
認証タイプ: 「OCI Resource Principal」を選択します。
-
コンテンツ・タイプ: 「application/json」を選択します。
-
本文:リクエストに送信されたペイロードを追加します。たとえば次のようにします。
{ "query": "Can you please give some overview on Oracle Database 23.4?" }
-
-
「テスト・リクエスト」をクリックして、
200
レスポンスを確認します。
タスク6.3: スキルの作成
LLMプロバイダRESTサービスをインスタンスに追加して、このサービスをコールし、ダイアログ・フロー定義を介してユーザーをそれに接続できるスキルを作成する必要があります。このスキルを作成するには、ステップに従います。
-
Oracle Digital Assistantに移動し、「開発」および+Skillsに移動します。
-
「+新規スキル」をクリックします。
-
「スキルの作成」ページで、次の情報を入力して「作成」をクリックします。
- 表示名:名前を追加します。
- ダイアログ・モード: 「ビジュアル」を選択します。
- 他のフィールドでは、デフォルト値をそのまま使用します。
タスク6.4: スキルをモデルに接続する
次に、RESTペイロードをLLMプロバイダとOracle Digital Assistantの両方によって受け入れられる形式に変換するイベント・ハンドラを使用してカスタム・コンポーネントを作成することで、スキルがLLM RESTサービスにアクセスできるようにします。
-
左側のナビゲーション・バーから「コンポーネント」アイコンをクリックし、「サービスの追加」をクリックします。
-
「サービスの作成」ページで、次の情報を入力して「作成」をクリックします。
- 名前:サービスを説明する名前を入力します。
- サービス・タイプ:デフォルト設定を受け入れ、「埋込みコンテナ」を選択します。
- コンポーネント・サービス・パッケージ作成タイプ: 「新規コンポーネント」を選択します。
- コンポーネント・タイプ: 「LLM変換」を選択します。
- コンポーネント名:わかる名前を入力します。
- テンプレート: 「カスタム」(「その他」の下)を選択します。
-
完了したコンポーネントが「コンポーネント」ページに表示されます。
-
「コンポーネント」ページからコンポーネントを選択して、そのデプロイメント・ステータスを確認します。「準備完了」が表示されたら、次のステップに進むことができます。
「サービス使用可能」(デフォルト設定)が有効になっていることを確認します。
タスク6.5: LLMサービス・プロバイダとOracle Digital Assistantのリクエストおよびレスポンスのマップ
モデルのサービス・プロバイダに対するスキルのリクエストは、共通LLMインタフェース(CLMI)と呼ばれるOracle Digital Assistantで使用されるインタフェースから、サービス・プロバイダが受け入れる形式に変換する必要があります。同様に、サービス・プロバイダから返された結果もCLMIに変換する必要があります。このマッピングを有効にするには、次のRESTサービス・イベント・ハンドラ・メソッドにプロバイダ固有のコードが必要です。
transformRequestPayload
.transformResponsePayload
.transformErrorResponsePayload
.
イベント・ハンドラ・コード・エディタを開き、変換コード(この場合はAzure OpenAI)を更新するには、次のステップを実行します。
-
サービスを展開し、イベント・ハンドラを選択します。
-
「編集」アイコンをクリックしてエディタを開きます。
-
transformRequestPayload
ハンドラのイベント・メソッド・コード(24行目から26行目)を次のコードに置き換えます。-
transformRequestPayload
:transformRequestPayload: async (event, context) => { return { "query": event.payload.messages[event.payload.messages.length - 1].content }; },
すべてのリクエストは、最後のユーザー入力をLLMプロンプトに渡すだけです。
-
-
transformResponsePayload
ハンドラのイベント・メソッド・コード(35行目から37行目)を次のコードに置き換えます。-
transformRequestPayload
:transformResponsePayload: async (event, context) => { return { candidates: [ { "content": event.payload.prediction || "" }]}; },
-
-
transformErrorResponsePayload
ハンドラのイベント・メソッド・コード(47行目から49行目)を次のコードに置き換えます。-
transformRequestPayload
:transformErrorResponsePayload: async (event, context) => { let errorCode = 'unknown'; if (event.payload.error) { if ( 'context_length_exceeded' === event.payload.error.code) { errorCode = 'modelLengthExceeded'; } else if ('content_filter' === event.payload.error.code) { errorCode = 'flagged'; } return {"errorCode" : errorCode, "errorMessage": event.payload.error.message}; } return {"errorCode" : errorCode, "errorMessage": JSON.stringify(event.payload)}; }
-
-
「検証」をクリックして、コード構文を確認します。修正できない構文エラーが発生した場合は、エディタのコードを置き換えます。
-
「保存」、「閉じる」の順にクリックします。デプロイが完了するまで待ちます。「準備完了」が表示されたら、次のステップに進むことができます。
タスク6.6: スキルのLLMサービスの定義
スキルがダイアログ・フローを介してユーザーをモデルに接続できるようにするには、モデルをコールするインスタンス全体のLLMサービスを変換イベント・ハンドラ(この場合はOracleモデル・デプロイメント用)と組み合せるLLMサービスを作成する必要があります。
-
左側のナビゲーション・バーから「設定」アイコンをクリックします。
-
「構成」をクリックします。
-
「大規模言語モデル・サービス」ページで、+New「LLMサービス」をクリックします。
-
次の情報を入力します
-
名前: LLMサービスの識別しやすい名前を入力します。この名前は、次のステップでダイアログ・フローを作成するときに参照します。
-
LLMサービス: 「タスク1: モデルのRESTサービスの作成」で作成したインスタンス全体のLLMサービスの名前を選択します。
-
変換ハンドラ: タスク3: スキルをモデルに接続でRESTサービスの一部として作成したイベント・ハンドラ・コンポーネントの名前を選択します。
-
残りのプロパティはデフォルト設定のままにします。このチュートリアルでこれまでに作成した唯一のサービスである場合は、「デフォルト」が有効であることに注意してください。
-
-
「保存」をクリックします。
-
スイッチの「フィードバック」およびその他のデフォルトの選択を解除します。
タスク6.7: サービスの統合
スキルがLLMに接続されたら、モデルをコールして何をするかを示すダイアログ・フロー・コンポーネントを作成して、スキルのユーザーをモデルに接続します。コンポーネントは、プロンプト(人間が読めるテキストのブロック)を使用してこれらの指示を伝達します。このタスクでは、ユーザー・フィードバックを正または負または中立として評価することをモデルに指示するこのプロンプトを提供します。
-
左側のナビゲーション・バーからフロー・アイコンをクリックします。
-
unresolvedIntentを選択します。
-
unresolvedMessage状態で、「省略記号(...)」アイコンをクリックし、メニューから「状態の追加」を選択します。
-
「サービス統合」および「大規模言語モデルの起動」を選択します。
-
センチメント分析などの「説明」を入力し、「挿入」をクリックします。
ダイアログ・フローに、
unresolvedMessage
(メッセージの送信)状態、invokeLLM
状態およびshowLLMError
状態が含まれるようになりました。 -
unresolvedMessage
状態では、UnresolvedIntentのエラー・メッセージを表示しないため、「省略記号(...)」アイコンをクリックし、メニューから「削除」を選択します。ダイアログ・フローに
invokeLLM
状態とshowLLMError
状態のみが含まれるようになりました。 -
invokeLLM
状態を開きます。「コンポーネント」ページで、タスク6.6で作成したLLMサービスを選択します。 -
「プロンプト」に次を貼り付けて、LLMサービスに指示を送信するプロンプトを追加します。すべてのユーザーの会話がプロンプト入力として渡される必要があります。
-
PROMPT_INPUT
変数を作成します。「プロンプト・パラメータ+」をクリックして、新しいパラメータとその値を追加します。 -
メッセージが増分ではなく全体として配信されるように、「ストリーミングの使用」を「False」に設定します。
-
プロンプト・ビルダーでプロンプトをテストし、「プロンプトの作成」をクリックします
-
「プロンプト・パラメータ・モック値」を追加し、「出力の生成」をクリックします。これにより、LLM統合を検証できます。
タスク6.8: スキル・テスターを使用したプロンプトのテスト
-
「プレビュー」をクリックして、スキル・テスターを開きます。
-
次のリクエストを入力します: Oracle Database 23.4の概要を教えてください。
出力は次のようになります:
-
LLMの次の問合せ(最新のoracleデータベース)を確認します。
出力は次のようになります:
タスク6.9: Oracle Webユーザー・チャネルの設定
Oracle WebクライアントがスキルにアクセスできるようにするOracle Digital Assistantユーザー・チャネルを作成します。Webクライアントのみがこのチャネルを使用できるように、クライアント認証を要求するように構成します。
-
Oracle Digital Assistantを開き、「開発」、「チャネル」に移動して、+Addチャネルをクリックします。
-
「チャネルの作成」で、次の情報を入力してプロバイダのエンドポイントへのPOST操作を作成し、「作成」をクリックします。
- 名前:文字で始まり、文字、数字、ピリオドおよびアンダースコアのみを含む一意の名前。たとえば、
OCI_MD_LLM
です。 - 説明(オプション):チャネルの使用目的。
- チャネル・タイプ: 「Oracle Web」を選択します。
- 許可されたドメイン:
*
と入力します。 - クライアント認証有効:選択を解除します。
- 名前:文字で始まり、文字、数字、ピリオドおよびアンダースコアのみを含む一意の名前。たとえば、
-
まだ無効になっていない場合は、「クライアント認証の有効化」の選択を解除します。
-
「ルート」で、使用するスキルを選択します。LLM-MD-Skillである現在のスキルを選択しました。
-
「チャネル使用可能」を有効にします。
-
httpsのないチャネルIDおよびODAドメインURIに注意してください。これは、このチャネルに表示されます。
これらの値は、Webアプリケーションおよびトークン・ジェネレータのルーティング構成で使用します。
タスク6.10: SDKのインストール
zipをダウンロードし、ローカル・システムに抽出します。このzipには、SDKのクラスを説明するユーザー・ガイドと、その多くの機能をデモで示すサンプル・アプリケーションが含まれます。
-
Oracle Digital Assistant (ODA)およびOracle Mobile Cloud (OMC)のダウンロードおよびOracle Native Client SDK (OCIネイティブ環境用) Web SDKの項に移動します。
-
ODA Web SDK 24.06をダウンロードします。
-
「プラットフォーム」で、「GENERIC」を選択します。
-
oda-native-client-sdk-js-24_06 for (GENERIC (All Platforms)
の最新のODA Js SDKをダウンロードする場合にクリックします。 -
ダウンロードしたzipファイルを抽出します。
タスク6.11: Oracle Webアプリケーションのテスト
-
ダウンロードしたOracle Web SDKの抽出されたzipフォルダに移動します。
-
samples/web/settings.js
ファイルを開き、<URI>
および<channelId>
を実際の値に置き換えます。たとえば次のようにします。
- URI:
oda-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-dax.data.digitalassistant.oci.oraclecloud.com
。 - ChannelId:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
.
- URI:
-
また、
isClientAuthEnabled
がfalseであることを確認します。let isClientAuthEnabled = false;
-
任意のブラウザで
samples/web/index.html
ファイルを実行します。 -
索引ファイルの内容を無視します。チャット・アイコンをクリックすると、Oracle Assistant CONNECTEDステータスが表示されます。
-
右下隅のチャットアイコンで当社のウェブサイトがどのように見えるかです。以前にスキル・テスターで行ったように、会話を開始できます。
タスク6.12: OCIコンピュート・インスタンスでのリリース
-
OCIコンピュート・インスタンスを作成します。詳細は、インスタンスの作成を参照してください
-
イングレス・ルールに従っていることを確認します。
-
新規作成されたインスタンスにすべてのWebフォルダをコピーします。
-
NGINXをインストールします。詳細は、Oracle LinuxでのNGINX Webサーバーおよびプロキシのインストールを参照してください。
-
ブラウザを開き、
http://<IP_address>/
に移動します。自己署名証明書がある場合は、https://<IP_address>/
にナビゲートできます。
結果
LLMに直接尋ねる出力とLLMでRAGを使用する出力を比較してみましょう。
-
LLMからのレスポンス
-
RAGからの応答
次のステップ
Oracle Database 23ai、RAG、LangChain、Mistral-7B-Instruct-v0.2、およびOracle Digital Assistantを使用して高度なチャットボットを構築すると、応答性が高くインテリジェントな会話エージェントを作成するために、最先端のテクノロジーを統合する力が示されます。リクエスト処理からレスポンス生成までの詳細なワークフローにより、チャットボットは大量の情報を効率的に取得して処理し、正確で状況に応じた回答をユーザーに提供できます。Oracle Database 23aiのベクター検索機能とOracle Digital Assistantが提供する堅牢なプラットフォームを活用することで、開発者はチャットボットのパフォーマンスとユーザー・エンゲージメントを大幅に強化できます。この統合アプローチにより、開発プロセスが合理化されるだけでなく、デジタル・アシスタントの競争環境において際立つ、スケーラブルで効率的かつ非常に効果的なAIソリューションが実現します。この高度なチャットボット・アーキテクチャは、カスタマー・サービス、情報取得、インタラクティブなサポートのいずれであっても、現代のユーザーの要求を満たす高度な会話型エクスペリエンスを創出する手段となります。
AIクイック・アクションの使用方法の詳細は、Oracle Cloud Infrastructure Data ScienceのYouTubeプレイリストでAIクイック・アクションのデモ・ビデオを参照し、テクニカル・ドキュメンテーションを参照して、ヒントと例を記載したGithubリポジトリを参照してください。
AIクイック・アクションに追加する特定のモデルを提案する場合、または質問がある場合は、OCIデータ・サイエンス・グループ(ask-oci-data-science_grp@oracle.com)に電子メールで送信してください。
関連リンク
-
Oracle Cloudの無料トライアルをお試しください。300USドルの無料クレジットが付いた30日間のトライアルでは、Oracle Cloud Infrastructure Data Scienceサービスにアクセスできます。詳細は、次のリソースを参照してください:
-
新しいGitHubリポジトリのスターリングとクローンを作成してください。ノートブック・チュートリアルとコード・サンプルが含まれています。
-
YouTubeに関するチュートリアルを見る
-
Oracle Data Scienceを検索し、LiveLabsを試してください。
承認
-
著者 - Shekhar Chavan (OCI Data Science、技術スタッフ主任メンバー)、Ashutosh Kumar (OCI Data Science、技術スタッフ主任メンバー)
-
貢献者 - Piyush Gajjariya (OCI Data Science、ソフトウェア開発マネージャー)、Tzvi Keisar (製品管理担当ディレクター)、SriRanjith R (OCI Data Science、シニア・メンバー技術スタッフ)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Build an Enterprise Chatbot with Oracle Digital Assistant, OCI Data Science, LangChain and Oracle Database 23ai
G13777-01
August 2024