Slide 1

Slide 1 text

The Ultimate RAG Showdown Kendra, KB for Bedrock, etc...

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

過度に期待しています 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 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 11 APIを一つ呼び出すだけで検索と回答生成が同時に処理される (検索だけを実行するAPIもあります)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 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"], ) ) 17 検索前にユーザーの質問からクエリを作成する処 理。 Cohere Command R/R+で用意されている 機能 例:「Kendraが提供されていて、Bedrockで Claude 3.5が使えるリージョンは?」 ・Kendraが提供されているリージョン ・BedrockでClaude 3.5が提供されている リージョン

Slide 18

Slide 18 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 18 Kendraで検索する処理

Slide 19

Slide 19 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"] 19 Bedrockで回答を生成する処理 Cohere Command RのAPIと相性がよい

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 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"}, ) 25 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 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

RAGの性能評価 28

Slide 29

Slide 29 text

RAGの性能評価 ● RAGの性能を定量的に評価するためのフレームワーク「Ragas」を用いて評価を 実施 ● 以下の4つの指標を使用しました 29 https://docs.ragas.io/en/stable/concepts/metrics/index.html

Slide 30

Slide 30 text

性能評価の検証条件 ● AWSのWhat's Newの記事のうち、2024年に公開された日本語記事 を対象(全1,267件) ● Ragasを使って質問と回答を生成しテストデータとして利用(200件) ● テストデータ生成と評価はGPT-4o miniを使用 30 Ragasが生成した質問 請求対象の使用量は AWS ConfigのAmazon CloudWatchメトリ クスでどのように表示されるようになったのでしょうか ? Ragasが生成した回答 AWS Config のデータ使用量をモニタリングするための Amazon CloudWatch メトリクスには、請求対象となる使用量のみが表示 されるようになりました 。これにより、請求対象外の使用量は表 示されなくなり、AWS Config の設定と使用量を検証し、 請求対 象となる使用量を関連コストと関連付けることができます 。

Slide 31

Slide 31 text

各アーキテクチャ個別の条件 31 ナレベベ KendRAG OpenSearchRAG 回答生成LLM Claude 3 Sonnet Command R+ Mistral Large 2 埋め込みLLM Titan Embeddings v2 未使用 Titan Embeddings v2 その他機能 ● Hierarchical chunking ● Break down queries ● Hybrid search ● Generate search query ● Japanese Index ● Sudachi analyzer ● Reranking with Cohere Rerank3 ● Hybrid search ● Text chunking

Slide 32

Slide 32 text

結果発表 32

Slide 33

Slide 33 text

性能評価の結果 33 ナレベベ (Claude 3 Sonnet) KendRAG (Command R+) OpenSearchRAG (Mistral Large 2) faithfulness 0.7904 0.8423 0.6197 answer_relevancy 0.6914 0.6723 0.7345 context_precision 0.9346 0.8814 0.8981 context_recall 0.9675 0.9342 0.9400

Slide 34

Slide 34 text

回答生成例 34 Ragasが生成した質問 請求対象の使用量は AWS ConfigのAmazon CloudWatchメトリ クスでどのように表示されるようになったのでしょうか ? ナレベベの回答 AWS ConfigのAmazon CloudWatchメトリクスでは、今後は請 求 対象となる使用量のみが表示されるようになりました 。記録さ れていないリソースタイプの使用量は表示されなくなり、請求対 象の使用量に合わせたより明確なビューが提供されます。これに より、CloudWatchメトリクスを使ってAWS Configの設定と使用量 を検証し、請求対象となる使用量を関連コストと関連付けること ができます 。

Slide 35

Slide 35 text

回答生成例 35 Ragasが生成した質問 請求対象の使用量は AWS ConfigのAmazon CloudWatchメトリ クスでどのように表示されるようになったのでしょうか ? KendRAGの回答 AWS Config は、記録されたリソースタイプごとに設定項目 (CI) を生成することにより、リソース設定の変更を監視します。 請求 対象となる使用量のみが表示されるようになった のは、今回の リリースにより、AWS Config の使用量についての Amazon CloudWatch メトリクスには、記録されたリソースタイプの使用量 のみが表示されるようになったからです。

Slide 36

Slide 36 text

回答生成例 36 Ragasが生成した質問 請求対象の使用量は AWS ConfigのAmazon CloudWatchメトリ クスでどのように表示されるようになったのでしょうか ? OpenSearchRAGの回答 AWS Config と Amazon CloudWatch メトリクスの違いは、 AWS Config はリソースの設定変更を記録し、コンプライアンスを監査 するためのサービスです。一方、 Amazon CloudWatch メトリクス は、リソースのパフォーマンスデータを収集し、監視するための サービスです。AWS Config はリソースの設定変更を追跡し、コ ンプライアンスを確認するのに役立ちますが、 CloudWatch メトリ クスはリソースのパフォーマンスをリアルタイムで監視するのに 役立ちます。

Slide 37

Slide 37 text

性能評価の考察 37 ● 評価結果の良し悪しがバラけたため、どの構成がよいのか一概には言えない結果 となった ● 個別に回答結果を見たところ、どの構成も性能が悪いわけではなく、一定の性能 を有していると感じた ● 評価の条件によって結果が変わる可能性がある 「評価方法の評価」が必要かもしれない ○ 評価に使用するLLM ○ 評価に使用したドキュメントの形式 ● Bedrockのモデル評価機能でRAGの評価ができるようになることに期待

Slide 38

Slide 38 text

The Ultimate RAG Showdown 総合結果 38 ナレベベ KendRAG OpenSearchRAG 難易度 ☆☆☆ ☆☆ ☆ 機能の豊富さ ☆☆ ☆ ☆☆ 拡張性 ☆ ☆☆☆ ☆ 日本語対応 ☆ ☆☆ ☆☆ 性能評価 ☆☆ ☆☆ ☆☆

Slide 39

Slide 39 text

検証コードはGitHubで公開しています 39 OpenSearchRAGの構成は構築するのに苦労した のでぜひ見てください