aws 에서 제공해줬던 workshop을 참고한 내용입니다. https://catalog.us-east-1.prod.workshops.aws/workshops/a372f3ed-e99d-4c95-93b5-ee666375a387/ko-KR
RAG의 종류에는 다음과 같은 종류가 있습니다.
1. Lexical Search (어휘 선택) - 특정 단어나 구절을 정확히 찾는 방법입니다. 정확한 키워드를 가진 질문엔 효과적이지만, 철자 오류나 유사어 처리에 취약할 수 있어 복잡한 질문에는 다른 검색 방법과 함께 사용하는 것이 좋다고 합니다.
사용자가 검색어(query)를 입력하면, 이 질의는 opensearch 시스템으로 전달되어 text 데이터를 검색합니다. 검색 결과를 관련 문서들이 반환되어, retriever가 처리하여 관련성 높은 정보를 추출하고 사용자한테 전달된다고 합니다.
2. Semantic Search(의미 검색) - 단어 매칭을 넘어 검색어의 의미와 맥락을 이해하여 정보를 찾는 방법입니다. 복잡하거나 모호한 질문, 유사어나 관련 개념을 포함한 검색, 사용자 의도 파악이 필요한 경우에 적합합니다.
사용자가 질의를 입력하면, 이는 Embedding모델을 통해 벡터로 전환됩니다. 이 벡터는 저장된 벡터들과 비교되고, opensearch는 의미적으로 유사한 문서들을 검색하여 retriever로 전달합니다. Retriever는 이 정보를 처리하여 가장 관련성 높은 내용을 추출하고, 최종적으로 사용적으로 적절한 답변을 전달합니다.
3. Hybrid search - Lexical Search(어휘검색)과 Semantic SEarch (의미검색) 을 함께 사용하는 방식입니다.
사용자의 질의는 두 가지 경로로 처리됩니다. 결과는 Rank Fusion 단계에서 결합되고 순위가 매겨집니다. 이 과정은 두 가지 방법을 동시에 활용하여, 최종적으로 Retriever를 통해 사용자에게 더 정확하고 관련성 높은 검색 결과를 제공합니다.
다음은, Context 재구성하기에 대해서 알아보도록 하겠습니다.
Context 재구성하기에 있어서 다음과 같은 기법들이 사용된다고 합니다.
1. ReRanker - 리턴된 documents 들에 대해 query와의 관련성을 다시 한번 측정하여 context에 들어갈 document의 rank를 바꿔주는 기법입니다. query와 문서를 동시에 고려하기 때문에 기존의 embedding기반 방식에 비해 더욱 정교한 유사도를 얻을수 있다고 합니다.
opensearch에서 hybrid 방식으로 검색이 수행된 후, 결과가 Rank fusion 단계에서 결합되고 초기 순위가 매겨진다고 합니다. 그 다음 reranker 단계에서 더욱 정교한 알고리즘을 통해 결과를 재정렬한다고 합니다. 그리고 최종적으로 retriever를 통해 사용자에게 제공된다고 합니다. reranker를 통해 검색 결과의 정확성과 관련성을 향상시켜, 복잡한 쿼리나 대규모 데이터셋에서 효과적인 성능을 발휘한다고 합니다.
2. Parent Document
쿼리가 들어와서 벡터 임베딩을 비교할 때, 문장이 길어진다고 더 vector similarity가 가까워 지는것이 아니라, 쿼리랑 비슷한 길이의 문장을 벡터 임베딩을 가깝다고 생각하는 경향이 있다고 합니다. 하지만 정확한 답변은 오히려 긴 문장에 포함되는 경우가 많다고 합니다.
이를 해결하기 위해 나온 기법이 Parent document 기법입니다. Parent document 에서는 small chunk를 통해 정확성이 높은 문장을 찾아내되, 해당문장을 그대로 답변하는 것이 아니라, 해당 문장이 갖고 있는 parent 문장을 답변하도록 유동하는 방식입니다. 이를 통해서 small chunk를 통해 놓치는 context를 parent chunk를 통해서 parent chunk를 통해서 context를 전달하도록 해서 사용자가 원하는 답변에 최대한 근접하도록 유도하는 방식입니다.
parent document를 찾아가는 과정은 다음과 같습니다. 하나의 문서를 context를 놓치지 않는 수준의 여러개의 parent chunk(large chunk)로 청킹해서 저장합니다. 그리고 각각의 parent chunk에 대해서 child chunk를 잘라서 작은 청크로 저장합니다. 그리고 사용자 쿼리에 대해서 가장 유사한 child chunk를 찾습니다. 그리고 찾은 child chunk의 parent chunk를 찾아서 답변을 합니다.
3. RAG-Fusion - RAG-fusion은 문서에서 사용자가 질의한 내용을 검색하기에 앞서 입력받은 쿼리를 다양한 형태의 쿼리로 변형시키는 기법입니다. 이렇게 변형되어 생성된 쿼리 여러 개는 지식 저장소(knowledge base) 에서 관련된 문서를 찾는데 활용됩니다.
이와 같이 RAG-fusion은 질의 관점의 다양화를 통해 사용자 쿼리와 의도된 의미 사이의 간극을 메워줌으로써 성능 향상을 이끌고 있다고 합니다.
- Step 1. 질문 입력
- 사용자가 질문을 입력합니다.
- Step 2. Query Augmentation 수행 (변형 쿼리 생성)
- LLM이 사용자의 질문을 적절히 변형해 중간 쿼리를 생성합니다. 이 중간 쿼리는 다음 단계에서 진행될 의미적 검색(Semantic Search)를 위해 임베딩 벡터로 변환됩니다.
- Step 3. 관련 문서 검색
- 지식 저장소(Knowledge Base)에서 의미적 검색(Semantic Search)을 통해 가상 답변과 의미적 유사성이 높은 관련 문서를 검색합니다.
- Step 4. 최종 답변 생성
- LLM이 검색된 관련 문서를 사용하여 사용자의 질문에 대한 최종 답변을 생성합니다.
4. HyDE - HyDE는 질문과 관련 문서간의 의미적 간격을 줄여 관련 문서를 검색하는 성능을 개선하는 것을 목표로 합니다. HyDE는 가상답변을 만들어서 가상답변을 통해 의미적 유사성을 줄여서 이를 통해서 답변을 찾습니다.
다음과 같이 이뤄진다고 합니다.
- Step 1. 질문 입력
- 사용자가 질문을 입력합니다.
- Step 2. 가상 답변 생성
- LLM이 사용자의 질문을 기반으로 가상 답변을 생성합니다. 이 답변은 사용자의 질문에 대한 이상적인 답변을 나타냅니다. 이 답변은 다음 단계에서 진행될 의미적 검색(Semantic Search)를 위해 임베딩 벡터로 변환됩니다.
- Step 3. 관련 문서 검색
- 지식 저장소(Knowledge Base)에서 의미적 검색(Semantic Search)을 통해 가상 답변과 의미적 유사성이 높은 관련 문서를 검색합니다.
- Step 4. 최종 답변 생성
- LLM이 검색된 관련 문서를 사용하여 사용자의 질문에 대한 최종 답변을 생성합니다.
'Deep Learning > NLP' 카테고리의 다른 글
RAFT(Retrieval Augemented Fine tuning)에서 어떤 식으로 Fine tuning을 해야할까요? (0) | 2024.07.17 |
---|---|
RAG의 새로운 대안 .. RAFT(RAG 할바에야 RAFT!) (3) | 2024.07.16 |
RAG란? 그리고 Langchain 을 이용한 구현까지 (0) | 2024.01.23 |
Jetson 에서 LLAMA2 돌리기! (0) | 2023.07.28 |
LLAMA2. 과연 엄청난 혁신일까? (0) | 2023.07.24 |