--- base_model: unsloth/gemma-2-9b-it-bnb-4bit tags: - text-generation-inference - transformers - gemma2 - trl license: creativeml-openrail-m language: - ko --- # QCR + GEN for Conversational RAG Chatbot ## 개요 이 모델은 **QCR**(Query Context Rewriter)과 **GEN**(Generator) 기능을 동시에 수행하는 하나의 LoRA 어댑터 모델입니다. 검색 기반 챗봇이나 RAG(Retrieval-Augmented Generation) 시스템에서 활용할 수 있도록 설계되었습니다. - **QCR 기능**: 사용자의 입력을 분석하여 검색에 필요한 쿼리를 생성하거나, 필요하지 않을 경우 빈 문자열을 반환합니다. - **GEN 기능**: 검색된 문서 청크(또는 컨텍스트)를 활용하여 자연스러운 답변을 생성합니다. 이 모델은 4bit 양자화된 버전과 일반 버전 모두 지원하므로, 원하는 환경에서 사용할 수 있습니다. ## 데이터셋 및 학습 특징 - **10개 주요 토픽**(가족/주거, 스포츠, 쇼핑, 미용/건강 등)의 대화 데이터를 증강하여 제작. - **약 18,000개의 QCR + GEN 샘플** 포함. - **QCR 데이터** - 일반 대화(인사, 농담 등)는 **빈 문자열**(`""`)을 반환하여 검색을 생략하고 즉시 답변 가능. - **GEN 데이터** - 검색된 문서 청크(최대 5개, 각 512 토큰 이하)를 활용하여 답변 생성. - **6가지 다양한 데이터 구성**: 1. 관련 정보가 있는 답변 2. 관련 정보가 없는 답변 3. 관련성이 혼재된 상황 4. 검색 청크가 전혀 없는 경우 등 이러한 데이터 구성을 통해 **더 자연스러운 대화**를 구현할 수 있도록 학습되었습니다. ## 모델 사용 방식 1. **QCR을 통해 검색 쿼리 생성** → 검색 엔진을 통해 문서 검색 → **GEN으로 답변 생성** 2. 불필요한 검색 방지(QCR이 빈 문자열 반환) → 인사, 잡담 등은 직접 응답 가능. 3. 4bit 양자화 모델 사용 가능 → 메모리 절감 및 고속 추론 가능. ## 프롬프트 템플릿 ### Query Context Rewriter (QCR) ``` # Query Rewriter ### Instruction: 다음은 대화 기록(Context)와 사용자의 질문(Input)입니다. 사용자의 질문에 답을 제공하기 위해 필요한 단일 문자열 검색 쿼리를 생성하세요. 검색이 필요하지 않거나 쿼리가 불필요한 경우(인사, 잡담 등)에는 빈 문자열을 반환하세요. 최종 출력 형식은 {'search': '<검색 쿼리>'}입니다. ### Conversation: {대화 맥락} ### Input: {사용자 질문} ### Response: {'search': '{생성된 검색 쿼리 또는 빈 문자열}'} ``` ### Generator (GEN) ``` # Generator ### Instruction: 당신은 외부검색을 이용하여 사용자에게 도움을 주는 인공지능 조수입니다. - Context는 외부검색을 통해 반환된 사용자 요청과 관련된 정보들입니다. - Context를 활용할 때 문장 끝에 사용한 문서 조각의 [Index]를 붙이고 자연스러운 답변을 작성하세요. (e.g. [1]) - Context의 정보가 사용자 요청과 관련이 없거나 도움이 안될 수 있습니다. 관련있는 정보만 활용하고, 없는 정보를 절대 지어내지 마세요. - 되도록이면 일반 지식으로 답변하지 말고, 최대한 Context를 통해 답변을 하려고 하세요. - Context에 없을 경우에는 이 점을 언급하며 사죄하고 다른 주제나 질문을 추천해주세요. - 사용자 요청에 알맞는 자연스러운 대화를 하세요. - 항상 존댓말로 답변하세요. ### Conversation: {대화 맥락} ### Context: {검색된 문서 청크} ### Input: {사용자 질문} ### Response: {모델이 생성한 응답} ``` # 예시 대화 샘플 ## 1. 검색이 필요 없는 경우 ### 예제 1: 인사 및 일반적인 대화 ``` User> 안녕? 넌 누구니? [QCR 단계] 검색 쿼리 생성... {'search': ''} → 검색 불필요로 판단. [답변 생성 중]... Assistant> 안녕하세요! 저는 외부검색을 통해 다양한 정보를 활용하여 사용자님께 도움을 주는 인공지능 조수입니다. 어떤 주제나 질문이든 편하게 말씀해 주세요. 오늘 하루가 어떠셨나요? ``` ## 2. 검색이 필요한 경우 ### 예제 2: 영화 추천 요청 ``` User> 넷플릭스에서 볼만한 영화 추천해줘. [QCR 단계] 검색 쿼리 생성... {'search': '넷플릭스 추천 영화 목록'} → 검색 필요. [검색된 문서 활용 후 답변 생성] Assistant> 넷플릭스에서 인기 있는 영화 목록은 다음과 같습니다. 1. '블랙 미러: 밴더스내치' 2. '돈 룩 업' 3. '익스트랙션' 더 궁금한 점이 있으시면 말씀해주세요! ``` ### 예제 3: 특정 정보 요청 (스포츠 규칙) ``` User> 복싱의 룰이 어떻게 되나요? [QCR 단계] 검색 쿼리 생성... {'search': '복싱 룰 설명'} → 검색 필요. [검색된 문서 활용 후 답변 생성] Assistant> 복싱 경기의 기본 룰은 다음과 같습니다. - 각 라운드는 3분 진행되며, 1분의 휴식이 주어집니다. - 글러브 착용은 필수이며, 다운된 선수는 10초 안에 일어나야 합니다. - 주요 타격 기술로는 스트레이트, 훅, 어퍼컷 등이 있습니다. 더 궁금한 사항이 있으시면 질문해주세요! ``` ## 3. 과거 대화 기반 질문 ### 예제 4: 문맥을 유지한 질문 ``` User> 넷플릭스 영화 추천해줘. [QCR 단계] 검색 쿼리 생성... {'search': '넷플릭스 추천 영화 목록'} → 검색 필요. [검색된 문서 활용 후 답변 생성] Assistant> 넷플릭스에서 인기 있는 영화 목록은 다음과 같습니다. 1. '블랙 미러: 밴더스내치' 2. '돈 룩 업' 3. '익스트랙션' User> 오징어 게임은 어때? [QCR 단계] 검색 쿼리 생성... {'search': '오징어 게임 정보'} → 검색 필요. [검색된 문서 활용 후 답변 생성] Assistant> '오징어 게임'은 넷플릭스에서 방영된 인기 서바이벌 드라마로, 456억 원의 상금을 건 생존 게임을 다룹니다. 게임에는 '무궁화꽃이 피었습니다', '달고나 뽑기' 등의 한국 전통 놀이가 포함되어 있습니다. 시즌 2 제작이 확정되었으며, 2024년 방영 예정입니다. 더 자세한 정보가 필요하시면 알려주세요! ``` ## 4. 갑작스러운 토픽 변경 ### 예제 5: 검색 중간에 주제 전환 ``` User> 넷플릭스에서 볼만한 영화 추천해줘. [QCR 단계] 검색 쿼리 생성... {'search': '넷플릭스 추천 영화 목록'} → 검색 필요. User> 근데 레슬링 규칙은 어떻게 돼? [QCR 단계] 검색 쿼리 생성... {'search': '레슬링 규칙 설명'} → 검색 필요. [검색된 문서 활용 후 답변 생성] Assistant> 레슬링은 던지기, 쓰러뜨리기, 꺾기 등의 기술을 이용하여 상대를 제압하는 스포츠입니다. 경기 방식은 올림픽 스타일인 '그레코로만형'과 '자유형'으로 나뉩니다. 특정 규칙이 궁금하시다면 추가로 질문해주세요! ``` 이러한 예시들을 참고하여 검색 기반 모델을 효과적으로 활용할 수 있습니다. ## 테스트 노트북 (Colab) 간단히 코드를 실행해보려면 [test_run.ipynb](https://huggingface.co/Austin9/gemma-2-9b-it-Ko-RAG/blob/main/test_run.ipynb) 파일을 Google Colab에서 바로 열어보세요. - **런타임 유형**에서 GPU를 **T4**로 선택하세요. - 이후, **셀을 순서대로 실행**하며 필요한 라이브러리를 설치하고 모델 및 FAISS 인덱스를 로드합니다. - 완성된 RAG 기반 챗봇 예시 코드를 체험할 수 있습니다 ## 주의사항 - 검색 엔진과 함께 사용할 경우 **QCR을 먼저 실행하여 검색 쿼리를 생성**한 후, 검색된 문서 청크를 바탕으로 **GEN을 실행**해야 합니다. - 검색된 청크는 최대 **512 토큰** 길이이며, 학습 과정에서 **최대 5개의 청크**를 반영하였으므로 이에 맞춰 활용하는 것이 중요합니다. - QCR의 **프롬프트 형식을 반드시 지켜야** 검색 쿼리 생성이 올바르게 이루어집니다. - GEN의 답변에서는 검색된 문서 출처(Index)를 정확히 기재해야 하며, 관련성이 없으면 없는대로 안내해야 합니다. 이 모델을 통해 보다 **효율적인 검색 + 정확한 답변**을 제공하는 AI 시스템을 구축할 수 있습니다.