AWS Bedrock RAG 開発メモ / 初心者向け

AWS で RAG

Bedrock が AWS のメインのAIサービス。この中で言語モデルを選択することが可能。

「RAG(検索拡張生成)」とは自然言語処理における手法の一つです。検索エンジンと生成モデルを組み合わせて質問に対する回答を生成します。具体的には、与えられた質問に対して関連する文書を検索し、その情報をもとに回答を生成する技術です。このアプローチにより、より正確かつ詳細な回答生成が可能になります。
検索方法が重要となります。

(2024年3月現在、今後サポート範囲拡大など改善していくと思われる)

  1.Kendra + Bedrock 2.Bedrock + ベクトル DB 3.Agents for Amazon Bedrock  4.ナレッジベース for Amazon Bedrock
(1)データ保存場所 Kendra  色々 S3 S3
(2)検索方法 Kendraによる ベクトル検索
ユーザ実装
OpenSearch Serverless
(セマンティック検索システムとテキスト検索システムに 2 つの検索クエリを実行し、インテリジェントなランキングによって結果を組み合わせることで機能) OpenSource
(3)基礎モデル ユーザ実装
anthropic.claude-v2:1など
ユーザ実装 Amazon Titan Embeddings  
(4)フロー処理 ユーザ実装
Langchainなど
ユーザ実装    
(5)ナレッジ更新 Kendra ユーザ実装    
(6)日本リージョン 〇  〇  × (2024年4月現在で日本リージョンでは未対応)  × (2024年4月現在で日本リージョンでは未対応)
備考     ・Bedrock -> エージェントで作成。日本リージョンでは表示されないが、バージニア北部などでは表示される。
・複数のLambda関数を自然言語で操作
・モデルの知らない情報、最新の情報にアクセス
・数クリックでタスク作成
・LangChainでもおなじようなことができる。
・エージェントを作成。Lamdaなど
自然言語での指示も可能
・アクショングループ、ナレッジベース、詳細プロンプトの設定などが可能。
・前処理を挟むことが可能。
・本日のニュース、指定したブログなど不足情報を保続しながら回答生成が可能。
・Bedrock -> ナレッジベース で作成。日本リージョンでは表示されないが、バージニア北部などでは表示される。
"Amazon BedrockのKnowledge base "とはRAGを GUI で簡単に作成。

・Vector Store
・データソース

BedrockによるRAG

Amazon Bedrock ナレッジベーの開発メモはこちら

Amazon Bedrock エージェントの開発メモはこちら


LangChainとは

LangChainは、言語理解や生成を行うアプリケーションの構築をサポートするツールキットです。検索拡張生成(RAG)やプロンプトエンジニアリングなどの言語タスクを連鎖させることができます。


Bedrock + Kendra 連携

ドキュメントを S3 にアップロードする。S3へは wget などで取得した html や pdf などでも可能。モデルは Titan Embeddings G1 - Textv1.2 などから選択。

RAGとして GUI で chat が可能。

1.Kendra 検索エンジンと連携

(*)Kendra は起動しているだけで課金、高額なので注意

(1)

Kendra は優秀な crawer 。インデクスを作成して全文検索としてQ&Aを行う。結果の数件をBedrock RAG にchain して生成AIにより回答を取得する。

KendraとBedrock 連携

(2)Q&Aを実施し、回答の結果数件から LLM で 文書を生成する。

python3.8 sample.py "入会方法を教えてください"

sample.py

import os
import boto3
import sys

from langchain_community.llms import Bedrock
from langchain.chains import RetrievalQA
from langchain_community.retrievers import AmazonKendraRetriever
from langchain.prompts import PromptTemplate


os.environ['AWS_CONFIG_FILE'] ="/.aws/config"
os.environ['AWS_SHARED_CREDENTIALS_FILE'] = "/.aws/credentials"

#自分のkendra の index id を設定
kendra_index_id="********-****-****-****-************"
attribute_filter = {"EqualsTo": {"Key": "_language_code","Value": {"StringValue": "ja"}}}

#渡す検索結果の件数を変更するには次の20を変更する
retriever = AmazonKendraRetriever(index_id=kendra_index_id,attribute_filter=attribute_filter,top_k=20)

llm = Bedrock(
model_id="anthropic.claude-v2:1",
model_kwargs={"max_tokens_to_sample": 1000}
)

#テンプレートは Bedrock のサンプルを参考
prompt_template = """
{context}
\n\nHuman: 上記参考文書を元に、<question>に対して説明してください。
参考文書に無かった場合は「文書に情報なし」とだけ答えてください。
<question>{question}</question>
\n\nAssistant:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
chain_type_kwargs = {"prompt": PROMPT}

qa = RetrievalQA.from_chain_type(retriever=retriever,llm=llm,chain_type_kwargs=chain_type_kwargs)

result = qa.run(sys.argv[1])
print(result)



参考:Amazon Bedrock テキストモデルのプロンプトテンプレートと例

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/prompt-templates-and-examples.html

(*1)RAGとしてデータソースに存在しない場合も基礎モデルから回答してしまうので「参考文書に無かった場合は「文書に情報なし」とだけ答えてください。」が必要。

(*2)「kendraの参考文献のURLを教えてください」という追加すると、存在しない適当なURLを回答してくる。」

(*3)文書の長さを指定しないと短く回答する。「300文字」とか条件を付けると長く回答してくれる。





[
AIまとめへ戻る
]

【注意事項】本ページの内容は個人的に調査した結果がであり内容が正しいことは保証されません。
またAWSサービスは常に改良、アップデートされており本ページの内容が古く誤った内容になる可能性もあります。変更になっても本ページが正しく更新されるとは限りません。
あくまでも参考程度でご覧ください。内容により発生したいかなる時間的損害、金銭的損害、その他の損害に関しても何人も保証しません。