fabagent / agents /tools /knowledge.py
hee_!J
feat(rag): CRAG self-correction (retrieval grader + query refiner)
0969faa
Raw
History Blame Contribute Delete
2.49 kB
"""search_knowledge tool - RAG ๊ฒ€์ƒ‰ (CRAG self-correction ํฌํ•จ)
๊ธฐ๋ณธ์€ CRAG ํ™œ์„ฑํ™” (๊ฒ€์ƒ‰ โ†’ ๊ด€๋ จ์„ฑ ํ‰๊ฐ€ โ†’ ๋ฏธ๋‹ฌ ์‹œ ์ฟผ๋ฆฌ ์žฌ์ž‘์„ฑ + ์žฌ๊ฒ€์ƒ‰).
ํ™˜๊ฒฝ๋ณ€์ˆ˜ CRAG_ENABLED=false ๋กœ ๋น„ํ™œ์„ฑ ๊ฐ€๋Šฅ (์‹คํ—˜ ๋น„๊ต์šฉ).
์ „์—ญ trace list (`LAST_CRAG_TRACE`)์— CRAG ๋ฉ”ํƒ€๊ฐ€ ๋ˆ„์ ๋˜์–ด agent ํ˜ธ์ถœ๋ณ„ ๊ด€์ฐฐ ๊ฐ€๋Šฅ.
"""
from agents.rag.crag import crag_enabled, crag_search
from agents.rag.store import load_document, search
# ํ˜ธ์ถœ ๋‹จ์œ„๋กœ reset ํ›„ agent loop ๋™์•ˆ CRAG ๋™์ž‘์„ ์ถ”์ 
LAST_CRAG_TRACE: list[dict] = []
def reset_crag_trace() -> list[dict]:
"""์ด์ „ trace ํšŒ์ˆ˜ ํ›„ ์ƒˆ๋กœ ์‹œ์ž‘ - ์‹คํ—˜ยทagent trace ์ˆ˜์ง‘์šฉ"""
global LAST_CRAG_TRACE
out = LAST_CRAG_TRACE
LAST_CRAG_TRACE = []
return out
def search_knowledge(query: str, top_k: int = 3) -> dict:
"""์‚ฌ๋‚ด ์ง€์‹ ๋ฌธ์„œ๋ฅผ hybrid ๊ฒ€์ƒ‰ + CRAG ์ž์ฒด ํ‰๊ฐ€
CRAG ํ™œ์„ฑ ์‹œ ๋ฐ˜ํ™˜์— relevance_score, refined ์—ฌ๋ถ€ ํฌํ•จ.
"""
if crag_enabled():
result = crag_search(query, top_k=top_k, trace_list=LAST_CRAG_TRACE)
return result
# CRAG ๋น„ํ™œ์„ฑ: ๊ธฐ์กด hybrid search ๊ทธ๋Œ€๋กœ
doc_ids = search(query, top_k=top_k)
hits = []
for d in doc_ids:
text = load_document(d)
hits.append({"doc_id": d, "snippet": text[:400] + ("..." if len(text) > 400 else "")})
return {"hits": hits}
SCHEMA = {
"type": "function",
"function": {
"name": "search_knowledge",
"description": (
"์‚ฌ๋‚ด ์ง€์‹ ๋ฌธ์„œ(๊ณผ๊ฑฐ ์‚ฌ๋ก€ INC, ์‹คํŒจ ๋ชจ๋“œ FMEA, ํ‘œ์ค€ ์ ˆ์ฐจ SOP, ๊ณต์ • ํ๋ฆ„ FLOW)๋ฅผ "
"hybrid ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. CRAG self-correction์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์–ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๊ด€๋ จ์„ฑ์ด "
"๋‚ฎ์œผ๋ฉด ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•ด ์žฌ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์— relevance_score(0~1)๊ฐ€ ํฌํ•จ๋˜์–ด "
"์›์ธ ๋ถ„์„ยท๋Œ€์‘ ๊ถŒ๊ณ ์— ์‹ ๋ขฐ๋„์™€ ํ•จ๊ป˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
),
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "๊ฒ€์ƒ‰ํ•  ํ‚ค์›Œ๋“œ/์งˆ์˜๋ฌธ (์˜ˆ: 'CMP ์Šฌ๋Ÿฌ๋ฆฌ ์œ ๋Ÿ‰ ์ด์ƒ')",
},
"top_k": {
"type": "integer",
"description": "๋ฐ˜ํ™˜ํ•  ๋ฌธ์„œ ์ˆ˜ (๊ธฐ๋ณธ 3)",
"default": 3,
},
},
"required": ["query"],
},
},
}