Project & Competiton/Upstage x Fastcampus

[프로젝트 7¹] Team GBE.SK 회고록

Visioneer 2024. 5. 11. 02:10

※ Anomaly Detection & Information Retrival 대회를 함께 진행

1. Abstract

    • Goal of the Competition
      • 과학 상식을 질문하는 시나리오를 가정하고 과학 상식 문서 4200여개를 미리 검색엔진에 색인해 둡니다.만일 과학 상식 이외의 질문이라면 검색엔진을 활용할 필요 없이 적절한 답을 바로 생성합니다. 대화 메시지 또는 질문이 들어오면 과학 상식에 대한 질문 의도인지 그렇지 않은 지 판단 후에 과학 상식 질문이라면 검색엔진으로부터 적합한 문서들을 추출하고 이를 기반으로 답변을 생성합니다.본 프로젝트는 모델링에 중점을 둔 대회가 아니라 RAG(Retrieval Augmented Generation) 시스템의 개발에 집중하고 있습니다. 이 대회는 여러 모델과 다양한 기법, 그리고 앙상블을 활용하여 모델의 성능을 향상시키는 일반적인 모델링 대회와는 다릅니다. 대신에 검색 엔진이 올바른 문서를 색인했는지, 그리고 생성된 답변이 적절한지 직접 확인하는 것이 중요한 대회입니다.

 

  • Description of the work
    • 데이터를 파악 후 OpenAI의 API를 활용하여 데이터 증강.
    • 프롬프트 엔지니어링을 통해 RAG 성능 고도화.
    • 다양한 임베딩 모델 실험 및 임베딩 모델 파인튜닝을 통한 검색 엔진 모델의 고도화.
    • Sparse Retrieval 과 Dense Retrieval을 혼합하여 성능 고도화. 
    • 검증 데이터셋을 만들어서 미리 스코어를 계산하며 성능 고도화.

  • Team notion
 

Scientific Knowledge Question Answering | 과학 지식 질의 응답 시스템 구축 | Notion

Team:

sixth-drum-9ac.notion.site

 

 

[패스트캠퍼스] Upstage AI Lab 1기 IR Final.pptx.pptx

효율적인 RAG 구축 공략 : 과학지식 편 (The Goal of Building an Efficient RAG: Scientific Knowledge) www.fastcampus.co.kr Copyright ⓒ FAST CAMPUS Corp. All Rights Reserved. 무단전재 및 재배포 금지 GBE-SK 가상민, 김다운, 김도

docs.google.com

 

 

GitHub - UpstageAILab/upstage-ai-final-ir1: upstage-ai-final-ir1 created by GitHub Classroom

upstage-ai-final-ir1 created by GitHub Classroom. Contribute to UpstageAILab/upstage-ai-final-ir1 development by creating an account on GitHub.

github.com


2. Process : Competition Model

  • EDA
    • eval.jsonl
      총 220개의 메세지. msg(메세지)는 LLM이 받는 입력 포맷으로 구성.
      검색 엔진 성능 뿐만 아니라 LLM을 활용한 질의 의도 분석standalone query 추출 성능도 평가해야 하기 때문에 20개의 멀티턴 대화20개의 일반 대화 메세지를 포함.

      • 멀티턴 대화
        {"eval_id": 243, "msg": [
        	{"role": "user", "content": "사람이나 물체가 지구 위에서 땅속으로 꺼지거나 바깥으로 튕겨나가지 않고 가만히 서 있을 수 있잖아?"}, 
        	{"role": "assistant", "content": "네 맞습니다."}, 
        	{"role": "user", "content": "그 이유를 힘의 원리로 설명해줘."}]
        }​
      • 일반 대화 메세지
        {"eval_id": 32, "msg": [{"role": "user", "content": "오늘 너무 즐거웠다!"}]}​
      • 멀티턴 대화이면서 일반 대화인 메세지는 없음.

    • documents.jsonl
      과학 지식 정보를 담고 있는 순수 색인 대상 문서 4200여개 
      'src': 출처, 'content': 실제 RAG에서 레퍼런스로 참고할 지식 정보

      자연 과학 뿐만 아니라, 사회/인문/우주/기술/코딩 등 다양한 분야 의 지식에 관한 문서를 포함
      -> 자연 과학에 국한되지 않은 다양한 주제의 지식 관련 메세지에 대해 검색을 수행해야 함.

  • 프롬프트 엔지니어링
    • 프롬프트의 역할
      질의 의도 분석 & 일반 대화 메세지 대응

    • 목표 
      1. 지식과 관련된 메세지에 대해 search 함수를 호출하고 적절한 standalone query를 추출해야 함.
      2. 지식과 관련 없는 일반 대화에 대해 search 함수를 호출하지 않고 적절한 대답을 생성해야 함.

      1. persona_function_calling
        # RAG 구현에 필요한 질의 분석 및 검색 이외의 일반 질의 대응을 위한 LLM 프롬프트
        persona_function_calling = """
        ## Role: 과학 상식 전문가
        
        ## Instruction
        - 사용자가 대화를 통해 과학 지식에 관한 주제로 질문하면 search api를 호출할 수 있어야 한다.
        - 과학 상식과 관련되지 않은 나머지 대화 메시지에는 적절한 대답을 생성한다.
        """


        • 문제 정의
          1. 지식 관련 메세지에 대해 search 함수가 호출되지 않아 standalone query가 추출되지 않음.
            # eval.jsonl
            {"eval_id": 98, "msg": [
            	{"role": "user", "content": "은하들이 점점 멀어지고 있다던데 맞아?"}, 
            	{"role": "assistant", "content": "네 맞아요."}, 
            	{"role": "user", "content": "어떤 물리적인 현상을 보고 그걸 알게 되었어?"}
            ]}
            
            # sample_submission.csv
            {"eval_id": 98, "standalone_query": "", "topk": [], ...}​
          2. 일반 대화 메세지임에도 불구하고 search 함수를 호출하고 standalone query가 추출됨.
            # eval.jsonl
            {"eval_id": 276, "msg": [{"role": "user", "content": "요새 너무 힘들다."}]}
            
            # sample_submission.csv
            {"eval_id": 276, "standalone_query": "과학 상식", "topk": ["a089a668-da0e-4abc-bd7f-5762d55e1d20", "a7058a3b-285f-4466-a267-f864796ee77a", "e6777a84-144b-47db-b69c-d2125f1574c7"], ...}​
        • 수정 후 최종 프롬프트
          • Instruction 수정
            1. “과학 지식에 관한” → “지식에 관해” : 다양한 주제의 지식 관련 질문을 모두 처리하도록
            2. “반드시” : 지식 관련 메시지임에도 search 함수가 호출되지 않는 문제 해결
            3. “함수 호출 없이” : search 함수 호출하지 않아야 하는 메시지(일반 대화 메시지)임에도 함수 호출되는 문제 해결
            persona_function_calling = """
            ## Role: 과학 상식 전문가
            
            ## Instruction
            - 사용자가 지식에 관해 질문하는 경우에는 반드시 search 함수를 호출한다.
            - 나머지 메시지에는 함수 호출 없이 적절한 대답을 생성한다.
            """​
      2. function calling에 사용할 함수의 standalone_query 정의
        # Function calling에 사용할 함수 정의
        tools = [
            {
                "type": "function",
                "function": {
                    "name": "search",
                    "description": "search relevant documents",
                    "parameters": {
                        "properties": {
                            "standalone_query": {
                                "type": "string",
                                "description": "Final query suitable for use in search from the user messages history"
                            }
                        },
                        "required": ["standalone_query"],
                        "type": "object"
                    }
                }
            },
        ]

        • 문제 정의
          메시지를 과도하게 요약하여 중요한 키워드를 포함하지 않음
          # eval.jsonl
          {"eval_id": 21, "msg": [
          	{"role": "user", "content": "다양한 책을 catalog화 하는 코드에서 class 정의 방법 알려줘."}
          ]}
          
          # sample_submission.csv
          { 
          	"eval_id": 21, 
          	"standalone_query": "class 정의 방법", 
          	"topk": ["c0645487-4d27-4153-8bd6-c6abc823b72e", "01b3d119-c0e1-4dcc-b5f4-9f57cd681f43", "7150c749-dff2-4bd5-90ff-ff1e1cda468b"], 
          	"answer": "클래스를 정의하는 방법은 프로그래밍 언어에 따라 다를 수 있지만... ",
          	"references": [
          		{"score": 0.0022734697, "content": "객체 지향 언어는 모든 엔티티가 객체인 언어입니다. 이 언어에서는 두 가지 관계가 발생합니다. 첫 번째는 객체와 해당 객체가 속한 클래스 사이의 관계인 인스턴스 관계입니다..."},
          		{"score": 0.0021750622, "content": "알파벳 순서를 고려할 때, 모든 대문자가 모든 소문자 앞에 온다는 것은 자바 프로그래밍 언어에서의 문자열 비교에 대한 규칙입니다. 이 규칙을 기반으로 한 선언인 String strA..."}, 
          		{"score": 0.0020844745, "content": "프로그래머는 도서관의 모든 책을 카탈로그화하는 프로그램을 설계하고 있습니다. 이를 위해 각 책의 특징을 저장하는 Book 클래스를 계획하고 있습니다. Book 클래스는 저자, 제목..."}
          	]
          }​
        • 수정 후 최종 프롬프트
        • 최대한 많은 키워드를 포함하도록 수정
          싱글턴 메세지의 경우, user의 메세지를 그대로 쿼리로 추출하도록 함.

          기존 : "Final query suitable for use in search from the user messages history"
          수정 : "User's question. Full message if the user message is single-turn."
          "parameters": {
          		"properties": {
          				"standalone_query": {
          						"type": "string",
                      "description": "User's question in Korean. Full message if the user message is single-turn."
          				}
              },
              "required": ["standalone_query"],
              "type": "object"
          }​

          의도한 대로 더 많은 키워드를 포함함.
          { "eval_id": 21, "standalone_query": "다양한 책을 catalog화 하는 코드에서 class 정의 방법", "topk": ["7150c749-dff2-4bd5-90ff-ff1e1cda468b", "01b3d119-c0e1-4dcc-b5f4-9f57cd681f43", "cd9feae5-13b2-4614-8524-a69814c6d49c"], }

  • 다양한 임베딩 모델 실험
    • Baseline model
      snunlp/KR-SBERT-V40K-klueNLI-augSTS

    • Baseline 모델보다 높은 성능 (BERT 기반)
      hunkim/sentence-transformer-klue
      jhgan/ko-sbert-sts
      bongsoo/moco-sentencedistilbertV2.1

    • SBERT보다 의미론적 유사도 예측 성능이 높은 모델 (RoBERTa 기)
      ddobokki/klue-roberta-base-nli-sts
      jhgan/ko-sroberta-multitask - 가장 높은 성능
      jhgan/ko-sroberta-sts

      test_query = "지구가 생겨난지 얼마나 오래 되었는지 확인하는 방법은?"
      
      # jhgan/ko-sbert-sts
      score: 0.0039065317 source: 행성년의 원인을 모델링하기 위해 과학자들은 행성이 태양으로부터 떨어져 있는 거리를 사용합니다. 이 거리는 행성이 태양 주위를 돌면서 받는 태양의 복사 에너지의 양을 결정합니다. 행성이 태양으로부터 멀어질수록 태양의 복사 에너지는 감소하게 되고, 이는 행성의 온도와 기후에 영향을 미칩니다. 따라서, 행성년의 원인을 연구하는 과학자들은 이 거리를 중요한 변수로 고려하여 모델링을 진행합니다. 이를 통해 우리는 행성년의 원인과 행성의 환경 사이의 관계를 이해할 수 있습니다.
      score: 0.0037860414 source: 우리 태양계의 기원에 대한 이론은 수년 동안 많은 천문학자들의 연구와 논의를 거쳐 왔습니다. 오랜 기간 동안, 우리 태양계가 천천히 응축되는 먼지와 가스의 구름에서 형성되었다는 가설이 주류였습니다. 그러나 최근의 연구 결과는 이 가설을 수정할 필요가 있음을 시사하고 있습니다.새로운 증거는 우리 태양계가 성운에서 단명하는 거대한 별들이 폭발할 때 형성되었을 수 있다는 가능성을 제시합니다. 이는 기존의 가설과는 다른 접근 방식이며, 우리 태양계의 기원에 대한 새로운 시각을 제시합니다...
      score: 0.0037348438 source: 수성은 태양계에서 가장 작은 행성 중 하나입니다. 이 작은 행성은 영구적인 대기 부재를 가지고 있지 않습니다. 그렇다면, 수성의 영구적인 대기 부재를 설명하지 못하는 메커니즘은 무엇일까요? 그것은 화산활동에 의한 가열입니다. 수성의 표면에는 많은 화산이 있으며, 이러한 화산들은 지속적으로 분출되는 열을 생성합니다. 이 열은 수성의 대기를 형성하는 데 충분하지 않습니다. 따라서, 수성은 영구적인 대기 부재를 가지고 있지 않습니다.
       
      # jhgan/ko-sroberta-multitask
      score: 0.013622982 source: 지구의 나이를 알아내는 방법은 바위와 운석의 방사성 연대 측정을 통해 알 수 있습니다. 바위와 운석은 지구의 역사를 담고 있는 증거들이며, 그들은 오랜 세월 동안 방사성 동위원소를 분해하여 안정 동위원소로 변화합니다. 이러한 방사성 붕괴 과정은 시간이 지남에 따라 예측 가능한 속도로 진행되므로, 바위와 운석의 방사성 연대 측정을 통해 그들의 나이를 알아낼 수 있습니다. 이러한 연구는 지구의 진화와 지질학적 역사를 이해하는 데 매우 중요한 역할을 합니다. 바위와 운석의 방사성 연대 측정은 과학적인 방법으로 수행되며, 다양한 기술과 기기를 사용하여 정확한 결과를 얻을 수 있습니다. 이러한 연구는 우리가 현재의 지구의 상태를 이해하고 미래를 예측하는 데 도움을 줄 수 있습니다.
      score: 0.011032162 source: 태양계는 대략 46억 년 전에 형성되었습니다. 이는 운석 연구를 통해 밝혀진 사실입니다. 태양계의 나이가 이렇게 오래된 이유는 태양계의 형성 단계에서 많은 운석들이 형성되었기 때문입니다. 이러한 운석들은 우리에게 태양계의 역사와 진화에 대한 중요한 정보를 제공합니다. 태양계의 나이를 알아내는 것은 우주 과학 연구에 있어서 매우 중요한 역할을 합니다. 이를 통해 우리는 태양계의 형성과 진화에 대한 이해를 더욱 깊이 있게 할 수 있습니다.
      score: 0.010985054 source: 라이엘과 다윈의 시대 이전에는 지구는 수천 년 된 것이며, 인구는 변하지 않는다는 개념이 지배적이었습니다. 이 시대에는 인류가 살아가는 동안 지구의 형태와 인구의 수는 변하지 않는다고 믿어졌습니다. 이 개념은 고대 철학자들에 의해 주장되었으며, 그들은 지구가 고대부터 존재하며 인구는 일정하게 유지된다고 믿었습니다. 이러한 개념은 자연의 균형과 안정성을 강조하며, 인간의 힘과 영향력을 상대적으로 작게 보는 철학적인 시각을 반영하고 있습니다. 그러나 라이엘과 다윈의 시대 이후에는 지구의 역사와 인구의 변화에 대한 새로운 이해가 발전하였습니다.​
  • Sparse Retrieval 과 Dense Retrieval 혼합
    임베딩 모델을 사용한 dense vector 기반 검색보다 sparse vector 기반 검색 시 MAP 스코어가 항상 높음
    하지만 sparse retrieval보다 dense retrieval로 검색할 때 성능이 더 좋은 쿼리가 존재
    • 문서의 키워드가 그대로 쿼리에 포함되지 않은 경우
      test_query = "세균의 순기능" 
      
      # sparse retrieval
      score: 11.097561 source: 세균 세포에 영향을 미치는 항생제는 다양한 방식으로 작용한다. 항생제는 세균의 세포벽을 파괴하거나 세포막의 투과성을 증가시키는 역할을 한다. 또한, 항생제는 세균의 단백질 합성을 억제하거나 핵산의 합성을 방해하여 세포의 기능을 교란시킨다. 그러나, 역전사는 항생제의 작용 방식 중 예외적인 경우이다. 역전사는 세균의 유전자를 역전사하여 단백질 합성을 억제하는데, 이는 항생제의 효과를 무효화시킬 수 있다. 따라서, 세균 세포에 영향을 미치는 항생제는 다양한 방식으로 작용하지만, 역전사는 예외적인 경우로 알려져 있다.
      score: 9.509126 source: 바이러스 형질도입은 세균 진화에서 중요한 역할을 합니다. 이 과정은 바이러스가 한 세균 세포에서 다른 세균 세포로 세균 DNA를 운반하는 과정입니다. 바이러스는 세균에 감염되어 세균의 유전적 변이를 증가시킵니다. 이는 세균의 다양성을 증가시키고 새로운 특성을 얻을 수 있는 기회를 제공합니다. 세균은 이러한 유전적 변이를 통해 환경 변화에 대응하고 생존력을 향상시킬 수 있습니다. 따라서 바이러스 형질도입은 세균 진화에서 중요한 역할을 하며, 세균의 다양성과 적응력을 증가시키는데 기여합니다.
      score: 9.3766 source: 세균은 무성 생식을 하는 유기체입니다. 이는 세균이 단일 부모로부터 새롭게 생산되는 것을 의미합니다. 세균은 유전자를 상속받는데, 이는 단일 부모와 같은 특성을 가지게 됩니다. 세균은 유전자의 조합을 통해 다양한 특성을 가질 수 있으며, 이는 세균의 다양성과 적응력을 높여줍니다. 세균은 빠른 성장과 번식 능력으로 인해 환경에서 매우 중요한 역할을 합니다. 세균은 다양한 환경에서 생존할 수 있으며, 이는 세균의 유전적 다양성과 적응력에 기인합니다. 세균은 우리 주변에 많이 존재하며, 우리의 건강에도 영향을 미칩니다. 세균의 특성을 이해하고 관리하는 것은 우리의 건강과 생활에 매우 중요합니다.
      # dense retreival 
      score: 0.015227599 source: 세균은 다양한 방식으로 인체에 도움을 줄 수 있습니다. 대표적으로, 세균은 음식을 분해하는 데 도움을 줍니다. 세균은 소화 과정에서 음식물을 분해하여 영양소를 생성하고 흡수를 도와줍니다. 이를 통해 우리 몸은 필요한 영양소를 효과적으로 흡수할 수 있습니다. 따라서, 세균은 우리 인체와 환경에 많은 도움을 주는 중요한 존재입니다.
      score: 0.013073802 source: 생태계에서 죽은 식물과 동물을 재활용하는 데 책임이 가장 큰 것은 세균입니다. 세균은 생분해 작용을 통해 유기물을 분해하여 영양분을 생성하고, 이를 다른 생물들이 이용할 수 있도록 합니다. 세균은 생태계의 중요한 구성원으로서, 죽은 식물과 동물의 분해와 분해 과정에서 발생하는 영양분의 순환을 도와줍니다. 이러한 세균의 역할은 생태계의 균형을 유지하는 데 매우 중요합니다. 세균은 또한 생태계에서 다양한 생물들의 생태적 상호작용에도 영향을 미치며, 생태계의 안정성과 다양성을 유지하는 데에도 기여합니다. 따라서 세균은 생태계에서 죽은 식물과 동물을 재활용하는 데 가장 큰 책임을 지고 있습니다.
      score: 0.010716381 source: 세균은 무성 생식을 하는 유기체입니다. 이는 세균이 단일 부모로부터 새롭게 생산되는 것을 의미합니다. 세균은 유전자를 상속받는데, 이는 단일 부모와 같은 특성을 가지게 됩니다. 세균은 유전자의 조합을 통해 다양한 특성을 가질 수 있으며, 이는 세균의 다양성과 적응력을 높여줍니다. 세균은 빠른 성장과 번식 능력으로 인해 환경에서 매우 중요한 역할을 합니다. 세균은 다양한 환경에서 생존할 수 있으며, 이는 세균의 유전적 다양성과 적응력에 기인합니다. 세균은 우리 주변에 많이 존재하며, 우리의 건강에도 영향을 미칩니다. 세균의 특성을 이해하고 관리하는 것은 우리의 건강과 생활에 매우 중요합니다.​
    • 키워드가 그대로 포함되더라도 BM25 알고리즘에 따라 잘못된 문서에 점수가 높게 매겨지는 경우
      test_query = "건강한 입을 가지고 있는지 판단할 수 있는 방법에 대해 알려줘."  
      
      # sparse retrieval
      score: 15.83141 source: 입덧은 일반적으로 임신 초기 동안 문제가 됩니다. 임신 초기에는 여러 가지 이유로 입덧이 발생할 수 있습니다. 호르몬 변화로 인해 입안의 혈액 공급이 증가하고 침샘의 활동이 증가하기 때문에 입안이 민감해지고 침샘에서 분비되는 침의 양이 증가합니다. 이로 인해 입안이 산성으로 변하고 세균이 번식하기 쉬워지며, 이는 입덧의 주요 원인이 됩니다. 또한, 임신 초기에는 면역 체계가 약해지는 경향이 있어 입덧이 발생할 확률이 높아집니다. 따라서 임신 초기 동안 입덧에 대한 적절한 관리와 치료가 필요합니다. 입덧을 예방하기 위해서는 규칙적인 구강 위생 관리와 칫솔질, 치실 사용, 구강 청결을 유지하는 것이 중요합니다. 또한, 건강한 식습관과 충분한 수분 섭취도 입덧 예방에 도움이 됩니다. 만약 입덧이 발생한다면, 치과 의사와 상담하여 적절한 치료 방법을 받아야 합니다.
      score: 12.876699 source: 정상적이고 건강한 입을 가진 환자에게서, 하악치를 지탱하는 치조골을 덮고 있는 점막은 점막 잇몸 접합부 아래는 빨강색이고 위는 연한 핑크색이라고 예상된다. 이 점막은 치아와 치조골 사이에 위치하여 치아를 보호하고 지지하는 역할을 한다. 또한, 이 점막은 치아 주위의 조직과 연결되어 있어 치아의 안정성을 유지하고 치아와 주변 조직 간의 상호작용을 조절한다. 이러한 점막은 치아의 건강을 유지하는 데 중요한 역할을 한다. 따라서, 정상적인 입을 가진 환자에게서 이러한 점막의 색상과 형태는 건강한 상태를 나타내는 지표로 사용될 수 있다.
      score: 12.077877 source: 인간 노화를 연구하는 주요 이유 중 하나는 위의 모든 것 때문이다. 인간 노화는 인간의 생물학적, 심리적, 사회적 변화를 이해하고 예방하기 위해 연구되고 있다. 노화는 인간의 삶의 질을 저하시키고 질병의 발생률을 증가시키는 요인으로 알려져 있다. 따라서, 인간 노화를 연구함으로써 우리는 더 건강하고 행복한 노후를 보낼 수 있는 방법을 찾을 수 있을 것이다. 또한, 노화 연구는 인간의 수명을 연장시키는 방법을 발견하는 데에도 도움을 줄 수 있다. 인간의 수명은 과거 몇 십 년 동안 상당히 증가했지만, 아직도 노화에 대한 이해와 대처 방법에는 한계가 있다. 따라서, 인간 노화를 연구함으로써 우리는 더 긴 수명을 즐길 수 있는 방법을 발견할 수 있을 것이다. 인간 노화 연구는 또한 질병 예방과 치료에도 중요한 역할을 할 수 있다. 노화는 다양한 질병의 발생과 진행에 영향을 미치는 요인으로 알려져 있다. 따라서, 인간 노화를 연구함으로써 우리는 질병 예방과 치료에 대한 새로운 통찰력을 얻을 수 있을 것이다. 인간 노화 연구는 또한 사회적인 측면에서도 중요하다. 인구 고령화가 진행되면서, 노화에 대한 이해와 대처 방법은 사회 전반에 영향을 미치고 있다. 따라서, 인간 노화를 연구함으로써 우리는 사회적으로 더 건강하고 지속 가능한 노년을 만들 수 있을 것이다. 이러한 이유들로 인하여, 인간 노화를 연구하는 것은 매우 중요하다.
      # dense retreival 
      score: 0.010015365 source: 정상적이고 건강한 입을 가진 환자에게서, 하악치를 지탱하는 치조골을 덮고 있는 점막은 점막 잇몸 접합부 아래는 빨강색이고 위는 연한 핑크색이라고 예상된다. 이 점막은 치아와 치조골 사이에 위치하여 치아를 보호하고 지지하는 역할을 한다. 또한, 이 점막은 치아 주위의 조직과 연결되어 있어 치아의 안정성을 유지하고 치아와 주변 조직 간의 상호작용을 조절한다. 이러한 점막은 치아의 건강을 유지하는 데 중요한 역할을 한다. 따라서, 정상적인 입을 가진 환자에게서 이러한 점막의 색상과 형태는 건강한 상태를 나타내는 지표로 사용될 수 있다.
      score: 0.009150982 source: 환자 중 한 명의 오른쪽 하악 측면의 절치의 순측 치조점막에서 병변을 발견했습니다. 이에 따라 구강 병리 보고서를 작성하기 위해 생체검사를 하기로 결정했습니다. 생체검사를 위해 통증 없이 신경을 차단하기 위해 어떤 신경에 국소적 마취를 해야 하는지 알아보겠습니다. 생체검사를 위해 국소적 마취를 사용하는 것은 일반적인 절차입니다. 이를 통해 환자는 통증 없이 생체검사를 받을 수 있습니다. 이 경우, 정신 신경을 국소적으로 마취하는 것이 가장 적합합니다...
      score: 0.008786558 source: 환자의 아래턱 림프절이 부풀어 있는 것을 발견했습니다. 이는 잠재적인 감염의 증거일 수 있습니다. 감염된 부위를 찾기 위해서는 다음의 곳을 살펴볼 수 있습니다. 첫째로, 경구개를 확인해야 합니다. 경구개는 입안의 윗부분으로, 이곳에서 감염이 발생할 수 있습니다. 둘째로, 윗입술을 살펴보아야 합니다. 윗입술은 입술의 윗부분으로, 여기서도 감염이 발생할 수 있습니다. 셋째로, 상악중절치를 확인해야 합니다. 상악중절치는 상악에 위치한 치아들로, 이곳에서도 감염이 발생할 수 있습니다. 마지막으로, 제일대구치를 살펴보아야 합니다. 제일대구치는 아래턱에 위치한 치아로, 이곳에서도 감염이 발생할 수 있습니다. 따라서, 이러한 부위들을 주의깊게 살펴보면 잠재적인 감염 부위를 찾을 수 있을 것입니다.​

      ※ 따라서 sparse vector 기반 dense vector 기반 검색을 결합시 성능 향상을 기대할 수 있음

      • 결과 스코어는 KNN 스코어와 쿼리 스코어의 합계
      • boost 값을 지정하여 각 스코어에 가중치를 부여할 수 있음
      • score = 0.0025 * match_score + 1 * knn_scoreHybrid Retrieval (Sparse Retrieval + Dense Retrieval)
        Elasticsearch의 쿼리 DSL을 사용하여 hybrid retrieval 구현
    • 결과
      리더보드 MAP 스코어 0.07 상승

  • Sparse retrieval 성능 향상
    hybrid retrieval로도 맞추지 못하는 데이터에 대해서는 sparse vector 기반 검색 성능을 높여 해결하는 방법을 시도

    • BM25 → LMJelinekMercer
      1. BM25 (Best Matching 25)
        • 확률적 정보 검색 모델
        • 쿼리와 문서 간의 유사성을 측정할 때 단어의 출현 빈도(frequency)와 문서의 길이(length)를 고려
        • 검색 쿼리와 문서 간의 일치하는 단어의 수를 기반으로 점수를 계산
        • 단어가 문서에 자주 나타나거나 문서의 길이가 긴 경우에는 가중치를 줄이고, 쿼리와 문서 간의 일치하는 단어가 적거나 문서의 길이가 짧은 경우에는 가중치를 높이는 방식으로 동작

      2. LM Jelinek-Mercer
        • 언어 모델 기반의 유사도 모델
        • 쿼리와 문서 간의 유사성을 측정할 때 문서의 언어 모델을 사용하여 단어의 확률을 고려
        • 일반적으로 문서 내에서 각 단어의 확률은 문서의 일치성을 반영하는 데 사용됨
        • Jelinek-Mercer 스무딩은 많은 문서에 존재하지 않는 단어들에 대해 보다 적절한 가중치를 할당
        • BM25와는 달리 단어의 출현 빈도나 문서의 길이보다는 언어 모델을 기반으로 유사성을 측정하는 특징이 있음

      test_query = "빗방울이 점점 커지게 되는 요인은?"
      
      # sparse retrieval with BM25
      score: 23.388632 source: 무지개는 자연 현상으로, 빗방울 속의 빛이 굴절과 반사를 통해 생기게 됩니다. 빗방울은 투명한 물질로 이루어져 있으며, 빛은 빗방울에 닿으면 굴절됩니다. 이 굴절된 빛은 빗방울 내부에서 반사되어 다시 외부로 나오게 됩니다. 이렇게 반사된 빛은 다시 한 번 굴절되며, 다양한 색상으로 분리됩니다. 이렇게 분리된 색상들이 빗방울에서 나오면서 무지개가 형성되는 것입니다. 무지개는 일정한 각도로 형성되며, 태양이 빗방울에 닿는 각도와 빗방울의 크기에 따라 다양한 형태와 색상을 보여줍니다. 따라서, 무지개는 빗방울 속의 빛이 굴절과 반사를 통해 생기는 자연의 아름다운 현상입니다.
      score: 19.680605 source: 물이 구름에서 다시 지구로 떨어질 때, 강수라는 현상이 일어납니다. 강수는 물의 순환 과정 중 하나로, 구름 안에 있는 수증기가 높은 고도에서 낮은 고도로 이동하면서 물방울로 변합니다. 이 물방울들은 구름 안에서 충돌하고 서로 합쳐져서 점점 커지게 됩니다. 그리고 어느 정도 크기가 되면 중력에 의해 지구로 떨어지게 됩니다. 이렇게 물이 구름에서 지구로 떨어지는 과정을 강수라고 합니다. 강수는 비, 눈, 우박 등 다양한 형태로 나타날 수 있으며, 지구의 생태계와 물의 순환에 중요한 역할을 합니다.
      score: 14.358231 source: 당신은 금성에 살고 있고, 당신의 망원경이 금성의 두꺼운 구름을 볼 수 있다고 가정한다면, 지구의 달을 관찰할 수 있습니다. 지구의 달은 월식과 만월을 거치며 다양한 단계를 보여줍니다. 여기서는 월식이 아닌 단계를 중심으로 설명하겠습니다...
      # sparse retrieval with LM Jelinek-Mercer
      score: 14.111265 source: 물이 구름에서 다시 지구로 떨어질 때, 강수라는 현상이 일어납니다. 강수는 물의 순환 과정 중 하나로, 구름 안에 있는 수증기가 높은 고도에서 낮은 고도로 이동하면서 물방울로 변합니다. 이 물방울들은 구름 안에서 충돌하고 서로 합쳐져서 점점 커지게 됩니다. 그리고 어느 정도 크기가 되면 중력에 의해 지구로 떨어지게 됩니다. 이렇게 물이 구름에서 지구로 떨어지는 과정을 강수라고 합니다. 강수는 비, 눈, 우박 등 다양한 형태로 나타날 수 있으며, 지구의 생태계와 물의 순환에 중요한 역할을 합니다.
      score: 13.345925 source: 무지개는 자연 현상으로, 빗방울 속의 빛이 굴절과 반사를 통해 생기게 됩니다. 빗방울은 투명한 물질로 이루어져 있으며, 빛은 빗방울에 닿으면 굴절됩니다. 이 굴절된 빛은 빗방울 내부에서 반사되어 다시 외부로 나오게 됩니다. 이렇게 반사된 빛은 다시 한 번 굴절되며, 다양한 색상으로 분리됩니다. 이렇게 분리된 색상들이 빗방울에서 나오면서 무지개가 형성되는 것입니다. 무지개는 일정한 각도로 형성되며, 태양이 빗방울에 닿는 각도와 빗방울의 크기에 따라 다양한 형태와 색상을 보여줍니다. 따라서, 무지개는 빗방울 속의 빛이 굴절과 반사를 통해 생기는 자연의 아름다운 현상입니다.
      score: 9.677388 source: 당신은 금성에 살고 있고, 당신의 망원경이 금성의 두꺼운 구름을 볼 수 있다고 가정한다면, 지구의 달을 관찰할 수 있습니다. 지구의 달은 월식과 만월을 거치며 다양한 단계를 보여줍니다. 여기서는 월식이 아닌 단계를 중심으로 설명하겠습니다...
      
      ------------
      
      test_query = "물체를 매우 크게 확대해서 볼수 있는 기계" 
      # sparse retrieval with BM25
      score: 15.284601 source: 많은 일반 수공도구들은 간단한 기계에서 볼 수 있는 기본 원리를 사용하여 기계적 이점을 제공합니다. 예를 들어, 스크루드라이버는 바퀴와 축의 원리를 사용하여 회전력을 전달하고 나사를 조이는 역할을 합니다. 또한, 플라이어는 지렛대 원리를 사용하여 그립력을 높이고 물체를 잡을 수 있습니다. 지렛대는 한쪽 끝에 힘을 가하면 다른쪽 끝에는 더 큰 힘이 발생하는 원리를 이용합니다. 이를 통해 플라이어는 작은 힘으로도 큰 물체를 잡을 수 있습니다. 따라서, 수공도구들은 간단한 기계적 원리를 활용하여 우리의 일상 생활을 편리하게 만들어줍니다.
      score: 14.6367235 source: 현미경은 물체를 50배로 확대할 수 있습니다. 따라서, 물체의 실제 길이는 상으로 보이는 길이의 1/50인 0.01cm입니다. 현미경을 사용하면 물체의 세부 사항을 더욱 자세히 관찰할 수 있습니다.
      score: 12.890602 source: 토크는 레버 암과 곱한 힘이다. 이는 물체에 가해지는 회전력을 나타내는 물리적인 힘입니다. 토크는 레버 암의 길이와 힘의 크기에 따라 결정됩니다. 레버 암이 길면 토크는 강력해지고, 힘의 크기가 크면 토크도 커집니다. 토크는 회전하는 물체에 영향을 주는 중요한 힘으로, 자동차의 엔진, 기계의 회전 부품 등에서 사용됩니다. 토크는 회전 운동을 이해하고 설계하는데 필수적인 개념이며, 엔지니어링 분야에서 중요한 역할을 합니다.
      # sparse retrieval with LM Jelinek-Mercer
      score: 11.073102 source: 현미경은 물체를 50배로 확대할 수 있습니다. 따라서, 물체의 실제 길이는 상으로 보이는 길이의 1/50인 0.01cm입니다. 현미경을 사용하면 물체의 세부 사항을 더욱 자세히 관찰할 수 있습니다.
      score: 9.110226 source: 많은 일반 수공도구들은 간단한 기계에서 볼 수 있는 기본 원리를 사용하여 기계적 이점을 제공합니다. 예를 들어, 스크루드라이버는 바퀴와 축의 원리를 사용하여 회전력을 전달하고 나사를 조이는 역할을 합니다. 또한, 플라이어는 지렛대 원리를 사용하여 그립력을 높이고 물체를 잡을 수 있습니다. 지렛대는 한쪽 끝에 힘을 가하면 다른쪽 끝에는 더 큰 힘이 발생하는 원리를 이용합니다. 이를 통해 플라이어는 작은 힘으로도 큰 물체를 잡을 수 있습니다. 따라서, 수공도구들은 간단한 기계적 원리를 활용하여 우리의 일상 생활을 편리하게 만들어줍니다.
      score: 8.6020355 source: 객체의 선형 크기를 3배로 확대하면 표면적은 9배 증가하고 부피는 27배 증가합니다. 이는 선형 크기와 표면적, 부피 간의 비례 관계에 기반한 결과입니다. 선형 크기가 증가하면 표면적은 선형 크기의 제곱에 비례하여 증가하고, 부피는 선형 크기의 세제곱에 비례하여 증가합니다. 따라서, 객체의 선형 크기를 3배로 확대하면 표면적은 9배 증가하고 부피는 27배 증가합니다.​
    • 결과
      리더보드 MAP 스코어 약 0.02 상승


3. Process : Issues

- GPU 메모리가 부족해서 Kobart보다 큰 모델들을 훈련시켜서 결과를 얻을 수 없었던 점이 아쉬웠다. (현재 사용하고 있는 GPU는 RTX 3090 VRAM, 24GB 였다.)

- NLP task를 진행하기에는 14일이라는 시간이 너무 짧아서, 학습 후 나오는 inference들 속에서 차이점을 발견하고 개선해보는 연구를 진행하지 못한 점들이 아쉬웠다. 

- 데이터를 증강하기 위한 기법인 Pororo 를 설치하는데 약 2일 정도의 시간을 잡아먹었음에도 불구하고 해당 모듈로 데이터를 증강한 결과가 좋지 못해서 아쉬웠다. 

- T5 모델로 학습해보지 못한 것이 아쉬웠다. T5의 경우 task를 꼭 추가해줘야한다. 그래서 prefix로 "summarize: "를 추가해줬다. 하지만 당시 나왔던 결과들이 다음과 같았다.

T5 훈련 결과


train epoch가 지날수록, eval loss는 떨어지는데 ROUGE score는 하락한다. 처음에 코드를 정확하게 파악하지 않고 Kobart보다 더 큰 모델인 T5에게 훈련시키는 데이터가 적었기 때문에 underfitting이 난다고 판단을 했었다. 그래서 T5 모델을 사용해보지 못하고, Kobart를 fine tuning해서 대회를 마무리 했었다. 
대회가 마무리 된 후에 더 research를 해보니 T5 모델의 경우 decoder에 input을 넣어주지 않는 점이었다. Kobart와 mbart 등 다른 여러 가지 모델들을 fine tuning하면서, 해당 부분을 점검하지 못해서 발생한 일이었다. 앞으로 모델을 변경할 때, 코드 하나하나를 잘 뜯어봐야겠다. 

- Model 자체에 noise를 주는 기법들을 활용해보았는데, 오히려 score가 떨어지는 경향이 있었다. 대회 기간이 적어서 해당 기법들을 통한 연구를 해보지 못했다. Token Dropout, Token Substitution, Token Masking 등 기법들을 통해 모델을 학습시켜서 성능을 높혀보고 싶다. 

4. Role

팀원으로써 다음과 같은 역할을 담당했었다.

1. train data EDA 

2. KWN(Korean Wordnet) pickle을 활용한 SR 증강 기법 코딩

3. Summarization task에 걸맞는 Hugging Face pretrain model research 및 기록

4. wandb 구현 및 설명

5. 증강 기법(Back translation, KWN SR, KoEDA, AEDA)을 활용한 연구 방향성 제시 

train data를 EDA 할 때는 2가지 관점으로 진행하였다. 

1. train data 속에서 빈도 수가 많은 n-gram이 어떻게 구성되어있나?

2. train data 속에 있는 noise는 무엇이 있나?

1의 관점을 위해서 "2.Process : Competition Model" 의 EDA를 진행하였다. 2의 관점을 위해서는 먼저 함수로 특수 기호가 어떠한 것들이 있는지를 코딩으로 발견하였다. 그 결과 "2.Process : Competition Model" 의 Data preprocessing의 표를 만들 수 있었고, 그 과정으로 데이터를 handling 하였었다.

 

5. Results

 


6. Conclusion

  • 코드 및 설명
    github

  • 최종 전략
    Train Data EDA 및 여러 가지 Data Augmentation 기법을 조합하여 fine tuning 하기

  • Self-Evaluation
    • WanDB를 활용하여 모델의 score들을 서로 비교해봄
    • NLP data의 여러 가지 증강 기법들을 찾아서 직접 진행해봄
    • 나만의 논리를 구축하여 LLM 모델을 fine tuning 하며 모델의 score를 높여봄.
    • Open API와 Solar API로 prompt engineering을 통해 데이터를 증강해봄.
    • Kobart 및 T5 모델의 구조에 대해서 알게됨
    • Hugging Face를 활용하여 모델을 fine tuning 해봄.

  • 좋은 변화
    • 논리를 구축하지 않고 스코어에 집착하던 습관을 고침
    • Research를 통해서 알게 된 방법들을 구현해봄
    • NLP task에 익숙해짐
    • NLP task에 대한 깊고 다양한 관점에 대한 시야가 열림

  • 나쁜 변화
    • 가지고 있는 제한된 Computing 환경에서 Lora tuning을 해보지 못함.
    • T5 모델에 대한 더 깊은 research를 통해서 T5 모델을 훈련시킬 수 있었는데 그렇지 못함. 이 과정을 통해서 내게 가지고 있는 좋지 못한 습관을 발견하였다. 따라서 어떻게 더 꼼꼼하게 paper와 code를 읽을 지에 대한 방향성을 잡게 되었다.

 

7. End of the Project

작년 10월에 시작한 Upstage AI Lab이 이번 대회를 끝으로 딱 하나의 대회만을 남두고 있다. "2주" 라는 시간은 정말 길다면 길고 짧다면 짧다. 그렇기 때문에 오늘 하루의 1시간이 더 소중해지고, 어떻게 하면 더 효율적으로 잘 활용하여 밀도 깊은 시간을 보낼 수 있을지 고민하게 되는 것 같다.

이러한 이야기를 하는 이유가 뭔지 다들 궁금할 것 같다. "대회" 라는 단어로 어떠한 시간을 시작하기로 마음 먹기 시작하면 나는 몰입하기 시작한다. 이 짧은 시간 내에 주어진 환경에서 내가 할 수 있는게 뭘까? 할 수 있는 것들이 보이기 시작하면 해당 문제들을 해결하기 위해서 정보를 수집한다. 정말 많은 정보들이 수집된다. 그 중에는 정말 쓸 수 있는 정보도 있고, 쓸모 없는 정보들도 있다. 그러한 것들을 정리해서 잘 가공하면 벌써 3일 정도가 지나가 있다. 해당 정보들을 이해하고 활용하다보면 3일 정도가 또 지나있다. 그러면 대회는 7일이 남아있다. 

이제부터 연구를 하기 시작한다. 내가 찾아온 정보들을 하나씩 적용해보면서, 무엇이 장점이고 무엇이 단점인지 비교한다. 단점은 보완하고 장점을 살린다. 그렇게 대회 마지막 날 오후 7시까지 정말 해볼 수 있는 것들을 최대한 다 해보려한다. 

 

중요한 건 그럼에도 불구하고 내가 생각한 것들을 다 해볼 수가 없다. 인 것 같다.

 

매번 아쉽다. 다해보지 못해서, 뭔가 역량을 다 발휘하지 못한 것 같아서. 더 성장하고 싶다. 그러면 내가 하고 싶었던 연구들을 전보다 더 해볼 수 있을 것 같다. 

 

이번 대회도 정말 아쉬운 대회였다. 함께 열심히 여러 Task를 고민하고 연구해준 팀원들에게 너무 고맙다.

 

마지막 대회는 더 성장한 모습으로 더 탄탄한 논리를 바탕으로 한 결과물을 도출해내겠다.