Slide 1

Slide 1 text

JAWS PANKRATION前哨戦 The Ultimate RAG Showdown 8/23 KyotoLT 第31回 (テーマはAWS!) @moritalous

Slide 2

Slide 2 text

自己紹介 森田 和明 富士ソフト株式会社 主任 / フェロー(アーキテクト・エバンジェリスト) AWS Ambassador(2023~) AWS Top Engineer(2020~) AWS All Certifications Engineer(2024) AWS Community Builder(2024) 生成AIに限らず、AWS関係のアーキテクトとエバンジェリストをやってます Java Webアプリ開発出身 新しいもの好き X / Qiita / GitHub : @moritalous 2 「Jumping deer with japanese temple」 Amazon Titan Image Generatorにて生成

Slide 3

Slide 3 text

3 Bedrockの入門書を執筆しました!!

Slide 4

Slide 4 text

明日のJAWS PANKRATION 2024に登壇します!! 4 2024/8/24 17:20 (JST) 登壇予定

Slide 5

Slide 5 text

RAGとは ● RAG(Retrieval-Augmented Generation)とは、生成AIに外部情報 を与えたうえで回答を生成させるテクニック ● 生成AIが「もっともらしい嘘(ハルシネーション)」を言わないようにする工夫 5

Slide 6

Slide 6 text

RAGとは 6 出典:Gartner (2024年8月) https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20240807-future-oriented-infra-tech-hc

Slide 7

Slide 7 text

過度に期待しています 7

Slide 8

Slide 8 text

RAGの構成を色々比 較して対決します 8

Slide 9

Slide 9 text

Knowledge bases for Amazon Bedrock 9 ニックネーム:ナレベベ エントリーNo.1

Slide 10

Slide 10 text

Knowledge bases for Amazon Bedrockと は 10 ● RAGを構築するためのBedrockの機能 ● マネージメントコンソールの操作のみで構築可能 ● 機能アップデートも活発

Slide 11

Slide 11 text

Knowledge bases for Amazon Bedrock Knowledge bases for Amazon Bedrockのアーキテクチャ 11 埋め込み 埋め込み 回答生成 テキスト 抽出 チャンク 分割 OpenSear ch Serverles s 検索 S3 質問 回答

Slide 12

Slide 12 text

1回のAPI呼び出しで検索と回答生成が可能 def retrieve_and_generate(question: str): response = client.retrieve_and_generate( input={"text": question}, retrieveAndGenerateConfiguration={ "knowledgeBaseConfiguration": { "knowledgeBaseId": knowledgeBaseId, "modelArn": modelArn, "orchestrationConfiguration": { "queryTransformationConfiguration": {"type": "QUERY_DECOMPOSITION"} }, "retrievalConfiguration": { "vectorSearchConfiguration": {"overrideSearchType": "HYBRID"} }, }, "type": "KNOWLEDGE_BASE", }, ) return response 12 APIを一つ呼び出すだけで検索と回答生成が同時に処理される (検索だけを実行するAPIもあります)

Slide 13

Slide 13 text

ナレベベの評価 ● 難易度:☆☆☆ マネジメントコンソールの操作だけで構築可能 OpenSearch Serverlessを自動で作成するクイック作成もある ● 機能の豊富さ:☆☆ 機能アップデートが頻繁にあり、最近はAdvanced RAGを構築する機能が追加 RAGの最適化手法の中から厳選されたものを簡単に適用できる ● 拡張性:☆ 新しい手法や新しいLLMが登場してもすぐに使えるわけではない ● 日本語対応:☆ クイック作成で作成されるOpenSearch Serverlessのインデックスには、日本語向けの 設定が入っていない 13

Slide 14

Slide 14 text

The Ultimate RAG Showdown 14 ナレベベ 難易度 ☆☆☆ 機能の豊富さ ☆☆ 拡張性 ☆ 日本語対応 ☆

Slide 15

Slide 15 text

Kendraを使って生成AIアプリを構築 15 ニックネーム:KendRAG エントリーNo.2

Slide 16

Slide 16 text

Kendraとは 16 ● マネージドなエンタープライズ検索サービス ● データソースコネクターが豊富に用意されている ● ドキュメント検索だけでなくFAQ形式の検索にも対応

Slide 17

Slide 17 text

生成AIアプリ KendRAGのアーキテクチャ 回答生成 検索 検索クエリ生成 17 Bedrock Bedrock テキスト 抽出 チャンク 分割 Kendra S3 質問 回答

Slide 18

Slide 18 text

処理1)検索クエリ生成関数 def generate_search_query(question: str): result = bedrock_runtime.converse( modelId="cohere.command-r-plus-v1:0", additionalModelRequestFields={"search_queries_only": True}, additionalModelResponseFieldPaths=["/search_queries"], messages=[ { "role": "user", "content": [{"text": question}], } ], ) return list( map( lambda x: x["text"], result["additionalModelResponseFields"]["search_queries"], ) ) 18 検索前にユーザーの質問からク エリを作成する処理。 Cohere Command R/R+で 用意されている機能 例:「Kendraが提供されてい て、BedrockでClaude 3.5 が使えるリージョンは?」 ・Kendraが提供されている リージョン ・BedrockでClaude 3.5が 提供されているr-ジョン

Slide 19

Slide 19 text

処理2)Kendra検索関数 def fetching_relevant_documents(queries: list[str]): items = [] for query in queries: response = kendra.retrieve( IndexId=kendra_index_id, QueryText=query, AttributeFilter={ "EqualsTo": {"Key": "_language_code", "Value": {"StringValue": "ja"}} }, ) items.extend( list( map( lambda x: {k: v for k, v in x.items() if k in ["Id", "DocumentId", "DocumentTitle", "Content", "DocumentURI"]}, response["ResultItems"], ) ) ) return items 19 Kendraで検索する処理

Slide 20

Slide 20 text

処理3)回答生成関数 def generating_response(question: str, documents: list[str]): result = bedrock_runtime.converse( modelId="cohere.command-r-plus-v1:0", additionalModelRequestFields={"documents": documents}, messages=[ { "role": "user", "content": [{"text": question}], } ], ) return result["output"]["message"]["content"][0]["text"] 20 Bedrockで回答を生成する処理 Cohere Command RのAPIと相性がよい

Slide 21

Slide 21 text

KendRAGの評価 ● 難易度:☆☆ 生成AIアプリを構築する必要があるが、LangChainなどの生成AIフレームワークが充実 しているので、それほど難易度は高くない ● 機能の豊富さ:☆ Kendraが提供している検索機能が利用できる 生成AIとの連携部分は開発する必要がある ● 拡張性:☆☆☆ 様々なRAGの精度向上テクニックを試して取り入れることが可能 生成AIや検索データベースの変更も容易 ● 日本語対応:☆☆ Kendraは日本語に正式に対応 21

Slide 22

Slide 22 text

The Ultimate RAG Showdown 22 ナレベベ KendRAG 難易度 ☆☆☆ ☆☆ 機能の豊富さ ☆☆ ☆ 拡張性 ☆ ☆☆☆ 日本語対応 ☆ ☆☆

Slide 23

Slide 23 text

OpenSearchでRAG APIを構築 23 ニックネーム:OpenSearchRAG エントリーNo.3

Slide 24

Slide 24 text

● オープンソースで開発されているOpenSearchをAWSがマネージドで提 供するサービス ● RAG用途で使える機能の追加が活発 ○ ベクトル検索、ニューラル検索、ハイブリッド検索 ○ Bedrock、SageMakerなど外部AIモデルとの連携 ○ テキストチャンキング ○ リランキング ○ 会話型検索、RAG OpenSearch Serviceとは 24

Slide 25

Slide 25 text

Search pipeline OpenSearch Service Ingest pipeline OpenSearchRAGのアーキテクチャ 25 Bedrock テキスト 抽出 データソー ス 質問 回答 Bedrock SageMaker Bedrock 埋め込み 検索 リランク 回答生成 チャンク分割 埋め込み

Slide 26

Slide 26 text

OpenSearchの検索API def search(query: str): response = client.search( index=index_name, body={ "_source": {"exclude": ["body_chunk_embedding"]}, "query": { "hybrid": { "queries": [ {"match": {"body_chunk": {"query": query,}}}, {"nested": { "score_mode": "max", "path": "body_chunk_embedding", "query": { "neural": { "body_chunk_embedding.knn": { "query_text": query, "model_id": titan_model_id, }}},}},],}}, "ext": { "rerank": {"query_context": {"query_text": query,},}, "generative_qa_parameters": { "llm_model": "litellm", "llm_question": query, "context_size": 4, },},}, params={"search_pipeline": "hybrid-rerank-search-pipeline"}, ) 26 context = list(map(lambda x: x["_source"], response["hits"]["hits"])) for tmp in context: del tmp["body_chunk"] return { "answer": response["ext"]["retrieval_augmented_generation"]["answer"], "context": context, } 検索パイプラインを定義しておくことで、検索 APIを呼び出すだけでRAGの結果を取得できる

Slide 27

Slide 27 text

OpenSearchRAGの評価 ● 難易度:☆ OpenSearch Serviceの様々な機能を組み合わせて構築 OpenSearchのドキュメントには単体機能の解説のみなので、構築の難易度は高い ● 機能の豊富さ:☆☆ RAGを想定した機能拡充が活発で、ハイブリッド検索、リランキング、チャンク分割などが 可能 ● 拡張性:☆ OpenSearchが対応している機能の範囲で実現 ● 日本語対応:☆☆ kuromojiやSudachiプラグインを使うことで日本語に合わせた検索が可能 27

Slide 28

Slide 28 text

The Ultimate RAG Showdown 28 ナレベベ KendRAG OpenSearchRAG 難易度 ☆☆☆ ☆☆ ☆ 機能の豊富さ ☆☆ ☆ ☆☆ 拡張性 ☆ ☆☆☆ ☆ 日本語対応 ☆ ☆☆ ☆☆

Slide 29

Slide 29 text

RAGの性能評価 29

Slide 30

Slide 30 text

続きは明日のお楽しみ! 30 2024/8/24 17:20 (JST) 登壇