Skip to content

[Feat] W4 Community stub + Routing Agent (#20 + #21)#51

Merged
TaskerJang merged 8 commits into
devfrom
feat/20-21-community-router
May 17, 2026
Merged

[Feat] W4 Community stub + Routing Agent (#20 + #21)#51
TaskerJang merged 8 commits into
devfrom
feat/20-21-community-router

Conversation

@TaskerJang

Copy link
Copy Markdown
Owner

์š”์•ฝ

W4 ๋งˆ๋ฌด๋ฆฌ. Layer C (Community Summary) stub + Layer A/B/C ํ†ตํ•ฉ ๋ผ์šฐํŒ… ์—์ด์ „ํŠธ ๋ฐ•์ œ.

Closes #20, closes #21.

PR #49 (#19 Local Retriever) ๋จธ์ง€ ์งํ›„ ์ง„ํ–‰ โ€” ์‹œ๋‚˜๋ฆฌ์˜ค A ์˜ 5/18 ์ผ์ •์„ ํ•˜๋ฃจ ๋‹น๊ฒจ 5/17 ์•ˆ์— W4 ์ „์ฒด ์™„๋ฃŒ.

๋ณ€๊ฒฝ ์‚ฌํ•ญ

์‹ ๊ทœ (4)

  • retrieval/community_summary.py โ€” Layer C stub ์ง„์ž…์  (@track, 138 lines, LLM/Neo4j ํ˜ธ์ถœ 0ํšŒ)
  • retrieval/prompts/community_summary_v1.md โ€” W5+ ์‹ค์ œ ๊ตฌํ˜„ ์‹œ ์ฑ„์šธ placeholder
  • retrieval/router.py โ€” Routing Agent (decide_route, route_and_answer, 424 lines)
  • retrieval/prompts/router_v1.md โ€” LLM fallback system prompt + 5 few-shot

์ˆ˜์ • (2)

  • retrieval/__init__.py โ€” ์‹ ๊ทœ export 8๊ฐœ (DEFAULT_ROUTE, Route, RouteDecision, RoutedResult, decide_route, route_and_answer, CommunitySummaryResult, community_summary)
  • scripts/run_w4_eval.py โ€” expected_route ํ•„๋“œ + R1~R3 ์ผ€์ด์Šค + --suite router + routing ๊ฒฐ๊ณผ ํ‘œ

๋ฐ•์ œ (1)

  • docs/weekly-log/2026-05-17-community-router.md โ€” ์ž‘์—… ์ปจํ…์ŠคํŠธ + ๋ ˆํผ๋Ÿฐ์Šค ํ‘œ + ์„ค๊ณ„ ๊ฒฐ์ • + ํ‰๊ฐ€ ์…‹ + ๋ฐœํ‘œ ์Šฌ๋ผ์ด๋“œ 14 ์—ฐ๊ฒฐ

์„ค๊ณ„ ๊ฒฐ์ •

#20 Community Summary โ€” ์ˆœ์ˆ˜ stub

  • Microsoft GraphRAG ์˜ Global Search ๋Š” indexing time ์— community detection + community report ์ƒ์„ฑ์ด ์„ ํ–‰๋˜์–ด์•ผ ๋™์ž‘. ์šฐ๋ฆฌ๋Š” ๋‘˜ ๋‹ค ์—†์Œ.
  • LLM ๋งŒ์œผ๋กœ ๊ธ€๋กœ๋ฒŒ ๋‹ต๋ณ€ ํ‰๋‚ด๋‚ด๋ฉด "๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜" ํ‘œํ˜„์ด ๊ฑฐ์ง“ โ†’ ์ •์งํ•œ stub ๋งŒ ์ œ๊ณต.
  • ์‘๋‹ต: ๊ธ€๋กœ๋ฒŒ ์งˆ์˜ ๋ถ„๋ฅ˜ ํ™•์ธ + Layer C ๋ฏธ๊ตฌํ˜„ ๋ช…์‹œ + 5/24+ ETA + ๋Œ€์•ˆ (Layer A/B ํ™œ์šฉ).
  • ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ•์ œ: CommunitySummaryResult(answer, is_stub=True) โ€” ๋ฏธ๋ž˜ ์ง„์งœ Layer C ์™€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํ˜ธํ™˜.

#21 Routing Agent โ€” ํ‚ค์›Œ๋“œ ๋ถ„๊ธฐ + LLM fallback

  • ๊ฒฐ์ •์  ํ‚ค์›Œ๋“œ ์šฐ์„  โ€” LangChain MultiRetrievalQAChain ์˜ LLM router ๋Š” "the same query may route to different sources" (TDS 2025) ์ผ๊ด€์„ฑ ๋ฌธ์ œ. ๊ฒฐ์ •์  ๋ถ„๊ธฐ๋ฅผ 1๋‹จ๊ณ„๋กœ ๋‘๋ฉด ๋””๋ฒ„๊น… / ํ‰๊ฐ€ / ๋ฐœํ‘œ ์‹œ์—ฐ ๋ชจ๋‘ ๋ช…ํ™•.
  • LLM fallback ์€ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ โ€” ํ‚ค์›Œ๋“œ ๋งค์นญ 0๊ฐœ ์‹œ์—๋งŒ ํ˜ธ์ถœ โ†’ ๋‹จ์ˆœ factual ์งˆ๋ฌธ์€ LLM ํ˜ธ์ถœ ์—†์ด t2c ๋กœ ์ฆ‰์‹œ ๋ผ์šฐํŒ….
  • graceful default = t2c โ€” LLM ์‹คํŒจ / unknown route ์‹œ (NeoConverse ์˜ "Intelligent fallback mechanism" ํŒจํ„ด).

ํ‚ค์›Œ๋“œ ๋งคํ•‘:

  • LOCAL_KEYWORDS (11๊ฐœ): ๊ด€๊ณ„, ๊ด€๋ จ, ์—ฐ๊ด€, ์˜ํ–ฅ, ํ•จ๊ป˜, ์ด์›ƒ, ์–ด๋–ป๊ฒŒ, co-mention, ๊ด€๊ณ„๋Š”, ๊ด€๋ จ๋œ, ์—ฐ๊ด€๋œ
  • COMMUNITY_KEYWORDS (17๊ฐœ): ํŠธ๋ Œ๋“œ, ์ „์ฒด, ํ๋ฆ„, ์ฃผ์š” ํŠธ๋ Œ๋“œ, ์ฃผ์ œ, ํŒจํ„ด, ์ฃผ์š” ํ๋ฆ„, ์ „๋ฐ˜, ๊ธ€๋กœ๋ฒŒ, community, communities, topic, topics, themes, ์ „์ฒด์ , ํ†ตํ•ฉ, ์‚ฌ์ „์ฒด
  • ๊ทธ ์™ธ โ†’ t2c

ํ‰๊ฐ€ ์…‹ R1~R3

ID ์ถœ์ฒ˜ ์งˆ๋ฌธ ๊ธฐ๋Œ€ ๋ผ์šฐํŠธ ๊ฒ€์ฆ ํฌ์ธํŠธ
R1 Q2 ๋™์ผ "๋ฏธ๋ž˜์—์…‹์ฆ๊ถŒ 4๋ถ„๊ธฐ ๋ณด๊ณ ์„œ์˜ Table ์€ ๋ช‡ ๊ฐœ?" t2c ํ‚ค์›Œ๋“œ ๋งค์นญ 0๊ฐœ โ†’ LLM fallback ํŠธ๋ฆฌ๊ฑฐ ๊ฒ€์ฆ + t2c ๋‹ต๋ณ€ "6"
R2 L1 ๋ณ€ํ˜• "๋‘์‚ฐ๋ฐฅ์บฃ๊ณผ ํ•จ๊ป˜ ์–ธ๊ธ‰๋œ ๋ฆฌ์Šคํฌ๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋‚˜?" local "๊ด€๋ จ/์–ด๋–ป๊ฒŒ/ํ•จ๊ป˜" ๋งค์นญ โ†’ local ์ฆ‰์‹œ ๋ถ„๊ธฐ
R3 L5 ๋™์ผ "์ „์ฒด 8๋ฌธ์„œ์˜ ์ฃผ์š” ํŠธ๋ Œ๋“œ์™€ ํ๋ฆ„์€?" community "์ „์ฒด/ํŠธ๋ Œ๋“œ/ํ๋ฆ„" ๋งค์นญ โ†’ community stub ์‘๋‹ต ๊ฒ€์ฆ

๊ฒ€์ฆ ๋ช…๋ น

git pull
uv run python -m scripts.run_w4_eval --suite router --json eval/w4_router_2026-05-17.json

DoD

#20 Community Summary stub

  • community_summary(question) ์ง„์ž…์ 
  • CommunitySummaryResult ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐ•์ œ (is_stub=True)
  • @track Opik trace
  • LLM/Neo4j ํ˜ธ์ถœ 0ํšŒ
  • R3 ์ผ€์ด์Šค๋กœ ํ‰๊ฐ€ ํ†ตํ•ฉ

#21 Routing Agent

  • ํ‚ค์›Œ๋“œ ๋ถ„๊ธฐ 1๋‹จ๊ณ„ (_classify_by_keywords)
  • LLM fallback 2๋‹จ๊ณ„ (_classify_by_llm) โ€” JSON ์‘๋‹ต ๊ฐ•์ œ, tenacity 2 attempts
  • graceful default = t2c
  • ํ†ตํ•ฉ ์ง„์ž…์  route_and_answer (@track)
  • R1~R3 ํ‰๊ฐ€ ์…‹ + --suite router ์˜ต์…˜

๋ฐœํ‘œ ์Šฌ๋ผ์ด๋“œ 14 (Routing ๋ช…๋ถ„) ๊ฐ•ํ™”

PR #49 ๊นŒ์ง€: L5 PASS ๋งŒ ์žˆ์—ˆ์Œ (local_retriever ๋‚ด๋ถ€์˜ "Layer C ์ ํ•ฉ ์•ˆ๋‚ด" fallback).

๋ณธ PR ๋จธ์ง€ ํ›„:

  • R3 ์‹œ์—ฐ = ๋ช…์‹œ์  routing decision trace (matched_keywords, llm_used ํ•„๋“œ) + Layer C stub ์‘๋‹ต
  • R2 ์˜ ํ‚ค์›Œ๋“œ 4์ค‘ ๋งค์นญ trace = Opik nested span ์œผ๋กœ "๋ผ์šฐํŒ… โ†’ entity ๋งค์นญ 0๊ฐœ โ†’ graceful fallback" 3๋‹จ๊ณ„ ์‹œ๊ฐํ™”

ํ›„์† (๋ณธ PR ์Šค์ฝ”ํ”„ ์™ธ)

  • Issue #50 (Entity ์ถ”์ถœ ํ•œ๊ณ„) โ€” 5/24+ W5 ์˜์—ญ, ๋ฐœํ‘œ ์ „ ํ•ด๊ฒฐ ๋ถˆ์š”
  • W5+ Layer C ์‹ค์ œ ๊ตฌํ˜„ (community detection โ†’ report ์ƒ์„ฑ โ†’ Global Search)
  • Semantic Router ํ™•์žฅ (EmbeddingRouterChain ํŒจํ„ด)

W4 ์„ธ ๋ฒˆ์งธ retrieval โ€” Layer C ์˜ stub ๊ตฌํ˜„. ์‹ค์ œ community detection /
์š”์•ฝ์€ W5+ ์˜์—ญ. ๋ณธ ๋ชจ๋“ˆ์€ Routing Agent (#21) ๊ฐ€ ๊ธ€๋กœ๋ฒŒ ์งˆ์˜๋ฅผ Layer C ๋กœ
๋ถ„๊ธฐํ–ˆ์„ ๋•Œ์˜ ์ง„์ž…์  ํ•จ์ˆ˜๋งŒ ์ œ๊ณต.

์„ค๊ณ„ ๊ฒฐ์ •:
- Microsoft GraphRAG ์˜ Global Search ๋Š” indexing time ์‚ฌ์ „ ์ƒ์„ฑ community
  report ์œ„์—์„œ ๋™์ž‘. ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” community detection ์ž์ฒด๊ฐ€ ๋ฏธ๊ตฌํ˜„ โ†’
  community ์ž๋ฃŒ ์—†์ด LLM ๋งŒ ๊ฐ€์ง€๊ณ  ๊ธ€๋กœ๋ฒŒ ๋‹ต๋ณ€ ํ‰๋‚ด๋‚ด๋Š” ๊ฒƒ์€ ์ •์งํ•˜์ง€ ์•Š์Œ.
- stub ์‘๋‹ต: ๊ธ€๋กœ๋ฒŒ ์งˆ์˜ ๋ถ„๋ฅ˜ ํ™•์ธ + Layer C ๋ฏธ๊ตฌํ˜„ ๋ช…์‹œ + 5/24+ ETA +
  ๋Œ€์•ˆ ์•ˆ๋‚ด (Layer A/B ํ™œ์šฉ).
- LLM / Neo4j ํ˜ธ์ถœ ์—†์Œ โ†’ ์ฆ‰์‹œ ์‘๋‹ต. @track ์œผ๋กœ Opik trace.

DoD (#20):
- Routing Agent (#21) ์ง„์ž…์  ํ•จ์ˆ˜ ์ œ๊ณต โœ…
- ์ •์งํ•œ ๋ฏธ๊ตฌํ˜„ ์•ˆ๋‚ด โœ…
- ์ฆ‰์‹œ ์‘๋‹ต โœ…

ํ›„์†:
- ์‹ค์ œ Layer C ๊ตฌํ˜„์€ ๋ณ„๋„ ์ด์Šˆ (W5+) โ€” Leiden detection + ์‚ฌ์ „ community
  summary + map-reduce ๋‹ต๋ณ€ ํ•ฉ์„ฑ.

Reference:
- Microsoft GraphRAG Global Search (map-reduce)
- Sotaaz blog (2026-01) โ€” hybrid_search() ์˜ elif is_global ๋ถ„๊ธฐ
- graphrag.com/reference/global-community-summary-retriever
W5+ ์‹ค์ œ Layer C ๊ตฌํ˜„ ์‹œ ์‚ฌ์šฉํ•  ํ”„๋กฌํ”„ํŠธ placeholder. ํ˜„์žฌ stub ๋‹จ๊ณ„์—์„œ๋Š”
LLM ํ˜ธ์ถœ์ด ์—†์–ด ๋ณธ ํ”„๋กฌํ”„ํŠธ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋‚˜, ํ–ฅํ›„ ํ™œ์„ฑํ™” ์‹œ์ ์—
๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์กฐ ๋ฏธ๋ฆฌ ์ •๋ฆฝ.

๋‚ด์šฉ:
- Role ์ •์˜ (Community report ์œ„ map-reduce ๋‹ต๋ณ€ ํ•ฉ์„ฑ๊ธฐ)
- Input format (W5+ ์‹œ community_reports ๋ฐฐ์—ด ์ž…๋ ฅ)
- Output format (์ž์—ฐ์–ด ๋‹ต๋ณ€)
- Reference (Microsoft GraphRAG, Tomaz Bratanic)
- ํ˜„์žฌ stub ์ƒํƒœ ๋ช…์‹œ
W4 ํ†ตํ•ฉ ์ง„์ž…์  โ€” ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์„ ๋ฐ›์•„ Layer A/B/C ๋กœ ๋ผ์šฐํŒ…:
- t2c (Text2Cypher) โ€” factual / numerical / topN
- local (Local Retriever) โ€” ๊ด€๊ณ„ / ์—ฐ๊ด€ / co-mention
- community (Community Summary stub) โ€” ๊ธ€๋กœ๋ฒŒ / ํŠธ๋ Œ๋“œ

2๋‹จ๊ณ„ ๊ตฌ์กฐ:
1. ํ‚ค์›Œ๋“œ ๋งค์นญ (๊ฒฐ์ •์ , LLM ํ˜ธ์ถœ ์—†์Œ) โ€” ๋งค์นญ ์žˆ์œผ๋ฉด ์ฆ‰์‹œ ๋ถ„๊ธฐ
2. LLM fallback โ€” ํ‚ค์›Œ๋“œ ๋งค์นญ 0๊ฐœ ์‹œ์—๋งŒ, max_tokens=150 (์งง์Œ)
3. graceful default โ€” LLM ์‹คํŒจ ์‹œ t2c

์„ค๊ณ„ ๊ฒฐ์ •:
- LangChain MultiRetrievalQAChain ์˜ LLM router ๋Š” "same query may route to
  different sources" (TDS, 2025) ์ผ๊ด€์„ฑ ๋ฌธ์ œ. ๊ฒฐ์ •์  1๋‹จ๊ณ„ ์šฐ์„ .
- ํ‚ค์›Œ๋“œ ๋งค์นญ์€ ํ† ํฐ ๋น„์šฉ 0 โ€” ๋‹จ์ˆœ factual ๋„ LLM ํ˜ธ์ถœ ์—†์ด ๋ถ„๊ธฐ
- LLM fallback ์€ ์–ดํœ˜ ํ•œ๊ณ„ ๋ณด์™„ โ€” ํ‚ค์›Œ๋“œ ๋ชป ์žก๋Š” ๋ณ€ํ˜• ํ‘œํ˜„ ์ฒ˜๋ฆฌ

ํ‚ค์›Œ๋“œ ๋งคํ•‘:
- ๊ด€๊ณ„ / ๊ด€๋ จ / ์—ฐ๊ด€ / ์˜ํ–ฅ / ํ•จ๊ป˜ / ์ด์›ƒ / ์–ด๋–ป๊ฒŒ โ†’ local
- ํŠธ๋ Œ๋“œ / ์ „์ฒด / ํ๋ฆ„ / ์ฃผ์ œ / ํŒจํ„ด / ๊ธ€๋กœ๋ฒŒ / community โ†’ community
- ๊ทธ ์™ธ โ†’ t2c (default)

Tie-break: ๋‘ ์…‹ ๋™์‹œ ๋งค์นญ ์‹œ ๋” ๋งŽ์€ ์ชฝ (๋™๋ฅ ์ด๋ฉด community โ€” ์ „์ฒด ์˜๋„ ๋ณดํ†ต ๊ธ€๋กœ๋ฒŒ).

Reference:
- LangChain MultiRetrievalQAChain (LLM router)
- LangChain EmbeddingRouterChain (semantic router โ€” 5/24+ ๊ฒ€ํ† )
- Neo4j ToolsRetriever (convert_to_tool ํŒจํ„ด)
- NeoConverse (specialized ์—†์œผ๋ฉด Text2Cypher fallback)
- Sotaaz blog (2026-01) โ€” hybrid_search() if/elif/else ํŒจํ„ด
- Memgraph Atomic GraphRAG (2026-03) โ€” Analytical/Local/Global 3-way

ํ–ฅํ›„ (5/24+):
- Semantic Router (embedding) โ€” ํ‚ค์›Œ๋“œ ์–ดํœ˜ ํ•œ๊ณ„ ๋ณด์™„
- LLM fallback ์‹ ๋ขฐ๋„ ์ ์ˆ˜ํ™” โ€” dual-path ํ•ฉ์„ฑ
- Conversation history ๋ฐ˜์˜
ํ‚ค์›Œ๋“œ ๋งค์นญ 0๊ฐœ ์‹œ LLM ์œผ๋กœ ๋ผ์šฐํŒ… ๊ฒฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” system prompt.

๊ตฌ์„ฑ:
- 3๊ฐ€์ง€ retriever ์ •์˜ + ์˜ˆ์‹œ ์งˆ๋ฌธ
- ๋ถ„๋ฅ˜ ๊ธฐ์ค€ (์ˆœ์„œ๋Œ€๋กœ ํŒ๋‹จ)
- Output format (JSON: route + reasoning)
- 5๊ฐœ few-shot ์˜ˆ์‹œ (t2c x 2, local x 2, community x 1)

ํŠน์ง•:
- max_tokens=150 โ€” ์งง์€ ์‘๋‹ต๋งŒ ๋ฐ›์Œ
- temperature=0.0 โ€” ๊ฒฐ์ •์  ๋ผ์šฐํŒ…
- response_format={"type": "json_object"} ๊ฐ•์ œ
- LLM ์‹คํŒจ / unknown route ์‹œ caller ๊ฐ€ default (t2c) ๋กœ fallback
, #21)

์‹ ๊ทœ export:
- DEFAULT_ROUTE, Route (ํƒ€์ž…)
- RouteDecision, RoutedResult (๊ฒฐ๊ณผ ๊ฐ์ฒด)
- decide_route, route_and_answer (์ง„์ž…์ )
- CommunitySummaryResult, community_summary (stub)

๊ถŒ์žฅ ์ง„์ž…์ ์€ `route_and_answer(question)` โ€” ์ผ๋ฐ˜ ์‚ฌ์šฉ ์‹œ ๋ผ์šฐํŒ… ์ž๋™.
๊ฐœ๋ณ„ retriever ํ•จ์ˆ˜๋„ ๊ทธ๋Œ€๋กœ export ์œ ์ง€ โ€” ๋ช…์‹œ์  ํ…Œ์ŠคํŠธ / ์ง์ ‘ ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ.

sha ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ 0 (dev branch ์˜ __init__.py ์™€ ๋‹ค๋ฅธ ํŒŒ์ผ).
R1~R3 ํ‰๊ฐ€ ์…‹:
- R1 (Q2 ๋™์ผ) โ€” factual / ๊ฐœ์ˆ˜ โ†’ t2c ๋ผ์šฐํŒ… ๊ธฐ๋Œ€. ํ‚ค์›Œ๋“œ ๋งค์นญ 0๊ฐœ๋ผ LLM
  fallback ํŠธ๋ฆฌ๊ฑฐ์˜ ๊ฒ€์ฆ ์ผ€์ด์Šค๋„ ๊ฒธํ•จ.
- R2 (L1 ๋ณ€ํ˜•) โ€” "๊ด€๊ณ„/๊ด€๋ จ/์–ด๋–ป๊ฒŒ/ํ•จ๊ป˜" ํ‚ค์›Œ๋“œ 4์ค‘ ๋งค์นญ โ†’ local ๊ธฐ๋Œ€.
- R3 (L5 ๋™์ผ) โ€” "์ „์ฒด/ํŠธ๋ Œ๋“œ/ํ๋ฆ„" ํ‚ค์›Œ๋“œ ๋งค์นญ โ†’ community (stub) ๊ธฐ๋Œ€.

eval ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ:
- EvalCase ์— expected_route ํ•„๋“œ ์ถ”๊ฐ€ (R* ์ผ€์ด์Šค ์ „์šฉ)
- _evaluate_router_case() ์ถ”๊ฐ€ โ€” ๋ผ์šฐํŒ… ์ •ํ™•์„ฑ + answer ์ฑ„์›Œ์ง + hint ๊ฒ€์ฆ
- CaseEvalResult ์— router ์ „์šฉ ํ•„๋“œ (actual_route, matched_keywords, llm_used,
  llm_reasoning) ์ถ”๊ฐ€
- _print_summary_table ์— Routing ๊ฒฐ๊ณผ ํ‘œ ์ถ”๊ฐ€ (expected vs actual, match ํ‘œ์‹œ,
  LLM ์‚ฌ์šฉ ์—ฌ๋ถ€, ๋งค์นญ ํ‚ค์›Œ๋“œ)
- --suite router ์˜ต์…˜ ์ถ”๊ฐ€
- ๋ผ์šฐํŒ… ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„ + ์ •ํ™•๋„ ํ‘œ์‹œ

์ƒˆ ์ผ€์ด์Šค๋ฅผ ๋ณ„๋„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  Q2/L1/L5 ์˜ ์˜๋„ ์žฌํ™œ์šฉ โ€” ๋ฐœํ‘œ ์ž๋ฃŒ ์ผ๊ด€์„ฑ + ๋น ๋ฅธ
๊ฒ€์ฆ. R1 ์€ ํ‚ค์›Œ๋“œ 0๊ฐœ๋ผ LLM fallback / default(t2c) ๊ฒฝ๋กœ ๊ฒ€์ฆ ๊ฒธํ•จ.
@TaskerJang

Copy link
Copy Markdown
Owner Author

์ •์„ฑ ๊ฒ€์ฆ ๊ฒฐ๊ณผ (5/17 10:02 KST ๋กœ์ปฌ ์‹คํ–‰)

3/3 PASS ยท ๋ผ์šฐํŒ… ์ •ํ™•๋„ 100% ยท ์ „์ฒด 12.8s ยท Routing ํ‰๊ท  4.3s

ID category verdict expected actual match llm? matched_keywords elapsed
R1 routing-factual PASS t2c t2c โœ… โœ… โ€” 7.2s
R2 routing-relation PASS local local โœ… โ€” ๊ด€๋ จ, ํ•จ๊ป˜, ์–ด๋–ป๊ฒŒ 5.6s
R3 routing-global PASS community community โœ… โ€” ํŠธ๋ Œ๋“œ, ์ „์ฒด, ํ๋ฆ„, ์ฃผ์š” ํŠธ๋ Œ๋“œ 0.0s

R1 โ€” LLM fallback ํŠธ๋ฆฌ๊ฑฐ โœ…

  • ํ‚ค์›Œ๋“œ 0๊ฐœ โ†’ LLM fallback ์ง„์ž…
  • Kimi reasoning: "ํŠน์ • ๋ฌธ์„œ ๋‚ด์˜ Table ๊ฐœ์ˆ˜๋ฅผ ๋ฌป๋Š” ๋ช…์‹œ์  ์‚ฌ์‹ค ์งˆ๋ฌธ. Text2Cypher๊ฐ€ aggregation ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค." โ†’ t2c
  • ๋‹ต๋ณ€: "๋ฏธ๋ž˜์—์…‹์ฆ๊ถŒ 4๋ถ„๊ธฐ ์‹ค์ ๋ณด๊ณ ์„œ์—๋Š” ์ด 6๊ฐœ์˜ ํ‘œ(Table) ๊ฐ€ ์ ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค." (Q2 ๋‹ต๊ณผ ์ผ์น˜)

R2 โ€” ํ‚ค์›Œ๋“œ 3์ค‘ ๋งค์นญ + graceful fallback โœ…

  • "๊ด€๋ จ / ํ•จ๊ป˜ / ์–ด๋–ป๊ฒŒ" 3๊ฐœ ๋งค์นญ โ†’ local ์ฆ‰์‹œ ๋ถ„๊ธฐ (LLM ํ˜ธ์ถœ ์—†์Œ, ๊ฒฐ์ •์ )
  • ๋‘์‚ฐ๋ฐฅ์บฃ entity ๋งค์นญ 0๊ฐœ โ†’ graceful fallback ์‘๋‹ต
  • ๋ผ์šฐํŒ… + retriever ๋‚ด๋ถ€ fallback ์–‘์ชฝ ๊ฒ€์ฆ

R3 โ€” Community stub ์ฆ‰์‹œ ์‘๋‹ต โœ…

  • "ํŠธ๋ Œ๋“œ / ์ „์ฒด / ํ๋ฆ„ / ์ฃผ์š” ํŠธ๋ Œ๋“œ" 4๊ฐœ ๋งค์นญ โ†’ community ์ฆ‰์‹œ ๋ถ„๊ธฐ
  • LLM/Neo4j ํ˜ธ์ถœ 0ํšŒ โ†’ elapsed 0.0s (์˜๋„๋Œ€๋กœ)
  • Answer hint hits 5/5

Opik trace

  • ํ”„๋กœ์ ํŠธ: hyunsang-doc-graph-agent
  • ๋ชจ๋“  R* ์ผ€์ด์Šค์˜ ๋ผ์šฐํŒ… decision + ํ•˜์œ„ retriever ํ˜ธ์ถœ์ด nested span ์œผ๋กœ ๋ฐ•์ œ๋จ

๋ฐ•์ œ commit

  • 6f6ec36a โ€” weekly-log ์ •์„ฑ ๊ฒ€์ฆ ๊ฒฐ๊ณผ + R2/R3 ๋งค์นญ ๊ฐœ์ˆ˜ ์ •ํ™•๋„ ์ˆ˜์ • (R2 4์ค‘โ†’3์ค‘, R3 3์ค‘โ†’4์ค‘)

PR ๋จธ์ง€ ์ค€๋น„ ์™„๋ฃŒ. ๋จธ์ง€ ์‹œ #20, #21 ์ž๋™ close.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] W4 Routing Agent (rule-based) [Feat] W4 Layer C: Community stub (์‹œ๋‚˜๋ฆฌ์˜ค A)

1 participant