에이전트라는 용어는 이제는 흔해졌지만 엔지니어나 AI를 헤비하게 쓰시는 분들이 아니라면 아직은 에이전트에 대한 이해가 추상적이실겁니다.
저 또한 아직 지속적으로 공부하고 경험해나가고 있는 중이긴 합니다만 나름의 이해를 정리해서 비즈니스 사이드이시거나 비엔지니어이신 분들을 위해 공유해봅니다.
일반적인 에이전트의 구성 요소는 다음과 같습니다.
모델, 인스트럭션(시스템 프롬프트), 툴(서브에이전트 포함), 메모리, 가드레일, 핸드오프
- Model : 에이전트의 두뇌가 될 LLM 모델을 선택
- Instruction 혹은 System Prompt : 에이전트의 역할, 행동 등에 대한 설정. 에이전트가 명확하게 동작할 수 있도록 활용할 수 있는 자산(툴, 서브 에이전트 등)들에 대한 설명 등을 추가하기도 합니다.
- Tools : 에이전트가 웹검색을 하거나 각종 실질적인 업무처리 등을 할 수 있도록 구현한 기능들을 부여합니다. MCP를 연결하는 것도 툴을 부여하는 방식의 하나로 볼 수 있습니다. RAG의 경우도 보통 툴로서 연결합니다. 그리고 에이전트 프레임워크에 따라서 서브 에이전트를 툴로서 부여합니다.
- Sub Agents : 사용자의 질문이 특수한 영역에 대해서 전문적이 역할이 필요한 경우 메인 에이전트가 서브 에이전트에게 질문을 전달하거나 역할 수행을 부탁한뒤 결과를 받아 다시 사용자에게 답변합니다. 위에 적었듯 툴이 동작하는 것과 매우 유사합니다.
- Memory : 에이전트가 대화내용을 기억하게 합니다. Short-term, Long-term 크게 두가지 종류의 메모리를 사용합니다. LLM 단독으로는 사용자의 질문이나 정보를 마법처럼 기억하지는 못합니다. 따라서 메모리는 결국 어딘가에 저장되어 사용자가 LLM에 입력을 할때 같이 공유 됩니다.
Short-term 메모리는 당장 대화를 이어나가기 위해 이전 대화의 내용들을 누적해서 저장하고 LLM에게 공유하는 것입니다. Short-term 메모리가 없다면 이름을 알려주고 "내가 누구야?"라고 물어봐도 AI는 바보처럼 대답하지 못할겁니다.
Long-term 메모리는 데이터베이스 등에 대화 내용을 저장하였다가 나중에 다시 사용자가 돌아왔을때 히스토리를 LLM에게 공유하여 기존 대화를 이어나갈수 있게 합니다. 혹은 사용자 정보를 Long-term 메모리에 누적하였다가 사용자 맞춤형으로 영리하게 동작하게 하는데 활용됩니다.
- Guardrails : 에이전트가 관련이 없는 질문에 응하지 않게 하거나 역할에서 벗어나는 답변을 하지 않도록 합니다. 크게 작동 시점에 따라 인풋 가드레일 (에이전트가 질문을 받을때), 아웃풋 가드레일(에이전트가 답변을 줄때)로 구분할 수 있겠고 프레임워크에 따라서는 에이전트가 동작하는 시점이나 행동에 따라 가드레일 실행시기를 적절히 조절할 수도 있습니다.사실상 LLM을 별도로 실행하여 질문이나 답변에 대한 동작여부나 필터링을 수행한다고 생각하면 되겠습니다.
- Handoff : 멀티 에이전트 시스템을 구축할 경우 자신의 역할에서 벗어나게 되면 다른 에이전트에게 컨텍스트와 함께 주도권을 넘깁니다. 프레임워크에 따라서는 별도의 핸드오프라는 기능 없이 연결고리를 설정하여 넘기거나 에이전트 인스턴스의 역할 자체를 새롭게 설정하는 방식으로도 수행합니다.
Sub Agent와의 차이는 대화의 주도권이 다른 에이전트에게 넘어간다는 것입니다. 즉 대화를 사용자가 다른 에이전트와 이어갈 수 있게 합니다. 서브 에이전트는 위에 기술했듯 메인 에이전트가 알아서 호출하여 사용자의 개입이 불가한 형태로 답변을 받아 전달합니다.
가드레일 관련해서 덧붙이자면, 갑론을박이 있을 수 있겠으나, 가드레일이 답변 제약에 활용 될 수 있기 때문에 자연스럽게 시큐리티 관점에서도 활용하려는 생각이 가능합니다. 하지만 많은 경우 추천하지 않는다고 합니다. 악의적인 목적을 가지고 있는 경우 99% 이상의 확률로 어떻게든 가드레일을 우회할 수 있다고 하네요. 사용자 경험 등의 서비스의 품질 관점으로만 적절히 사용되는 것이 좋을 것 같습니다.
개인적으로 n8n의 AI Agent 노드가 시각적으로 이해하기 좋은 자료라고 생각되네요. n8n에 무료가입후 AI Agent 노드를 추가하시면 Guardrail과 Handoff를 제외한 구성을 시각적으로 바로 확인해 보실 수 있습니다.(n8n에도 Guardrail 노드가 있으나 사용 방식이 일반적인 프레임워크 대비 직관적이지 않아 오히려 이해하는 데 방해가 될 것 같습니다.)