# RAG & Agents リファレンス
> **関連**: 基礎Embedding・自前セマンティック検索は [BEDROCK-EMBEDDING-SEARCH.md](./BEDROCK-EMBEDDING-SEARCH.md) を参照
## Knowledge Bases 概要
### アーキテクチャ
Amazon Bedrock Knowledge Basesは、企業データをFoundation Modelsと統合するためのマネージドRAG(Retrieval-Augmented Generation)ソリューション。
**基本フロー**:
```
1. データ取り込み → 2. チャンク化 → 3. 埋め込み生成 → 4. ベクトルストアへ保存
↓
5. ユーザークエリ → 6. ベクトル検索 → 7. 関連文書取得 → 8. LLMへコンテキスト注入
```
---
## データソース統合
### サポートされるデータソース
| データソース | 形式 | 用途 |
|------------|------|------|
| **Amazon S3** | PDF, TXT, MD, HTML, DOCX, CSV | ドキュメント、マニュアル |
| **Confluence** | Wiki | 社内ナレッジベース |
| **Salesforce** | CRM | 顧客情報 |
| **SharePoint** | ドキュメント | 社内ファイル |
| **Web Crawler** | Webページ | 公開ドキュメント |
### S3データソースの設定
```python
import boto3
bedrock_agent = boto3.client('bedrock-agent')
# Knowledge Base作成
knowledge_base_response = bedrock_agent.create_knowledge_base(
name='enterprise-docs',
description='企業ドキュメントのナレッジベース',
roleArn='arn:aws:iam::123456789012:role/BedrockKBRole',
knowledgeBaseConfiguration={
'type': 'VECTOR',
'vectorKnowledgeBaseConfiguration': {
'embeddingModelArn': 'arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0'
}
},
storageConfiguration={
'type': 'OPENSEARCH_SERVERLESS',
'opensearchServerlessConfiguration': {
'collectionArn': 'arn:aws:aoss:us-east-1:123456789012:collection/kb-collection',
'vectorIndexName': 'bedrock-knowledge-base-index',
'fieldMapping': {
'vectorField': 'embedding',
'textField': 'text',
'metadataField': 'metadata'
}
}
}
)
kb_id = knowledge_base_response['knowledgeBase']['knowledgeBaseId']
# データソース追加(S3)
bedrock_agent.create_data_source(
knowledgeBaseId=kb_id,
name='s3-documents',
dataSourceConfiguration={
'type': 'S3',
's3Configuration': {
'bucketArn': 'arn:aws:s3:::my-knowledge-base-bucket',
'inclusionPrefixes': ['documents/']
}
}
)
```
---
## ベクトルストア
### サポートされるベクトルデータベース
| データベース | 特徴 | 推奨用途 |
|------------|------|---------|
| **OpenSearch Serverless** | マネージド、スケーラブル | 本番環境、大規模データ |
| **Amazon Aurora PostgreSQL** | RDS統合、pgvector | 既存RDS環境 |
| **Pinecone** | サードパーティ、高性能 | 専用ベクトルDB |
| **Redis Enterprise Cloud** | インメモリ、高速 | リアルタイム検索 |
### ベクトルストア比較
| 項目 | OpenSearch Serverless | Aurora PostgreSQL | Pinecone |
|------|---------------------|-------------------|----------|
| **管理** | フルマネージド | フルマネージド | フルマネージド |
| **スケーラビリティ** | 自動スケール | 手動/自動 | 自動スケール |
| **コスト** | 中 | 低 | 高 |
| **検索速度** | 高速 | 中速 | 最速 |
| **統合** | AWS統合 | RDS統合 | API統合 |
---
## チャンク戦略
### チャンクパラメータ
```python
# データソース設定でチャンク戦略を指定
chunking_configuration = {
'chunkingStrategy': 'FIXED_SIZE', # または 'SEMANTIC', 'NONE'
'fixedSizeChunkingConfiguration': {
'maxTokens': 300, # チャンクサイズ
'overlapPercentage': 20 # オーバーラップ率
}
}
```
### チャンク戦略の選択
| 戦略 | 説明 | 用途 |
|------|------|------|
| **FIXED_SIZE** | 固定トークン数で分割 | 汎用(デフォルト) |
| **SEMANTIC** | 意味的な境界で分割 | 文脈を保持したい場合 |
| **NONE** | 分割なし | 短いドキュメント |
### 推奨設定
| ドキュメントタイプ | チャンクサイズ | オーバーラップ |
|-----------------|--------------|-------------|
| 技術ドキュメント | 300-500トークン | 10-20% |
| FAQ | 100-200トークン | 0-10% |
| 長文記事 | 500-800トークン | 20-30% |
| コードドキュメント | 200-400トークン | 10-20% |
---
## RAG実装パターン
### 基本RAGパイプライン
```python
import boto3
import json
bedrock_runtime = boto3.client('bedrock-runtime')
bedrock_agent_runtime = boto3.client('bedrock-agent-runtime')
def rag_query(question: str, kb_id: str) -> str:
"""
RAGクエリの実行: 検索 → 拡張 → 生成
"""
# 1. ベクトル検索
retrieve_response = bedrock_agent_runtime.retrieve(
knowledgeBaseId=kb_id,
retrievalQuery={
'text': question
},
retrievalConfiguration={
'vectorSearchConfiguration': {
'numberOfResults': 5 # 取得する文書数
}
}
)
# 2. 関連文書を取得
documents = retrieve_response['retrievalResults']
# 3. コンテキストを構築
context = "\n\n".join([doc['content']['text'] for doc in documents])
# 4. LLMにコンテキストを注入して生成
prompt = f"""
以下のコンテキストを参照して質問に答えてください。
{context}
{question}
回答:
"""
request_body = {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": prompt}
]
}
response = bedrock_runtime.invoke_model(
modelId='anthropic.claude-3-sonnet-20240229-v1:0',
body=json.dumps(request_body)
)
response_body = json.loads(response['body'].read())
return response_body['content'][0]['text']
# 使用例
answer = rag_query(
question="AWS Lambdaの料金体系は?",
kb_id='ABCDEFGHIJ'
)
print(answer)
```
### Retrieve and Generate API
Knowledge BaseとLLMを自動統合するAPI:
```python
def rag_query_simple(question: str, kb_id: str) -> str:
"""
Retrieve and Generate APIで簡単にRAG実行
"""
response = bedrock_agent_runtime.retrieve_and_generate(
input={
'text': question
},
retrieveAndGenerateConfiguration={
'type': 'KNOWLEDGE_BASE',
'knowledgeBaseConfiguration': {
'knowledgeBaseId': kb_id,
'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0',
'retrievalConfiguration': {
'vectorSearchConfiguration': {
'numberOfResults': 5
}
}
}
}
)
return response['output']['text']
```
### Hybrid Search
ベクトル検索 + キーワード検索の組み合わせ:
```python
retrieve_response = bedrock_agent_runtime.retrieve(
knowledgeBaseId=kb_id,
retrievalQuery={'text': question},
retrievalConfiguration={
'vectorSearchConfiguration': {
'numberOfResults': 10,
'overrideSearchType': 'HYBRID' # ベクトル + キーワード
}
}
)
```
### ReRanking
検索結果の再ランキング:
```python
# Retrieve with ReRanking
retrieve_response = bedrock_agent_runtime.retrieve(
knowledgeBaseId=kb_id,
retrievalQuery={'text': question},
retrievalConfiguration={
'vectorSearchConfiguration': {
'numberOfResults': 20,
'overrideSearchType': 'HYBRID'
}
}
)
# Cohere ReRankを使用して再ランキング
from cohere import Client
cohere_client = Client(api_key='...')
documents = [doc['content']['text'] for doc in retrieve_response['retrievalResults']]
rerank_response = cohere_client.rerank(
query=question,
documents=documents,
top_n=5,
model='rerank-english-v2.0'
)
# 上位5件を取得
top_docs = [documents[result.index] for result in rerank_response.results]
```
---
## Bedrock Agents
### Agent概要
Bedrock Agentsは、マルチステップ推論と外部システム統合を可能にするエージェントフレームワーク。
**主要機能**:
- **マルチステップ推論**: 複雑なタスクを分解して実行
- **Action Groups**: Lambda関数を呼び出して外部システムと連携
- **Knowledge Base統合**: RAGを自動実行
- **Return of Control**: 人間の承認を要求
### Agentアーキテクチャ
```
ユーザー入力
↓
Agent(LLM)
↓ 推論
├─ Knowledge Base検索
├─ Action Group実行(Lambda呼び出し)
└─ 次のステップを計画
↓
最終回答
```
### Agent作成
```python
import boto3
bedrock_agent = boto3.client('bedrock-agent')
# Agent作成
agent_response = bedrock_agent.create_agent(
agentName='customer-support-agent',
description='カスタマーサポート用エージェント',
foundationModel='anthropic.claude-3-sonnet-20240229-v1:0',
instruction="""
あなたは親切なカスタマーサポートエージェントです。
以下のタスクを実行できます:
1. 注文状況の確認
2. 返品処理
3. FAQ検索
4. エスカレーション
""",
idleSessionTTLInSeconds=1800,
agentResourceRoleArn='arn:aws:iam::123456789012:role/BedrockAgentRole'
)
agent_id = agent_response['agent']['agentId']
```
### Action Group設定
```python
# Lambda関数をAction Groupとして登録
bedrock_agent.create_agent_action_group(
agentId=agent_id,
agentVersion='DRAFT',
actionGroupName='order-management',
description='注文管理アクション',
actionGroupExecutor={
'lambda': 'arn:aws:lambda:us-east-1:123456789012:function:OrderManagementFunction'
},
apiSchema={
'payload': json.dumps({
"openapi": "3.0.0",
"info": {"title": "Order Management API", "version": "1.0.0"},
"paths": {
"/getOrderStatus": {
"post": {
"summary": "注文状況を取得",
"operationId": "getOrderStatus",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"orderId": {"type": "string"}
},
"required": ["orderId"]
}
}
}
},
"responses": {
"200": {
"description": "成功",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"status": {"type": "string"},
"estimatedDelivery": {"type": "string"}
}
}
}
}
}
}
}
}
}
})
}
)
```
### Lambda関数(Action Group)
```python
import json
def lambda_handler(event, context):
"""
Bedrock Agent Action Group用Lambda関数
"""
api_path = event['apiPath']
parameters = event.get('parameters', [])
if api_path == '/getOrderStatus':
order_id = next(
(param['value'] for param in parameters if param['name'] == 'orderId'),
None
)
# 注文状況を取得(実際のDB検索等)
order_status = {
'orderId': order_id,
'status': '配送中',
'estimatedDelivery': '2025-03-15'
}
return {
'messageVersion': '1.0',
'response': {
'actionGroup': event['actionGroup'],
'apiPath': api_path,
'httpMethod': event['httpMethod'],
'httpStatusCode': 200,
'responseBody': {
'application/json': {
'body': json.dumps(order_status)
}
}
}
}
```
### Knowledge Base統合
```python
# AgentにKnowledge Baseを関連付け
bedrock_agent.associate_agent_knowledge_base(
agentId=agent_id,
agentVersion='DRAFT',
description='FAQナレッジベース',
knowledgeBaseId='KBID123456',
knowledgeBaseState='ENABLED'
)
```
### Agent実行
```python
bedrock_agent_runtime = boto3.client('bedrock-agent-runtime')
# Agentを準備
bedrock_agent.prepare_agent(agentId=agent_id)
# Agentを呼び出し
response = bedrock_agent_runtime.invoke_agent(
agentId=agent_id,
agentAliasId='TSTALIASID',
sessionId='session-123',
inputText='注文番号ABC123の配送状況を教えてください'
)
# レスポンスを処理
for event in response['completion']:
if 'chunk' in event:
chunk = event['chunk']
print(chunk.get('bytes', b'').decode('utf-8'), end='', flush=True)
```
---
## オープンソースフレームワーク統合
### LangChain統合
```python
from langchain_aws import BedrockEmbeddings, ChatBedrock
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.document_loaders import S3DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. ドキュメント読み込み
loader = S3DirectoryLoader('my-bucket', prefix='documents/')
documents = loader.load()
# 2. チャンク化
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
# 3. 埋め込み生成
embeddings = BedrockEmbeddings(
model_id="amazon.titan-embed-text-v2:0",
region_name="us-east-1"
)
# 4. ベクトルストア作成
vectorstore = FAISS.from_documents(chunks, embeddings)
# 5. LLM設定
llm = ChatBedrock(
model_id="anthropic.claude-3-sonnet-20240229-v1:0",
model_kwargs={"temperature": 0.7}
)
# 6. RAGチェーン構築
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 5})
)
# 7. 質問実行
answer = qa_chain.invoke("AWS Lambdaの料金体系は?")
print(answer['result'])
```
### LlamaIndex統合
```python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.bedrock import Bedrock
from llama_index.embeddings.bedrock import BedrockEmbedding
# 1. LLMと埋め込みモデル設定
Settings.llm = Bedrock(
model="anthropic.claude-3-sonnet-20240229-v1:0",
temperature=0.7
)
Settings.embed_model = BedrockEmbedding(
model="amazon.titan-embed-text-v2:0"
)
# 2. ドキュメント読み込み
documents = SimpleDirectoryReader('data/').load_data()
# 3. インデックス作成
index = VectorStoreIndex.from_documents(documents)
# 4. クエリエンジン作成
query_engine = index.as_query_engine(similarity_top_k=5)
# 5. 質問実行
response = query_engine.query("AWS Lambdaの料金体系は?")
print(response)
```
---
## Amazon Q
### Amazon Q Business
エンタープライズ向けAIアシスタント。企業データを統合してビジネスユーザーが活用可能。
**主要機能**:
- 自然言語でのデータ検索
- 複数データソース統合(S3、Confluence、Salesforce等)
- ファイルアップロード&質問
- ビジネス分析支援
### Amazon Q Developer
開発者向けコーディングアシスタント。
**主要機能**:
- コード生成・補完
- バグ修正提案
- AWSリソース操作支援
- セキュリティスキャン
---
## モデル評価
### Bedrock Model Evaluation
```python
bedrock = boto3.client('bedrock')
# 評価ジョブ作成
evaluation_job = bedrock.create_evaluation_job(
jobName='text-generation-eval',
jobDescription='テキスト生成モデルの評価',
roleArn='arn:aws:iam::123456789012:role/BedrockEvalRole',
evaluationConfig={
'automated': {
'datasetMetricConfigs': [
{
'taskType': 'Summarization',
'dataset': {
'name': 'summarization-dataset',
'datasetLocation': {
's3Uri': 's3://my-bucket/eval-data/summarization.jsonl'
}
},
'metricNames': ['ROUGE', 'BERTScore']
}
]
}
},
inferenceConfig={
'models': [
{
'bedrockModel': {
'modelIdentifier': 'anthropic.claude-3-sonnet-20240229-v1:0',
'inferenceParams': json.dumps({
'temperature': 0.7,
'max_tokens': 512
})
}
}
]
},
outputDataConfig={
's3Uri': 's3://my-bucket/eval-results/'
}
)
```
### 自動評価メトリクス
| メトリクス | 説明 | 用途 |
|----------|------|------|
| **ROUGE** | n-gramの重複度 | 要約、翻訳 |
| **BERTScore** | 意味的類似度 | テキスト生成全般 |
| **BLEU** | 翻訳品質 | 機械翻訳 |
| **Perplexity** | モデルの不確実性 | 言語モデル評価 |
### 人間評価
```python
# 人間評価用のワークフローを設定
evaluation_job = bedrock.create_evaluation_job(
jobName='human-eval',
evaluationConfig={
'human': {
'datasetMetricConfigs': [
{
'taskType': 'General',
'dataset': {
'name': 'qa-dataset',
'datasetLocation': {
's3Uri': 's3://my-bucket/human-eval/qa.jsonl'
}
},
'humanWorkflowConfig': {
'flowDefinitionArn': 'arn:aws:sagemaker:us-east-1:123456789012:flow-definition/human-eval',
'instructions': '回答の正確性を1-5で評価してください'
}
}
]
}
}
# ...
)
```
---
## まとめ
このリファレンスでは、RAG実装、Bedrock Agents、オープンソースフレームワーク統合、Amazon Q、モデル評価について解説した。実装時は以下の点に注意:
- **Knowledge Bases**: 適切なチャンク戦略とベクトルストアを選択
- **RAG最適化**: Hybrid Search、ReRankingを活用
- **Agents**: Action Groupsで外部システムと統合
- **フレームワーク**: LangChain/LlamaIndexで開発効率向上
- **評価**: 自動評価と人間評価を組み合わせて品質保証