Knowledge Bases for Amazon Bedrock を OpenSearch Serverless で試してみる 

# はじめに

Knowledge Bases for Amazon Bedrock を利用すると、会社のデータなどを利用した RAG を簡単に構成できる機能です。OpenSearch Serverless などのベクトルデータストアと連携して、データの格納、利用などを便利に利用できます。以下のような機能が提供されています。

- OpenSearch Serverless の自動作成
- S3 上のデータを Embedding して、ベクトルデータストアに自動的に格納
- 入力したテキストに紐づくデータを、ベクトルデータストアから自動的に取得して、テキストを生成
- など



今回は、Knowledge Bases for Amazon Bedrock と OpenSearch Serverless を連携する構成をやってみる記事です。



# Knowledge Base を作成

バージニア北部リージョンを開き、Knowledge base の画面で Create を押します。

![image-20240503153323632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6a3e6dab-721c-fe0f-9091-9cb91c835223.png)



Knowledge base の名前や、IAM Role を指定します。デフォルトのまま Next を押します。

![image-20240503172259634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e6dbeca4-0141-031c-243f-193959158c71.png)



Datasource の名前と、S3 バケットを定義します。Chunking strategy は Default としており、基本的に 300 Token ごとに分割されてベクトルデータストアに保管されます。これを変更することも可能です。

![image-20240503164843837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/208bdd99-d8d6-a132-6bb2-3b687c17f294.png)



Embedding Model は、Titan Embeddings でやってみます。また、データストアは Quick create と指定することで、裏側では OpenSearch Serverless が自動的に作成されます。

![image-20240503172834469.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/60aa09ba-1e9a-55e0-cc0c-fb42fb485fde.png)



Create を押します。

![image-20240503172935646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fd9170a0-4f15-e020-d6d1-79533a008bb3.png)







作成処理が走ります。

![image-20240503154248019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b24e169a-dd58-5e94-d43d-a7ba3a540665.png)





一定時間後に、Ready となります。

![image-20240503174750711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e1079049-977d-549d-f09c-116db70da0b5.png)



OpenSearch Serverless が自動的に裏側で構築されています。

![image-20240503160740763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c4a92f30-9cff-8c8f-f92f-c7ea4d547fe9.png)



裏側の詳細を確認するため、OpenSearch Dashboard を開き、OpenSearch Serverless 上の Index 一覧を出します。

```
GET /_cat/indices?v
```



出力結果 :「bedrock-knowledge-base-default-index」という名前の Index が作成されています。これに、S3 上のデータが Embedding されて格納されます。

```
health status index                                uuid                 pri rep docs.count docs.deleted store.size pri.store.size
              bedrock-knowledge-base-default-index aIWZPY8B8SBtH7qZbf--                 72            0      1.9mb          1.9mb

```



mapping 情報を確認します。

```
GET /bedrock-knowledge-base-default-index/_mapping
```



出力結果

```
{
  "bedrock-knowledge-base-default-index": {
    "mappings": {
      "properties": {
        "AMAZON_BEDROCK_METADATA": {
          "type": "text",
          "index": false
        },
        "AMAZON_BEDROCK_TEXT_CHUNK": {
          "type": "text"
        },
        "bedrock-knowledge-base-default-vector": {
          "type": "knn_vector",
          "dimension": 1536,
          "method": {
            "engine": "faiss",
            "space_type": "l2",
            "name": "hnsw",
            "parameters": {}
          }
        },
        "id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "x-amz-bedrock-kb-source-uri": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}
```



# S3 にアップロードして Sync

S3 に RAG 用データセットをアップロードします。これは適当なサンプルファイルを格納しています。

![image-20240503165704057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3bfd60ec-da3e-a4bd-185e-a8829a63c6c1.png)



Data source を選択して、Sync を押します。

![image-20240503161918095.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f09c03be-04d2-3752-79aa-8a442e938446.png)



Status が Syncing に変わります。

![image-20240503165841779.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/411c0225-6571-e10e-7d82-b0c2dcfef469.png)



一定時間後、Available になりました。

![image-20240503175432677.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/44052b07-fc4c-27bd-2179-e0c56cc73366.png)



OpenSearch Serverless 上に、Chunk で区切られたベクトルデータが保管されている様子が確認できます。

![image-20240503180147985.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9d4e2c56-e370-eee9-0df2-3fffc9487e15.png)



# 動作確認 : GUI

S3 に格納しているテストファイルの中身を一部抜粋すると、出張の旅費規程のサンプルが格納されています。

![image-20240503183307527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c1137797-e387-3fe8-e7bd-d8fca2148440.png)



AWS マネジメントコンソールで Test を押します。

![image-20240503183446602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4dcf847a-7ac5-07c9-e09d-5fa9f82ebea7.png)



「出張における日当はいくらですか？」と質問を投げると、S3 上のデータを基に回答が得られます。

![image-20240503183524192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/63c9c07e-b13a-1a46-8fe8-00fbf8445de1.png)





source detail 開くと、参考元のファイル名を確認できます。

![image-20240503183602875.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e2e835b1-9445-bae5-15c5-7f0e82b4eba9.png)



# 動作確認 : Python から API アクセス

Python から API で Knowledge Base にアクセスを行います。

「retrieve_and_generate」API を呼び出します。これは、ユーザーからの Input テキストをもとに、RAG 的にデータに基づいたテキストを生成します。

```python
# Python外部ライブラリをインポート
import boto3
import json

# Bedrockクライアントを作成
kb = boto3.client("bedrock-agent-runtime", region_name='us-east-1')

# Retrieve and Generate
response = kb.retrieve_and_generate(
    input={"text": "出張における日当はいくらですか？"},
    retrieveAndGenerateConfiguration={
        "type": 'KNOWLEDGE_BASE',
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": "CVXUPL53HG",  # ここにナレッジベースIDを記載する
            "modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
            'retrievalConfiguration': {
                'vectorSearchConfiguration': {
                    'numberOfResults': 10,
                }
            }
        },
    },
)

# RAG結果を画面に表示
print(json.dumps(response, indent=2, ensure_ascii=False))
```



実行例

- `outout.text` は、生成されたテキスト
- `retrievedReferences` は、参考元のデータの詳細

```json
{
  "ResponseMetadata": {
    "RequestId": "42c72888-c987-43a5-ae6d-0b807847f528",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Fri, 03 May 2024 13:50:30 GMT",
      "content-type": "application/json",
      "content-length": "2628",
      "connection": "keep-alive",
      "x-amzn-requestid": "42c72888-c987-43a5-ae6d-0b807847f528"
    },
    "RetryAttempts": 0
  },
  "citations": [
    {
      "generatedResponsePart": {
        "textResponsePart": {
          "span": {
            "end": 88,
            "start": 0
          },
          "text": "出張における日当の金額は、役職によって異なります。\n\n役員: 4,000円\n部長: 3,000円\n次長・課長: 2,500円\n係長・主任: 2,000円\n一般社員: 1,800円"
        }
      },
      "retrievedReferences": [
        {
          "content": {
            "text": "ただし、宿泊費については、１泊10,000円を限度とする。  （日当）  第　19　条　１日以上の出張の場合は、日当を支給するものとし、その額は、次に定めるとおりとする。  \t役職・身分  \t日当   \t役員  \t4,000円   \t部長  \t3,000円   \t次長・課長  \t2,500円   \t係長･主任  \t2,000円   \t一般社員  \t1,800円       平成○○年○○月○○日制定施行     オモテ　　　　　　　　　　　　　　　　　　　　　　　　　平成　　年　　月　　日  ○○部御中    通勤交通費（新規・変更）支給申請書兼通勤経路届  下記のとおり申請します。  所　属  氏　名　　　　　　　　　  \t交通機関  \t区　　　　間  \t１カ月通勤定期券代  \t購　　入　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t合　　計  \t  \t円  \t     裏面に、鉄道駅、バス停留所等から自宅（居所）までの経路図をわかりやすく書いてください。  \t  \t主　任  \t係   \t        \t        \t             ウラ  通勤経路図   ( 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 N )  　方角ほほう                     ( 最寄駅 バス停 )                                                         Moyori も    ○○部御中    給与等振込（新規・変更）依頼書  　　　　　　　　　　　　　　　　　　　　　  　　　　　　　　　　　　　所　属  　　　　　　　　　　　　　　　　　　　　　　氏　名　　　　　　　　　    下記のとおり届け出いたします。"
          },
          "location": {
            "s3Location": {
              "uri": "s3://knowledge-base-virginia-bucket01/賃金規程.docx"
            },
            "type": "S3"
          },
          "metadata": {
            "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/賃金規程.docx"
          }
        }
      ]
    }
  ],
  "output": {
    "text": "出張における日当の金額は、役職によって異なります。\n\n役員: 4,000円\n部長: 3,000円\n次長・課長: 2,500円\n係長・主任: 2,000円\n一般社員: 1,800円"
  },
  "sessionId": "b1627c40-9d05-4cb4-88f0-4665459f423a"
}
```





次に、「retrieve」API を呼び出します。これは、ユーザーからの Input テキストをもとに、近い内容のデータのみを返却します。質問に対する答えは生成されません。

```python
# Python外部ライブラリをインポート
import boto3
import json

# Bedrockクライアントを作成
kb = boto3.client("bedrock-agent-runtime", region_name='us-east-1')

# Retrieve のみ
response = kb.retrieve(
    retrievalQuery={
        'text': '出張における日当はいくらですか？'
    },
    knowledgeBaseId='CVXUPL53HG',
    retrievalConfiguration={
        'vectorSearchConfiguration': {
            'numberOfResults': 10
        }
    }
)

# RAG結果を画面に表示
print(json.dumps(response, indent=2, ensure_ascii=False))
```



実行例

- retrievalResults : 参考元のテキストデータが未返却されています。

```python
{
  "ResponseMetadata": {
    "RequestId": "5814c693-fc8d-43de-82ab-57741ba99985",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Fri, 03 May 2024 13:50:54 GMT",
      "content-type": "application/json",
      "content-length": "28745",
      "connection": "keep-alive",
      "x-amzn-requestid": "5814c693-fc8d-43de-82ab-57741ba99985"
    },
    "RetryAttempts": 0
  },
  "retrievalResults": [
    {
      "content": {
        "text": "出張旅費規程    第　１　章　　総則    （目的）  第　１　条　この規程は、社員が社命により出張する場合の旅費の支給について定める。  （用語の定義）  第　２　条　この規程で用いる用語の意味は次のとおりとする。  ⑴　出　　張  　会社の出張命令により、通常の勤務地を離れて業務を遂行することをいい、宿泊出張と日帰り出張に区分する。  　①　宿泊出張　　活動の目的地・地域が遠方にあり、移動時間を含めて活動が２日以上にわたるため、宿泊を伴う出張をいう。  　②　日帰り出張　本来の勤務地を中心に半径150㎞の地域への出張で、拘束６時間以上となる宿泊を伴わない出張をいう。ただし営業職についてこの概念は適用しない。  ⑵　旅　　費  　出張に際して支給する交通費、宿泊費、日当を総称していう。  　①　交通費　交通機関を利用する際に目的地へ到達するまでの、運賃、諸料金、燃費、有料道路使用料等をいう。  　②　宿泊費　宿泊に要する費用をいう。  　③　日当　宿泊を伴う出張で、通常勤務の場合には要しない費用を支弁するため、定額で支給する手当をいう。  　④　半日当　日帰り出張に対して支給する、日当の半額に相当する手当をいう。  （旅費の計算）  第　３　条　旅費はすべて順路によって支給する。ただし、天災その他特別の事情により、やむを得ないときは実際の経路により支給する。  （交通費の計算）  第　４　条　交通費は、次の区分によって別表に定める等級の料金を支給する。  ⑴　鉄道料金  ⑵　船舶料金  ⑶　航空料金  ⑷　その他の交通料金  ２　出張地、行程に応じて承認を得た特別急行料金、寝台料金、グリーン料金等の実費を支給する。  ３　下級者が上級者に随行するとき、またはこれに準ずる場合は、上級者の等級区分による交通費を支給する。  ４　通勤交通費支給区間の交通費は原則として支給しない。ただし、特に承認を得た場合はこの限りでない。  （航空機の利用）  第　５　条　緊急業務のため、航空機の利用が必要であると所属長が認めたときは、その実費を支給する。  （社有自動車等利用の場合）  第　６　条　社有自動車など会社の所有に属する交通機関を利用したときは、この区間の交通費は支給しない。　  ２　自動車の運行に伴う高速道路通行料、ガソリン代、修理費、駐車料その他の経費は実費を支給する。  ３　自動車による出張中、自動車の使用が不可能となった場合、あるいは特殊な業務のため他の交通機関を利用したときは、この区間の交通費は実費を支給する。  （日当、宿泊費）  第　７　条　日当は、出張の初日から最終日まで、暦日により出張日数に応じて別表に定める額を支給する。  　　ただし、午後出発の場合および午前帰着の場合には、その日については半日当を支給する。  ２　第２条第１号の②にいう日帰り出張の場合は、その日について半日当を支給する。  ３　宿泊費は、宿泊した夜数に応じて別表に定める額を支給する。ただし、会社の施設、出張者の縁故先に宿泊した場合は、別表に定める宿泊費の50％を支給する。  ４　鉄道、船舶などの交通機関において、暦日が２日にわたって乗車・乗船し、４時間以上宿泊する車船中泊となる場合は、別表に定める宿泊費の50％を支給する。  ５　社外機関の宿泊研修等で宿泊費込みの受講料を会社負担している場合は、宿泊費を支給しない。  （休日の出張と旅費）  第　８　条　業務の都合により、出発の日が休日となる場合または、出張業務の遂行が休日になる場合および、出張期間内に休日がある場合の旅費の取扱いは、それぞれ次のとおりとする。  ⑴　宿泊費の支給  　　　　休日の宿泊費は、前条第３項による。  ⑵　日当の支給  　①　休日勤務となる場合　　別表に定める日当  　②　移動のみの場合　　　　半日当  　③　完全休日　　　　　　　なし  ただし、②には商品または業務に必要な物品の持運びで、直接の業務活動を行わない場合を含む。          第　２　章　　出張手続    （出張の申請）  第　９　条　出張するときは、あらかじめ所定の「出張申請および予定表」にそれぞれ必要事項記入のうえ、所属長あてに提出し、承認を得なければならない。  （旅費の仮払い）  第　10　条　出張者が、前条の承認を得たときは、出張に要する費用の全額の仮払いを受けることができる。  （出張報告書）  第　11　条　出張者が出張先から帰着したときは、所定の「出張報告書」を作成のうえ、５日以内に所属長あて報告しなければならない。  （旅費の精算）  第　12　条　出張者が、出張先から帰着したときは、すみやかに所定の「出張旅費精算書」を作成して、所属長の承認を受けたうえ、５日以内に旅費の精算をしなければならない。  ２　実費の支給を受けるときは、その支出を証明するため、前項の精算書に領収証書となる書面を添付しなければならない。ただし、領収証書を徴することができないときは、支払報告書を提出することを要する。    　"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
      },
      "score": 0.62947065
    },
    {
      "content": {
        "text": "２　前項の宿泊に要する実費は会社が負担する。ただし、転勤者またはその家族の都合により、会社が認める宿泊施設以外のところに宿泊したときは、原則としてこの実費は支給しない。  （赴任休暇）  第　○　条　転勤者が転勤するときは、次に定める赴任休暇を与える。  ⑴　単身で赴任の場合　　　　　　２日  ⑵　家族を同伴する赴任の場合　　３日  ２　前項の赴任休暇は特別有給休暇扱いとする。    平成○○年○○月○○日制定施行   出張命令書兼仮払い申請・精算書  平成　　年　　月　　日    　　　　　　　　　　　　　　　　　　　　○○部長　　　　　　　　　　　    右の者に、下記予定にて出張を命ずる。　　　　出張者：氏　名  　　　　　　　　　　　　　　　　　　　　　　　　　　  出張予定　　１．旅　程　：　　月　　日～　　月　　日　（　　　　　　　　　　）  　　　　　　２．目　的　：    経理部長　殿  　　上記のとおり出張命令を受けましたので、出張旅費の仮払いを申請いたします。    所　　属  氏　　名　　　　　　　　　　  \t  概算旅費  \t  円  \t承    認  \t  \t出    納  \t  \t受  領  印  \t     　　　注：仮払金受領後、旅費精算のときまでこの書類は出張命令者保管とする。    出張旅費精算書  下記のとおり精算いたします。　　　　　　　　　　　　　　平成　　年　　月　　日  金　額：円  \t月　日  \t目的地  \t交通機関・区間  \t交通費  \t日当  \t宿泊費  \t計   \t／  \t  \t  \t  \t  \t  \t   \t／  \t  \t  \t  \t  \t  \t   \t／  \t  \t  \t  \t  \t  \t   \t／  \t  \t  \t  \t  \t  \t   \t／  \t  \t  \t  \t  \t  \t   \t合　　　計  \t  \t  \t  \t   \t①仮払金  \t  \t②実際額  \t  \t· 精算額①－②  （不足時は△）  \t   \t承  認  欄  \t経理部長      \t所属部長  \t事務処理  \t  \t出納係  \t出張者氏名・精算印     注：領収書等は、Ａ４縦用紙に貼付してこの書類に添付すること。     5"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
      },
      "score": 0.59219235
    },
    {
      "content": {
        "text": "ただし、宿泊費については、１泊10,000円を限度とする。  （日当）  第　19　条　１日以上の出張の場合は、日当を支給するものとし、その額は、次に定めるとおりとする。  \t役職・身分  \t日当   \t役員  \t4,000円   \t部長  \t3,000円   \t次長・課長  \t2,500円   \t係長･主任  \t2,000円   \t一般社員  \t1,800円       平成○○年○○月○○日制定施行     オモテ　　　　　　　　　　　　　　　　　　　　　　　　　平成　　年　　月　　日  ○○部御中    通勤交通費（新規・変更）支給申請書兼通勤経路届  下記のとおり申請します。  所　属  氏　名　　　　　　　　　  \t交通機関  \t区　　　　間  \t１カ月通勤定期券代  \t購　　入　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t  \t～  \t円  \t月　　日   \t合　　計  \t  \t円  \t     裏面に、鉄道駅、バス停留所等から自宅（居所）までの経路図をわかりやすく書いてください。  \t  \t主　任  \t係   \t        \t        \t             ウラ  通勤経路図   ( 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 N )  　方角ほほう                     ( 最寄駅 バス停 )                                                         Moyori も    ○○部御中    給与等振込（新規・変更）依頼書  　　　　　　　　　　　　　　　　　　　　　  　　　　　　　　　　　　　所　属  　　　　　　　　　　　　　　　　　　　　　　氏　名　　　　　　　　　    下記のとおり届け出いたします。"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/賃金規程.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/賃金規程.docx"
      },
      "score": 0.58126134
    },
    {
      "content": {
        "text": "海外出張旅費規程    (目　　的)  第　１　条　この規程は、就業規則第〇条に基づき、役員もしくは役員以外の社員が業務上の命令によって海外へ出張する場合の旅費について必要な事項を定める。  ２　この規程に定めのない事項については、旅費規程の定めるところによる。  (出張先地域区分)  第　2　条　この規程は、出張先を次のとおり区分し、旅費等の取扱いを定める。  (1) A地域　アメリカ、カナダ、欧州、豪州・中南米  (2) B地域　A地域以外の地域  (旅費の種類)  第　３　条　この規程により支給する旅費は、交通費・滞在費・支度金・業務経費・雑費とする。  (旅費計算上の発着点)  第　４　条　海外出張旅費計算上の発着点は国際線使用で国内を最初に出発または最後に帰着した空港または港とする。  (旅費の仮払い)  第　５　条　旅費は、支度金を除き、仮払い支給する。  (旅費の精算)  第　６　条　旅費の精算は帰着後２週間以内に証票類を添付して精算するものとする。  ２　30日以上にわたる出張の場合、海外出張者は毎月末ごとに総務部に旅費精算書を送付しなければならない。  (交通費)  第　７　条　交通費は航空機、船舶、鉄道およびその他の運賃とし、別表第1により支給する。  (滞在費)  第　８　条　滞在費は、出発日から帰着日までの日数につき、1日あたり別表第２により支給するものとし、宿泊費、食費、日当の割合は別表第３のとおりとする。  ２　特殊業務のため同一地に滞在する場合の滞在費は、滞在期間に応じ、次の各号により支給する。  (1)　滞在期間30日未満の場合は、滞在費の100%を支給する。  (2)　滞在期間30日以上60日未満の場合は、滞在費の90%を支給する。  (3)　滞在期間60日以上の場合は、滞在費の80%を支給する。  ３　航空機または船舶中等で宿泊した場合は、宿泊費は支給しない。食費および日当については別表第３(2)、(3)の50%とする。  ４　出張地域の物価騰貴、その他やむを得ない事由により所定の滞在費で支弁不可能な場合の取扱いは、その実情により別途考慮することがある。  (支度金)  第　９　条　支度金は別表第4により支給する。  ２　２回目以降の海外出張の支度金は、前回の支度金支給時の出張より帰国後の経過期間に応じ、次の各号により支給する。  (1)　帰国後３年未満の場合は、支給しない。  (2)　帰国後３年以上5年未満の場合は、支度金の40%を支給する。  (3)　帰国後5年以上10年未満の場合は、支度金の70%を支給する。  (4)　帰国後10年以上の場合は、支度金の100%を支給する。  (業務経費)  第　10　条　通信費、通訳の費用その他業務上の経費は実費を支給する。  (随行、視察の旅費)  第　11　条　役員に随行する場合の旅費は、職務上必要と認められるときに限り、役員と同等の交通費ならびに別表第3(1)の宿泊費を支給する。  ２　外部機関等で行う海外視察に参加し、出張する場合の旅費は、その外部機関等が定めた参加費用の全額を支給する。ただし、参加費用中にこの規程に定める滞在費の一部または全部が含まれていない場合は、別表第2により不足額を支給する。  (保険加入)  第　12　条　出張中の不測の事故に備え、海外出張者に対し、別表第5の区分により死亡、傷害、治療、疾病、盗難その他の事故につき保険を付保する。この場合の保険契約者および受取人は会社とする。  ２　事故発生の場合は、事故の原因、法定災害補償の有無等を勘案して、保険金の一部または全部を本人またはその相続人に支給する。  (付帯費用)  第　13　条　海外出張者の旅券交付手数料、査証手数料、外貨手数料、予防注射料、出入国税および携帯荷物の運賃等出張の付帯費用は全額会社負担とする。  ２　パスポートの取得費用は、初めて取得する場合（10年間有効）に限り会社負担とし、２回目以降の更新費用は本人負担とする。    平成○○年○○月○○日制定施行      別表第1　交通費  \t交通費    区　分  \t航空機  \t船舶  \t鉄道  \tその他   \t役　　　　員  \tファースト  クラス  \t1等  \tグリーン  \t実費   \t役員以外の者  \tエコノミー  クラス  \t2等  \t2等  \t実費       　　　　　　　　　　　　　　　　　　　別表第２　滞在費（ドル）    \t滞在費    区　分\t　　　A地域\t　　B地域   \t　　　　　　　　　　　　  社　　長\t　 　140　　　　　130   \t常務以上　　　　　 115\t　　　　105   \t取 締 役　\t　  105\t　　　　  95   \t部　　長\t　　 95\t　　　　　85   \t課　　長\t　　 85\t　　　　  75"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/海外出張旅費規程.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/海外出張旅費規程.docx"
      },
      "score": 0.5661603
    },
    {
      "content": {
        "text": "⑵　日当の支給  　①　休日勤務となる場合　　別表に定める日当  　②　移動のみの場合　　　　半日当  　③　完全休日　　　　　　　なし  ただし、②には商品または業務に必要な物品の持運びで、直接の業務活動を行わない場合を含む。          第　２　章　　出張手続    （出張の申請）  第　９　条　出張するときは、あらかじめ所定の「出張申請および予定表」にそれぞれ必要事項記入のうえ、所属長あてに提出し、承認を得なければならない。  （旅費の仮払い）  第　10　条　出張者が、前条の承認を得たときは、出張に要する費用の全額の仮払いを受けることができる。  （出張報告書）  第　11　条　出張者が出張先から帰着したときは、所定の「出張報告書」を作成のうえ、５日以内に所属長あて報告しなければならない。  （旅費の精算）  第　12　条　出張者が、出張先から帰着したときは、すみやかに所定の「出張旅費精算書」を作成して、所属長の承認を受けたうえ、５日以内に旅費の精算をしなければならない。  ２　実費の支給を受けるときは、その支出を証明するため、前項の精算書に領収証書となる書面を添付しなければならない。ただし、領収証書を徴することができないときは、支払報告書を提出することを要する。    　別　　表　　　　　　　　　　　　　　　　　　　　（金額単位：円）  \t区分  \t宿泊費  \t日当  \t計  \t列　車  \t船舶  \t航空機   \t役員  \t15,000  \t4,000  \t19,000  \tグリーン  \t１等  \tファースト   \t部長  \t10,000  \t3,000  \t13,000  \t〃  \t〃  \tビジネス   \t次・課長  \t8,000  \t2,500  \t10,500  \t普通車  \t２等  \tエコノミー   \t係長･主任  \t7,000  \t2,000  \t9,000  \t〃  \t〃  \t〃   \t一般社員  \t6,000  \t1,800  \t7,800  \t〃  \t〃  \t〃         第　○　章　　転勤旅費    （転勤旅費）  第　○　条　転勤旅費を次のとおり支給する。  ⑴　本人移転料  ⑵　支　度　料  ⑶　運賃荷造費および運送保険料  ⑷　家族移転料  （本人移転料）  第　○　条　居住地の変更を要する転任または新任のため、赴任する者に対しては、第○章第○条に定める出張旅費を支給する。  （支度料）  第　○　条　本人の赴任支度料は下記によって支給する。  ⑴　本人が単身で赴任するとき　　　　　　　基本給の１月分  ⑵　本人赴任のあと家族だけが移転するとき　基本給の0.5月分  ⑶　本人が家族と一緒に赴任するとき\t　　　　基本給の２月分  （運賃荷造費等）  第　○　条　転任にあたっては、家具などの運賃荷造費および運送保険料の実費を支給する。  （家族移転料）  第　○　条　家族の移転料として、本人と同等級の交通費の実費を支給する。  ２　本人赴任後３か月を経ても、家族が移転しないときは、原則としてその家族の移転料および支度料は支給しない。  （転勤者の宿泊）  第　○　条　転勤者およびその家族が、新任地に到着してから新住居に入居できるまでは、会社が認める宿泊施設に宿泊することとする。  ２　前項の宿泊に要する実費は会社が負担する。ただし、転勤者またはその家族の都合により、会社が認める宿泊施設以外のところに宿泊したときは、原則としてこの実費は支給しない。  （赴任休暇）  第　○　条　転勤者が転勤するときは、次に定める赴任休暇を与える。"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/出張旅費規程.docx"
      },
      "score": 0.5646919
    },
    {
      "content": {
        "text": "◆◇◆ 秋のレクリェーションご案内 ◆◇◆    秋の気配を感じる今日このごろ、今期も残すところ半月ほどになりました。下期を前に『全員で、秋・レク旅行へ』ということで、下記の通り開催することに決定しました。  　今回はオプションも用意しましたので、いまから仕事のケジメをつけて、全員が参加できるように願っています。    　　　　　　 〇〇年秋レク 　　　　　　  ①　会費：5,000円／１人  ②　場所：犬山高原・ホテル光明閣  ③　集合：９月25日（土）９時　本社・正面玄関前  ④　解散：９月26日（日）17時ごろ（都内到着）  ⑤　交通：貸切りバスで往復します。  ⑥　オプション：テニス、釣り、ハイキング、ゴルフ  ★なお、幹事がご希望を伺って歩きますので、よろしくお願いします。  以上　"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/秋のレクリエーションご案内.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/秋のレクリエーションご案内.docx"
      },
      "score": 0.53603065
    },
    {
      "content": {
        "text": "6ヵ月以上   \t4日  \t169日  ～　216日  \t7日  \t8日  \t9日  \t10日  \t12日  \t13日  \t15日   \t3日  \t121日  ～　168日  \t5日  \t6日  \t6日  \t8日  \t9日  \t10日  \t11日   \t2日  \t73日  ～　120日  \t3日  \t4日  \t4日  \t5日  \t6日  \t6日  \t7日   \t1日  \t48日  ～　72日  \t1日  \t2日  \t2日  \t2日  \t3日  \t3日  \t3日     ※各表中の「勤続年数」欄の(　)内は、平成5年9月30日以前に採用された者の勤続年数    〔別表2〕  労働基準法所定の休暇等    \t休　　暇　　等  \t内　　　　　　　　　　　　　容   \t産前産後休暇  育児時間  生理休業  公民権行使時間  \t産前6週間（多胎妊娠14週）、産後8週間  生後1年以内、1日2回各30分  著しく就業困難な者、必要日数  選挙権の行使等、必要時間               雇　入　通　知　書  \t　　　　　　　　　　　　　　　　　　　　  　　　　　　　　　　　　　　　　　　　　平成　　年　　月　　日  殿  　　　　　　　　　　　　　　　　　　　社　名：　○○　株式会社  　　　　　　　　　　　　　　　　　　　社　長：　　　　　　　　   \t契約期間  \t１．期間の定めなし　２．期間の定めあり（平成　年　月　日～　年　月　日）   \t就業の場所  \t     \t業務内容  \t     \t就業時間  ・　　　　  休憩等  \t始業時刻　　　：　　～　終業時刻　　　：　　  休憩時間　　　：　　～　　　：　　　（　　分間）  実働時間　　１日　　　時間　　分   \t休　　日  \t毎週　○曜日（法定休日）　及び○曜日　国民の祝日　会社創立記念日  年末・年始　（　　　　　　）　その他　（　　　　　　　　　）   \t休　　暇  \t１．年次有給休暇　６カ月継続勤務した場合　→　○日  詳細はパートタイマー就業規則第○条によります。  ２．その他の休暇　有給：（　　　　　　　　）無給：（　　　　　　　　）   \t        賃　　金  \t１．基本給：時給　　　　　円　　　４．賞与　会社業績によります。"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/パートタイマー就業規則.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/パートタイマー就業規則.docx"
      },
      "score": 0.53217596
    },
    {
      "content": {
        "text": "№　　　　    \t  休　暇　届      　　　　　　　　　殿    平成　　年　　月　　日　届　　　　　年　　月　　日承認   \t所  \t  \t  \t　　  \t部長  \t課長  \t係長   \t属  \t　　　　　部(課)　　係  \t  \t  \t  \t  \t   \t氏  \t  \t  \t  \t  \t  \t   \t名  \t　　　　　　　　　　印  \t   \t期  \t　平成　　年　　月　　日から   \t間  \t　平成　　年　　月　　日まで　　（　　　間）   \t区  \t   \t別  \t   \t事  \t   \t  \t   \t由  \t   \t備  \t   \t  \t   \t考  \t     　注意１．届は、休暇の前日までにすませるようにしてください。  ２．届は、自分で所属長の承認を得て担当部課に提出して  　ください。"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/休暇届.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/休暇届.docx"
      },
      "score": 0.5289614
    },
    {
      "content": {
        "text": "№　　　　    \t  休　暇　届      　　　　　　　　　殿    平成　　年　　月　　日　届　　　　　年　　月　　日承認   \t所  \t  \t  \t　　  \t部長  \t課長  \t係長   \t属  \t　　　　　部(課)　　係  \t  \t  \t  \t  \t   \t氏  \t  \t  \t  \t  \t  \t   \t名  \t　　　　　　　　　　印  \t   \t期  \t　平成　　年　　月　　日から   \t間  \t　平成　　年　　月　　日まで　　（　　　間）   \t区  \t   \t別  \t   \t事  \t   \t  \t   \t由  \t   \t備  \t   \t  \t   \t考  \t     　注意１．届は、休暇の前日までにすませるようにしてください。  ２．届は、自分で所属長の承認を得て担当部課に提出して  　ください。"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/休暇届.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/休暇届.docx"
      },
      "score": 0.5289614
    },
    {
      "content": {
        "text": "業務内容  \t     \t就業時間  ・　　　　  休憩等  \t始業時刻　　　：　　～　終業時刻　　　：　　  休憩時間　　　：　　～　　　：　　　（　　分間）  実働時間　　１日　　　時間　　分   \t休　　日  \t毎週　○曜日（法定休日）　及び○曜日　国民の祝日　会社創立記念日  年末・年始　（　　　　　　）　その他　（　　　　　　　　　）   \t休　　暇  \t１．年次有給休暇　６カ月継続勤務した場合　→　○日  詳細はパートタイマー就業規則第○条によります。  ２．その他の休暇　有給：（　　　　　　　　）無給：（　　　　　　　　）   \t        賃　　金  \t１．基本給：時給　　　　　円　　　４．賞与　会社業績によります。  ２．精勤手当　　　　　　　円　　　５．その他  ３．通勤費　　　　　　　　円    計算期間　前月16日～当月15日（締切日）　支給日　毎月25日  支給方法　本人指定の金融機関等の本人名義口座に振込  昇給等　　職務内容・成績等により毎年４月に見直します。  退職金   \t退職に関  する事項  \t１．定年　　あり（　　　歳）　　なし  ２．自己都合退職　（退職予定日の　○日以上前までに届け出ることとします）  ３．契約期間満了　更新の有無を１カ月以上前までに決めて通知します。  ４．解雇　　この場合は事由を明示し法の手続きに従います。   \tその他  \t１．社会保険の加入（健康保険　厚生年金保険　厚生年金基金　その他）  ２．雇用保険の適用（あり　なし）  ３．その他          8"
      },
      "location": {
        "s3Location": {
          "uri": "s3://knowledge-base-virginia-bucket01/パートタイマー就業規則.docx"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-source-uri": "s3://knowledge-base-virginia-bucket01/パートタイマー就業規則.docx"
      },
      "score": 0.52611613
    }
  ]
}
```





# 付録1 : Cohere で 300 Chunk で Sync した時のエラー画面

Model Cohere の Embedding Model を選択した際に、以下のエラーが表示されることがありました。正確には AWS Support に問合せする内容だと思いますが、おそらく、Cohere Embed Multilingual Model の Chunk Size の上限 512 に引っ掛かっているエラーだと思います。Chunk Size をより小さくするとエラーがなくなったりもしていました。

> The server encountered an internal error while processing the request.

![image-20240503170253618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4addc8e2-df45-82b3-db34-73f18a070ac0.png)



# 検証を通じてわかったこと

- Knowledge Base と連携する S3 Bucket について
  - 別の AWS アカウントでも指定可能
  - Knowledge Base と S3 バケットは同じリージョンで作成する必要がある。
    - https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-ingest.html
  - S3 に配置できるファイル
    - https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-ds.html
- Knowledge Base を利用したときに、「ストリーム出力」が出来ない
  - `retrieve_and_generate` API を呼び出した場合、モデルがテキストをすべて生成したあとに Response が返ってくるため、ストリーム出力が出来ない。
  - Bedrock では `invoke_model_with_response_stream` API を利用すると、テキスト生成処理の結果を少しずつ出力してくれるので、最初出力するまでの時間を短くできるメリットがあって体験が良い。
  - このストリーム出力が Knowledge Base 単体だと出来ないため、`retrieve` 部分だけ Knowledge Base を利用して、生成部分は Bedrock を利用する構成が考えられる。
- S3 上のデータを Sync する際の定期実行は Knowledge Base の機能としては提供されておらず、EventBridge などと連携して定期実行が可能。
  - https://xp-cloud.jp/blog/2024/01/12/110000
- ベクトルデータストアにデータを蓄積せず、直接 1 個のファイルに対する質問ができる機能が追加されている。
  - ベクトルデータストアを構築しなくても API 呼び出しが可能なので、費用的にメリットがある。
  - https://qiita.com/hayao_k/items/32f0d0479a947942d96e
- OpenSearch Serverless を使ってハイブリッド検索を行おうと思ったときに、Analyzer が Kuromoji が設定されていないため、日本語の精度的に問題がある。そのため、以下の URL などを参考に Kuromoji を設定すると精度向上を期待できる。
  - https://www.fsi.co.jp/blog/10661/
- 1 個の Knowledge Base に追加可能な Data source の上限 (limit) は 5 個まで。
  - Document に記載はなかったが、動作確認をおこなった。もしかしたら緩和する可能性はあり。
- 1 個の AWS アカウント、1 リージョンあたり、作成できる Knowledge Base は 50 個まで
  - https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/quotas.html#quotas-kb



# 参考 URL

https://aws.amazon.com/jp/blogs/news/knowledge-bases-now-delivers-fully-managed-rag-experience-in-amazon-bedrock/

https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-now-supports-amazon-aurora-postgresql-and-cohere-embedding-models/

https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-now-supports-hybrid-search/