Command R+ の登場で「プロンプトを書かないRAG」が実現できるようになったので、StepFunctionsの「コードを書かないRAG」と組み合わせて「コードもプロンプトも書かないRAG」を作ってみます。Retrieverとしてはナレッジベースを使用しこちらもノーコードです。
実行例
入力
{
"query": "Claude 3 と Command R のモデルIDは?"
}
出力
"result":
"Anthropic Claude 3にはいくつかのモデルIDがあります。その一部を次に示します。\n\n
- anthropic.claude-3-haiku-20240307-v1:0\n
- anthropic.claude-3-opus-20240229-v1:0\n\n
Cohere Command RのモデルIDは次のとおりです。\n\n
- cohere.command-r-v1:0"
1ステップ目
1ステップ目ではユーザー入力を元にRetrieverの検索クエリを生成します。
Bedrock の InvokeModelを配置し、設定タブを以下の様にします。
基盤モデルとして Command R+ を指定し、モデルパラメーターを以下の様にします。
{
"message.$": "$.query",
"search_queries_only": true
}
出力タブを以下の様にします。
ResultSelector を使用して結果を変換
にチェックを入れ、以下の様に入力します。
{
"result.$": "$.Body.search_queries[*].text"
}
生成結果(複数件)からtext
を配列で引っこ抜きます。
ResultPath を使用して元の入力を出力に追加
にチェックを入れ、以下の様に入力します。
$.step1
これで元の入力を維持したまま、このステップの実行結果をstep1
に格納します。
このステップの最終的な出力の例は以下です。
{
"query": "Claude 3 と Command R のモデルIDは?",
"step1": {
"result": [
"Claude 3 model ID",
"Command R model ID"
]
}
}
step1
のresult
配列の中に検索クエリが配列で格納されます。
※英語に存在する単語は英語になっちゃうかー。。。
2ステップ目
1ステップ目(検索クエリ)の件数だけループしてナレッジベースを呼び出す為、Map を配置し、設定タブを以下の様にします。
項目配列へのパスを指定
にチェックを入れ、以下の様に入力します。
$.step1.result
step1
のresult
配列の内容でループします。
出力タブを以下の様に設定します。
ResultPath を使用して元の入力を出力に追加
にチェックを入れ、以下の様に入力します。
$.step2
これで元の入力を維持したまま、このステップの実行結果をstep2
に格納します。
3ステップ目
Retrieverとしてナレッジベースを使用して検索を行います。
Map の中に Bedrock Runtime Agents: Retrieve を配置し、以下の様に設定します。
APIパラメータを以下の様に設定します。
{
"KnowledgeBaseId": "各自のナレッジベースID 10桁",
"RetrievalQuery": {
"Text.$": "$"
}
}
これで、step1
のresult
配列の内容を元にナレッジベースの検索が実行されます。
ResultSelector を使用して結果を変換
にチェックを入れ、以下の様に入力します。
{
"result.$": "$.RetrievalResults[*].Content"
}
ナレッジベースの実行結果(検索結果)から、とりあえずContent
のみ抜き出して(contentの中に検索結果がtext
として複数件(デフォルト5件)格納されています)result
に格納します。
2ステップ目と3ステップ目の最終的な例は以下です。
{
"query": "Claude 3 と Command R のモデルIDは?",
"step1": {
"result": [
"Claude 3 model ID",
"Command R model ID"
]
},
"step2": [
{
"result": [
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...}
]
},
{
"result": [
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...}
]
}
]
}
検索クエリが複数件だった場合、ナレッジベースの検索が複数実行され、result
が複数格納されます。
4ステップ目
Bedrock の InvokeModelを配置し、設定タブを以下の様にします。
基盤モデルとして Command R+ を指定し、モデルパラメーターを以下の様にします。
{
"message.$": "$.query",
"documents.$": "$.step2[*].result[*]"
}
大元の入力をmessage
に設定します。
step2
にはナレッジベースの検索結果(複数件)が格納されているので、まとめてdocuments
に設定します。
出力タブを以下の様に設定します。
ResultSelector を使用して結果を変換
にチェックを入れ、以下の様に入力します。
{
"result.$": "$.Body.text"
}
これで最終的な生成結果のみ出力します。
最終的に実行されるプロンプトの例は以下です。
{
"ModelId": "arn:aws:bedrock:us-west-2::foundation-model/cohere.command-r-plus-v1:0",
"Body": {
"documents": [
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...},
{"Text": ...}
],
"message": "Claude 3 と Command R のモデルIDは?"
}
}
実行結果の例は冒頭の以下になります。
"result":
"Anthropic Claude 3にはいくつかのモデルIDがあります。その一部を次に示します。\n\n
- anthropic.claude-3-haiku-20240307-v1:0\n
- anthropic.claude-3-opus-20240229-v1:0\n\n
Cohere Command RのモデルIDは次のとおりです。\n\n
- cohere.command-r-v1:0"
まとめ
以上で、コードもプロンプトも書かずにRAG、いや、Advanced RAG が実現できました。
ノーコードでとても簡単ですね!(白目