æ¬èšäºã¯ 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 Service ã Amazon Aurora PostgreSQL-Compatible Edition ã Amazon 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 ãéããŠå€éšã®åã蟌ã¿ã¢ãã«ã LangChain ã LlamaIndex ãªã©ã® 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 ã¯ãŒã¯ãããŒã¯ã次ã®å€§ãŸããªã¹ãããã§æ§æãããŸãã ããŒã¿åã蟌㿠(æ¬ãã¢ã§ã¯ PDF): ã¢ããªã« PDF ãåã蟌ã¿ãããã¹ãã³ã³ãã³ããèªã¿åã£ãŠæœåºããŸãã ããã¹ããã£ã³ãã³ã° : æœåºããããã¹ããå¹ççã«åŠçã§ãããããå°ã㪠ãã£ã³ã¯ ã«åå²ããŸããããã¹ãã®ãã£ã³ãã³ã°ã¯æ€çŽ¢å質ãšã¬ãŒããªããã察çã®äž¡é¢ã§éèŠã§ãã åã蟌ã¿çæ : ã¢ããªã±ãŒã·ã§ã³ã¯ Amazon Bedrock ã® Amazon Titan Text Embeddings v2 ã¢ãã«ã䜿ããããã¹ããã£ã³ã¯ã®ãã¯ãã«è¡šçŸã§ããåã蟌ã¿ãçæããŸãã ãã¯ãã«ã¹ã㢠: Oracle Database@AWS ã® Oracle AI Database 26ai (Oracle AI Vector Search) ã«ãã¯ãã«ãšã¡ã¿ããŒã¿ãä¿åããŸãã ãŠãŒã¶ãŒã®è³ªå : ãŠãŒã¶ãŒããã£ãããããã«èªç¶èšèªã§è³ªåãå
¥åããŸãã é¡äŒŒåºŠãããã³ã° : ãŠãŒã¶ãŒã質åãããšãã¢ããªã¯ããã¹ããã£ã³ã¯ãšæ¯èŒããã»ãã³ãã£ãã¯ã«æãé¡äŒŒãããã£ã³ã¯ãç¹å®ããŸãã RAG : Streamlit UI äžã«æ§ç¯ãããã¢ããªã±ãŒã·ã§ã³ãéããŠãAmazon Bedrock ã® Anthropic Claude 3 Sonnet ã¢ãã«ã§æ€çŽ¢æ¡åŒµå Q&A ãå®è¡ããŸãã ã¬ã¹ãã³ã¹ : 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 ããã³ãŒãããããã€ããŠå®è¡ããæé ã¯ããã¢ãã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã ã©ã€ãã©ãªã®ã€ã³ããŒã: 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 ããã¥ã¡ã³ãã®åã蟌ã¿: æ¬ãŠãŒã¹ã±ãŒã¹ã§ã¯ 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 ãã±ãããªã©ããŒã¿ããŒã¹å€éšã«é
眮ããããšãå¯èœã§ãã ããã¹ãã®ãã£ã³ãã³ã°: æœåºããããã¹ããã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 ãã¯ãã«åã蟌ã¿ã®ä¿å: 次ã«ã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 ã€ã®æäœãå®è¡ããŸãã å
ã»ã©å®çŸ©ãã颿°ã§ Amazon Bedrock åã蟌ã¿ãµãŒãã¹ãåæåããŸãã ããã¥ã¡ã³ã (docs) ã®ããããåŠçãããšã³ããããŒã䜿ã£ãŠãã¯ãã«åã蟌ã¿ãäœæããŸãã ããã¥ã¡ã³ããšåã蟌ã¿ã Oracle Database (OracleVS) ã«ãã¯ãã«ã¹ãã¢ãšããŠä¿åããŸãããã¯ãã«éã®é¡äŒŒåºŠææšãšããŠãããç©ã䜿ããORAVSEMBEDDING ãšããããŒãã«ã«æ ŒçŽããŸãã æ¬¡ã®ã¹ãããã§ããã¥ã¡ã³ãã®ãã¯ãã«é¡äŒŒæ€çŽ¢ãæå¹ã«ãªããŸãã äŒè©±ãã§ãŒã³ã®äœæ: äŒè©±å 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 質ååŠç颿°ã®äœæ: ãŠãŒã¶ãŒã®å
¥å質åãåŠçãã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() 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 ããã³ãŒãããããã€ããŠãã ããã GitHub ãªããžããªãã¯ããŒã³ããŸãã git clone https://github.com/aws-samples/sample-chatbot-bedrock-oracle-on-aws/ ã¯ããŒã³ãããªããžããªã®ãã©ã«ãã«ç§»åããŸãã cd ./sample-chatbot-bedrock-oracle-on-aws ãããžã§ã¯ããã£ã¬ã¯ããªã« .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> ã¯ããŒã³ãã GitHub ãªããžããªã«ã¯ãAI ã¢ã·ã¹ã¿ã³ãã¢ããªã±ãŒã·ã§ã³æ§ç¯ã«å¿
èŠãªã©ã€ãã©ãªãèšèŒããã requirements.txt ãã¡ã€ã«ãå«ãŸããŠããŸããæ¬¡ã®ã³ãã³ãã§ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã pip install -r requirements.txt ã¯ããŒã³ãããªããžããªã®ãã©ã«ãã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã streamlit run odbapp.py --server.port 8080 ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããã©ãŠã¶ãŠã£ã³ããŠã§ URL ãéãã以äžã®ããã«ã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããŸãã Browse files ãéžæã㊠PDF ãã¡ã€ã«ãã¢ããããŒãããŸãã ãã®äŸã§ã¯ Oracle 26ai ãŠãŒã¶ãŒã¬ã€ã ã PDF 圢åŒã§ã¢ããããŒãããŠããŸãã Process Documents ãéžæããŸãã 質åãå
¥åã㊠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 ã¯ãAWS ã®ããªã³ã·ãã«ããŒã¿ããŒã¹ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããOracle ãªã©ã®åçšããŒã¿ããŒã¹ãšã³ãžã³ãæ
åœããã¢ãŒããã¯ãã£ã¬ã€ãã³ã¹ããã¯ãã«ã«ã¢ããã€ã¶ãªãŒãããŒã¿ããã³ AI æŠç¥ã®æ¯æŽãéããŠã客æ§ãšåæ¥ããŠããŸãã Sharath Chandra Kampili Sharath ã¯ãAWS ã®ããŒã¿ããŒã¹ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãã§ããAmazon RDS ããŒã ã§ Oracle ãªã©ã®åçšããŒã¿ããŒã¹ãšã³ãžã³ãæ
åœããã客æ§ã®ããŒã¿ããŒã¹ãããžã§ã¯ãã«å¯Ÿããã¬ã€ãã³ã¹ãšæè¡æ¯æŽãçŽæ¥æäŸããŠããŸãã Archana Sharma Archana ã¯ãAWS ã®ã·ãã¢ããŒã¿ããŒã¹ã¹ãã·ã£ãªã¹ããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããšããŠãã¯ãŒã«ãã¯ã€ããããªãã¯ã»ã¯ã¿ãŒã®ã客æ§ãæ
åœããŠããŸãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®è±å¯ãªçµéšãæã¡ãããŒã¿ããŒã¹ã®ç§»è¡ãšã¢ããã€ãŒãŒã·ã§ã³ãäžå¿ã«ãã客æ§ã® AWS ã¯ã©ãŠããžã®ç§»è¡ãæ¯æŽããŠããŸãã ãã®èšäºã¯ Solutions Architect ã® ç¢æš èŠ ã翻蚳ããŸããã