Stanford Webinar - Agentic AI: A Progression of Language Model Usage
https://www.youtube.com/watch?app=desktop&v=kJLiOGle3Lw
안녕하세요, 인섭 송입니다. 오늘은 에이전틱 AI, 에이전틱 언어모델에 대해 이야기해보려고 합니다.
간단히 오늘 이야기할 개요를 소개드릴게요.
먼저 언어모델이 무엇이고, 우리가 그것을 어떻게 사용하는지에 대한 개요를 살펴볼 거예요.
그리고 공통적으로 나타나는 한계점들을 짚어보고, 그 한계를 극복할 수 있는 몇 가지 방법을 살펴볼 겁니다.
그 다음으로는 에이전틱 언어모델이란 무엇인지, 그리고 그 설계 패턴들에 대해 이야기할 거예요.
언어모델은 입력된 텍스트를 기반으로 다음에 올 단어를 예측하는 머신러닝 모델입니다.
예를 들어 "The students open their"라는 문장이 주어지면,
언어모델은 다음에 올 가능성이 가장 높은 단어를 예측하는 식으로 동작해요.
대규모 코퍼스를 기반으로 훈련된 언어모델은, 다음에 올 단어의 확률을 계산합니다.
예를 들어 "books"나 "laptops" 같은 단어가 더 높은 확률로 예측될 수 있어요.
그래서 전체 문장의 완성은 "The students open their books."처럼 될 수 있죠.
그리고 계속해서 문장을 생성하고 싶으면, 완성된 문장을 다시 입력으로 넣어서 다음 단어를 생성하는 식으로 이어갈 수 있습니다.
그렇다면 언어모델은 어떻게 훈련될까요?
크게 두 단계로 나눌 수 있어요: **사전 훈련(pre-training)**과 **후속 훈련(post-training)**입니다.
먼저 사전 훈련은 인터넷, 책, 기타 공개된 텍스트 데이터를 수집해서,
"다음 토큰 또는 다음 단어 예측"이라는 목표로 모델을 훈련시키는 과정입니다.
이 과정을 통해 모델은 입력을 주면 그 다음에 어떤 단어가 올지를 잘 예측할 수 있는 능력을 갖추게 돼요.
하지만 사전 훈련만 거친 모델은 바로 쓰기에 그렇게 편리하지 않아요.
그래서 후속 훈련이 필요한데요,
이 단계에서는 **명령어를 따르는 학습(Instruction Following Training)**과
**인간 피드백을 활용한 강화학습(Reinforcement Learning with Human Feedback)**을 거치게 됩니다.
이 후속 훈련에서는 특정 질문이나 지시문을 주고,
그에 대해 사람이 기대하는 답변을 모델이 출력하도록 훈련시키는 거예요.
이 과정을 통해 모델은 특정 스타일이나 포맷에 맞춰 답할 수 있게 되고, 훨씬 사용하기 쉬워집니다.
추가적으로, 인간의 선호도를 반영해서 모델의 출력을 조정하는 강화학습 과정을 거치기도 해요.
이때는 사람의 평가를 기반으로 보상 신호를 줘서 모델을 더 잘 맞추도록 유도합니다.
간단한 예시를 보면, 후속 훈련용 데이터셋은 이런 식으로 준비돼요.
특정 지시문과 예상 출력값을 짝지어 넣고,
모델은 이 지시문에 기반해서 답변 부분만 학습하는 방식입니다.
이렇게 사전훈련과 후속훈련을 모두 마친 언어모델은
입력된 지시문에 따라 자연스럽고 지식이 풍부한 텍스트를 생성할 수 있게 됩니다.
요즘 이 모델들은 정말 빠르게 발전하고 있고,
우리 일상 곳곳에서 AI 코딩 어시스턴트라든지, 특정 도메인에 특화된 AI 코파일럿,
혹은 우리가 잘 아는 ChatGPT 같은 대화형 인터페이스로 활용되고 있어요.
이런 모델을 사용하려면, 크게 두 가지 방법이 있어요.
하나는 클라우드 기반 API를 호출하는 방법이고,
다른 하나는 모델 크기가 작다면 로컬 머신이나 심지어 모바일 기기에서 직접 모델을 호스팅하는 방법입니다.
그럼 API 호출을 통한 사용은 어떻게 하는 걸까요?
언어모델은 자연어 텍스트를 입력받고 텍스트를 출력합니다.
따라서 자연어 형태로 명령이나 질문을 잘 준비해서 특정 포맷으로 API 호출을 보내야 해요.
모델 서버는 이 요청을 받아서 처리하고, 생성된 출력을 다시 돌려줍니다.
우리는 이 출력을 파싱해서 필요한 작업에 활용하면 되는 거죠.
여기서 중요한 게 바로 **프롬프트 준비(prompting)**입니다.
입력 텍스트를 어떻게 준비하느냐가 모델의 성능에 큰 영향을 줘요.
프롬프트 작성할 때 참고할 수 있는 몇 가지 팁이 있습니다.
- 명확하고 자세한 지시문을 써라.
- 원하는 스타일이나 포맷의 예시를 포함하라.
- 참고 자료나 배경 정보를 제공하라.
- 모델에게 "바로 답하라"기보다는 "생각할 시간"을 주는 식으로 유도하라. (예: Chain of Thought)
- 복잡한 작업은 쪼개서 순차적으로 요청하라.
- 개발할 때는 항상 로깅과 자동화된 평가 체계를 갖추어라.
각 항목을 하나씩 살펴볼게요.
우선, 명확하고 구체적인 지시문을 작성해야 합니다.
짧고 모호한 요청보다는, 모델이 정확히 이해할 수 있도록 세세하게 설명하는 게 중요해요.
모델은 우리의 마음을 읽을 수 없으니까요.
다음은 few-shot 예시 포함하기입니다.
모델이 일관된 스타일로 답변하도록 하려면,
입력-출력 예시를 몇 개 보여준 뒤, 진짜 질문을 던지는 게 효과적입니다.
또한 관련 컨텍스트나 참조자료 제공하기도 매우 중요합니다.
모델은 모르는 분야에서는 **헛소리(hallucination)**를 할 수 있기 때문에,
정확한 정보를 기반으로 답하도록 문맥을 함께 제공하는 것이 좋아요.
예를 들어, "다음 기사에 기반해서만 답하라"고 명시하고,
답할 수 없으면 "답을 찾을 수 없습니다"라고 응답하라고 지시할 수 있습니다.
그리고 모델에게 생각할 시간을 주는 Chain of Thought 기법을 적용하는 것도 좋아요.
질문에 바로 답하게 하지 말고, 먼저 모델이 스스로 풀이 과정을 거치게 유도하는 거죠.
또 하나 중요한 건, 복잡한 요청은 여러 단계로 나눠서 처리하는 것입니다.
1단계 결과를 다음 프롬프트에 붙여서 2단계 요청을 하고,
그 결과를 또 이어서 3단계 요청을 하는 식으로요.
개발 측면에서는 로깅과 자동 평가 체계를 초기에 구축하는 것이 정말 중요합니다.
이게 있어야 모델 성능을 제대로 비교하고 개선할 수 있어요.
자동화된 평가를 위해서는 모델에게 직접 답변 품질을 평가하게 하는 것도 한 방법입니다.
(물론 이건 비용과 정확도 문제를 고려해서 결정해야 해요.)
지금까지는 언어모델의 개요를 살펴봤어요.
굉장히 강력한 모델들이 나와있고, 다양한 방법으로 사용할 수 있죠.
하지만 이런 모델에도 여전히 한계가 있습니다.
대표적인 문제들이 여기 나와있어요.
우선 환각(hallucination) 문제가 있어요.
모델이 틀린 정보나 허구의 내용을 만들어내는 경우가 종종 있죠.
특히 계산이 필요한 문제나 특정 지식이 요구되는 분야에서는 이런 문제가 더 심각해질 수 있어요.
이건 여러분이 애플리케이션을 만들 때 꼭 피해야 할 문제예요.
또 다른 문제는 **지식의 컷오프(cut-off)**입니다.
모델을 훈련할 때 데이터셋을 수집하는데,
어느 시점에서는 "이제 여기까지" 하고 데이터를 끊고 훈련을 시작해야 하잖아요.
그렇기 때문에 모델은 최신 정보나 최근 뉴스 같은 걸 모를 수도 있어요.
출처를 명시하지 않는 것도 한계입니다.
모델은 다양한 세계 지식을 기반으로 답변을 하지만,
"이 답이 어디서 왔는지"를 명확히 말해주지 못하죠.
데이터 프라이버시 문제도 있습니다.
모델은 공개된 데이터를 기반으로 훈련되었기 때문에,
여러분 회사나 조직의 내부 데이터 같은 건 전혀 모릅니다.
마지막으로 컨텍스트 길이의 제한도 있습니다.
요즘 많이 늘어나긴 했지만, 여전히 긴 문맥을 처리하면 비용도 올라가고, 응답 속도도 느려질 수 있어요.
이런 공통적인 문제들을 해결하기 위해서,
**RAG(Retrieval Augmented Generation)**이라는 방법이 등장했습니다.
RAG는 이렇게 도와줍니다.
- 환각을 줄여줘요. 왜냐하면 실제 관련 자료를 기반으로 답변하니까요.
- 출처를 제공할 수 있어요. 어디서 답을 가져왔는지 명확히 알 수 있죠.
- 사내 데이터나 사적인 텍스트를 활용할 수 있어요.
- 긴 문맥이 필요할 때, 필요한 부분만 뽑아서 넣을 수 있어요.
어떻게 동작하냐면요,
자신만의 데이터셋이나 텍스트를 미리 작은 조각(chunk)으로 나눈 다음,
각 조각을 임베딩(embedding) 공간으로 변환해서 벡터 데이터베이스에 저장해요.
그 다음 사용자가 질문을 하면, 그 질문도 임베딩으로 변환해서
**가장 가까운 관련 조각(top-K)**을 찾아서 가져오죠.
그리고 이걸 프롬프트에 집어넣어서 모델에게 "이 자료만 참고해서 답해"라고 시키는 거예요.
아까 봤던 것처럼, "다음 기사만 참고해서 답해"라는 식으로 문장을 구성하면 되죠.
이 방법은 특히,
자신만의 사내 데이터, 혹은 특정 도메인 데이터로
모델을 안전하게 사용하는 데 굉장히 유용합니다.
비슷한 방식으로 AI 검색 시스템도 만들 수 있어요.
웹 검색을 하거나 다른 검색 인덱스를 사용해서,
관련 정보를 찾아낸 다음, 그걸 프롬프트에 삽입하는 방식이죠.
참고로, Retrieval Augmented Generation(RAG)에는 여러 가지 방법이 있어요.
방금 설명한 건 가장 기본적인 방식(텍스트를 임베딩해서 벡터 검색하는 방식)이지만,
**지식 그래프(Knowledge Graph)**를 사용하는 방법도 있습니다.
텍스트 소스에서 지식 그래프를 만들고, 그걸 기반으로 정보를 추출하는 식이에요.
(이걸 Graph RAG라고 부르기도 해요.)
그리고 또 하나, 중요한 기술이 있습니다.
툴 사용(tool usage), 또는 **펑션 콜(function calling)**이라고 부르는 방법이에요.
기존 언어모델은 텍스트 입력을 받아서 텍스트를 출력했어요.
하지만 이건 외부 세계에서 새로운 정보를 가져오거나
무언가를 "실행"할 수 없다는 한계가 있었어요.
툴 사용을 하면 이걸 극복할 수 있습니다.
- 실시간 정보 검색이 가능해지고
- 실제 계산이나 코드 실행도 할 수 있어요.
예를 들어볼게요.
"샌프란시스코 날씨가 어때?"라고 물었을 때,
모델 자체는 그 정보를 모르잖아요.
그런데 미리 모델한테 "만약에 날씨 질문이 오면 이런 API를 호출하라"고 알려주면,
모델이 'get_weather' 같은 함수를 호출하는 형식의 출력을 만들어낼 수 있어요.
그러면 소프트웨어가 그 출력을 받아서,
진짜로 날씨 API를 호출하고, 결과를 가져오고,
다시 모델에게 알려주는 거죠.
모델은 그 결과를 기반으로 사람 친화적인 답변을 생성할 수 있습니다.
어떤 경우에는, 모델이 아예 소프트웨어 코드를 생성할 수도 있어요.
예를 들면, 계산이 필요한 문제에 대해
파이썬 코드를 짜서 외부 샌드박스 환경에서 실행하게 하는 식입니다.
여기까지 요약하면, **에이전틱 언어모델(agentic language model)**은 이렇게 정의할 수 있어요.
- 단순히 "텍스트 입력 → 텍스트 출력"만 하는 게 아니라,
- 환경과 상호작용할 수 있어야 합니다.
- 툴을 호출하거나, 검색을 하거나, 코드 실행을 하거나, 정보를 가져와야 해요.
- 그리고 이 모든 과정(대화 이력, 툴 사용 결과 등)을 메모리처럼 저장해서
- 이어지는 작업에 활용할 수 있어야 합니다.
또 다른 식으로 정의하면,
에이전틱 언어모델은 Reasoning(추론)과 Action(행동)을 모두 할 수 있어야 한다고 볼 수 있어요.
(줄여서 ReAct라고도 해요.)
- Reasoning(추론):
모델이 요청을 단순히 처리하는 대신, 문제를 쪼개서 생각하거나 계획을 세우게 하는 것. - Action(행동):
필요한 정보를 검색하거나, 계산하거나, API를 호출하거나, 코드를 작성하는 것.
이 둘을 결합하면, 모델이 훨씬 복잡하고 어려운 작업도 수행할 수 있게 됩니다.
추론과 행동을 더 구체적으로 살펴볼게요.
Reasoning(추론):
단순히 요청을 해결하는 대신,
모델에게 "이 작업을 쪼개서 단계별로 계획을 세워라"라고 요청할 수 있어요.
Action(행동):
계획을 세운 다음,
외부 API를 호출하거나, 검색을 하거나,
필요한 정보를 모은 다음,
최종적으로 답변을 만들어내는 거예요.
그리고 이런 과정에서 생긴 결과들은 모두 메모리에 저장해서
다음 작업에 계속 활용할 수 있습니다.
예를 들어볼게요.
고객 지원 AI 에이전트를 만든다고 가정해봅시다.
고객이 "이 제품 환불할 수 있나요?"라고 물었을 때,
에이전트 시스템은 다음과 같은 작업을 순차적으로 수행합니다.
- 환불 정책을 확인하기 (회사 문서 검색)
- 고객 정보를 조회하기 (주문 내역 확인)
- 해당 제품 정보를 확인하기 (품목 세부사항 검색)
- 이 모든 정보를 종합해서 결론을 내리기 (환불 가능 여부 판단)
이 각 단계에서, 모델은 외부 시스템에 API 요청을 보내거나,
사용자에게 추가 정보를 요청하거나,
검색 결과를 기반으로 판단을 내립니다.
마지막에는 환불 승인 요청을 보내거나, 사용자에게 결과를 안내할 수도 있겠죠.
그래서 에이전틱 언어모델 시스템의 전반적인 워크플로우는 이렇습니다.
언어모델이 문서나 작업을 검토하면서, 반복적으로 외부 도구를 호출하고,
필요한 정보를 수집하면서 작업을 이어가는 거예요.
예를 들면, 특정 주제에 대해 리서치를 하고 싶다고 가정해볼게요.
그러면 에이전트가 웹 검색이나 다양한 검색을 하면서,
찾아낸 정보를 요약하고, 그걸 또 정리하면서 최종적으로 보고서를 만들어줄 수 있어요.
또 다른 예를 들면,
소프트웨어 어시스턴트 에이전트를 들 수 있어요.
이런 에이전트는 특정 소프트웨어 버그나 이슈를 찾기 위해,
- 문제를 검색하고,
- 관련된 코드나 파일을 모으고,
- 코드를 분석해서 수정 방법을 제안할 수 있어요.
그리고 그 수정 코드를 실제로 샌드박스 환경에서 실행해보고,
결과를 확인한 다음, 최종적으로 풀 리퀘스트(pull request) 형태로 변경사항을 제안할 수도 있습니다.
이렇게 복잡한 작업들을 가능하게 만드는 이유가 뭐냐?
바로 에이전틱 패턴을 쓰기 때문이에요.
만약 똑같은 모델을 그냥 단순한 요청에만 쓴다면,
모델은 이런 복잡한 작업을 제대로 못할 수도 있어요.
그런데 작업을 "계획하고, 추론하고, 도구를 쓰고, 메모리에 저장하고"
이런 식으로 에이전트화하면,
같은 모델이라도 훨씬 더 복잡한 작업을 해낼 수 있는 거죠.
이게 에이전틱 언어모델이 요즘 주목받는 이유입니다.
AI 에이전트를 이용해서 할 수 있는 일들이 점점 확장되고 있어요.
실제 활용 예시를 살펴보면,
- 소프트웨어 개발: 코드 생성, 버그 수정, 자동화된 리팩토링 등
- 리서치 및 분석: 정보 수집, 요약, 리포트 작성
- 업무 자동화: 반복 업무를 자동화하고 최적화하는 것
이런 분야에 에이전틱 패턴이 점점 널리 사용되고 있습니다.
그럼 구체적으로 에이전틱 언어모델을 설계할 때
어떤 디자인 패턴을 쓸 수 있을까요?
- Planning(계획 수립):
모델에게 작업을 분해하고, 계획을 세우게 하세요.
그렇게 해야 나중에 필요한 API 호출이나 도구 사용이 명확해져요. - Reflection(자기 피드백):
모델에게 스스로 생성한 출력을 검토하고, 비판하도록 요청할 수 있어요.
이 과정을 통해 더 나은 결과를 얻을 수 있습니다. - Tool Usage(도구 사용):
모델이 직접 접근할 수 없는 외부 정보를 얻기 위해,
API를 호출하거나, 코드로 계산하게 하는 방법입니다. - Multi-Agent Collaboration(다중 에이전트 협업):
복잡한 작업을 여러 에이전트로 나눠서 병렬로 처리하게 하는 방식입니다.
각 에이전트는 특정 역할에 특화되어 있습니다.
Reflection(자기 피드백) 패턴을 예로 들면,
코드를 리팩토링하고 싶을 때
바로 "이 코드 고쳐줘"라고 하지 말고, 이렇게 해볼 수 있어요.
- 먼저, 모델에게 "이 코드에서 고칠 점을 찾아봐"라고 요청합니다.
- 모델이 고칠 점을 지적하게 한 다음,
- 그 지적사항을 다시 입력으로 주고, "이 피드백을 반영해서 코드를 고쳐줘"라고 요청하는 거예요.
이런 식으로 하면, 모델이 훨씬 더 좋은 수정 결과를 낼 가능성이 높아집니다.
**Tool Usage(도구 사용)**은 아까 얘기했던 것처럼,
모델이 "이 API를 호출하라"거나,
"이 계산을 해라" 같은 식으로 외부 시스템을 사용하는 걸 의미해요.
필요할 때는, 모델이 프로그램(예: 파이썬 코드)을 생성하고,
그걸 샌드박스 환경에서 실행시킨 다음,
그 결과를 다시 모델에게 넘겨줄 수도 있습니다.
**Multi-Agent(다중 에이전트)**는
조금 더 복잡하지만 아주 강력한 패턴이에요.
작업을 여러 개의 작은 역할로 나누고,
각각 다른 에이전트(모델 인스턴스 또는 다른 프롬프트 설정)를 통해 처리하게 하는 거죠.
예를 들어, 스마트 홈 자동화를 한다고 치면,
- 기온 조절 담당 에이전트
- 조명 제어 담당 에이전트
- 보안 시스템 담당 에이전트
이렇게 나누어서 각각 특정 업무를 맡기고,
전체 시스템이 이들을 조율하는 구조를 만들 수 있습니다.
각 에이전트는 약간씩 다른 프롬프트나 페르소나를 가지고 동작할 수도 있고,
같은 모델을 쓰거나 다른 모델을 조합해서 사용할 수도 있어요.
정리하면,
에이전틱 언어모델 사용법은 기존 언어모델 사용법을 확장한 버전입니다.
기본적으로
- 프롬프트 작성 잘하고
- 검색이나 도구 사용 추가하고
- 워크플로우를 잘 설계하면,
단순한 질의응답을 넘어서,
훨씬 더 복잡한 일도 언어모델을 이용해서 해낼 수 있게 되는 거예요.
(마무리 및 Q&A 세션)
PETRA가 질문을 받기 시작해요.
"에이전틱 AI 관련해서, 평가 방법을 어떻게 하면 좋을까?"라는 질문이 나왔어요.
INSOP SONG 답변:
- LLM(언어모델)을 평가하는 데는 'LLM을 판정자로 쓰는 방법'이 널리 쓰인다.
- 근데 그걸 좀 개선할 수 있다. 예를 들면,
- 먼저 모델이 결과를 생성하고,
- 다른 모델(혹은 다른 프롬프트)을 써서 그 결과를 검토하고,
- 또 다른 관점에서 재검토하는 방식(즉 Reflection Pattern)으로 평가 정확도를 높일 수 있다.
- 평가가 굉장히 중요하다. 왜냐하면 이게 있어야 모델을 바꾸거나 튜닝할 때 확실히 개선할 수 있기 때문이다.
다음 질문은,
"특정 용도에 맞게 AI 에이전트를 조정하고 싶은데 어떻게 해야 하나요?" 였어요.
INSOP SONG 답변:
- 단순한 작업이면 기존 언어모델로도 충분하다.
- 하지만 복잡한 작업이면, 간단한 에이전틱 패턴을 적용해볼 수 있다.
- 처음부터 너무 복잡하게 시작하지 말고,
- 작게 시작하고, 빠르게 실험하고, 반복하면서 발전시키는 게 중요하다.
또 다른 질문,
"윤리적인 문제, 환각 문제, 데이터를 어떻게 안전하게 다루느냐?"
INSOP SONG 답변:
- 환각은 모델의 본질적 한계다. 완전히 없앨 수는 없다.
- 그래도 모델 제공자들도 지속적으로 개선하고 있고,
- 개발자 입장에서도 **가드레일(Guardrails)**을 추가해야 한다.
- 즉, 출력 결과나 입력 요청을 자동으로 체크하고 필터링하는 체계를 갖추는 게 필요하다.
마지막 질문,
"초보자가 에이전틱 언어모델 실습을 시작하려면 어떻게 하면 좋을까?"
INSOP SONG 답변:
- 너무 복잡하게 시작하지 말고,
- 모델 제공업체에서 제공하는 '플레이그라운드(Playground)' 같은 곳에서 프롬프트 실습부터 시작하라.
- 거기서 감을 익힌 다음,
- 간단한 API 호출을 해보면서 조금씩 자신만의 코드를 만들어보라.
- 이후에 필요하면 더 복잡한 라이브러리나 프레임워크를 사용해도 된다.
마지막으로
"최신 흐름을 따라가려면 어디를 참고하면 좋을까?"라는 질문이 나왔어요.
INSOP SONG 답변:
- 신뢰할 수 있는 몇몇 전문가들을 팔로우하면서 최신 트렌드를 따라간다.
- 트위터(X)나 유튜브 같은 곳에서 관련 정보를 얻고,
- 추가로 Stanford나 다른 교육 기관에서 제공하는 공개 강의 자료도 참고할 수 있다.