Amazon Web Services ブログ

Amazon Bedrock と Oracle Database@AWS で生成 AI ユースケースを加速する

本記事は 2025 年 11 月 19 日 に公開された「Accelerate generative AI use cases with Amazon Bedrock and Oracle Database@AWS」を翻訳したものです。

Oracle Database バージョン 26ai では、ベクトル埋め込みの保存と、キーワードではなくセマンティクスに基づくデータ検索が可能になり、音声アシスタント、チャットアシスタント、言語翻訳、レコメンデーションシステム、異常検知、動画検索・認識などの生成 AI アプリケーションを開発できます。Oracle AI Database 26ai の AI Vector Search を使うと、大規模言語モデル (LLM) を再学習することなく、重要なコンテキストを活用した Retrieval Augmented Generation (RAG) アプリケーションを構築できます。コンテキストは Oracle AI Database 26ai に保存・検索・取得され、LLM に渡すことで、プロンプトに対して正確で最新かつ的確な回答を生成します。Oracle AI Database 26ai の AI Vector Search と LLM を組み合わせた RAG により、社内のビジネス情報を安全に活用して重要なビジネス上の質問への回答やさまざまなユースケースのコンテンツ生成が可能です。

Oracle AI Database 26ai は VECTOR データ型をサポートし、データベース内にビジネスデータと並べてベクトル埋め込みを保存する基盤を提供します。埋め込みモデルを使えば、非構造化データをベクトル埋め込みに変換し、ビジネスデータに対するセマンティック検索に活用できます。ベクトル埋め込みは Oracle Database の外部で生成でき、Amazon Bedrock でホストされる事前学習済み埋め込みモデル、オープンソースの埋め込みモデル、または独自の埋め込みモデルを利用できます。AWS では、ユースケースや要件に応じて Amazon OpenSearch ServiceAmazon Aurora PostgreSQL-Compatible EditionAmazon DocumentDB など、さまざまなベクトルデータベースの選択肢があります。本記事では、Oracle Database@AWS (ODB@AWS) と Amazon Bedrock を統合し、Amazon Bedrock の Amazon Titan 埋め込みモデルと Oracle AI Database 26ai に保存されたベクトルを使って RAG アシスタントアプリケーションを構築する手順を解説します。

ODB@AWS では、AWS データセンター内で Oracle Cloud Infrastructure (OCI) が管理する Oracle Exadata インフラストラクチャにアクセスできます。オンプレミスの Exadata と同等のパフォーマンスと機能を維持しながら、Oracle Exadata ワークロードを AWS に移行できます。ODB@AWS は Exadata Database Service および Autonomous Database Service on Dedicated Infrastructure で Oracle Database 19c と 26ai の両バージョンをサポートしています。Amazon Redshift との Zero-ETL 連携、バックアップ用の Amazon S3 連携、モニタリング用の Amazon CloudWatch、Amazon Bedrock、Amazon SageMaker AI などの生成 AI サービスとの統合により、生成 AI アプリケーションを構築できます。

Oracle AI Database 26ai のベクトル機能の概要

Oracle AI Database 26ai は AI Vector Search 機能を通じてベクトル機能を提供し、ODB@AWS 上で AI ワークロードを実行できます。主な機能は次のとおりです。

ネイティブ VECTOR データ型と操作

Oracle AI Database 26ai は新しい VECTOR データ型を導入し、テーブルカラムに高次元ベクトルを直接保存できます。単一の統合データベース環境内でベクトルデータの保存、クエリ、分析操作を実行できます。AI Vector Search 機能がネイティブに統合されており、類似検索、ベクトルとリレーショナルデータを組み合わせたハイブリッドクエリ、外部サービスを必要としない高度な分析が可能です。

ベクトルは、SecureFiles LOB に保存されたドキュメント、PDF、画像などの非構造化データ、メタデータやコンテキスト用の JSON データ、高度な分析や AI ベースのレコメンデーション用のグラフデータや空間データと共存できます。複雑性を低減しセキュリティを向上させつつ、セマンティック検索とビジネスコンテキストを組み合わせたハイブリッドクエリを実現します。

柔軟なベクトル生成

Oracle は Python や REST API を通じて外部の埋め込みモデルや LangChainLlamaIndex などの RAG フレームワークと柔軟に統合できます。また、事前学習済み埋め込みモデルを ONNX 形式で直接データベースにインポートし、データベース環境内でベクトル埋め込みを生成することも可能です。ただし、データベースへの性能負荷が増加し、モデルの更新やメンテナンスも必要になります。

AI Smart Scan (Exadata 最適化)

Oracle Database@AWS は Exadata 上で動作するため、AI Smart Scan を使ってベクトルデータを照会し、ベクトル操作を Exadata ストレージサーバーにオフロードします。帯域幅を最適化し、データベース層の CPU 使用率を削減するため、リアルタイムのセマンティック検索やレコメンデーションエンジンなど、大規模な AI/ML アプリケーションに最適です。

専用メモリ割り当て

Oracle は vector_pool と呼ばれる専用メモリ領域を割り当て、Hierarchical Navigable Small World (HNSW) ベクトルインデックスと関連メタデータをデータベースバッファキャッシュとは別に保存します。この領域は Inverted File Flat (IVF) インデックスの作成や、IVF インデックスを持つベーステーブルに対する DML 操作の高速化にも使用されます。トランザクション処理に影響を与えることなく、AI ワークロードの予測可能なパフォーマンスを実現します。

開発とデータ管理の簡素化

開発者は標準 SQL を使って単一の環境内でリレーショナルデータとベクトルデータの両方を扱えるため、学習コストを低減しアプリケーション開発を効率化できます。PL/SQL パッケージを使ったベクトル操作も可能です。汎用データベースにベクトル機能を統合することで、Oracle AI Database 26ai はセキュリティ、高可用性 (RAC など)、パーティショニング、シャーディング、災害復旧などの既存のエンタープライズ機能を活用できます。

ベクトルデータの外部テーブルサポート

Oracle AI Database 26ai のベクトル向け外部テーブルサポートにより、外部ファイルから直接埋め込みを保存・検索でき、コストと柔軟性の面で有利です。ベクトルデータの探索やステージング、リレーショナル情報とベクトル情報を混合した類似検索やハイブリッドクエリの実行、大規模な外部データセットに対する概念実証の分析を、本格的な取り込みの前に行うのに適しています。Amazon S3 上にベクトルデータを持つ外部テーブルを作成し、セマンティック検索を実行できます。

ソリューションの概要

本記事では、Oracle AI Database 26ai をベクトルデータストア、LangChain フレームワーク、Amazon Titan 埋め込みモデル、Amazon Bedrock でホストされる Anthropic Claude LLM モデルを使って RAG AI アシスタントアプリケーションを構築する方法をデモします。

次の図では、ODB@AWS にデプロイした Oracle AI Database 26ai をベクトルストアとして使用しています。AI チャットアシスタントアプリケーションは、ODB ピアリングで ODB ネットワークとピアリングした VPC 内の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにデプロイされています。ODB ネットワークは、AWS アベイラビリティゾーン内の Oracle インフラストラクチャをホストするプライベートな分離されたネットワークです。標準的な VPC とは異なり、ODB ネットワークにはインターネット接続がなく、ODB@AWS リソースのみをサポートします。ODB ピアリングは ODB ネットワークと Amazon VPC 間のプライベートネットワーク接続を確立し、同一ネットワーク上にあるかのようにアプリケーションから Oracle データベースに通信できるようにします。ODB ピアリングは AWS と Oracle の環境を橋渡しし、ピアリングされた VPC に接続された特定の AWS サービスからのトラフィックが ODB ネットワークに到達できるルーティング機能をサポートします。Amazon Bedrock の Amazon Titan 埋め込みモデルでベクトル埋め込みを作成します。Anthropic Claude LLM はセマンティック検索のために Amazon Bedrock から呼び出されます。Amazon Bedrock へのアクセスは、EC2 インスタンスに関連付けられた AWS Identity and Access Management (IAM) ロールを通じて付与されます。

デモのエンドツーエンド RAG ワークフローは、次の大まかなステップで構成されます。

  1. データ取り込み (本デモでは PDF): アプリに PDF を取り込み、テキストコンテンツを読み取って抽出します。
  2. テキストチャンキング: 抽出したテキストを効率的に処理できるよう、小さなチャンクに分割します。テキストのチャンキングは検索品質とレートリミット対策の両面で重要です。
  3. 埋め込み生成: アプリケーションは Amazon Bedrock の Amazon Titan Text Embeddings v2 モデルを使い、テキストチャンクのベクトル表現である埋め込みを生成します。
  4. ベクトルストア: Oracle Database@AWS の Oracle AI Database 26ai (Oracle AI Vector Search) にベクトルとメタデータを保存します。
  5. ユーザーの質問: ユーザーがチャットボットに自然言語で質問を入力します。
  6. 類似度マッチング: ユーザーが質問すると、アプリはテキストチャンクと比較し、セマンティックに最も類似したチャンクを特定します。
  7. RAG: Streamlit UI 上に構築されたアプリケーションを通じて、Amazon Bedrock の Anthropic Claude 3 Sonnet モデルで検索拡張型 Q&A を実行します。
  8. レスポンス: LLM が PDF の関連コンテンツに基づいて回答を生成します。

完全なコードは GitHub リポジトリを参照してください。

前提条件

このソリューションを実装するにあたり、以下の前提条件を満たし、必要なリソースを作成しています。

  • AWS リージョンで Amazon Bedrock にアクセスできる AWS アカウント。Amazon Bedrock では、API を使ってモデルを呼び出す前に、基盤モデル (FM) へのアクセスをリクエストする必要があります。生成 AI アプリケーションを構築・実行するには、Amazon Bedrock でモデルアクセスを設定する必要があります。Amazon Bedrock は AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon など複数のプロバイダーからさまざまな FM を提供しています。
  • ベクトルストアとして使用する Oracle Database@AWS 上の Oracle AI Database 26ai。本デモのアーキテクチャでは、ODB@AWS の Exadata Database Service に 26ai をデプロイしています。
  • Oracle Database@AWS サービスをホストする ODB ネットワークと ODB ピアリングされた VPC にデプロイされた EC2 インスタンス。クライアントとして使用する EC2 インスタンスから ODB@AWS 上の Oracle Database へのネットワーク接続を確認してください。
  • Amazon Bedrock モデルと SageMaker AI サービスへのアクセスを許可するポリシーがアタッチされた IAM ロールを EC2 インスタンスに関連付けます。以下はポリシーの例です。完全なポリシー JSON ドキュメントは GitHub を参照してください。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBedrockInvoke",
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel",
                "bedrock:InvokeModelWithResponseStream"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowSageMakerStudioDiscovery",
            "Effect": "Allow",
            "Action": [
                "sagemaker:ListDomains",
                "sagemaker:ListUserProfiles",
                "sagemaker:ListApps",
                "sagemaker:DescribeDomain",
                "sagemaker:DescribeUserProfile"
            ],
            "Resource": "*"

      {
            "Sid": "AllowSageMakerStudioPresignedUrls",
            "Effect": "Allow",
            "Action": [
                "sagemaker:CreatePresignedDomainUrl"
            ],
            "Resource": "*"
        }
    ]
}

アプリケーションの構築

以下の手順に従い、Oracle 26ai をベクトルストアとして使用し、Amazon Bedrock の埋め込みモデルと LLM モデルを統合した、Streamlit ベースの AI チャットアシスタントを含むエンドツーエンドの RAG ワークフローを構築します。

GitHub で公開されている完全なコードを再利用することもできます。GitHub からコードをデプロイして実行する手順は「デモ」セクションを参照してください。

  1. ライブラリのインポート:
    import sys
    import os
    from pathlib import Path
    from typing import Dict, List
    import logging
    from dotenv import load_dotenv
    import time
    from concurrent.futures import ThreadPoolExecutor
    import numpy as np
    from PIL import Image
    import base64
    
    import boto3
    import oracledb
    import streamlit as st
    from PyPDF2 import PdfReader
    from langchain_aws import BedrockEmbeddings, ChatBedrock
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_core.documents import Document
    from langchain_community.vectorstores.oraclevs import OracleVS
    from langchain_community.vectorstores.utils import DistanceStrategy
    from langchain.chains import ConversationalRetrievalChain
  2. ドキュメントの取り込み:

    本ユースケースでは PDF 形式のドキュメントを使用します。PDF ドキュメントを読み込み、各ページをテキストに変換します。
     

    def extract_text_from_pdf(pdf_file) -> str:
        """Extract text content from a PDF file."""
        try:
            pdf_reader = PdfReader(pdf_file)
            text = ""
            for page in pdf_reader.pages:
                text += page.extract_text()
            return text
        except Exception as e:
            logger.error(f"Error extracting text from PDF: {e}")
            raise

    注: この例ではローカルデスクトップから PDF ドキュメントをアプリに読み込んでいますが、データソース (PDF ドキュメント) は Oracle Database 内 (BLOB としての PDF) や、Amazon S3 バケットなどデータベース外部に配置することも可能です。

  3. テキストのチャンキング: 抽出したテキストを、LangChain の RecursiveCharacterTextSplitter モジュールで小さなチャンクに分割します。チャンクサイズ、オーバーラップなどのパラメータは処理効率を最適化するよう設定します。
    def chunk_text(text: str) -> List[str]:
        try:
            splitter = RecursiveCharacterTextSplitter(
                separators=["\n\n", "\n", ".", " "],
                chunk_size=MAX_CHUNK_SIZE,
                chunk_overlap=100,
                length_function=len
            )
            return splitter.split_text(text)
        except Exception as e:
            logger.error(f"Error chunking text: {e}")
            raise

    以下の create_documents 関数は、テキストチャンクのリストを受け取り、メタデータ付きの Document オブジェクトに変換します。各テキストチャンクに対して ID とページリンクをメタデータとして割り当てた Document オブジェクトを作成し、リスト内包表記で効率的に処理します。

    def create_documents(chunks: List[str]) -> List[Document]:
        """Create document objects with metadata from text chunks."""
        return [
            Document(
                page_content=text,
                metadata={'id': str(i), 'link': f'Page {i}'}
            )
            for i, text in enumerate(chunks)
        ]

    process_chunk_with_delay 関数は、レートリミット対応としてタイムディレイを挿入しながら、単一のドキュメントチャンクを処理します。まず time.sleep で一定時間待機し、次にエンベッダーを使ってドキュメントの内容をベクトル埋め込みに変換します。

    def process_chunk_with_delay(chunk: Document, embedder) -> np.ndarray:
        """Process a single chunk with rate limiting."""
        time.sleep(RATE_LIMIT_DELAY)
        return embedder.embed_documents([chunk.page_content])[0]

    batch_process_embeddings 関数は、レートリミットを維持しながら複数のドキュメントの埋め込み生成を並列処理で管理します。ThreadPoolExecutor を使って最大 MAX_CONCURRENT_REQUESTS 個のドキュメントを並行処理し、各ドキュメントを process_chunk_with_delay 関数でレートリミットを守りつつ埋め込みを生成し、生成された埋め込みのリストを返します。

    def batch_process_embeddings(docs: List[Document], embedder) -> List[np.ndarray]:
        """Process embeddings in batches with rate limiting."""
        with ThreadPoolExecutor(max_workers=MAX_CONCURRENT_REQUESTS) as executor:
            embeddings = list(executor.map(
                lambda doc: process_chunk_with_delay(doc, embedder),
                docs
            ))
        return embeddings
  4. ベクトル埋め込みの保存: 次に、amazon.titan-embed-text-v2 モデルを使ったベクトル埋め込みをベクトルデータベースとして Oracle Database@AWS にロードします。テキストチャンクを入力として受け取り、Amazon Titan Embeddings を使ってベクトルストアを作成します。次のスクリーンショットのように環境変数から設定できます。データベースの構成に合わせて変更してください。
    def get_oracle_connection():
        """Create and return Oracle connection."""
        try:
            if not hasattr(st.session_state, 'oracle_connection') or st.session_state.oracle_connection is None:
                connection = oracledb.connect(
                    user=os.getenv('ORACLE_USER'),
                    password=os.getenv('ORACLE_PASSWORD'),
                    dsn=f"{os.getenv('ORACLE_HOST')}:{os.getenv('ORACLE_PORT', '1521')}/{os.getenv('ORACLE_SERVICE')}"
                )
                st.session_state.oracle_connection = connection
                logger.info("New Oracle connection established successfully")
            return st.session_state.oracle_connection
        except Exception as e:
            logger.error(f"Error creating Oracle connection: {e}")
            raise
    
    def check_connection():
        """Check if the Oracle connection is healthy and reinitialize if needed."""
        try:
            connection = st.session_state.get('oracle_connection')
            if connection is None:
                st.session_state.oracle_connection = get_oracle_connection()
                return
    
            try:
                with connection.cursor() as cursor:
                    cursor.execute("SELECT 1 FROM DUAL")
            except Exception as e:
                logger.warning(f"Connection test failed: {e}")
                try:
                    connection.close()
                except Exception:
                    pass
                st.session_state.oracle_connection = get_oracle_connection()
        except Exception as e:
            logger.error(f"Error checking connection: {e}")
            raise
    
    def safe_close_connection():
        """Safely close the Oracle connection."""
        if hasattr(st.session_state, 'oracle_connection') and st.session_state.oracle_connection is not None:
            try:
                if st.session_state.oracle_connection.ping():
                    st.session_state.oracle_connection.close()
                    logger.info("Oracle connection closed successfully")
            except Exception as e:
                logger.warning(f"Error during connection cleanup: {e}")
            finally:
                st.session_state.oracle_connection = None

    上記のコードは、Streamlit アプリケーションで Oracle データベース接続を 3 つの関数で管理しています。get_oracle_connection() はセッション状態に接続がなければ新しいデータベース接続を作成し、check_connection() は既存の接続が正常かどうかを検証して必要に応じて再作成し、safe_close_connection() は不要になったデータベース接続を適切にクローズします。これらの関数により、接続リークを防止しエラーを適切に処理しながら、安定したデータベース接続を提供します。

    def initialize_bedrock_embeddings():
        """Initialize and return Bedrock embeddings."""
        try:
            client = boto3.client("bedrock-runtime", 'us-east-1')
            return BedrockEmbeddings(
                model_id="amazon.titan-embed-text-v2:0",
                client=client
            )
        except Exception as e:
            logger.error(f"Error initializing Bedrock embeddings: {e}")
            raise

    上記のコードは、Amazon Titan モデルを使ってテキストをベクトル (埋め込み) に変換する Amazon Bedrock 埋め込みサービスを初期化します。us-east-1 リージョン用の Amazon Bedrock クライアントを作成し、Amazon Titan 埋め込みモデルで BedrockEmbeddings オブジェクトを設定します。初期化中にエラーが発生した場合はログに記録して例外を再送出します。

    embedder = initialize_bedrock_embeddings()
    embeddings = batch_process_embeddings(docs, embedder)
    
    vectorstore = OracleVS.from_documents(
    	docs,
        embedder,
        client=st.session_state.oracle_connection,
        table_name="ORAVSEMBEDDING",
        distance_strategy=DistanceStrategy.DOT_PRODUCT
    	)

    上記のコードは、ドキュメント埋め込みワークフローで 3 つの操作を実行します。

    1. 先ほど定義した関数で Amazon Bedrock 埋め込みサービスを初期化します。
    2. ドキュメント (docs) のバッチを処理し、エンベッダーを使ってベクトル埋め込みを作成します。
    3. ドキュメントと埋め込みを Oracle Database (OracleVS) にベクトルストアとして保存します。ベクトル間の類似度指標としてドット積を使い、ORAVSEMBEDDING というテーブルに格納します。

    次のステップでドキュメントのベクトル類似検索が有効になります。

  5. 会話チェーンの作成: 会話型 AI モデル (Anthropic Claude v1) と前の関数で作成したベクトルストアを使って会話チェーンを作成します。このチェーンにより、生成 AI アプリケーションが対話型のやり取りを行えるようになります。
    def create_conversation_chain(vectorstore):
        """Create a conversation chain for Q&A."""
        try:
            llm = ChatBedrock(
                model_id="us.anthropic.claude-3-sonnet-20240229-v1:0",
                client=boto3.client("bedrock-runtime", 'us-east-1')
            )
            return ConversationalRetrievalChain.from_llm(
                llm=llm,
                retriever=vectorstore.as_retriever(),
                return_source_documents=True
            )
        except Exception as e:
            logger.error(f"Error creating conversation chain: {e}")
            raise
  6. 質問処理関数の作成: ユーザーの入力質問を処理し、AI アシスタントからの回答を生成する関数です。
    # Questions Section
        st.markdown("### Ask Questions")
        question = st.text_input("Enter your question:")
        
        if question:
            if st.button("Ask", type="primary"):
                try:
                    if not st.session_state.vectorstore:
                        st.warning("Please process documents first!")
                    else:
                        check_connection()
                        
                        if st.session_state.conversation is None:
                            st.session_state.conversation = create_conversation_chain(
                                st.session_state.vectorstore
                            )
    
                        with st.spinner("Thinking..."):
                            response = st.session_state.conversation.invoke({
                                "question": question,
                                "chat_history": st.session_state.chat_history
                            })
                            
                            st.session_state.chat_history.append((question, response['answer']))
                            display_chat_history()
                except Exception as e:
                    st.error(f"Error processing question: {e}")
        
        if st.session_state.chat_history:
            if st.button("Clear Chat History"):
                st.session_state.chat_history = []
                st.rerun()
  7. Streamlit コンポーネントの作成:

    Streamlit は、ML やデータサイエンス向けのカスタム Web アプリケーションを簡単に作成・共有できるオープンソースの Python ライブラリです。数分で強力なデータアプリケーションを構築しデプロイできます。以下のコードで Streamlit コンポーネントを作成します。
     

    def main():
        """Main application function."""
        set_custom_style()
        init_session_state()
        display_sidebar()
    
        st.markdown('<h1 class="main-header">? OracleRAG: AI-Powered Knowledge Navigator</h1>', 
                    unsafe_allow_html=True)
    
        # Document Upload Section
        st.markdown("### Document Upload")
        uploaded_files = st.file_uploader(
            "Choose PDF files",
            type="pdf",
            accept_multiple_files=True
        )
    
        if uploaded_files:
            total_size = sum(file.size for file in uploaded_files)
            st.info(f"Total upload size: {total_size/1024/1024:.2f} MB")
    
            if st.button("Process Documents", type="primary"):
                try:
                    for pdf_file in uploaded_files:
                        if pdf_file.name not in st.session_state.processed_files:
                            with st.spinner(f"Processing {pdf_file.name}..."):
                                text = extract_text_from_pdf(pdf_file)
                                chunks = chunk_text(text)
                                docs = create_documents(chunks)
                                
                                show_processing_progress(len(docs))
                                
                                embedder = initialize_bedrock_embeddings()
                                embeddings = batch_process_embeddings(docs, embedder)
                                
                                vectorstore = OracleVS.from_documents(
                                    docs,
                                    embedder,
                                    client=st.session_state.oracle_connection,
                                    table_name="ORAVSEMBEDDING",
                                    distance_strategy=DistanceStrategy.DOT_PRODUCT
                                )
                                
                                st.session_state.vectorstore = vectorstore
                                st.session_state.processed_files.add(pdf_file.name)
                                st.session_state.total_chunks_processed += len(docs)
                    
                    st.success("All documents processed successfully!")
                except Exception as e:
                    st.error(f"Error during processing: {e}")

デモ

生成 AI アシスタントアプリケーションのコードが完成したら、Streamlit でアプリケーションを実行します。以下の手順で GitHub からコードをデプロイしてください。

  1. GitHub リポジトリをクローンします。
    git clone https://github.com/aws-samples/sample-chatbot-bedrock-oracle-on-aws/
  2. クローンしたリポジトリのフォルダに移動します。
    cd ./sample-chatbot-bedrock-oracle-on-aws
  3. プロジェクトディレクトリに .env ファイルを作成し、Oracle Database@AWS の接続情報を追加します。.env ファイルは以下のようになります。
    Oracle Database Configuration
    ORACLE_USER=<username>
    ORACLE_PASSWORD=<password>
    ORACLE_HOST=<Oracle-VM-HOSTNAME>
    ORACLE_PORT=1521
    ORACLE_SERVICE=<ORACLE-SERVICE-NAME>
    
    AWS Configuration
    AWS_DEFAULT_REGION=<REGION>
  4. クローンした GitHub リポジトリには、AI アシスタントアプリケーション構築に必要なライブラリが記載された requirements.txt ファイルが含まれています。次のコマンドでライブラリをインストールします。
    pip install -r requirements.txt
  5. クローンしたリポジトリのフォルダで次のコマンドを実行します。
    streamlit run odbapp.py --server.port 8080

    アプリケーションが起動し、ブラウザウィンドウで URL が開き、以下のようにアプリケーションが表示されます。

  6. Browse files を選択して PDF ファイルをアップロードします。

    この例では Oracle 26ai ユーザーガイドを PDF 形式でアップロードしています。

  7. Process Documents を選択します。

  8. 質問を入力して Ask を選択します。

AI アシスタントが RAG ワークフローを通じて質問を処理し、以下のスクリーンショットのように回答を生成します。

クリーンアップ

不要になった場合は、課金を避けるためにテスト用にプロビジョニングしたリソースを必ず削除してください。Streamlit アプリケーション、EC2 インスタンス、および使用しない Exadata Database Service 上の Oracle AI Database 26ai を手動で削除できます。

まとめ

本記事では、Oracle Database@AWS 上の Oracle Database 26ai のベクトル機能を解説し、Amazon Bedrock と Amazon SageMaker を ODB と統合して生成 AI アプリケーションを構築する方法をデモしました。

著者について

Yamuna Palasamudram

Yamuna Palasamudram

Yamuna は、AWS のプリンシパルデータベーススペシャリストソリューションアーキテクトです。Oracle などの商用データベースエンジンを担当し、アーキテクチャガイダンス、テクニカルアドバイザリー、データおよび AI 戦略の支援を通じてお客様と協業しています。

Sharath Chandra Kampili

Sharath Chandra Kampili

Sharath は、AWS のデータベーススペシャリストソリューションアーキテクトです。Amazon RDS チームで Oracle などの商用データベースエンジンを担当し、お客様のデータベースプロジェクトに対するガイダンスと技術支援を直接提供しています。

Archana Sharma

Archana Sharma

Archana は、AWS のシニアデータベーススペシャリストソリューションアーキテクトとして、ワールドワイドパブリックセクターのお客様を担当しています。リレーショナルデータベースの豊富な経験を持ち、データベースの移行とモダナイゼーションを中心に、お客様の AWS クラウドへの移行を支援しています。


この記事は Solutions Architect の 矢木 覚 が翻訳しました。