目次
この記事について
本記事は、Agent Builder を使用したデータストア参照型対話エージェントの作成に関する調査記録です。
やりたいこと
Agent Builder を用いたデータストア参照型対話エージェントの作成において、
データストアのファイル数が増加することで回答率が低下する問題への対処を進める。
前回の調査日記
あわせて読みたい


AI Agent開発日記 2025/04/03
この記事について 本記事は、Agent Builder を使用したデータストア参照型対話エージェントの作成に関する調査記録です。 やりたいこと Agent Builder を用いたデータス...
Agent BuilderのツールであるOpenAPIのスキーマを適切に設定し、Cloud RunにデプロイしたElasticsearchで検索できるか調べる。
- やりたいこと
- データ内容を物件データに変更して、正しく回答されるのか検証する
- 試したこと
- 以下準備をし、agentに質問。
- 下記コードで、適当な物件データ作成してelasticsearchに追加
- 物件検索用にplaybookのInstructionsを調整
- 以下準備をし、agentに質問。
- 結果
- 「property」インデックスで「location:仙台」の物件を尋ねると通常は回答されるが、まれに値が含まれずに回答されることがある。これはおそらくPlaybookの問題であり、現在改善中。
- 「property」インデックスで「location:仙台」と「nearest_station:三宮駅」など複数の条件を指定して検索すると、回答が得られなくなってしまう。PythonのElasticsearchでは「most」機能を使うことで複数条件の検索が可能だったため、エージェントがこの「most」機能を使用できていないことが原因と考えられ、現在改善中。
適当な物件データを作成してelasticsearchに追加するコード
from elasticsearch import Elasticsearch
from time import sleep
es = Elasticsearch(
http_auth=('user-name', 'pass'),
hosts=['https://url.run.app']
)
index_name = "property"
# サンプル用の物件データ生成
import random
locations = ['東京', '大阪', '名古屋', '札幌', '福岡', '横浜', '京都', '神戸', '仙台', '広島']
types = ['マンション', '一戸建て', 'アパート', 'タウンハウス', 'シェアハウス', '分譲賃貸']
statuses = ['空室', '入居中', 'リフォーム中', '商談中']
stations = ['新宿駅', '渋谷駅', '梅田駅', '名古屋駅', '博多駅', '池袋駅', '東京駅', 'なんば駅', '天神駅', '三宮駅']
def generate_property(i):
return {
"index": {"_index": index_name}
}, {
"property_id": i,
"location": random.choice(locations),
"type": random.choice(types),
"status": random.choice(statuses),
"nearest_station": random.choice(stations),
"price": random.randint(50000, 300000),
"area_sqm": round(random.uniform(20.0, 100.0), 1)
}
# 100件作成して20件ずつ送信
chunk_size = 20
for i in range(0, 100, chunk_size):
bulk_data = []
for j in range(i, i + chunk_size):
meta, doc = generate_property(j)
bulk_data.append(meta)
bulk_data.append(doc)
res = es.bulk(operations=bulk_data)
print(f"Inserted {i + chunk_size} 件まで完了: {res['errors'] = }")
sleep(1) # 負荷軽減のため少し待つ
物件検索用playbook Instructions
- **フィールド指定検索(インデックス名 + フィールド名:キーワード)**
- 形式: 「[インデックス名] インデックスで [フィールド名]:[検索キーワード] を検索して」
- 処理:
- 指定フィールドを ${TOOL:toolname} で検索し、結果を物件情報として整形して表示する。
- 出力フォーマット:
- 「[インデックス名] インデックスで [検索条件] を検索した結果、[件数] 件の物件が見つかりました。
- 物件ID: [property_id]
- 物件名: [property_name]
- 所在地: [location.address]
- 賃料: [rent] 円
- 他に条件があれば教えてください。」
- **インデックス全体の検索**
- 形式: 「[インデックス名] インデックス全体を検索して」
- 処理:
- インデックス内のすべての物件データを ${TOOL:toolname} で検索し、上位物件を抜粋して表示する。
- 出力フォーマット:
- 「[インデックス名] インデックス全体を検索した結果、[件数] 件の物件が見つかりました。
- 上位3件を表示:
- 物件ID: [property_id]
- 物件名: [property_name]
- 所在地: [location.address]
- 賃料: [rent] 円
- 全件表示が必要な場合は、お知らせください。」
- **検索エラーが発生した場合**
- 形式: 「Elasticsearch でエラーが発生した場合」
- 処理:
- エラー内容を解析し、ユーザーにとってわかりやすい形で解決策を提示する。
- 出力フォーマット:
- 「検索中にエラーが発生しました。[エラー内容]」
- 「もう一度検索するか、内容をご確認ください。それでも解決しない場合は、管理者にご連絡ください。」
- **Elasticsearchツールの指定が必要な場合**
- 形式: 「明確な検索指示がない、または検索フォーマットが不適切な場合」
- 処理:
- 適切な検索例を提示して、ユーザーに再入力を促す。
- 出力フォーマット:
- 「検索の指定方法が不明確です。次のように入力してください:
- property-index インデックスで location.city:札幌 を検索して
- rent-index インデックスで rent:10万円以下 を検索して
- もう一度ご入力をお願いします。」