오픈AI의 retrieval은 못하는데 올거나이즈는 잘하는 것? - 복잡한 표에서 답 찾기
11월 6일, 오픈AI의 데브데이에서 발표한 내용에 개발자를 위한 다양한 기능도 포함되었는데요. 어시스턴트 API(Assistant API)를 통해 코드 인터프리터나 함수를 호출할 수 있는 것이 소개되었습니다.
또한 retrieval(검색) 기능을 통해 그간 GPT의 한계라고 여겨졌던 최신 외부 지식의 강화도 부분적으로 이뤄졌습니다. 파일을 업로드해 Assistant에 전달하면 OpenAI가 문서를 전처리하고, 임베딩을 색인화 및 저장한 뒤 관련 콘텐츠를 검색하여 사용자 쿼리에 응답하는 기술입니다.
올거나이즈는 오픈AI가 리트리벌 기능을 발표하기 전부터 RAG(Retrieval Augmented Generation, 검색 증강 생성) 기능을 제품에 적용했고, RAG에 사용자 피드백을 반영하는 등 실제 사용 고객을 위한 장치를 마련해 두었는데요.
오픈AI의 리트리벌과 올거나이즈의 리트리벌 성능을 비교해서 보여드리고자 합니다.
올거나이즈 AI 팀의 이정훈 엔지니어가 기술의 배경 설명, 간단한 표와 복잡한 표에서의 성능을 비교한 글을 작성했습니다.
1. RAG의 필요성
GPT는 다양한 영역과 산업에 대한 질문에 대해 좋은 답변을 하여 많은 사용자들을 놀라게 하고 있습니다. 하지만, GPT가 모든 도메인의 질문에 대한 답변할 수 있을까요?
예를 들어, 사내 문서와 관련된 질문을 하면 GPT는 잘못된 답변을 할 가능성이 높습니다. 당연하게도 GPT 학습 데이터에 사내 문서가 포함되어 있지 않기 때문에, 정확한 답변을 하기 힘듭니다.
만약, 최근에 발행된 문서에 대한 질문을 하면 GPT는 답변하기 어렵습니다. 하지만, 프롬프트에 해당 문서 내용을 넣고 질문을 하면, GPT는 프롬프트에 입력된 내용을 참조해 답변을 생성합니다.
이렇게 외부 데이터에 대한 질문에 대응하기 위한 RAG(Retrieval Augmented Generation, 검색 증강 생성) 방식이 각광을 받고 있습니다.
RAG 방식은 프롬프트에 외부 데이터에 대한 정보를 포함하여 질문을 하고 답변을 얻는 기술입니다.
아래 문서는 정부에서 2023년에 발표한 ‘2023년 정부혁신 종합계획’ 입니다.
사용자는 ‘2023년 정부혁신 종합계획에 발표된 선제적 대응 방안을 알려줘’라는 질문에 대한 답변을 얻고 싶습니다.
하지만 해당 문서는 2023년에 발행된 문서이기 때문에 GPT에 해당 정보가 없을 것입니다.
실제로 ChatGPT에 질문을 해보니 답변할 수 없다는 내용을 생성하고 있습니다.
하지만, RAG 방식으로 해당 문서에 대한 정보를 프롬프트에 주입한다면 답변을 얻을 수 있습니다.
아래는 올거나이즈의 Alli Answer를 활용해 얻은 답변입니다.
문서의 내용을 반영해서 답변을 생성하는 것을 확인할 수 있습니다.
아래와 같이 프롬프트에 문서의 내용을 함께 넣어주고 LLM에 요청을 보내 답변을 생성합니다.
LLM 프롬프트의 길이 제한이 있기 때문에, 문서를 그대로 넣지 않고 요약하여 질문과 함께 요청을 보냅니다.
그렇다면 RAG 방식으로 모든 질문에 대해 답변할 수 있을까요?
만약, 문서에 테이블이 있는 경우에는 어떻게 RAG 방식으로 프롬프트에 정보를 주입해야 할까요?
예를 들어, 아래 문서를 보고 ‘2022년 정부 효율성 순위는 몇위야?’라는 질문을 하고 싶습니다.
해당 질문에 대해 답변하기 위해서는 하단의 3년간 6대 지표별 순위 추이 테이블 정보를 사용해야 합니다.
2. Simple Table
테이블 정보를 다루기 위해서는 어떻게 해야 할까요?
먼저, 테이블을 다루려면 아래 기술들이 필요합니다.
- Table Detection : 문서에서 테이블을 찾을 수 없다면 시작조차 할 수 없습니다.
- Table Recognition : 테이블을 찾았다 하더라도 행과 열을 잘 못 복원하면 프롬프트에 잘못된 정보를 입력하게 됩니다.
- Header Detection : 테이블의 헤더 부분을 찾아야, 헤더와 셀 간의 관계를 잘 파악할 수 있습니다.
위의 문서에 Table Detection을 적용하면 아래 같이 테이블을 찾을 수 있습니다.
테이블을 찾은 후, Table Recognition을 적용해 테이블의 셀 정보를 복원합니다.
연도 = (0, 0)
여론과 책무성 (0, 1)
정치적 안전성 (0, 2)
….
37(209) = (4, 4)
30(209) = (4, 5)
59(209) = (4, 6)
복원된 셀 정보를 활용해 마크다운으로 변환한 후, 프롬프트에 입력해 정보를 주입하면 테이블 정보를 프롬프트에 반영할 수 있습니다.
아래는 Alli Answer를 사용해 얻은 답변입니다.
‘2022년 정부 효율성 순위는 몇위야?’라는 질문에 대해 20위라는 답변을 정확하게 하고 있습니다.
아래의 이미지는 Alli에서 사용하는 실제 프롬프트의 일부 내용입니다.
테이블을 마크다운으로 변환 후, 프롬프트에 넣어 답변을 얻습니다.
3. Complex Table
그렇다면, 위와 같이 테이블을 마크다운으로 변환하면 모든 테이블이 포함된 문서들에 대해 대응할 수 있을까요?
고객사의 테이블을 다루다 보면 셀 병합, 테이블 헤더가 여러 개인 경우 등 복잡한 형태의 테이블이 많습니다.
예를 들어, 사용자가 아래의 식단표를 보고 '4주차 금요일 중식메뉴 알려줘'라는 질문을 했습니다.
앞에서 했던 대로 테이블을 마크다운으로 변환하여 프롬프트에 넣고 질문을 하면 답변을 얻을 수 있을까요?
위의 식단표를 마크다운으로 변환하면 아래 이미지처럼 변환시킬 수 있습니다.
마크다운으로 변환했을 때의 문제점은 2가지입니다.
- 표가 크면 프롬프트의 최대 길이를 초과할 수 있다는 점입니다.
- 위의 표 같은 경우에는 테이블의 헤더가 중간마다 섞여 있어 인식이 어렵다는 점입니다.
4주차 금요일 중식에 대한 질문을 했는데, 2주차 금요일 중식에 대한 답변을 생성하고 있네요. (4주차 금요일 중식은 콩나물오징어비빔밥, 두부팽이해장국, 스모크햄구이, 채소계란찜입니다.)
이런 복잡한 테이블을 해결하기 위해서 올거나이즈에서는 테이블을 자연어로 변환하는 작업을 파이프라인에 추가했습니다.
복잡한 테이블을 자연어로 변환하면 위에서 언급한 문제점 2가지를 해결할 수 있습니다.
1. 자연어 형태이기 때문에 일부분만 가져오거나 혹은 요약해서 프롬프트의 길이를 조절할 수 있습니다.
2. 중간 중간에 헤더가 섞여 있어도 헤더를 반영해서 자연어로 변환하기 때문에 좋은 퀄리티의 답변을 얻을 수 있습니다.
아래는 Alli answer를 이용해 얻은 답변입니다.
‘4주차 금요일 중식메뉴 알려줘’라는 질문에 대한 답변으로 ‘4주차 금요일 중식 메뉴는 콩나물오징어비빔밥, 두부팽이장국, 스모크햄구이, 채소계란찜, 배추김치/아이스크림/쌈채소입니다. [1]’을 생성했습니다.
프롬프트에는 아래와 같이 테이블을 자연어로 변환한 정보가 입력되고 있습니다.
4. 결론
확실히 RAG 방식은 기존 GPT의 한계를 극복해 좋은 답변을 얻는 효과가 있습니다.
하지만, RAG 방식을 적용하기 위해서는 여러 기술적인 문제들이 존재합니다.
위에서 언급했던 테이블 또한 하나의 문제이며 그 외에도 다양한 타입의 문서 파싱, 여러 페이지 중 질문과 관련 있는 페이지를 찾는 retrieval 이슈 등 많은 문제가 있습니다.
올거나이즈에서는 이렇게 최대한 실제 고객이 사용하는 문서를 처리하기 위한 기술을 발전시키고 있습니다.
올거나이즈의 Alli에 사내 문서를 업로드해 자사만의 맞춤형 질문 답변 봇을 만들어 보는 건 어떨까요?
작성자: 올거나이즈 AI 엔지니어 이정훈
편집자: 올거나이즈 마케터 송혜원