새어나가는 기억을 영원에 묶기 위한 노력
"청춘이 멀어진다.."
아침부터 토이의 세사람을 들으며 울컥했다.
꾸준히 글을 쓴다는 것은 생각처럼 간단한 일이 아니다.
일상은 쉼 없이 흐르고, 새로이 맞이해야 할 프로젝트와 과제들이 끊임없이 밀려온다. 바쁜 흐름 속에서 기억은 손가락 사이로 흘러내리는 물처럼, 붙잡으려 해도 어느새 희미한 느낌만을 둔 채 사라져 버린다. 기술의 축복은 나를 자유롭게 해줄 것 같았지만 마주한 현실은 열정의 빠른 고갈과 인내심의 부족, 의도치 않은 무기력과의 조우였다.
나는 효율성을 중시하는 사람이다. 유한한 시간 안에서 기회비용을 따진다면, 과거를 기록하기보다는 미래를 준비하고 설계하는 것이 최선의 선택이라 믿어왔다. 현재 나는 사내 인공지능 컨택센터 프로젝트에서 GenAI 파트 프로젝트 오너로 일하고 있다. 매일이 바쁘고, 긴장 속에서 새로운 지식들이 쉼 없이 머릿속에 밀려든다. 이 속도에 발맞춰 나아가는 것만으로도 숨이 가쁘다.
그래서일까, 과거의 기억을 글로 남기는 일이 내게는 귀찮고 낯설게 느껴진다. 과거를 기록하는 일은 어딘가 멈추어 서서 되돌아보는 행위이고, 나는 효율적인 선택에 의해 앞으로 나아가는 것에 익숙한 사람이기 때문이다. 되돌아볼 여유조차 허락하지 않는 이 바쁜 흐름 속에서, 보통 미래만이 나의 시간을 채운다.
그럼에도 불구하고, 글을 쓰는 이유는 어느 순간, 기술의 변화가 내 기억보다 빠르고, 이 모든 것들을 온전히 붙잡지 못한다는 것을 깨달았기 때문이다. 글을 남긴다는 것은 단순한 기록을 넘어, 빠르게 흐르는 세계 속에서 나의 사고를 닻처럼 붙잡아두는 일이기도 하다. 사라져가는 기억의 틈을 메우고, 지금의 나를 미래의 나에게 전달하는 가장 효율적인 방식일지도 모른다는 생각이 들었다.
불과 일 년 전만 해도, 지금의 이 상황과 기술의 변화가 이토록 빠르게 다가올 줄은 몰랐다. AI가 실질적으로 사람들의 업무 방식을 바꾸고, 내가 그 변화를 이끄는 역할을 할 것이라고는 상상조차 하지 못했다. 기술이 그리는 미래가 이제는 일상이 되어버렸다.
시간이 흐르는 동안, 나를 둘러싼 환경과 목표 또한 많이 달라졌다. 어제의 나는 오늘의 나를 설명할 수 없고, 오늘의 나도 내일의 나를 가늠할 수 없다. 이러한 변화는 늘 자연스럽게 찾아오지만, 때로는 그 속도를 따라가는 것이 버겁게 느껴진다. 맡겨진 역할과 쌓여가는 기대 속에서, 나는 마치 쉼 없이 돌아가는 톱니바퀴에 맞춰 움직이는 듯한 기분이 든다. 그럼에도 어딘가에서 멈추어 나를 돌아보는 순간이 필요하다. 지금의 내가 어디로 가고 있는지, 무엇을 위해 달려가고 있는지를 확인할 수 있는 그 짧은 숨 돌림이, 나에게는 무엇보다 소중하다.
우주의 광활한 시간에 비하면 내 삶은 빛에 잠깐 반짝였다가 이내 사라지는 먼지 한 톨에 불과하다. 하지만 그 미미함 속에서도 의미를 찾기 위해, 나는 오늘을 기록하고 내일을 계획한다. 거대한 우주 속에서 흔적도 없이 사라질 수 있는 이 순간들이 헛되지 않도록, 나의 작은 선택과 행동에 가치를 부여하려 애쓴다. 스스로의 발자취를 남기고, 지나온 길을 돌아보며 나아갈 방향을 찾는 이 과정이, 어쩌면 나에게 주어진 이 짧은 삶을 조금 더 의미 있게 만드는지도 모른다.
ChatGPT 플러그인 개발자 승인을 받은 후, 나는 GenAI의 실질적인 활용을 위해 다양한 실습과 프로토타이핑을 시작했다. 기존 챗봇의 한계를 극복하고 기업 가치를 극대화하기 위한 아이디어를 고민해보았다. 이 당시 사내 GenAI 활용을 위해 고민했던 문서로 이하 내용을 대체하고자 한다.
이하 내용은 GEN AI를 사용한 데이터 활용 방안에 대한 연구 및 프로토타입이다. LLM은 gpt-3.5-turbo를 사용하였다. 내부데이터를 통한 테스트는 외부 유출 위험이 있으므로 프로토타입 구축은 외부 시스템에서 사용중인 공공 데이터와 오픈소스 API를 활용하는 것으로 테스트를 진행하였다. 이후 테스트한 데이터를 바탕으로 향후 사내 활용 방안에 대한 아이디어를 이야기 할 것이다.
API 구축을 위한 백엔드, 화면 구축을 위한 프론트엔드를 위해 python 언어를 사용하였다. 향후 실 서비스를 위해 AWS Lambda 환경과 API Gateway를 연결하여 구축이 가능하지만, 본 실습에서는 프로토타입만을 구축하면 되기 때문에 localhost에서 동작하도록 구현하였다. 버전은 3.11.4를 사용하였다. [그림 1] 참고
GEN AI 활용을 위한 LLM은 가장 대중적이라고 할 수 있는 OPENAI의 gpt-3.5-turbo 모델을 사용하였다.본 실습에서는 LLM 모델의 fine-tuning은 담고 있지 않고, 기존에 잘 학습된 모델을 사용한 GEN AI 활용 예시를 담고있기 때문에 https://huggingface.co/ 사이트 등에서 얻을 수 있는 다양한 LLM의 백본 모델에 대한 초기 학습은 배제되어 있다. 해당 API를 사용하기 위해 openai 사이트에서 개발을 위한 API 유료 결제를 등록하였다. [그림 2, 3] 참고. (결제 링크)
ChatGPT Plugins은 ChatGPT 내에서 학습 기간의 제약이나 잘못된 데이터를 불러오는것을 보완하기 위해 만든 기능으로 허가된 개발자만 접근이 가능하다. 해당 기능 개발을 위해 openai 측으로 특정 양식을 작성하여 플러그인 개발자 신청을 하였고, 이후 심사를 거쳐 OpenAI로 부터 플러그인 개발자 허가를 받았다. [그림 4, 5] 참고
본 기술을 활용한 개발은 2.2 CASE 2 (Plugins 방식) 에서 다루었다.
항공 데이터의 활용을 검토하기 위해 공공데이터 포털에서 한국공항공사_공항별 항공노선과 관련된 REST API를 신청하였다. 해당 데이터는 허가 후 개인 API 인증 KEY가 있어야만 조회 가능하며, JSON 형태로 RESPONSE 된다. [그림 6, 7] 참고
본 기술을 활용한 개발은 CASE 2 (Plugins 방식)에서 다루었다.
플러그인 기능의 아이디어 컨셉은 다음과 같다.
공공데이터포털 (JSON 타입의 Response)의 항공편 정보
> 사용 데이터
+ 플러그인에서 Response로 사용된 실제 50개의 항공사별 국내 취항 정보 (API KEY 필요)
https://api.odcloud.kr/api/15002707/v1/uddi:1d493e86-dbc5-4bb2-b737-f3e98939833a
실제 Data
{
"currentCount": 50,
"data": [
{
"연번": 1,
"취항노선": "김포-김해",
"항공사": "대한항공"
},
============= 중간 생략 =============
{
"연번": 50,
"취항노선": "김포-제주",
"항공사": "하이에어"
}
],
"matchCount": 56,
"page": 1,
"perPage": 50,
"totalCount": 56
}
아래의 구축 예시들은 모두 localhost 환경에서 진행하였다. 외부에서도 사용 가능하도록 만들기 위해서는 AWS Sandbox 등의 환경에서 EC2, Lambda, API Gateway를 사용하여 얼마든지 구현 가능하다. (실제 기본 활용 영역은 홈페이지 운영팀 Sandbox 환경에서 EC2 내에 배포하여 외부에서도 접속하도록 셋팅해보기도 하였다) 단, 이번 실습에서는 해당 내용은 범위를 벗어나기 때문에 AWS 영역은 따로 다루지 않는다.
> 폴더 구조
> 주요 소스 (main.py)
========================
from flask import Flask, jsonify, request
from flask_cors import CORS
import requests
from flask import send_from_directory
import os
app = Flask(__name__)
CORS(app)
SERVICE_KEY = "서비스 키는 본 문서에서는 유출 방지를 위해 삭제"
API_ENDPOINT = "https://api.odcloud.kr/api/15002707/v1/uddi:1d493e86-dbc5-4bb2-b737-f3e98939833a"
@app.route('/')
def index():
return "kimhyukju chatgpt test"
@app.route('/airline-info', methods=['GET'])
def get_airline_info():
# 고정된 URL로 요청을 보냅니다.
response = requests.get(API_ENDPOINT, params={
'page': 1,
'perPage': 50,
'serviceKey': SERVICE_KEY
})
if response.status_code == 200:
return jsonify(response.json())
else:
return jsonify({"error": "Failed to fetch data from the API"}), 500
@app.route('/logo.png')
def serve_logo():
return send_from_directory(os.path.join(app.root_path), 'logo.png', mimetype='image/png')
@app.route('/.well-known/ai-plugin.json')
def ai_plugin_manifest():
with open('.well-known/ai-plugin.json', 'r') as f:
manifest = f.read()
return manifest, 200, {'Content-Type': 'application/json'}
@app.route('/openapi.yaml')
def openapi_spec():
with open('openapi.yaml', 'r') as f:
spec = f.read()
return spec, 200, {'Content-Type': 'application/x-yaml'}
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5525, debug=True)
ChatGPT에게 API에 대한 설명과, 인지를 위해 사용된다. 이 파일이 없으면 ChatGPT 플러그인을 수행한다고 해도, 플러그인이 언제 수행되는지 ChatGPT가 알 수 없다. 본 파일은 API에 대한 깊은 이해가 있는 사람이 작성하는 것이 좋다. 해당 파일 내 설명을 통해 ChatGPT 플러그인에 대한 성능이 결정된다.
각 항목의 설명은 아래와 같다. 기술해야 하는 부분은 영어를 사용해야 한다.
openapi : openapi의 버전 정보를 기록한다
info : 문서에 대한 대략적인 정보를 작성한다
version : 문서의 버전을 기록한다
title : 문서 제목을 입력한다
description : 서버에서 참고하는 API나 프로젝트 세부 내용을 적는다. ChatGPT가 해당 기능을 invoke하는데 필수적으로 사용되는 기능이다
servers : Servers에는 항목을 여러 항목을 작성할 수 있다
- description : 세부 내용 작성한다. 이 역시 ChatGPT가 해당 기능을 invoke하는데 필수적으로 사용되는 기능이다
url : 요청 보내고 싶은 서버 주소를 적는다. 샘플테스트에서는 localhost로 호출하기 때문에 http://localhost:5525로 수행한다.
paths : RESTful API Method 작성하고 도메인뒤에 해당 API를 호출하는 path를 기록한다.
/ : 경로를 입력하여 접속한다
get : REST API Method 중 get 방식으로 사용한다는 의미
summary : 소제목을 의미한다
description : 세부 내용을 작성한다
responses : "서버에게 받을 결과 값 설명문"
'200' : 정상 결과가 Response 되었다는 뜻이다
description : 세부 내용 작성한다. 이 역시 ChatGPT가 해당 기능을 invoke하는데 필수적으로 사용되는 기능이다
content : 결과에 대한 서식이 application/json: "content type" 으로 오는지 기술하는 곳이다
schema : 데이터 스키마를 적는 곳이다
type : object "객체(JSON) 형태로 받겠다."
properties : response로 return 되는 각 항목들에 대한 타입을 기술한다.
> 주요 소스 (openapi.yaml)
파이썬으로 로컬호스트 5525포트로 실행
> 터미널에서 시작 명령
> 시작 화면
> 결과 화면
프론트엔트 영역에서 활용가능한 방식으로, 입력되는 DATA의 활용이 아닌 결과 값으로 Response 되는 Data의 값을 활용하는 방식. 응답되는 답변에 특정 단어가 들어가는 경우 관련 링크로 바로 이동해 줄 수 있는 기능을 넣어 활용가능 하다
ex1) GEN AI가 생성해주는 답변 내 [환불] 이라는 단어가 있는 경우 홈페이지 환불 관련 콘텐츠 링크로 이동할 수 있도록 설계 [그림 1] 참고
실제 응답받는 데이터는 환불이라는 단어에 대해 특별한 조치를 해준것이 없다. 프론트엔드 소스에 보면 관련 라우팅 기능이 추가되어 있음을 확인 가능하다. [그림 2, 3] 참고
이 당시는 fine tuning이 모든것의 해결책이 될 것이라 믿었다.
ex2) 고민한 To-Be 구상으로 STT를 통해 LLM 모델에 fine-tuning을 거쳐 자동학습을 하여 LLM 모델을 지속 발전시키고 답변에 마찬가지로 특정 발화에 링크 처리를 하여 고객에게 안내 할 수 있도록 조치하는 시스템 플로우이다. fine-tuning 기능은 해당 작업 범위 내 포함되어 있지 않고, 보다 큰 지원이 필요한 영역이기 때문에 추후 지원을 받게되면 개발 예정이다. [그림 4] 참고
CASE 2 (Plugins 방식)에서의 예시는 API 응답 데이터에 대해 GEN AI에게 설명하고 이에 대한 GEN AI의 해석과 결과에 대해서 말해주고 있다. 마찬가지로 동 방식으로 당사 홈페이지에서 호출하고 있는 API의 스펙에 대한 정의/설명 등을 통해 GEN AI에게 이를 사용할 수 있게 해 줄수는 있다. 대한항공에서 사용중인 API(air-offers)에 대한 실제 화면과 API 응답값은 [그림 1, 2] 참고
하지만 이러한 방식의 API 사용은 학습과 프로그래밍 같은 어려움보다 큰 장벽이 존재한다
1) 내부 데이터의 plug-in 제공 가능여부
plug-in 방식은 내부시스템에 구축되는 방식이 아니라, ChatGPT와 같은 주체가 되는 시스템에 확장 개념으로 제공이 되는 방식이다. 따라서 대한항공과 1A사이에 주고 받는 주요 API에 대한 내용을 플러그인 주체 (ex. ChatGPT)에게도 허용을 해 주어야 하는데 보통 air-offers와 같은 주요 API는 사내에서 CDN 시스템을 활용한 보안 및 내부 서버에만 허용되는 whitelist 처리를 하는데 이러한 중요한 시스템을 외부 시스템에 학습시키고 사용을 허가해주는 것은 어렵다
2) 무분별한 호출에 대한 방어체계
주요 API의 경우 Call을 한번 할 때마다 비용이 부과되는데, plug-in 형태로 타 시스템에서 호출되는 경우 이에 대한 관리와 모니터링이 쉽지 않다. 불필요하게 호출될 위험이 있어 플러그인을 통한 중요 비즈니스 관련 내부 API 호출은 모니터링 검토 등 많은 고민이 필요하다
이 모든 기록은 회사 업무와는 무관하게, 순수한 호기심에서 시작된 실험이었다.
그 시작은 그저 단순한 취미에 불과했지만, 뜻밖에도 몇몇 사람들의 관심과 지지가 이어졌다. 그 격려들은 나에게 작은 불씨가 되었다. 하지만 동시에, 보수적인 시선에서는 보안에 대한 걱정과 비난이 끊이지 않았다.
그럴 때마다 답답함과 속상함이 밀려왔다. 내가 걷고 있던 이 길이 정말 맞는 걸까, 스스로에게 묻곤 했다. 그러나 그런 의심과 혼란 속에서도, 나를 붙잡아준 건 작은 믿음과 응원이었다.
“너라면 왠지 해낼 수 있을 것 같아. 주변 선입견에 휘둘리지 말고, 상상을 결과로 증명해줘”
그저 스쳐 지나가는 인연에서 나온 말이었을지도 모른다. 하지만 그 순간, 그 한마디는 내 마음에 깊이 새겨졌다. 설렘으로 시작한 경험과 그들의 응원은 마치 양분처럼 나를 자라게 했다. 흔들리던 순간마다 그 말은 다시 나를 일으켜 세웠고, 의심과 불안 속에서도 앞으로 나아가게 했다. 현재 나는 사내 인공지능 컨택센터 프로젝트에서 GenAI 파트의 프로젝트 오너로서, 새로운 길을 만들어가고 있다.
일론 머스크는 TED 강연에서 이런 말을 남겼다.
" I am not trying to be anyone's savior.
I am just trying to think about the future and not be sad.”
나도 그렇다. 누군가의 구원자가 되려는 것이 아니라, 그저 내가 상상하는 미래를 생각하고, 그 미래에 슬퍼하지 않기를 바랄 뿐이다. 이 글을 보는 당신도, 불확실한 길을 걷고 있다면 잊지 않았으면 좋겠다.
작은 실험과 도전이, 결국 의미있는 가치를 만들 것이라는 것을