如何改善搜尋結果相關性
搜尋可以擷取查詢的有用記錄,但廣義的搜尋仍會傳回比應用程式可使用的更直接的結果,包括只與問題無關的結果。
搜尋後續處理可讓應用程式控制擷取後結果集的大小和焦點。當搜尋結果插入代理程式提示或具有有限空間的環境定義卡時,這特別有用。
本指南說明如何設定一般搜尋和內容卡擷取的搜尋後行為。使用 TopKMemorySearchConfig 可傳回固定的直接搜尋結果數目上限,並可選擇重新排列。使用 PruningMemorySearchConfig 可透過 LLM 移除較少相關的結果。
注意:建立相關資訊環境卡時,Oracle 代理程式記憶體會從目前繫線中的訊息分開搜尋類似記憶體的記錄。設定重新分級或刪減時,會在組合集合之前,分別套用至每一組結果。合併結果受限於 max_relevant_results 和記號預算。
使用 min_relevant_results_by_type 時,會分別搜尋每個要求的記錄類型。若配置了重新排序或刪減,也會分別套用至每個搜尋的結果。另一種搜尋所有類似記憶體的記錄類型後,即可使用任何保留的結果位置。相較之下,如果針對要求多個 record_types 的一般搜尋設定重新排名或刪減,則會在合併的搜尋結果套用一次。
在本指南中,您將:
- 設定固定的直接搜尋結果數上限
- 使用重新排名
- 使用 LLM 型刪減
- 使用已設定和每次通話的權杖預算
提示:如需設定套裝程式,請參閱開始使用代理程式記憶體。如果此範例需要本機 Oracle AI Database,請遵循在本機執行 Oracle AI Database 。
設定搜尋組件
建立搜尋組態所使用的模型元件。重新排名器會接收查詢和原始文件文字,而刪除器則使用 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 則只會接收這些結果並變更其順序,而不會變更其識別。
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 | OracleAgent 記憶體 |
使用 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% 的文件會受到保護,不會進行刪減並保留在搜尋結果中。
將 evaluation_mode 設為 PruningEvaluationMode,以控制評估工作刪除執行的數目:
FAST為預設值。它優先考慮低延遲,並可能會提前停止評估。EXTENDED會以額外的延遲和 LLM 使用狀況評估更廣泛的結果部分。EXHAUSTIVE會個別評估每個候選結果,並具有最高延遲和 LLM 使用量。
num_probe_points 控制以 FAST 和 EXTENDED 模式考量之排名結果區域的數目。使用 EXHAUSTIVE 時予以忽略。
注意:刪減會使用 LLM,讓搜尋速度變慢。當取得更重點的結果集比將搜尋延遲降到最低更重要時使用。
| API 參照:PruningMemorySearchConfig | 刪減評估模式 |
套用變數替代字預算
使用 soft_token_budget 來定位格式化輸出的預估大小。系統會依照等級順序來考量完成結果,並保留達到或超越目標的結果。這會在搜尋找到相符項目時至少保留第一個結果。
使用 token_budget 作為嚴格限制。系統會省略超過此限制的完整結果,因此,如果第一個結果太大,嚴格限制就不會產生輸出。個別結果永遠不會分割。建議您同時設定兩個預算,其嚴格限制大於非強制目標。強制限制約三倍軟目標是有用的起點。
例如,如果使用 soft_token_budget=800,且結果預估為 420、300 和 250 個記號,則會傳回這三個記號。第三個結果採用從 720 到 970 個記號的累積預估值,然後完成非強制預算選取。如果也設定了 token_budget=900,則只會傳回前兩個,因為第三個值會超過嚴格限制。
預設會套用設定的預算。正值每通電話值會置換其對應的已設定預算,非正值則會停用它們。
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 | TopK 記憶體搜尋組態 |
結論
在本指南中,我們瞭解如何設定直接結果限制、重新排名、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,
)