Slide 1

Slide 1 text

RAG Approach on AWS ~Kendraの検索API ひとつじゃないって知ってた?~ JAWS-UG東京 2023 〜Bedrock Night〜 November 13th, 2023 小杉 隼人 | Hayato Kosugi

Slide 2

Slide 2 text

About Me • Cloud Engineer @ セゾン情報システムズ • AWS Community Builder • 2019 - 2023 Japan AWS Top Engineer • 12x AWS Certified 2 @hayaok3 @hayao_k

Slide 3

Slide 3 text

本日お話すること • AWS での RAG 実装アプローチ • 所属会社の事例紹介 3

Slide 4

Slide 4 text

AWS での RAG 実装アプローチ 4

Slide 5

Slide 5 text

• Retrieval-Augmented Generation (RAG) • 学習済みの大規模言語モデルに、外部検索によって得られた知識を組み合わせる手法 • 検索結果をプロンプトに組み込むことで”幻覚”を抑止しつつ、回答精度の向上が可能 5 RAG とは Amazon Bedrock ナレッジソース Users App Prompt + ナレッジ ナレッジをクエリ Human: Use the following pieces of context to provide a concise answer to the question at the end. If you don‘t know the answer, just say that you don’t know, don‘t try to make up an answer. {context} Question: {question} Assistant:

Slide 6

Slide 6 text

ナレッジソースの選択肢 • Amazon Kendra • 豊富なコネクターを利用して社内情報ソースを同期、セマンティック検索をサポート • フィルター機能を使うことでユーザーの権限に応じたナレッジデータの参照制御も実現可能 • RAG 用途に適した Retrieve API がリリース 2023.06 • Vector Database • Embedding モデル等でデータをベクトル化し DB に登録、検索結果をもとにプロンプトを⽣成 • 利用可能なサービスと機能 • Amazon OpenSearch Service の k-NN 検索機能 • Vector Engine for Amazon OpenSearch Serverless (Preview) 2023.07 • RDS for PostgreSQL の pgvector 拡張 • Amazon Aurora PostgreSQL pgvector 拡張 2023.07 6

Slide 7

Slide 7 text

• Retrieve API • 最大 200 トークンからなるドキュメントの抜粋を 100 個まで取得できる • 戻り値のデータ構造がシンプルに • 検索結果に FAQ タイプの回答が含まれないという制限あり • FAQ: Kendra が定める仕様で定義した CSV / JSON ファイルを登録し、検索対象にできる機能 • Query API • ドキュメントの抜粋はデフォルトで最大 100 トークン 7 Retrieve API と Query API

Slide 8

Slide 8 text

8 Response Syntax の比較 Retrieve API Query API { "QueryId": "string", "ResultItems": [ { "Content": "string", "DocumentAttributes": [ { "Key": "string", "Value": { "DateValue": number, "LongValue": number, "StringListValue": [ "string" ], "StringValue": "string" } } ], "DocumentId": "string", "DocumentTitle": "string", "DocumentURI": "string", "Id": "string", "ScoreAttributes": { "ScoreConfidence": "string" } } ] } { "QueryId": "string", "ResultItems": [ { "AdditionalAttributes": [ { "Key": "string", "Value": { "TextWithHighlightsValue": { "Highlights": [ { "BeginOffset": number, "EndOffset": number, "TopAnswer": boolean, "Type": "string" } ], "Text": "string" } }, "ValueType": "string" } ], "CollapsedResultDetail": { "DocumentAttribute": { "Key": "string", "Value": { "DateValue": number, "LongValue": number, "StringListValue": [ "string" ], "StringValue": "string" } }, "ExpandedResults": [ { "DocumentAttributes": [ { "Key": "string", "Value": { "DateValue": number, "LongValue": number, "StringListValue": [ "string" ], "StringValue": "string" } } ], "DocumentExcerpt": { "Highlights": [ { "BeginOffset": number, "EndOffset": number, "TopAnswer": boolean, "Type": "string" } ], "Text": "string" }, "DocumentId": "string", "DocumentTitle": { "Highlights": [ { "BeginOffset": number, "EndOffset": number, "TopAnswer": boolean, "Type": "string" } ], "Text": "string" }, "DocumentURI": "string", "Id": "string" } ] }, "DocumentAttributes": [ { "Key": "string", "Value": {

Slide 9

Slide 9 text

• AmazonKendraRetriever が利用可能 9 LangChain with Kendra 🦜️🔗LangChain RetrievalQA / ConversationalRetrievalChain AmazonKendraRetriever LLMs Amazon Bedrock Amazon Kendra Retrieve API from langchain.chains import RetrievalQA from langchain.chat_models import BedrockChat from langchain.retrievers import AmazonKendraRetriever llm = BedrockChat( model_id="anthropic.claude-v2", model_kwargs={"temperature":0.1} ) retriever = AmazonKendraRetriever( index_id="c0806df7-e76b-4bce-9b5c-d5582f6b1a03", attribute_filter = { "EqualsTo": { "Key": "_language_code", "Value": {"StringValue": "ja"} } } ) qa = RetrievalQA.from_chain_type( llm=llm, chain_type='stuff', retriever=retriever ) query = “Amazon BedrockはPrivateLinkをサポートしていますか" qa.run(query)

Slide 10

Slide 10 text

事例紹介 10

Slide 11

Slide 11 text

• LLM Mavericks • ボトムアップで意欲の高いメンバーを募集し、20 名ほどで活動 • バーチャル組織として既存の業務と兼務 • 個々の⽣成系 AI へのモチベーションを組織的なムーブメントへ • ミッション • 社員が当たり前に LLM を活用し、業務プロセスを改善したり、プロダクト、 サービスに取り込み、お客様に価値を届ける 11 研究チームの立ち上げ

Slide 12

Slide 12 text

12 研究チームの立ち上げ 環境の整備 • 社内向け利用環境の構築 • 利用ガイドラインの作成 研究 • アイデアや最新情報の収集と共有 • プロトタイプの作成と PoC 発信 • 社内外への取り組みの発信 社内環境向け Web AI チャットボット

Slide 13

Slide 13 text

• Kendra に製品サポート担当が参照する FAQ の情報を同期 • 将来的に社員向け Web AI チャットボットに機能を取り込んでいきたい • 取り組みの詳細は AWS Jr. Champion の 石原さんの登壇資料を参照ください 製品サポート部門の業務効率化 13 Amazon BedrockとAmazon Kendraで専門知識から回答できる⽣成系AIサービスを構築! 〜業務効率化につなげている話〜

Slide 14

Slide 14 text

• 社員が自由にデータ活用できる環境として Data Driven Platform (DDP) を提供 • DDP に自然言語で問い合わせることにより SQL や BI の知識の障壁を取り払う ChatDDP 14 Azure OpenAI Service 顧客管理 購買管理 経費管理 案件管理 会計 社員マスタ データ連携 Data Driven Platform ( Snowflake ) Users ChatDDP ( LangChain & Streamlit ) 部署ごとの有給休暇の 平均取得日数を教えて Vector DB ( Faiss ) テーブル定義およびメタデータを ベクトル化して格納 SQL の⽣成 回答の⽣成 SQL の実行 自社データ

Slide 15

Slide 15 text

• LangChain の場合、基本は LLMs / Chat models の差し替えだけ • 楽勝!そんなふうに考えていた時期が私にもありました 15 ChatDDP を Bedrock する 非BedrockアプリをBedrockして開発観点で比較する by @kzk_maeda 2023/10/17 AWSの⽣成AI「Amazon Bedrock」入門&LT会! from langchain.llms import Bedrock llm = Bedrock( model_id="anthropic.claude-v2", model_kwargs={"temperature":0} )

Slide 16

Slide 16 text

• Claude だと LangChain で Tools が使用されない事象に遭遇 16 ChatDDP を Bedrock する Claude 2 ぱっと見動作しているように見えるが、 存在しないデータを回答している GPT-4 適切に Tool を選択して DDP 上にあるデータを回答している

Slide 17

Slide 17 text

17 どう解決したか prompt_template = """You are great assistant of employees. Answer the following questions as best you can. If you receive a question in Japanese, you must still think in English. .... """ • 日本語の質問も英語で思考するようにお願いしたら動作した!

Slide 18

Slide 18 text

18 Demo

Slide 19

Slide 19 text

他、Bedrock してみてどうだったか • Claude が忖度して SQL を実行しないケースがあった • 個人情報にはセキュリティ上、アクセスできません〜 • 有害な出力を⽣成する確率が低い Claude 2 の特色がでているように感じる • この事例の用途においては Claude は GPT-4 より精度が劣った • 具体的には SQL ⽣成の精度が低く、実行エラーや誤った回答になるケースも • テーブル定義を参照せずに SQL を⽣成してしまうなど • これらは単に Claude に適したプロンプトになっていないことが原因かも 19

Slide 20

Slide 20 text

Summary • AWS での RAG 実装アプローチ • ナレッジソースとして使用可能な複数の AWS サービスがある • 一般論としてナレッジデータの扱いにはそれなりの運用負荷がある • アクセス許可範囲の制御、データの継続的なメンテナンスなど • Kendra はこれらの実装をシンプルにする機能が提供されている • 本当に LLM / RAG が必要か考える • 必要だったのは単にエンタープライズサーチ (Kendra そのもの) というオチもありえる • 既存アプリの Bedrock への移行 • LLM 部分の差し替えは容易 • LangChain で複雑な処理を組むケースではプロンプトの見直し等も必要 20

Slide 21

Slide 21 text

最後に宣伝させてください🙏 21

Slide 22

Slide 22 text

AWS re:Invent 2023 に出展します! 22 Come join us at Booth #1502 • Las Vegas に現地参加される方はぜひブースへお越しください AWS re:Invent 2023 出展特設ページ https://www.hulft.com/special-column/hulft-event-report/reinvent2023

Slide 23

Slide 23 text

Appendix. 23

Slide 24

Slide 24 text

OpenSearch がセマンティック検索をサポート 24 • https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon- opensearch-neural-search/ • https://docs.aws.amazon.com/opensearch- service/latest/developerguide/cfn-template.html

Slide 25

Slide 25 text

References 25 • https://docs.aws.amazon.com/kendra/latest/dg/searching-retrieve.html • https://docs.anthropic.com/claude/docs/introduction-to-prompt-design