본문으로 건너뛰기

Retrieval 신호

Retrieval은 설명 가능해야 합니다. candidate는 prompt가 우연히 선호해서가 아니라, 이름 붙은 signal 때문에 이겨야 합니다.

signal은 두 곳에서 사용됩니다.

  • LLM이 tool을 보기 전에 compact candidate set을 ranking
  • target selector가 candidate를 신뢰하거나 거절한 이유 설명

Signal Pipeline

retrieval 경로는 inspect 가능한 단계로 나뉩니다. adapter는 prompt, secret, full API payload를 저장하지 않고도 각 단계를 compact evidence로 남길 수 있습니다.

StageInputOutputDebug Object
Query normalizationuser querytoken, alias, inferred shapeseeds
Candidate retrievalindexed tool text와 metadataranked toolscore_breakdown
Contract matchingrequest/response fieldconsumes/produces matchsemantic_evidence.contract_match
Graph expansiondeterministic/promoted edgeproducer/neighbor toolexpanded_from, edge_evidence
Selector handoffTop-K candidateselector-ready ranking rowsemantic_evidence

즉 retrieval은 prompt heuristic이 아니라 query engine에 가깝습니다. 각 candidate가 어떤 artifact 때문에 보였는지 설명할 수 있어야 합니다.

Core Signals

SignalSource중요한 이유
seedtool name, operation id, summary, description직접 retrieval seed contribution을 기록
action_matchmetadata.ai_metadata.canonical_actionsearch/read/create/update/delete intent 분리
resource_matchmetadata.ai_metadata.primary_resourcebusiness object를 맞춤
module_matchmetadata.openapi.path_module 또는 operation group대형 enterprise API 범위를 좁힘
shape_matchmetadata.ai_metadata.result_shapelist/detail/count/mutation sibling 구분
contract_matchrequest/response contract field사용자 entity와 field evidence가 맞는지 확인
graph_expansionproducer, consumer, manual, trace, curated edgeworkflow 주변 tool을 후보에 포함
learningpromoted trace-learning suggestion검증된 local feedback을 low-weight boost로 반영

Evidence Output

signal detail은 include_evidence=True로 확인합니다.

from graph_tool_call import ToolGraph
from graph_tool_call.graphify import retrieve_graphify

graph = ToolGraph.load("collection.json")
response = retrieve_graphify(
graph,
"환불 가능한 주문을 찾아줘",
top_k=5,
include_evidence=True,
)

for row in response["results"]:
print(row["name"], row["score_breakdown"])

일반적인 output은 다음과 같습니다.

{
"name": "getRefundableOrderList",
"score_breakdown": {
"seed": 0.0314,
"graph": 0.0057,
"learning": 0.02,
"history_demoted": false,
"action_match": 1.0,
"resource_match": 1.0,
"module_match": 0.0,
"shape_match": 1.0,
"contract_match": 1.0,
"graph_expansion": 0.1
},
"semantic_evidence": {
"canonical_action": "search",
"primary_resource": "order",
"result_shape": "list",
"action_match": true,
"resource_match": true,
"shape_match": true,
"contract_match": true,
"matched_terms": ["order", "refund"]
}
}

숫자의 절대 scale은 engine version에 따라 바뀔 수 있습니다. 안정 contract는 고정된 절대 score가 아니라 이름 붙은 signal과 evidence field가 남는 것입니다.

Result Row 읽기

weight를 바꾸기 전에 result row부터 읽습니다. 대부분의 search 실패는 score 상수 하나가 아니라 metadata나 contract 누락에서 시작합니다.

Field확인할 질문
name기대 tool이 Top-K에 들어왔는가?
list positiontool이 너무 낮은가, 아예 없는가?
score_breakdown.seedname, summary, operation id가 candidate를 seed했는가?
score_breakdown.action_matchquery 동사가 canonical_action과 맞았는가?
score_breakdown.resource_matchbusiness object가 primary_resource와 맞았는가?
score_breakdown.shape_matchlist/detail/count/mutation intent가 result_shape와 맞았는가?
semantic_evidence.contract_matchrequest/response field가 query와 맞았는가?
edge_evidencegraph relation 때문에 candidate가 추가됐는가?
stats.token_budget_usedretrieval context가 LLM에 너무 많이 넘어가는가?

기대 tool이 없으면 ingest, semantic metadata, alias, contract extraction을 고칩니다. 기대 tool은 있는데 LLM이 sibling을 고르면 Target Selection을 확인합니다.

Signal Interaction

상황유용한 signal
한국어 query, 영어 operation idkeyword, alias, Korean tokenizer, semantic metadata
list/detail sibling conflictshape_match, response schema, operation id hint
직접 검색되지 않은 toolgraph_expansion, producer/consumer edge
LLM이 틀린 target 선택selector rank_signals와 retrieval evidence
반복 성공한 correctionpromoted learning suggestion

예시: List vs Detail Sibling

대형 OpenAPI catalog에는 단어 하나만 다른 sibling operation이 자주 있습니다. selector가 도움을 주려면 retrieval이 두 candidate의 evidence를 보존해야 합니다.

from graph_tool_call import ToolGraph

graph = ToolGraph.load("collection.json")
response = retrieve_graphify(
graph,
"회원 배송지 상세 정보를 조회해줘",
top_k=8,
include_evidence=True,
)

for row in response["results"]:
print(
row["name"],
row["score_breakdown"].get("shape_match"),
row["semantic_evidence"].get("matched_terms"),
)

기대 동작:

Candidate좋은 Evidence
getMemberDeliveryDetailread, member_delivery, single, response field
getMemberDeliveryListread, member_delivery, list, 더 약한 shape match
getMemberInforead, member, 부분 resource match

모든 candidate가 동일하게 보이면 search weight보다 result_shape, primary_resource, response contract coverage를 먼저 보강합니다.

Tuning 원칙

weight를 바꾸기 전에 metadata와 contract를 먼저 개선합니다.

  1. expected tool이 Top-K에 있는지 확인합니다.
  2. score_breakdownsemantic_evidence를 봅니다.
  3. text가 약하면 summary 또는 alias를 개선합니다.
  4. list/detail이 헷갈리면 result_shape를 개선합니다.
  5. upstream value가 필요하면 contract producer를 확인합니다.
  6. evidence가 올바른 뒤에만 weight를 조정합니다.

Signal Quality Checklist

collection rebuild나 새 source 추가 시 아래를 확인합니다.

Check건강한 신호
action coverage대부분 tool에 알려진 canonical_action이 있음
resource coveragetool이 안정적인 primary_resource로 배정됨
module coverage큰 API가 path/module group으로 나뉨
contract coveragerequest/response field가 api_contract에 보존됨
evidence densityTop-K row에 semantic 또는 contract signal이 있음
expansion restraintgraph expansion이 candidate를 범람시키지 않고 producer를 추가함
learning restraintpromoted suggestion만 ranking에 영향

이 체크는 product diagnostic과 release gate에 보여야 합니다. search, selector, plan, adapter execution 중 어디가 문제인지 가장 빠르게 가르는 기준이 됩니다.

Best Practice

product debug screen과 regression fixture에는 include_evidence=True를 사용합니다. ranking을 설명하는 compact evidence만 저장하고 raw secret이나 full API payload는 저장하지 않습니다.

production log에 저장할 수 있는 항목은 다음 정도입니다.

  • tool name
  • rank
  • score breakdown
  • selected evidence key
  • token budget used
  • learning suggestion id

저장하면 안 되는 항목은 다음입니다.

  • full request/response body
  • auth header
  • cookie
  • user identifier
  • secret을 포함할 수 있는 raw prompt trace

Adapter Display Contract

product UI에서 retrieval diagnostic을 보여줄 때는 raw metadata dump가 아니라 compact comparison으로 보여줍니다.

UI FieldSource
rank와 tool nameresult row
action/resource/shape badgesemantic_evidence.action_match, resource_match, shape_match
matched termsemantic_evidence.matched_terms
Top-K에 들어온 이유stats.seeds, expanded_from
selection outcometarget_selector.selected_target
uncertaintyambiguous, reason_codes

collection에 수백, 수천 개 tool이 있어도 debugging 가능한 형태를 유지해야 합니다.

검증

scoring 또는 metadata extraction을 바꾸면 retrieval-focused test를 실행합니다.

poetry run pytest tests/test_graphify_metadata.py tests/test_graphify_contract_025.py -q

관련 문서