LoginSignup
4
4

StepFunctionsとCommandR+でコードもプロンプトも書かずにRAGを作る

Last updated at Posted at 2024-05-04

Command R+ の登場で「プロンプトを書かないRAG」が実現できるようになったので、StepFunctionsの「コードを書かないRAG」と組み合わせて「コードもプロンプトも書かないRAG」を作ってみます。Retrieverとしてはナレッジベースを使用しこちらもノーコードです。

image.png

実行例

入力

{
  "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を配置し、設定タブを以下の様にします。

image.png

image.png

基盤モデルとして Command R+ を指定し、モデルパラメーターを以下の様にします。

{
  "message.$": "$.query",
  "search_queries_only": true
}

出力タブを以下の様にします。

image.png

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"
    ]
  }
}

step1result配列の中に検索クエリが配列で格納されます。

※英語に存在する単語は英語になっちゃうかー。。。

2ステップ目

1ステップ目(検索クエリ)の件数だけループしてナレッジベースを呼び出す為、Map を配置し、設定タブを以下の様にします。

image.png

項目配列へのパスを指定にチェックを入れ、以下の様に入力します。

$.step1.result

step1result配列の内容でループします。

出力タブを以下の様に設定します。

image.png

ResultPath を使用して元の入力を出力に追加にチェックを入れ、以下の様に入力します。

$.step2

これで元の入力を維持したまま、このステップの実行結果をstep2に格納します。

3ステップ目

Retrieverとしてナレッジベースを使用して検索を行います。
Map の中に Bedrock Runtime Agents: Retrieve を配置し、以下の様に設定します。

image.png

APIパラメータを以下の様に設定します。

{
  "KnowledgeBaseId": "各自のナレッジベースID 10桁",
  "RetrievalQuery": {
    "Text.$": "$"
  }
}

これで、step1result配列の内容を元にナレッジベースの検索が実行されます。

出力タブを以下の様に設定します。
image.png

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を配置し、設定タブを以下の様にします。

image.png

基盤モデルとして Command R+ を指定し、モデルパラメーターを以下の様にします。

{
  "message.$": "$.query",
  "documents.$": "$.step2[*].result[*]"
}

大元の入力をmessageに設定します。
step2にはナレッジベースの検索結果(複数件)が格納されているので、まとめてdocumentsに設定します。

出力タブを以下の様に設定します。

image.png

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 が実現できました。
ノーコードでとても簡単ですね!(白目

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4