검색 결과 관련성을 향상시키는 방법

검색은 조회에 대한 유용한 레코드를 검색할 수 있지만 광범위한 검색은 여전히 질문과 느슨하게 관련된 결과를 포함하여 애플리케이션에서 사용할 수 있는 것보다 더 많은 직접 결과를 반환할 수 있습니다.

검색 후행 처리를 사용하면 애플리케이션이 검색 후 해당 결과 집합의 크기와 포커스를 제어할 수 있습니다. 이 기능은 검색 결과가 제한된 공간으로 에이전트 프롬프트 또는 컨텍스트 카드에 삽입될 때 특히 유용합니다.

이 설명서에서는 일반 검색 및 컨텍스트 카드 검색에 대한 사후 검색 동작을 구성하는 방법을 설명합니다. 고정된 최대 직접 검색 결과 수를 반환하고 선택적으로 순위를 재지정하려면 TopKMemorySearchConfig를 사용합니다. PruningMemorySearchConfig를 사용하여 LLM과 관련성이 낮은 결과를 추가로 제거할 수 있습니다.

주: 컨텍스트 카드를 작성할 때 Oracle Agent Memory는 현재 스레드의 메시지와 별도로 메모리 유사 레코드를 검색합니다. 순위 재지정 또는 제거가 구성된 경우 세트를 결합하기 전에 각 결과 세트에 개별적으로 적용됩니다. 결합된 결과는 max_relevant_results 및 토큰 예산으로 제한됩니다.

min_relevant_results_by_type를 사용할 경우 요청된 각 레코드 유형이 별도로 검색됩니다. 순위 재지정 또는 제거(구성된 경우)도 각 검색 결과에 별도로 적용됩니다. 그러면 모든 메모리 유사 레코드 유형에 대한 다른 검색에서 남아 있는 결과 슬롯을 사용할 수 있습니다. 반면, 여러 record_types를 요청하는 일반 검색에 대해 순위 재지정 또는 제거가 구성된 경우 결합된 검색 결과에 한 번 적용됩니다.

이 설명서에서는 다음 작업을 수행합니다.

힌트: 패키지 설정은 에이전트 메모리 시작하기를 참조하십시오. 이 예에 대한 로컬 Oracle AI Database가 필요한 경우 로컬에서 Oracle AI Database 실행을 따르십시오.

검색 구성 요소 구성

검색 구성에 사용되는 모델 구성요소를 생성합니다. Reranker는 쿼리 및 원시 문서 텍스트를 수신하고, Pruner는 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 Oracle 에이전트 메모리

LLM 기반 제거 사용

OracleAgentMemory에서 pruner_llm를 설정하여 기본 FAST 평가 모드로 클라이언트 전체 제거를 사용으로 설정합니다. 새 스레드는 이 설정을 상속하고, 이미 저장된 검색 구성이 있는 스레드는 다시 열 때 유지됩니다. 초기 검색에 관련성이 낮은 결과가 너무 많이 포함되어 있어 제거 동작을 조정해야 하는 경우 PruningMemorySearchConfig를 사용합니다. 순위가 지정된 직접 결과를 유지하고 구성된 LLM을 사용하여 제거해야 할 추가 결과를 식별합니다.

직접 결과 제한은 제거 전에 적용되므로 pruner는 해당 제한으로 선택된 결과만 평가하고 결과 수를 더 줄일 수 있습니다. 일반 검색 호출 시 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,
)

How Pruning Works in a Nutshell에 대한 리뷰 보기

pruner는 순위가 지정된 결과를 평가하여 보존할 문서 수를 결정합니다. protected_fraction는 가장 관련성이 높은 문서가 항상 포함되도록 합니다. 예를 들어, protected_fraction=0.1를 사용할 경우 순위가 지정된 문서의 상위 10%가 제거되지 않도록 보호되고 검색 결과에 유지됩니다.

evaluation_mode를 PruningEvaluationMode로 설정하여 평가 작업 제거가 수행하는 작업량을 제어합니다.

num_probe_points는 FAST 및 EXTENDED 모드에서 고려되는 순위가 지정된 결과 영역 수를 제어합니다. EXHAUSTIVE를 사용할 때 생략합니다.

주: 제거는 LLM을 사용하므로 검색을 더 느리게 만들 수 있습니다. 검색 대기 시간을 최소화하는 것보다 더 집중적인 결과 집합을 얻는 것이 더 중요할 때 사용합니다.

API 참조: PruningMemorySearchConfig 제거 평가 모드

토큰 예산 적용

형식이 지정된 출력의 예상 크기를 목표로 지정하려면 soft_token_budget를 사용합니다. 전체 결과는 순위 순서대로 고려되며 목표에 도달하거나 교차하는 결과는 유지됩니다. 그러면 검색에서 일치 항목을 찾을 때 최소한 첫번째 결과가 유지됩니다.

하드 한계로 token_budget를 사용합니다. 이 제한을 초과하는 전체 결과는 생략되므로 첫번째 결과가 너무 클 경우 하드 한계로 인해 출력이 생성되지 않을 수 있습니다. 개별 결과는 결코 분리되지 않습니다. 하드 한계가 소프트 목표보다 큰 두 예산을 설정하는 것이 좋습니다. 소프트 대상의 약 3배 하드 한계는 유용한 시작점입니다.

예를 들어, 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 최상위 메모리 검색 구성

결론

이 가이드에서는 직접 결과 한도, 순위 재지정, 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,
)