検索結果の関連性を改善する方法
検索では、問合せの有用なレコードを取得できます。ただし、広範な検索では、質問にのみ疎に関連している結果を含め、アプリケーションが使用できるよりも直接的な結果を返すことができます。
検索後処理では、取得後の結果セットのサイズとフォーカスをアプリケーションで制御できます。これは、検索結果がエージェント・プロンプトまたは領域が制限されたコンテキスト・カードに挿入される場合に特に役立ちます。
このガイドでは、通常の検索およびコンテキスト・カードの取得について検索後の動作を構成する方法について説明します。TopKMemorySearchConfigを使用して、直接検索結果の固定最大数を返し、オプションで再ランク付けします。LLMの関連性の低い結果をさらに削除するには、PruningMemorySearchConfigを使用します。
ノート:コンテキスト・カードを構築する場合、Oracle Agent Memoryは、現在のスレッド内のメッセージとは別にメモリーのようなレコードを検索します。再ランキングまたはプルーニングを構成すると、セットが結合される前に、各結果セットに個別に適用されます。結合結果は、max_relevant_resultsおよびトークン予算によって制限されます。
min_relevant_results_by_typeを使用すると、リクエストされた各レコード・タイプが個別に検索されます。再ランキングまたはプルーニング(構成されている場合)も、各検索の結果に個別に適用されます。メモリーに類似したすべてのレコード・タイプにわたる別の検索では、残っているすべての結果スロットを使用できます。比較すると、複数のrecord_typesをリクエストする通常の検索に対して再ランキングまたはプルーニングが構成されている場合は、結合された検索結果に1回適用されます。
このガイドでは、次のことを行います。
- 直接検索結果の固定最大数を設定
- 再ランキングの使用
- LLMベースのプルーニングの使用
- 構成済およびコールごとのトークン予算の使用
ヒント:パッケージの設定については、エージェント・メモリーのスタート・ガイドを参照してください。この例にローカルのOracle AI Databaseが必要な場合は、「Oracle AI Databaseをローカルで実行」に従います。
検索構成要素の構成
検索構成で使用されるモデル・コンポーネントを作成します。再ランカは問合せおよびRAWドキュメント・テキストを受信し、プルーナはLLMを使用して関連性の低い直接結果を削除します。
import oracledb
from oracleagentmemory.core import (
OracleAgentMemory,
PruningEvaluationMode,
PruningMemorySearchConfig,
Reranker,
SchemaPolicy,
TopKMemorySearchConfig,
)
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
embedder = Embedder(model="YOUR_EMBEDDING_MODEL")
search_llm = Llm(model="provider/search-llm-model")
reranker = Reranker(model="provider/reranker-model")
db_pool = oracledb.SessionPool(
user="YOUR DB USER",
password="YOUR DB PASSWORD",
dsn="localhost:1521/...",
)
memory_store_id = "T_SEARCH_RESULTS"
| APIリファレンス: Reranker | Llm |
固定直接結果制限および再ランク付けの使用
クライアントまたはスレッドの作成時にTopKMemorySearchConfigを渡します。検索では、最初に最大max_results直接の結果が取得されます。オプションのrerankerは、これらの結果のみを受信し、IDを変更せずに順序を変更します。
top_k_config = TopKMemorySearchConfig(
max_results=5,
reranker=reranker
)
memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=search_llm,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
search_config=top_k_config,
)
user_id = "user_123"
| APIリファレンス: TopKMemorySearchConfig | OracleAgentMemory |
LLMベースのプルーニングの使用
OracleAgentMemoryにpruner_llmを設定して、デフォルトのFAST評価モードでクライアント全体のプルーニングを有効にします。新しいスレッドはこの設定を継承しますが、すでに格納された検索構成を持つスレッドは再オープン時にその設定を保持します。初期検索に含まれる関連性の低い結果が多すぎて、プルーニング動作をチューニングする必要がある場合は、PruningMemorySearchConfigを使用します。ランク付けされた直接の結果を保持し、構成済のLLMを使用して、削除する必要がある追加の結果を識別します。
プルーニングの前に直接結果制限が適用されるため、プルーナはその制限で選択された結果のみを評価し、結果の数をさらに減らすことができます。通常の検索コールでmax_resultsを指定します。コンテキスト・カードの取得の場合、max_relevant_resultsは対応する初期制限を提供します。
pruning_memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=search_llm,
memory_store_id=memory_store_id,
pruner_llm=search_llm,
)
thread = pruning_memory.create_thread(
thread_id="search_result_pruning_demo",
user_id=user_id,
)
pruned_results = thread.search(
query="Which database does the service use?",
max_results=50,
)
#Use PruningMemorySearchConfig for advanced modes and tuning.
extended_pruning_config = PruningMemorySearchConfig(
pruner=search_llm,
evaluation_mode=PruningEvaluationMode.EXTENDED,
num_probe_points=3,
protected_fraction=0.1,
)
プルーニングの仕組み
プルーナは、ランク付けされた結果を評価して、保持するドキュメントの数を決定します。protected_fractionは、最も関連性の高いドキュメントが常に含まれていることを確認します。たとえば、protected_fraction=0.1では、ランク付けされたドキュメントの上位10%はプルーニングから保護され、検索結果に残ります。
PruningEvaluationModeを使用してevaluation_modeを設定し、評価作業プルーニングの実行量を制御します。
FASTがデフォルトです。低レイテンシを優先し、早期に評価を停止する場合があります。EXTENDEDは、結果の大部分を評価し、レイテンシとLLMの使用率を高めます。EXHAUSTIVEは、すべての候補結果を個別に評価し、レイテンシとLLM使用率が最も高くなります。
num_probe_pointsは、FASTおよびEXTENDEDモードで考慮されるランク付けされた結果リージョンの数を制御します。EXHAUSTIVEを使用する場合は省略します。
ノート:プルーニングではLLMが使用されるため、検索が遅くなる可能性があります。検索レイテンシを最小限に抑えるよりも、より焦点を絞った結果セットを取得する方が重要です。
| APIリファレンス: PruningMemorySearchConfig | プルーニング評価モード |
トークン予算の適用
soft_token_budgetを使用して、フォーマットされた出力の推定サイズを指定します。完全な結果はランク順に考慮され、ターゲットに到達または交差する結果は保持されます。これにより、検索で一致が見つかった場合、少なくとも最初の結果が保持されます。
token_budgetを強い制限値として使用します。この制限を超える完全な結果は省略されるため、最初の結果が大きすぎる場合、強い制限によって出力が生成されない可能性があります。個々の結果は分割されません。ハード制限がソフト・ターゲットより大きく、両方の予算を設定することをお薦めします。ソフトターゲットの約3倍のハード制限は、有用な開始点です。
たとえば、soft_token_budget=800と、420、300および250トークンと見積もられた結果では、3つすべてが戻されます。3番目の結果は、720から970トークンまでの累積見積りを取得し、ソフト予算の選択を完了します。token_budget=900も設定されている場合は、最初の2つのみが戻されます。これは、3番目が強い制限値を超えるためです。
構成済予算はデフォルトで適用されます。コール当たりの値が正の場合は対応する構成済予算より優先され、正の値でない場合は無効になります。
results = memory.search(
query="Which database does the service use?",
user_id=user_id,
soft_token_budget=1_000,
token_budget=3_000,
)
#Per-call values override the configured budgets.
larger_results = memory.search(
query="Which database does the service use?",
user_id=user_id,
soft_token_budget=4_000,
token_budget=12_000,
)
| APIリファレンス: MemorySearchConfig | トップメモリ検索設定 |
まとめ
このガイドでは、直接結果の制限、再ランク付け、LLMベースのプルーニング、およびソフト形式とハード形式の結果トークン予算を構成する方法を学習しました。
→ 検索結果の選択をカスタマイズする方法を学習した後、「コンテキスト・カード・コンテンツのカスタマイズ」に進むことができます。
完全コード
このガイドには、コピーして実行するための完全な例が含まれています。
#Copyright © 2026 Oracle and/or its affiliates.
#This software is under the Apache License 2.0
#(LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) or Universal Permissive License
#(UPL) 1.0 (LICENSE-UPL or https://oss.oracle.com/licenses/upl), at your option.
#Oracle Agent Memory Code Example - Improve Search Result Relevance
#------------------------------------------------------------------
##Configure search components
import oracledb
from oracleagentmemory.core import (
OracleAgentMemory,
PruningEvaluationMode,
PruningMemorySearchConfig,
Reranker,
SchemaPolicy,
TopKMemorySearchConfig,
)
from oracleagentmemory.core.embedders.embedder import Embedder
from oracleagentmemory.core.llms.llm import Llm
embedder = Embedder(model="YOUR_EMBEDDING_MODEL")
search_llm = Llm(model="provider/search-llm-model")
reranker = Reranker(model="provider/reranker-model")
db_pool = oracledb.SessionPool(
user="YOUR DB USER",
password="YOUR DB PASSWORD",
dsn="localhost:1521/...",
)
memory_store_id = "T_SEARCH_RESULTS"
##Configure top k search
top_k_config = TopKMemorySearchConfig(
max_results=5,
reranker=reranker
)
memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=search_llm,
schema_policy=SchemaPolicy.CREATE_IF_NECESSARY,
memory_store_id=memory_store_id,
search_config=top_k_config,
)
user_id = "user_123"
##Configure pruned search
pruning_memory = OracleAgentMemory(
connection=db_pool,
embedder=embedder,
llm=search_llm,
memory_store_id=memory_store_id,
pruner_llm=search_llm,
)
thread = pruning_memory.create_thread(
thread_id="search_result_pruning_demo",
user_id=user_id,
)
pruned_results = thread.search(
query="Which database does the service use?",
max_results=50,
)
#Use PruningMemorySearchConfig for advanced modes and tuning.
extended_pruning_config = PruningMemorySearchConfig(
pruner=search_llm,
evaluation_mode=PruningEvaluationMode.EXTENDED,
num_probe_points=3,
protected_fraction=0.1,
)
##Apply search token budgets
results = memory.search(
query="Which database does the service use?",
user_id=user_id,
soft_token_budget=1_000,
token_budget=3_000,
)
#Per-call values override the configured budgets.
larger_results = memory.search(
query="Which database does the service use?",
user_id=user_id,
soft_token_budget=4_000,
token_budget=12_000,
)