김정래
RAG를 활용한 AI 챗봇을 계획하신다면 알아두면 좋은 정보
안녕하세요.
디스콰이엇 덕분에 최근 RAG를 활용한 챗봇 개발 문의가 많이 들어와, 열심히 RAG 기반 AI챗봇을 만들고 있습니다.
해외 대학교의 TA 봇을 시작으로, 제품 검색 AI 챗봇, 법무법인 사례 검색 AI 챗봇에 이르기까지 다양한 분야의 AI 챗봇을 개발하고 있습니다.
최근 RAG AI 챗봇에 대한 관심이 뜨거워지고 있음을 체감하고 있습니다.
미팅을 나가면 많은 분들께서 이미 RAG에 대해 상당한 지식을 갖추고 오셔서, 흥미로운 제안들을 해주시곤 합니다.
이에 RAG를 활용한 챗봇 개발이나 도입을 고려하시는 분들께 도움이 되고자 이 글을 작성합니다.
1. gpt vs claude vs gemini vs 로컬모델
1) 챗봇을 도입할 때 가장 많이 여쭤보시는 부분이 로컬모델 활용입니다.
이는 주로 보안 및 데이터 유출에 대한 우려 때문인데요, 하지만
- gpt, claude, gemini api 문서를 보면, api에 사용된 input 및 output은 학습에 사용하지 않는다고 명시되어 있습니다. 또한 법적으로 요구되지 않는한 데이터를 30일 이후에 삭제합니다.(https://openai.com/enterprise-privacy/)
- 로컬모델에서 가장 많이 언급되는 llama 3.1 모델 중 그나마 쓸만한 70B 모델만 해도 학습 및 추론에 비싼 하드웨어가 필요합니다. 그리고 성능도 상대적으로 많이 떨어집니다. 가장 큰 문제는 모델 업데이트가 빈번해서 지속적인 관리가 필요합니다. 참고로 llama2 공개가 23년7월, llama3 공개가 24년4월, llama3.1 공개가 24년7월이었습니다.
그래서 법적으로 데이터 관리에 힘써야 하는 일부 기업이 아닌 이상 gpt, claude, gemini 중 하나를 골라 저렴하고 편하게 쓰는게 좋습니다.
2) gpt vs claude vs gemini 중 그럼 무엇을 추천하냐
[gemini]
- gemini의 가장 큰 문제는 저작권 및 성윤리 뭐 그런 이슈로 답을 종종 안한다는 겁니다. 심지어 어린이용 챗봇을 만들었을 때, 어린이가 "똥!"하고 대답하면 챗봇이 바보가 됩니다. 그래서 챗봇으로 쓰기 어렵습니다.
[claude vs gpt]
- gpt와 cladue는 답변 성능이 거의 비슷합니다. 어떤 부분에선 gpt가 좋고 어떤 부분에서 claude가 앞섭니다. 심지어 가격도 비슷합니다. 참고로 gpt-4o가 10월 2주차부터 저렴한 (gpt-4o-2024-08-06)api를 도입할 예정입니다.
- 다만 대량의 데이터 처리 시, gpt의 답변 속도가 약간이나마 빨라서, 저희는 주로 gpt를 사용해 챗봇을 만들었습니다.
2. 일반인 상대 챗봇을 만들 때에는 Vector search + GraphDB를 같이 활용하는 GraphRAG로 설계하는 게 좋습니다.
1) Vector search
Vector search는 비슷한 뜻을 가진 단어들은 벡터 공간에 저장해서 검색하는 방법입니다.
예를 들어 아래 이미지처럼 king, man, woman이 비슷하니 뭉쳐있고, apple banana, orange가 비슷하니 뭉쳐 있는 것처럼 비슷한 뜻을 가진 단어들을 묶어서 검색하는 방법입니다.
[이미지 참조 : causewriter.ai]
하지만 이 방식에도 한계가 있습니다. 아래 예시처럼, 한글 + 전문적 데이터를 이용하는 챗봇은 일반인이 사용하는 단어를 이해하지 못하는 경우가 종종 발생합니다. (오한과 관련 없는 약이 추천됩니다.)
이러한 문제를 해결하기 위해 gpt를 활용하여 GraphDB 검색용 쿼리를 생성하여 검색하는 방법이 필요합니다.
이 방식을 사용하면 아래 이미지처럼 gpt가 GraphDB 검색용 쿼리를 생성해 적합한 제품을 추천해주는 것을 볼 수 있습니다.
2) 그렇다고 단순히 GraphDB만 사용하면, 또 다른 문제가 발생할 수 있어 Vector search도 함께 사용해야 합니다.
예를 들어, 사용자가 "ice아메리카노 주세요"라고 요청했을 때, GraphDB에서는 "아이스 아메리카노"로 정확히 매칭되는 결과를 찾지 못할 수 있습니다. 이러한 경우에 비슷한 의미를 찾아주는 Vector search가 유용합니다.
다행히도 Neo4j와 같은 GraphDB 솔루션에서는 Vector search 기능도 함께 제공하고 있어, 두 기술을 결합하여 사용하는 것이 효과적입니다. 이렇게 함으로써 정확한 키워드 매칭과 의미적 유사성을 모두 고려한 검색이 가능해집니다.
이러한 방식을 통해 일반 사용자의 다양한 표현과 전문 용어 사이의 간극을 더욱 효과적으로 메울 수 있습니다.
3. gpt는 최대한 쪼개서 사용해야 합니다.
gpt가 정말 우수하지만, 아직 완벽하지는 않습니다. 특히 RAG처럼 입력값이 많은 경우 gpt의 답변이 기대에 미치지 못할 때가 있습니다.
아래는 RAG 챗봇의 잘못된 답변 예시입니다. 답변에서 알 수 있듯이 관련 없는 사례들을 가져와 억지로 대답 한 것을 볼 수 있습니다. 기대했던 답변은, "관련된 사례가 없습니다. 당사의 카카오톡 상담을 통해 연락주시면 상담을 제공해드릴 수 있습니다." 같은 것이었지만, GPT의 특성상 어떻게든 답변을 만들어내려고 하여 위와 같은 부적절한 답변이 나왔습니다.
위 사례들은 **** 사례로, 귀하의 경우와 직접적으로 일치하지 않을 수 있으나, **** 와 관련한 자문을 제공한 사례입니다. 이런 사례들을 참고하여 법률적 자문을 받는 것이 도움이 될 수 있습니다.
이런 문제를 해결하기 위해서는 프롬프트 하나에 여러 조건을 때려넣는 것이 아닌, 기능별로 쪼개서 gpt를 사용하면 됩니다.
1) 추출한 데이터가 유저 질문과 관련 있는지 체크하는 gpt
2) 관련이 있으면 답변하는 gpt
3) 관련이 없으면 카카오톡을 통해 상담을 요청하도록 유도하는 gpt
이렇게 기능을 분리하여 GPT를 사용하면 더 정확하고 적절한 답변을 제공하는 것을 보실 수 있습니다.
4. 이용자를 잘 아는 내가 알려줘야 내 마음에 드는 챗봇이 나옵니다.
가장 중요한 부분입니다. 막상 챗봇은 만들고 RAG 성능 평가에서 높은 점수를 받더라도 점수와 별개로 답변이 아쉬운 경우가 많습니다. 이런 식으로 말하는 거보다 요런 식으로 말해주면 좋겠는데 하는 생각이 듭니다.
왜냐하면 챗봇이 아직 고객상담 뉴비이기 때문입니다. 그래서 경험이 많은 내가 어떻게 답변해야 하는지 가이드를 제공해줘야 합니다.
간단하게 분류 / 질문 유형 / 질문 예시 / 답변 예시 / 답변 순서 가이드라인 형태로 표를 만든 후 테스트를 하면 됩니다.
막상 처음에는 답변 예시나 가이드라인을 적는 것이 어색할 수 있습니다. 뭘 넣어야 하지, 어떤 식으로 답변하는게 좋은거지? 하는 생각이 드는데요.
이럴 땐, 아래 순서에 따라 만드시면 됩니다.
1) 일단 질문 예시만 많이 만들어 챗봇 테스트를 진행합니다.
2) 각 질문에 대한 답변이 마음에 들면 뭐가 마음에 드는지 마음에 안들면 뭐가 마음에 안드는지 한번 적어봅니다.
3) 마음에 안드는 부분을 위주로 챗봇을 고친 후에 다시 테스트합니다.
4) 그러면 아 이 부분이 이래서 좋았던 거고, 저 부분은 이래서 안 좋았던 거구나 하고 파악할 수 있습니다.
위 과정을 여러 번 반복하면 효과적인 가이드라인을 만드실 수 있습니다. 이 가이드라인이 꼭꼭꼭 있어야 챗봇의 답변을 더욱 정교하고 만족스럽게 만들 수 있습니다.
RAG 기반 AI 챗봇에 대해 더 많은 정보들을 쓰고 싶은데, 막상 생각나는게 크게 4가지네요. 뭔가 여러 이미지들을 넣고 싶었는데, 막상 적합한 이미지들이 없어 장황한 줄 글이 되어 버렸네요 ㅠㅠ.
다음번에 기회가 된다면 이미지를 가득가득 눌러 담아 저희가 만든 챗봇들을 쭈욱 정리해보겠습니다.
RAG에 대해 궁금한 점이 있으시면 언제든 편하게 물어봐주세요.