ML

RAG/ LangChain 도입

지미닝 2024. 7. 14. 03:48

경단 프로젝트에서 기사 재생성 도메인을 맡아 개발하고 있는데, LLM의 문제점 몇 가지를 해결하고자 솔루션이 필요했다. 이번에 출전하는 대회에서도 아래 네가지에 대한 솔루션을 원했던 것 같다.

 

- 사실 관계 오류와 맥락 이해의 한계를 개선하기 위해 도입

- 최신 정보와 정확한 사실 관계 필요

- 생성물의 품질과 공정성 보장 및 인간-AI 협업 방식 정립 등 해결 과제 대응

- 생성 AI 기술의 혜택을 안전하고 효과적으로 제공하기 위한 방법 모색

 

이 배경에서 RAG라는 기술을 활용할 경우 외부 지식 베이스를 연결하여 사실 관계 파악에도 도움이 될 것이라 판단했고, 생성 능력 향상에 도움이 더욱이 될것이라 판단하여 RAG와 LangChain을 도입하게 되었다.

 

RAG 도입


RAG는, LLG의 단점 중에 ‘사실 관계 오류 가능성’과 ‘맥락 이해의 한계’를 개선하는 데 초점을 맞춘 방법이다.

RAG는 LLM에 외부 지식 베이스를 연결하여 모델의 생성 능력과 사실 관계 파악 능력을 향상시키는 기술이다. 즉 우리 기사 생성 도메인에서 필요한 것은 최근 기술과, 사실 관계성에 대한 보완이 필요하기에 RAG를 도입하게 되었다.

 

구체적으로 RAG는 다음과 같은 방식으로 LLM의 한계를 보완한다.

  1. 외부 지식 활용
    • 대규모의 구조화된 지식 베이스(예: 위키피디아)를 모델에 연결
    • 주어진 질의에 대한 관련 정보를 지식 베이스에서 검색 및 추출
  2. 증거 기반 생성
    • 검색된 지식 정보를 증거로 활용하여 보다 사실에 기반한 답변 생성
    • 생성된 답변의 출처를 명시함으로써 신뢰성 향상
  3. 맥락 이해력 향상
    • 외부 지식을 통해 질의에 대한 배경 지식과 맥락 정보를 파악
    • 단순한 패턴 매칭이 아닌 추론 능력을 바탕으로 한 답변 생성

 

RAG의 주요 구성 요소


  1. 질의 인코더(Query Encoder): 사용자의 질문을 이해하기 위한 언어 모델입니다. 주어진 질문을 벡터 형태로 인코딩합니다.
  2. 지식 검색기(Knowledge Retriever): 인코딩된 질문을 바탕으로 외부 지식 베이스에서 관련 정보를 검색합니다. 예를 들어 Wikipedia, 뉴스 기사, 전문 서적 등 방대한 문서 집합에서 질문과 연관된 문단이나 구절을 찾아냅니다.
  3. 지식 증강 생성기(Knowledge-Augmented Generator): 검색된 지식을 활용하여 질문에 대한 답변을 생성하는 언어 모델입니다. 기존의 LLM과 유사하지만, 검색된 지식을 추가 입력으로 받아 보다 정확하고 풍부한 답변을 생성할 수 있습니다.

 

RAG의 동작 과정 요약


  1. 사용자의 질문이 주어지면 질의 인코더가 이를 이해하기 쉬운 형태로 변환합니다.
  2. 지식 검색기가 인코딩된 질문을 바탕으로 외부 지식 베이스에서 관련 정보를 검색합니다.
  3. 검색된 지식은 지식 증강 생성기의 입력으로 전달됩니다.
  4. 지식 증강 생성기는 검색된 지식을 활용하여 사용자 질문에 대한 답변을 생성합니다.

RAG는 LLM의 강력한 언어 이해 및 생성 능력과 외부 지식 활용을 결합함으로써, 보다 정확하고 풍부한 정보를 제공할 수 있습니다. 특히 최신 정보나 특정 도메인 지식이 필요한 질문에 효과적으로 대응할 수 있다는 장점이 있습니다.

레퍼런스

활용 모듈


LangChain

Installation | 🦜️🔗 LangChain

GoogleCustom Search Engine: googleapiclient

WikiPedia Retriver: 아직 구현 못함.

Retriver의 역할


사용자가 입력한 쿼리에 대해 관련 정보를 검색하고 반환하는 역할을 한다.

쿼리 전처리, 데이터 소스 검색, 결과 정리 및 반환을 하는 역할이다.

GoogleCSERetriever ,WikipediaRetriever 를 활용한다.

아래와 같이 쿼리에 대해서 관련된 정보를 검색하고 반환해준다.

예제는 Google Custom Search Engine이다.

Async GoogleRetriver

대규모 벡터 데이터 베이스


FAISS와 Chroma

→ 우리 프로젝트는 복잡도가 낮은 편이고, 처음 사용하기 때문에 일단 Chroma가 맞다고 판단했다.

Retriver로 단순히 데이터만 가져오면🤔 → LangChain, 벡터 데이터 베이스 도입하자!


검색 성능이 떨어지는 문제가 있었으며, 의미론적 검색을 개선할 필요가 있었다.

✔️ 검색 성능 개선 - LangChain

검색 추론 능력을 높이고자 LangChain 도구의 필요성을 느꼈다. 이를 활용할 경우에는 문맥을 더 잘 이해하고, 사용자 쿼리에 대해서 더 관련성 높은 결과를 제공할 수 있게 된다.

 

✔️의미론적 검색 및 실시간 업데이트 - ChromaDB

ChromaDB는 텍스트를 벡터로 변환하여 의미론적 유사성을 기반으로 검색을 수행한다. 이는 단순히 키워드를 매칭하는 것 뿐만 아니라 더 나은 검색 결과를 제공하게 된다.

 

따라서 우리는 LangChain과 벡터 데이터베이스를 도입하도록 결정했다.

 

 

LangChain,ChromaDB를 활용한 예시


만약 이 두가지를 활용한다면 아래와 같이 플로우가 수정된다.

Chroma DB를 활용한 흐름 설명

  1. 질문 입력: 사용자가 "국내 총 생산량이 뭐야?"라는 질문을 입력합니다.
  2. Google 검색: Google Custom Search API를 사용하여 질문과 관련된 결과를 검색합니다.
  3. 벡터화 및 저장: 검색 결과를 텍스트 임베딩으로 변환하고 ChromaDB에 저장합니다.
  4. 검색 수행: 저장된 문서들 중에서 주어진 쿼리와 유사한 문서를 ChromaDB를 사용하여 검색합니다.

 

LangChain까지 활용한 흐름 설명

그런데 위 흐름은 또다른 문제 있다. 정보 통합 과정에서 LLM을 적극적으로 활용할 필요가 있다.

  • 주어진 흐름: Google 검색 -> 벡터화 및 저장 -> 유사도 기반 검색
  • LangChain 방법: Google 검색 + LLM 분석 -> 벡터화 및 저장 -> LLM 기반 정보 통합 및 검색

LangChain을 활용한 방법은 LLM의 강력한 언어 이해 및 생성 능력을 적극적으로 활용하여, 더 정교하고 신뢰성 있는 결과를 제공한다.

 

 

주요 차이점(LangChain까지 활용한 흐름과 Chroma DB만 활용한 흐름 차이)

1. LLM의 역할:
    - 이전 흐름에서는 LLM이 직접적인 검색에 사용되지 않으며, 검색 결과를 단순히 벡터화하여 저장하고 검색하는 데 초점을 맞춥니다.
    - LangChain을 활용한 방법에서는 LLM이 검색 과정에서 적극적으로 사용됩니다. Google Custom Search API를 통해 검색한 결과를 LLM을 사용하여 분석하고, 필요한 정보를 추출하는 데 도움을 줍니다.

 

2. 검색 및 정보 통합:
    - 이전 흐름에서는 검색 결과를 벡터화하여 ChromaDB에 저장한 후, 쿼리와 유사한 문서를 검색하는 단순한 접근 방식을 취합니다.
    - LangChain을 활용한 방법에서는 LLM이 검색 결과를 통합하여 더 신뢰성 있고 일관된 정보를 제공합니다. LLM이 검색된 문서를 분석하고 요약하는 데 사용되므로, 더 나은 품질의 출력을 기대할 수 있습니다.

 

3. 정보의 처리 방식:
    - 이전 흐름에서는 검색 결과의 벡터화와 저장에 초점을 맞추며, 이후 검색은 단순한 유사도 기반 검색입니다.
    - LangChain을 활용한 방법에서는 검색 과정에서 LLM의 능력을 활용하여 정보의 품질을 높이고, 검색된 정보를 통합하여 최종 출력물의 품질을 개선합니다.

구현 완료 ㅋㅋ

https://github.com/Gyeongdan/gyeongdan-server-fastapi/pull/78