如何改善搜尋結果相關性

搜尋可以擷取查詢的有用記錄,但廣義的搜尋仍會傳回比應用程式可使用的更直接的結果,包括只與問題無關的結果。

搜尋後續處理可讓應用程式控制擷取後結果集的大小和焦點。當搜尋結果插入代理程式提示或具有有限空間的環境定義卡時,這特別有用。

本指南說明如何設定一般搜尋和內容卡擷取的搜尋後行為。使用 TopKMemorySearchConfig 可傳回固定的直接搜尋結果數目上限,並可選擇重新排列。使用 PruningMemorySearchConfig 可透過 LLM 移除較少相關的結果。

注意:建立相關資訊環境卡時,Oracle 代理程式記憶體會從目前繫線中的訊息分開搜尋類似記憶體的記錄。設定重新分級或刪減時,會在組合集合之前,分別套用至每一組結果。合併結果受限於 max_relevant_results 和記號預算。

使用 min_relevant_results_by_type 時,會分別搜尋每個要求的記錄類型。若配置了重新排序或刪減,也會分別套用至每個搜尋的結果。另一種搜尋所有類似記憶體的記錄類型後,即可使用任何保留的結果位置。相較之下,如果針對要求多個 record_types 的一般搜尋設定重新排名或刪減,則會在合併的搜尋結果套用一次。

在本指南中,您將:

提示:如需設定套裝程式,請參閱開始使用代理程式記憶體。如果此範例需要本機 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,以控制評估工作刪除執行的數目:

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,
)