概要
このサンプルコードは、Streamlitを使ったRAG(Retrieval Augmented Generation)アプリケーションの実装例です。RAGとは、LLMの回答生成を外部知識で拡張する手法で、より正確で信頼性の高い回答を得るために活用されています。
アーキテクチャ
![RAGの概念図]
-
ユーザーからの入力
- Streamlit UIから質問を受付
- 使用するLLMモデル(Claude 3 SonnetまたはHaiku)を選択
-
知識検索(Retrieval)
- Amazon Knowledge Basesから関連ドキュメントを検索
- ハイブリッド検索(ベクトル + キーワード)で上位30件を取得
-
コンテキスト拡張プロンプト生成(Augmentation)
- 検索結果を「context」としてプロンプトに挿入
- 検索結果がない場合の回答方法も指定
-
回答生成(Generation)
- Amazon Bedrockを通じてClaude 3モデルに問い合わせ
- 検索結果を参考にした回答を生成
主要コンポーネント
1. UI層 (Streamlit)
st.title("Knowledge base RAGアプリケーションサンプル")
use_model = st.selectbox("使用するモデルを選択してください",("Sonnet","Haiku"))
user_input = st.text_input("質問")
send_button = st.button("送信")
2. レトリーバー (Amazon Knowledge Bases)
retriever = AmazonKnowledgeBasesRetriever(
knowledge_base_id="XXXXXXXXXX",
retrieval_config={
"vectorSearchConfiguration": {
"numberOfResults": 30,
"overrideSearchType": "HYBRID"
}
}
)
3. LLM (Claude 3 via Amazon Bedrock)
LLM = ChatBedrock(model_id=modelId, model_kwargs={"temperature": 0, "max_tokens": 4000})
4. RAGチェーン (LangChain)
chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | LLM | StrOutputParser()
技術的ポイント
-
ハイブリッド検索
- ベクトル検索(意味的類似性)とキーワード検索(構文的一致)を組み合わせて検索精度を向上
-
プロンプトエンジニアリング
- システムプロンプトで明確な指示を与え、知識ベースの情報と一般知識を区別
-
パラメータチューニング
- temperature=0で決定論的な回答を生成(再現性向上)
- 最大トークン数や検索結果数の適切な設定
-
LangChainパイプライン
- 複数のコンポーネントを統合したシンプルなデータフロー
-
|
演算子を使用した直感的なチェーン構築
拡張ポイント
- 検索結果のフィルタリングやリランキング
- 回答品質の評価メカニズム
- ユーザーフィードバックの取り込み
- 多言語対応