Wie man die Relevanz der Suchergebnisse verbessert
Die Suche kann nützliche Datensätze für eine Abfrage abrufen, aber eine breite Suche kann immer noch direktere Ergebnisse zurückgeben, als eine Anwendung verwenden kann, einschließlich Ergebnissen, die sich nur lose auf die Frage beziehen.
Mit der Nachverarbeitung der Suche kann eine Anwendung nach dem Abrufen die Größe und den Fokus dieses Ergebnissets steuern. Dies ist besonders nützlich, wenn Suchergebnisse in eine Agent-Eingabeaufforderung oder eine Kontextkarte mit begrenztem Platz eingefügt werden.
In diesem Handbuch wird erläutert, wie Sie das Verhalten nach der Suche für reguläre Suchen und das Abrufen von Kontextkarten konfigurieren. Verwenden Sie TopKMemorySearchConfig, um eine feste maximale Anzahl von direkten Suchergebnissen zurückzugeben und diese optional neu zu ordnen. Verwenden Sie PruningMemorySearchConfig, um mit einem LLM zusätzlich weniger relevante Ergebnisse zu entfernen.
Hinweis: Beim Erstellen einer Kontextkarte durchsucht Oracle Agent Memory speicherähnliche Datensätze getrennt von Nachrichten im aktuellen Thread. Bei der Konfiguration des Umschneidens oder Beschneidens wird es separat auf jeden Ergebnissatz angewendet, bevor die Sätze kombiniert werden. Die kombinierten Ergebnisse sind durch max_relevant_results und das Tokenbudget begrenzt.
Wenn min_relevant_results_by_type verwendet wird, wird jeder angeforderte Datensatztyp separat durchsucht. Nachträglich oder beschneiden, wenn konfiguriert, wird auch separat auf die Ergebnisse jeder Suche angewendet. Eine weitere Suche über alle speicherähnlichen Datensatztypen hinweg kann dann alle verbleibenden Ergebnis-Slots verwenden. Wenn für eine reguläre Suche, die mehrere record_types anfordert, eine erneute Einstufung oder Pruning konfiguriert ist, wird diese einmal auf die kombinierten Suchergebnisse angewendet.
In diesem Leitfaden werden Sie:
- eine feste maximale Anzahl von direkten Suchergebnissen konfigurieren
- Rangfolge verwenden
- LLM-basierte Beschneidung verwenden
- konfigurierte Tokenbudgets und Tokenbudgets pro Anruf verwenden
Hinweis: Informationen zum Packagesetup finden Sie unter Erste Schritte mit Agent-Speicher. Wenn Sie für dieses Beispiel eine lokale Oracle AI Database benötigen, folgen Sie Oracle AI Database lokal ausführen.
Suchkomponenten konfigurieren
Erstellen Sie die von der Suchkonfiguration verwendeten Modellkomponenten. Der Reranker erhält den Abfrage- und Rohdokumenttext, während der Pruner das LLM verwendet, um weniger relevante direkte Ergebnisse zu entfernen.
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-Referenz: Reranker | LLM |
Verwenden Sie ein festes Direct-Result Limit und ein Reranking
Übergeben Sie TopKMemorySearchConfig beim Erstellen des Clients oder Threads. Die Suche ruft zuerst maximal max_results direkte Ergebnisse ab. Die optionale reranker empfängt dann nur diese Ergebnisse und ändert ihre Reihenfolge, ohne ihre Identität zu ändern.
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-Referenz: TopKMemorySearchConfig | OracleAgentMemory |
LLM-basiertes Pruning verwenden
Setzen Sie pruner_llm auf OracleAgentMemory, um das clientseitige Pruning mit dem Standardauswertungsmodus FAST zu aktivieren. Neue Threads übernehmen diese Einstellung, während Threads, die bereits eine gespeicherte Suchkonfiguration haben, diese beibehalten, wenn sie erneut geöffnet werden. Verwenden Sie PruningMemorySearchConfig, wenn die erste Suche zu viele weniger relevante Ergebnisse enthält und Sie das Beschneidungsverhalten optimieren müssen. Es behält die eingestuften direkten Ergebnisse bei und verwendet das konfigurierte LLM, um zusätzliche Ergebnisse zu identifizieren, die entfernt werden sollen.
Die direkte Ergebnisgrenze wird vor dem Pruning angewendet, so dass der Pruner nur die durch diese Grenze ausgewählten Ergebnisse bewertet und die Ergebnisanzahl weiter reduzieren kann. Geben Sie max_results bei einem regulären Suchaufruf an. Für den Abruf von Kontextkarten stellt max_relevant_results den entsprechenden anfänglichen Grenzwert bereit.
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,
)
Wie Pruning auf den Punkt gebracht wird
Die Vergütung wertet Ranglistenergebnisse aus, um zu bestimmen, wie viele Dokumente aufbewahrt werden sollen. protected_fraction stellt sicher, dass die relevantesten Dokumente immer enthalten sind. Beispiel: Bei protected_fraction=0.1 sind die Top 10% der eingestuften Dokumente vor Beschneidung geschützt und verbleiben in den Suchergebnissen.
Legen Sie evaluation_mode mit PruningEvaluationMode fest, um zu steuern, wie viel Auswertungs-Work Pruning ausführt:
FASTist die Standardeinstellung. Es priorisiert eine niedrige Latenz und kann die Bewertung frühzeitig stoppen.EXTENDEDwertet einen breiteren Teil der Ergebnisse aus, mit zusätzlicher Latenz und LLM-Nutzung.EXHAUSTIVEwertet jedes Kandidatenergebnis einzeln aus und hat die höchste Latenz und LLM-Nutzung.
num_probe_points steuert die Anzahl der Regionen mit eingestuften Ergebnissen, die im FAST- und EXTENDED-Modus berücksichtigt werden. Lassen Sie es aus, wenn Sie EXHAUSTIVE verwenden.
Hinweis: Beim Pruning wird ein LLM verwendet, damit die Suche langsamer wird. Verwenden Sie es, wenn Sie eine fokussiertere Ergebnismenge erhalten, ist wichtiger als die Minimierung der Suchlatenz.
| API-Referenz: PruningMemorySearchConfig | PruningEvaluationMode |
Tokenbudgets anwenden
Verwenden Sie soft_token_budget, um die geschätzte Größe der formatierten Ausgabe als Ziel festzulegen. Vollständige Ergebnisse werden in Rangfolge betrachtet, und das Ergebnis, das das Ziel erreicht oder überquert, wird beibehalten. Dadurch bleibt mindestens das erste Ergebnis erhalten, wenn die Suche eine Übereinstimmung findet.
Verwenden Sie token_budget als festen Grenzwert. Ein vollständiges Ergebnis, das diese Grenze überschreiten würde, wird weggelassen, so dass eine harte Grenze keine Ausgabe erzeugen kann, wenn das erste Ergebnis zu groß ist. Einzelne Ergebnisse werden nie geteilt. Wir empfehlen, beide Budgets festzulegen, wobei das harte Limit größer als das weiche Ziel ist. Ein hartes Limit etwa das Dreifache des weichen Ziels ist ein nützlicher Ausgangspunkt.
Beispiel: Wenn soft_token_budget=800 und die Ergebnisse auf 420, 300 und 250 Token geschätzt werden, werden alle drei zurückgegeben. Das dritte Ergebnis nimmt die kumulative Schätzung von 720 bis 970 Token und vervollständigt die Soft-Budget-Auswahl. Wenn auch token_budget=900 festgelegt ist, werden nur die ersten beiden zurückgegeben, da das dritte den festen Grenzwert überschreiten würde.
Konfigurierte Budgets werden standardmäßig angewendet. Positive Anrufwerte überschreiben die entsprechenden konfigurierten Budgets, nicht positive Werte deaktivieren sie.
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-Referenz: MemorySearchConfig | TopKMemorySearch-Konfiguration |
Abschluss
In diesem Handbuch haben wir gelernt, wie Sie Limits für direkte Ergebnisse, Umstufungen, LLM-basiertes Pruning und Tokenbudgets für flexible und hart formatierte Ergebnisse konfigurieren.
→ Nachdem Sie gelernt haben, wie Sie die Suchergebnisauswahl anpassen, können Sie jetzt mit Kontextkarteninhalt anpassen fortfahren.
Vollständiger Code
Das vollständige Beispiel ist in diesem Handbuch enthalten, das Sie kopieren und ausführen können.
#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,
)