스마티지와 글 읽기 – Prompt 중심으로 Backend 소스코드 분석 – AI와 기존 앱의 강점을 최대한 활용하는 것이 Agentic AI 입니다.

https://www.youtube.com/watch?v=BCn3ZjI5nFY

 

여러분 안녕하십니까? 오늘 우리는 AI 에이전트 애플리케이션의 백엔드 소스코드를 ‘프롬프트’라는 핵심 키워드를 중심으로 함께 분석해보는 시간을 갖겠습니다. 이 강의를 통해 AI 에이전트가 기존의 애플리케이션(툴)과 최신의 AI 기술 사이에서 어떻게 조율자 역할을 수행하며, 사용자가 원하는 결과를 빠르고 정확하게 제공하는지 그 작동 원리를 깊이 이해하실 수 있을 겁니다.

1. AI 에이전트의 역할: 툴과 AI의 장점을 결합하는 조율자

영상 서두에서 강조하듯이, AI 에이전트 개발의 핵심은 **세 가지 요소(툴, 에이전트, AI)**의 유기적인 결합입니다.

  • 툴(Tool): 우리가 이미 개발해 사용하고 있는 기존의 애플리케이션들을 의미합니다. 이 툴들은 반복적인 작업에 대해 매우 정확하고 신뢰할 수 있는 결과를 제공하는 장점이 있습니다.
  • AI: 주어진 정보를 바탕으로 의미를 파악하고 판단을 내릴 수 있는 새로운 기술입니다.
  • 에이전트(Agent): 바로 이 툴의 정확성과 AI의 판단 능력을 연결하고 조율하여, 두 기술의 장점을 모두 활용할 수 있도록 하는 중간자 역할을 합니다.

그리고 이 에이전트가 AI와 소통하는 가장 기본적인 방법이 바로 **프롬프트(Prompt)**입니다. 따라서 효율적인 프롬프트의 설계, 관리, 활용은 AI 에이전트 개발의 성패를 좌우하는 매우 중요한 요소입니다.

2. 슈퍼바이저(Supervisor) 에이전트와 시스템 프롬프트 분석

본격적으로 소스코드 분석에 들어가 보겠습니다. 영상에서는 여러 AI 에이전트(워커)들을 관리하고 지시하는 역할을 하는 ‘슈퍼바이저 에이전트’를 설계하는 데 사용된 시스템 프롬프트를 상세히 분석합니다.

시스템 프롬프트 예시 및 분석:

  • “You are a supervisor tasked with managing a conversation between .”
    • 이 부분은 슈퍼바이저 AI에게 명확한 역할(정체성)을 부여합니다. 단순 정보 전달자가 아니라, {members}로 지정된 워커 에이전트들과의 대화를 관리하고 지시하는 주도적인 역할을 수행해야 함을 명시합니다.
    • {members}는 변수로서, 어떤 팀(예: 리서치 팀, 도큐먼트 작성 팀)을 구성하느냐에 따라 해당 팀의 실제 멤버(워커 에이전트) 이름들이 동적으로 전달됩니다. 이는 프롬프트의 재사용성과 확장성을 높여줍니다.
  • “Given the following user request, respond with a worker to act next.”
    • 사용자의 요청이 주어졌을 때, 슈퍼바이저는 그 요청을 처리하기 위해 다음 작업을 수행할 적절한 워커를 선택하여 응답해야 함을 지시합니다. 이는 슈퍼바이저가 단순 전달이 아닌, 판단을 통해 워커를 선택하는 의사결정 능력이 필요함을 의미합니다.
  • “Each worker will perform a task and respond with their result and status.”
    • 각 워커는 할당된 작업을 수행하고, 그 결과와 현재 상태를 슈퍼바이저에게 보고해야 함을 정의합니다.
  • “When finished, respond with FINISH.”
    • 모든 작업이 완료되었을 때, 워커는 “FINISH”라는 특정 문자열을 포함하여 응답해야 함을 명시합니다. 슈퍼바이저는 이 “FINISH” 신호를 통해 해당 워커의 작업 완료를 인지하고, 전체 작업 흐름을 관리하게 됩니다. 예를 들어, 리서치 팀의 작업이 “FINISH”되면 슈퍼바이저에게 보고하고, 슈퍼바이저는 이 내용을 다시 상위 AI(LLM)에게 전달하여 최종적으로 모든 작업이 완료되었는지 판단하게 됩니다.

시스템 프롬프트의 효과:

  • AI 역할 명확화: 슈퍼바이저가 무엇을 해야 하는지, 작업 완료 조건은 무엇인지 등을 명확히 정의합니다.
  • 지시 용이성: 명확한 정의를 바탕으로 다음 단계를 지시하기 용이해집니다.
  • 확장성 확보: 슈퍼바이저 노드를 만드는 함수를 별도로 구현하고 멤버를 파라미터로 전달받음으로써, 새로운 팀이나 워커를 쉽게 추가할 수 있습니다.

결론적으로, 이 시스템 프롬프트는 슈퍼바이저에게 적절한 워커 선택 임무 부여, LLM 답변 기반 다음 작업 결정, 작업 완료 시 처리 방식 명시 등을 통해 AI 에이전트 프로그래밍에서 중요한 의사결정 능력과 툴 활용 능력을 강조하고 있습니다.

3. 툴(Tool) 정보 관리 및 AI 전달 방식

AI 에이전트가 다양한 툴을 효과적으로 활용하기 위해서는 각 툴이 어떤 기능을 하는지 알아야 합니다. 영상에서는 두 가지 종류의 툴과 그 정보 처리 방식을 설명합니다.

  • 랭체인(Langchain) 등의 프레임워크에서 제공하는 프리빌트 툴(Pre-built Tool) (예: Tavily Search Tool)
    • 이러한 툴은 일반적으로 소스코드 내에 **name**과 **description**이라는 속성을 가집니다.
    • name (예: tavily_search_results_json): 툴의 고유 식별자입니다. AI가 특정 툴을 사용해야 한다고 판단하면, 응답에 이 name을 포함시켜 에이전트에게 알려줍니다.
    • description: 툴의 기능, 사용 목적, 입력값 형식 등을 상세히 설명합니다. 예를 들어, “신뢰성 있는 검색 결과를 제공하며, 현재 이벤트와 관련된 질문에 답변할 때 사용됩니다. 입력값은 검색 쿼리여야 합니다.” 와 같이 기술됩니다.
    • AI는 이 description 정보를 통해 언제 어떤 툴을 사용해야 할지, 그리고 어떤 형태로 입력값을 전달해야 할지를 판단합니다. 예를 들어 “오늘 날씨”와 같은 최신 정보가 필요한 질문에는 검색 툴을 사용하도록 결정하고, “조선시대 역사”와 같은 이미 학습된 정보에 대해서는 해당 툴을 사용하지 않을 것입니다.
  • 개발자가 직접 정의한 커스텀 툴(Custom Tool) (예: scrape_webpage 함수)
    • 파이썬 함수에 @tool 데코레이터를 사용하여 툴로 정의할 수 있습니다.
    • 이 경우, 별도의 name이나 description 속성을 명시적으로 설정하지 않으면, 랭체인과 같은 프레임워크는 내부적으로 함수의 이름(예: scrape_webpage)을 툴의 name으로, 함수의 독스트링(docstring)을 description으로 사용하는 경향이 있습니다.
    • 따라서 개발자는 함수 이름과 독스트링을 명확하고 상세하게 작성하여 AI가 툴의 기능을 정확히 파악하도록 해야 합니다.

AI 에이전트는 이렇게 수집된 툴들의 name과 description 정보를 프롬프트에 포함시켜 LLM에게 전달합니다. LLM은 이 정보를 바탕으로 사용자의 요청을 가장 잘 처리할 수 있는 툴을 선택하고, 필요한 경우 입력값을 적절한 형태로 변환하여 에이전트에게 응답합니다. 그러면 에이전트는 LLM의 지시에 따라 해당 툴을 실행하는 방식으로 작동합니다.

4. 에이전트별 프롬프트 커스터마이징: system_message_modifier 활용

모든 에이전트가 동일한 시스템 프롬프트나 툴 설명만으로 최적의 성능을 내기는 어렵습니다. 특정 에이전트에게는 더 구체적인 역할, 작업 지침, 예외 처리 방법, 행동 방침 등을 명시해줄 필요가 있습니다. 영상에서는 이를 위해 create_react_agent 함수 사용 시 전달할 수 있는 system_message_modifier 파라미터를 활용하는 예를 보여줍니다.

  • 기본적인 에이전트 (예: 서치 에이전트, 웹스크래퍼 에이전트):
    • 이러한 에이전트들은 단일 툴을 사용하거나 툴의 description만으로도 역할 수행이 충분한 경우, 별도의 system_message_modifier 없이 툴 정보만으로 구성될 수 있습니다.
  • 복잡한 작업을 수행하는 에이전트 (예: 문서 작성 에이전트 – Doc Writer):
    • 이 에이전트는 문서 읽기, 쓰기, 편집 등 여러 툴을 사용하며 복잡한 작업을 수행합니다. 따라서 system_message_modifier를 통해 더 상세한 프롬프트를 제공합니다.
      • 명확한 작업 지침: “당신은 문서를 읽고, 쓰고, 편집할 수 있는 에이전트입니다. 노트 테이커가 제공한 아웃라인을 바탕으로 작업해야 합니다.”
      • 예외 상황 처리 지침 (개발자 추가): “아웃라인을 디스크에 저장하는 데 문제가 발생하면, 아웃라인을 참조하지 않고 직접 시를 작성하세요.” (이는 영상 제작자가 특정 구현 문제에 대응하기 위해 추가한 예시입니다.)
      • 행동 방침 제한 (효율성 증대): “추가 질문을 하지 마세요 (Don’t ask follow-up questions).” 이는 에이전트가 불필요한 상호작용 없이 지시받은 작업에만 집중하도록 하여 효율성을 높이기 위함입니다.
  • 특정 목적을 가진 에이전트 (예: 노트 테이킹 에이전트):
    • “당신은 문서를 읽고, 문서 작성가를 위한 초안(아웃라인)을 생성할 수 있습니다. 추가 질문은 하지 마세요.” 와 같이 역할과 행동 방침을 명확히 합니다.

system_message_modifier의 중요성:

  • 에이전트별로 특화된 역할과 행동 지침을 부여하여 작업의 정확성과 효율성을 높입니다.
  • 여러 개의 툴을 사용하는 에이전트에게 각 툴을 어떻게 유기적으로 활용해야 하는지에 대한 가이드라인을 제공합니다. (하나의 에이전트가 여러 툴을 가질 수 있으며, system_message_modifier는 이 툴들을 어떻게 조화롭게 사용할지에 대한 설명을 포함할 수 있습니다.)

5. AI 에이전트 프로그래밍의 핵심 요약

영상 말미에서 강사는 AI 에이전트 프로그래밍의 핵심을 다음과 같이 요약합니다.

  • 프롬프트 관리: AI와의 소통에서 가장 중요한 요소이며, 에이전트의 역할 정의, 데이터 흐름 관리의 핵심입니다.
  • 툴 관리: 기존 애플리케이션의 장점을 활용하고, AI가 이를 적절히 사용할 수 있도록 정보를 제공하고 관리하는 것이 중요합니다.
  • 아키텍처 설계: 복잡한 애플리케이션을 구현할 때는 각 에이전트와 툴들이 어떻게 상호작용할지에 대한 견고한 아키텍처 설계가 필수적입니다.

AI 에이전트는 이처럼 기존의 정확한 툴과 AI의 판단 능력을 프롬프트를 통해 효과적으로 결합하여, 인간이나 AI 단독으로는 처리하기 어려운 복잡한 작업을 자동화하는 강력한 도구입니다.

결론

오늘 우리는 AI 에이전트의 백엔드 소스코드를 프롬프트 중심으로 분석해보았습니다. 보신 바와 같이, 잘 설계된 프롬프트는 AI 에이전트가 자신의 역할을 명확히 인지하고, 다양한 툴을 효과적으로 활용하며, 사용자의 요청에 최적의 답변을 제공하는 데 결정적인 역할을 합니다. AI 에이전트 시대가 본격적으로 열리면서, 이러한 프롬프트 엔지니어링과 에이전트 설계 능력은 더욱 중요해질 것입니다.

[강의 종료]

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*