본 포스팅은 2023년 05월 08일을 기준으로 작성되었습니다.
엘라스틱 공식 블로그를 참고하여 chatGPT with Elasticsearch를 php로 만들었습니다.
ChatGPT는 2021년 9월 이전의 데이터로 학습된 엔진입니다. 즉, 최신 데이터나 private한 데이터에 대한 정보는 알려줄 수 없습니다.
이런 GPT의 한계를 넘을 수 있는 방법이 바로 ChatGPT with Elaticsearch입니다.
ChatGPT with Elasticsearch의 구조는
조회 대상이 될 데이터를 elasticsearch에 적재하고
어플리케이션 상에서 질문(쿼리)을 던지면
해당 질문에 대한 데이터를 elasticsearch에서 조회
조회된 데이터를 참조하도록 하여 OpenAI(ChatGPT)에게 질문을 합니다.
그럼 ChatGPT는 elasticsearch에서 준 데이터를 바탕으로 결과를 리턴해줍니다.
Q: 우리 회사(위엔유텍) 내부 규정중에 무단 결근에 대한 항목을 알려줘.
위와 같은 질문을 ChatGPT(https://chat.openai.com/)에게 던지면 회사(위엔유텍)의 규정이 아닌, 일반적인 무단결근에 대한 정보를 알려줍니다. 회사내부 규정을 elasticsarch에 넣어두고 ChatGPT with elasticsearch로 만든 어플리케이션에 질의를 던지면 회사(위앤유텍) 내부 규정에 대한 정확한 답변을 얻을 수 있게 됩니다.
샘플로 만든 ChatGPT with Elasticsearch과 연동된 Elasticsearch(DB)에는 최신 "Elastic 공식 도큐먼트"를 담고 있습니다.
답변의 신뢰도와 정확성을 알아보기 위해 다음과 같은 테스트를 진행했습니다.
ChatGPT with Elasticsearch - 1 (줄여서 "E-GPT1"이라 칭함)
- 엘라스틱 공식 블로그 대로 BM25, KNN을 사용하여 상위 데이터 1개만 참조하여 대답 리턴
ChatGPT with Elasticsearch - 2 (줄여서 "E-GPT2"이라 칭함)
- BM25, KNN을 사용하여 상위 데이터 5개를 참조하여 리턴
"Elastic 공식 도큐먼트"의 구조를 보면, 계층형 구조로 한 페이지에 모든 데이터를 담고 있는 것이 아닌, 상위 페이지에는 요약 또는 해당 기능에 대한 설명이 있고 하위 페이지에 상세 사용방법 또는 예시 코드들이 적혀있습니다. 하여 "Elastic 공식 도큐먼트" 특성상 상위 1개 데이터만으로는 정확한 답변을 어려울 것 같아 E-GPT1과 E-GPT2로 테스트를 진행해보았습니다.
Q: how ingest pipeline works? 한글로 대답해줘
E-GPT1
E-GPT2
결론은 "무작정 많은 정보를 제공한다고 정확한 대답을 주는 것은 아니다"
질문에 따라 E-GPT2가 더 정확한 답변을 줄 수도 있지만, (상위 5개의 데이터가 전부 질문에 대한 내용이 포함되어 있을 때) 통상적으로는 한 개의 정확한 데이터만 참고하는 것이 효과적임을 알 수 있었습니다.
E-GPT3
E-GPT3은 na***쇼핑 카테고리에서 크롤링한 상품 데이터에 대한 정보를 담고 있습니다.
상품 카테고리 -1
상품 카테고리 -2
상품 이름
상품 가격
상품 랭킹 (판매순)
상품 URL
상품 등록일
크롤링 날짜
...
이런 상품 정보를 제공했을 때, E-GPT가 얼마나 정확하게 대답을 할까? 궁금했습니다.
왼쪽 캡쳐처럼 정확한 상품명을 알려주고 그에 대한 필드 값을 가져오게하는 것은 잘 동작하였습니다. (풀네임을 제공하지 않더라도 nori 형태소 분석기를 적용하였기 때문에 조회 가능)
하지만 aggregation(집계)가 필요한 내용을 물어봤을 땐 정확한 답변을 얻기 힘들었습니다.
질문:
"가장 많이 팔리는 자켓은 뭐야?"
기대대답:
"랭킹1위인 "the izel the izel 배색 포인트 카라 7부 니트자켓 3종"입니다."
Elasticsearch에 던지는 쿼리는 고정되어 있기 때문에, 상품 데이터 5개를 GPT에 주고 거기서 랭킹이 가장 높은 상품을 리턴해주기를 기대했습니다. 하지만 GPT가 rank라는 필드를 인식하지 못하였는지 엉뚱한 상품을 리턴해 주었습니다.
질문:
"자켓은 얼마야?"
기대대답:
"자켓의 평균 가격은 15,000원 입니다."
질문:
"가장 비싼 자켓은 뭐야?"
기대대답:
"가장 비싼 자켓은 "TMK 조이너스 썸머 플로럴 원피스"입니다."
해결방안으로 아래와 같이 테스트를 진행해 볼 예정입니다.
Elasticsearch에서 조회한 데이터 배열을 GPT에게 넘겨주고 GPT가 집계 결과를 알려주는 것
GPT에게 질문의 의도를 파악해서 Elasticsearch query를 만들게 하여 그 쿼리를 Elasticsearch에 던지는 것
위에 예제들은 GPT-3.5-turbo모델을 사용했습니다. 모델에 따라 결과는 다를 수 있습니다. 상위모델의 경우 비용은 비싸되 대답의 정확도는 올라갈 수 있습니다.
실제로 사용하기 위해서 가장 중요한 점은 바로 비용이겠죠. Elasticsearch는 데이터 양에 맞춰(SaaS) 구축하면 끝이지만, OpenAI는 질문마다 token이 차감되는 방식으로 어떻게 질문하냐가 곧 비용으로 지출됩니다.
질문 유형, 길이에 따라 몇 토큰이 차감되는지 확인하기 위해서 대답할 때 사용되는 토큰 수도 알려달라고 GPT에게 요청 했지만, 다음과 같이 알려줄 수 없다고 반환했습니다.
ChatGPT를 애용하신다면 한번쯤은 아래와 같은 질문을 해보셨을겁니다.
Q: 위에 url를 읽고 내용을 요약해줘
하지만 실제로 ChatGPT는 url를 타고 들어가서 문서를 읽을 수 없는 것 같았습니다. (저자피셜) URL를 shorten으로 바꿔서 제공하면 엉뚱한 대답을 하거나 링크를 타고 들어가는 행위는 할 수 없다고 대답하는 것을 발견할 수 있습니다.
이렇듯 OpenAI API는 질문에 대한 길이, 복잡도 등으로 토큰이 차감되는 방식이라 신뢰도 높은 정확한 문서 전달이 비용 절감의 핵심이라고 할 수 있습니다.
다양한 스타트업 및 플랫폼 기업들의 앞으로의 고민은 Chat GPT 자체를 사용하기보다는 기업 별로 보유하고 있는 데이터를 Chat GPT(또는 생성형 AI)를 통해 활용하는 단계로 넘어가고 있습니다. 이를 위해 Chat GPT 를 사용하는 비용을 최적화(토큰 최소 사용) 하는 것, 보유하고 있는 수많은 데이터를 정제하여 Chat GPT 에 태우는 방법을 고민하고 개발해야겠죠.
이러한 다양한 테스트와 튜닝을 위해 Elasticsearch를 활용하게 된다면, 끊임 없이 오르는 비용과 Performance 두 마리 토끼를 잡을 수 있는 최적의 방법이라고 할 수 있습니다.
앞으로 쏟아지는 생성형 AI 모델을 적절하게 선택하고 이를 활용하여 개발 하기 전 선행되어야 하는 업무는 우리가 갖고 있는 데이터를 생성형 AI에 맞게 정제하기 입니다.
이러한 적재를 위해 Elasticsearch는 다양하게 활용 될 수 있습니다.
지금까지 너무나 핫한 트렌드인 Chat GPT 와 Elasticsearch를 연결하여 테스트한 결과와 개인적인 의견을 정리해봤습니다.
짬이 날때마다 테스트 후 새로운 내용을 공유드리겠습니다.
Search하면 역시 Elasticsearch죠
#위앤유텍 #wenyoutech #we-tech #엘라스틱 #Elastic #엘라스틱서치 #Elasticsearch