문서검색 챗봇 → 도구를 활용하는 비서로 확장
박수현 · (사)한국정보공학기술사회 · 2026
🎯 목표: 문서검색 전용 봇 → 필요한 도구를 선택하는 비서로 전환.
💡 핵심 차이: RAG 는 항상 검색, Agent 는 필요 시에만 RAG 도구를 호출.
from langchain_core.tools import tool
@tool
def search_docs(query: str) -> str:
"""기술 문서에서 질문과 관련된 내용을 검색한다
(SSD, RAID 등 저장장치 주제)."""
hits = vectorstore.similarity_search(query, k=3)
return "\n".join(f"- {d.page_content}" for d in hits) \
or "관련 문서를 찾을 수 없습니다."
Chroma.from_documents)를 검색 도구로 그대로 재사용🔑 RAG 를 별도 개념이 아닌 도구 하나로 취급한다. 동일한 방식으로
calculator도구도 추가한다.
agent = create_agent(
llm, [search_docs, calculator],
system_prompt="저장장치 질문은 search_docs 로 근거를 찾고, "
"계산은 calculator 를 써라. 문서에 없으면 모른다고 답하라.",
checkpointer=MemorySaver()) # thread_id 로 대화 기억
# LLM 이 질문 보고 도구 선택
config = {"configurable": {"thread_id": "console"}}
agent.invoke({"messages": [("user",
"NVMe와 SATA 속도를 더하면?")]}, config=config)
# → search_docs(속도 찾기) + calculator(덧셈) 순서대로 호출
thread_id 로 맥락 유지📁 참고:
8.agents/3.applied_agents/,7.RAG/6.agentic/
💡
/ask가agent.invoke(...)한 줄을 호출한다. 응답에 답변과 trace(질문→도구 호출→도구 결과→최종 답변)를 함께 담아 우측 패널에 시각화한다.

통합 웹 데모 · 브라우저(좌측 대화 · 우측 에이전트 trace 패널) ↔ Flask /ask ↔ 에이전트가 search_docs·calculator 도구를 골라 실행, 단계를 trace로 반환
💡
build_trace(result["messages"])가 "질문 → 판단·도구 호출 → 도구 결과 → 최종 답변"을 단계 카드로 분해해, 블랙박스였던 도구 선택 과정을 가시화한다.
🔑 Agent 가 항상 정답은 아니다 — 단순함 우선, 자율성은 필요한 경우에 한정.
@tool 로 노출(search_docs) → 도구 중 하나로search_docs + calculator + 메모리(MemorySaver/thread_id)로 조립agent.invoke 한 줄을 Flask /ask 로 감싸 통합 웹 데모build_trace 로 도구 선택 과정을 trace 시각화(좌:대화·우:패널)