GenAI Stack의 다양한 활용성 및 기능

GenAI Stack Introduction

Getting Started with GenAI Stack powered with Docker, LangChain, Neo4j and Ollama

Implementing RAG Pipeline using GenAI Stack

GenAI Stack은 대규모 언어 모델(Large Language Models, LLMs)을 쉽게 애플리케이션에 통합할 수 있도록 설계된 엔드 투 엔드 프레임워크입니다. 이는 원시 데이터와 애플리케이션에서 활용할 수 있는 실행 가능한 인사이트나 응답 사이의 간극을 메우는 것을 목적으로 하고 있습니다. GenAI Stack은 Docker, Neo4j, LangChain, 그리고 Ollama와의 협력을 통해 개발되었으며, 이는 기술자들이 몇 번의 클릭만으로 GenAI를 지원하는 애플리케이션을 빠르게 구축할 수 있게 하기 위함이었습니다.

엔드 투 엔드(End-to-End, E2E) 프레임워크는 특정 작업이나 프로세스를 시작부터 끝까지 처리할 수 있도록 설계된 소프트웨어 개발 틀을 의미합니다. 이러한 프레임워크는 개별 구성 요소, 서비스, 또는 기능을 별도로 개발하고 관리하는 대신, 하나의 연속적인 시스템을 구축하는 데 중점을 둡니다. 여기에는 데이터 수집, 처리, 분석, 그리고 결과 제공과 같은 모든 필요한 단계가 포함될 수 있습니다.

엔드 투 엔드 프레임워크의 주요 특징과 이점은 다음과 같습니다:

  1. 통합성: 엔드 투 엔드 프레임워크는 각 단계에서 필요한 모든 기능과 서비스를 통합하여, 개발자가 전체 시스템을 쉽게 구축하고 관리할 수 있도록 돕습니다.
  2. 효율성: 프레임워크는 표준화된 방식으로 작업을 처리하며, 이는 개발 시간을 줄이고 코드의 품질과 일관성을 높여줍니다.
  3. 확장성: 엔드 투 엔드 프레임워크는 시스템의 다양한 부분을 모듈화하며, 이를 통해 개발자는 필요에 따라 시스템을 쉽게 확장하거나 수정할 수 있습니다.
  4. 자동화: 프레임워크는 많은 작업을 자동화하여, 개발자가 더 복잡하고 중요한 작업에 집중할 수 있도록 해줍니다.
  5. 생산성 향상: 엔드 투 엔드 프레임워크는 프로세스의 각 단계를 손쉽게 관리하고 통합함으로써, 개발자의 생산성을 향상시킵니다.
  6. 에러 감소: 프레임워크는 전체 시스템을 통합 관리함으로써, 에러 발생 가능성을 줄이고 문제 해결을 더 쉽게 만듭니다.

엔드 투 엔드 프레임워크의 예로는 위에서 언급한 GenAI Stack이 있으며, 이는 큰 언어 모델을 애플리케이션에 통합하는 전체 프로세스를 관리하고 지원합니다.

간단히 말해서, 이것은 생성 AI(Generative AI) 개발 여정을 조직하고 간소화합니다. ETL(추출, 변환, 로드) 데이터 처리의 초기 단계부터 LLM 추론 단계에 이르기까지, GenAI Stack은 AI의 잠재력을 활용하는 방식을 혁신적으로 바꾸어, 데이터 개인 정보 보호, 도메인 중심, 그리고 전통적인 LLM과 관련된 일반적인 환상의 함정 없이 사실을 보장합니다.

GenAI Stack은 여러 가지 방법으로 도움이 될 수 있습니다:

  1. 단순화된 ETL(Extract, Transform, Load):
    GenAI Stack은 복잡한 데이터 처리 환경을 탐색하는 지침 역할을 합니다. 이는 데이터 추출, 변환, 및 로딩 과정을 단순화하고 효율화하여, 개발자가 더 쉽게 데이터를 처리하고 관리할 수 있도록 돕습니다.
  2. 환상 없는 추론(Hallucination-Free Inference):
    AI가 생성한 환상으로 가득 찬 콘텐츠와 관련된 일반적인 고민을 줄일 수 있습니다. GenAI Stack의 오케스트레이터의 독특한 구조는 LLM 추론 단계에서 현실과 도메인 전문 지식에 기반한 출력을 생성한다는 것을 보장합니다. 이는 생성된 정보를 신뢰하고 결정 내리기, 연구 및 의사소통 목적으로 자신있게 활용할 수 있다는 것을 의미합니다.
  3. 매끄러운 통합(Seamless Integration):
    기존 작업 흐름에 GenAI Stack을 통합하는 것은 경험이 풍부한 AI 개발자이든 처음 시작하는 사람이든 간에 간단합니다. 이는 GenAI Stack을 기존의 시스템과 프로세스에 쉽게 통합하여, AI 기능을 빠르게 채택하고 활용할 수 있도록 돕습니다.
  4. 맞춤화 및 제어(Customization and Control):
    ETL 프로세스, 벡터 데이터베이스, 추론 매개변수를 세밀하게 조정하고, 시스템을 프로젝트의 고유한 요구 사항에 맞게 조정할 수 있습니다. 이는 GenAI Stack이 다양한 프로젝트 요구 사항과 목표를 충족시키기 위해 필요한 유연성과 제어 기능을 제공한다는 것을 의미합니다.

GenAI Stack의 이러한 기능은 개발자들에게 데이터 처리에서 추론, 통합, 그리고 맞춤화에 이르기까지 생성 AI 개발의 전반적인 프로세스를 관리하고 최적화하는 데 필요한 도구와 기능을 제공합니다.

사용 사례들은 다음과 같습니다:

  1. AI 구동 검색 엔진:
    컨텍스트를 인식하는 결과를 통해 검색을 향상시켜, 단순한 키워드 일치를 넘어서게 됩니다.
  2. 지식 기반 Q&A:
    데이터베이스에서 직접적이고 동적인 답변을 제공하여, 데이터 접근을 신속하고 사용자 친화적으로 만듭니다.
  3. 감정 분석:
    텍스트 소스를 분석하여 공개 감정을 평가하고, 기업에 실시간 피드백을 제공합니다.
  4. 고객 지원 챗봇:
    거의 정확한 지원 질문에 대한 응답으로 고객 지원 팀의 운영 효율성을 향상시킵니다.
  5. 대량 문서의 정보 검색:
    방대한 저장소에서 특정 정보나 관련 문서를 빠르게 추출하여 데이터 관리를 간소화합니다.

이러한 사용 사례들은 GenAI Stack의 다양한 기능과 구성 요소가 어떻게 실제 문제를 해결하는데 도움이 될 수 있는지 잘 보여줍니다. AI 구동 검색 엔진, 지식 기반 Q&A, 감정 분석, 고객 지원 챗봇, 그리고 대량 문서의 정보 검색과 같은 다양한 애플리케이션에서 GenAI Stack의 활용성을 볼 수 있습니다.

GenAI Stack은 주로 7개의 주요 구성 요소로 구성되어 있습니다:

  1. 데이터 추출 및 로딩(Data Extraction & Loading): 다양한 소스에서 데이터를 추출하는 것을 지원하며, 이에는 구조화된(sql, postgress 등), 비구조화된(pdf, 웹 페이지 등) 및 반구조화된(mongoDB, documentDB 등) 데이터 소스가 포함됩니다.
  2. 임베딩(Embeddings): 데이터의 수치적 표현으로, 일반적으로 단어, 문장 또는 다른 객체를 벡터 공간에서 표현하는 데 사용됩니다.
  3. 벡터 데이터베이스(Vector Databases): 추출된 데이터가 벡터 임베딩으로 변환되며, 이 임베딩은 빠르고 정확하게 검색할 수 있는 형식으로 데이터를 표현합니다.
  4. 프롬프트 엔진(Prompt Engine): 사용자 쿼리와 필요한 프롬프트 유형을 기반으로 프롬프트 템플릿을 생성하는 것이며, 이 템플릿은 소스 데이터베이스에서 관련 데이터를 검색하는 데 사용됩니다.
  5. 검색(Retrieval): 여러 검색 관련 작업을 관리하는 것이며, 이는 필요한 정보 또는 자원을 검색하는 것, 프롬프트 엔진 구성 요소에서 프롬프트 템플릿을 검색하고 포맷을 지정하여 기대되는 형식과 일치하게 하는 것 등을 포함합니다.
  6. 메모리(Memory): 채팅 시스템 내에서 중요한 구성 요소로, 사용자와 LLMs 간의 과거 상호 작용 기록을 유지하는 것이 주요 기능입니다.
  7. 모델(Model): 큰 언어 모델은 사용자 쿼리를 기반으로 벡터 임베딩을 활용하여 응답이나 인사이트를 생성합니다.

ETL(Extract, Transform, Load)

ETL은 다양한 출처에서 데이터를 출처로부터 얻어오고, 사용 가능하게 변환하며, 대상 시스템에 로드하는 프로세스입니다.
ETL은 Extract(추출), Transform(변환) 및 Load(로드)를 의미합니다. 이것들은 데이터 소스에서 대상 목적지로 변환/이동하는 세 가지 주요 단계입니다.
여기에서는 여러 다른 소스로부터 문서를 가져오고 (추출), 그것을 임베딩으로 변환 (변환)하며, 마지막으로 벡터 데이터베이스에 로드 (로드)합니다. 따라서 이 ETL 프로세스는 소스에서 벡터db 목적지로의 데이터 로딩 부분을 달성합니다.

임베딩(Embeddings)

임베딩은 데이터의 수치적 표현으로, 일반적으로 벡터 공간에서 단어, 문장 또는 다른 객체를 표현하는 데 사용됩니다. 자연어 처리(NLP)에서는 단어 임베딩이 널리 사용되어 단어를 밀집 벡터(dense vectors)로 변환합니다. 각 단어는 의미론적으로 유사한 단어가 유사한 벡터를 가지도록 고유한 벡터로 표현됩니다. 대표적인 단어 임베딩 방법으로는 Word2Vec, GloVe, FastText가 있습니다. 단어 임베딩은 감정 분석, 기계 번역, 명명된 엔터티 인식과 같은 다양한 NLP 작업에 필수적이며, 단어 간의 의미론적 관계를 포착하여 모델이 맥락과 의미를 이해하게 합니다. 단어뿐만 아니라 전체 문장이나 단락도 고정 길이 벡터로 임베딩될 수 있어 텍스트의 의미 정보를 보존합니다. 문장 임베딩은 텍스트 분류, 문서 클러스터링, 정보 검색과 같은 작업에 유용합니다.

벡터 데이터베이스

벡터 데이터베이스는 종종 “vectordbs”로 불리며, 벡터 임베딩을 효율적으로 저장, 관리, 및 쿼리하기 위해 설계된 특수 데이터베이스 시스템입니다. 이러한 데이터베이스는 의미론적 관계를 포착하는 데이터의 고차원 수치 표현을 처리하기 위해 맞춤 제작되었으며, 유사성 검색, 추천 시스템, 자연어 처리, 그리고 머신 러닝 애플리케이션과 같은 작업에 특히 적합합니다.

추출된 데이터는 그 후에 벡터 임베딩으로 변환됩니다. 이러한 임베딩들은 데이터의 표현으로서 빠르고 정확하게 검색할 수 있는 형식으로 제공됩니다. 임베딩들은 벡터 데이터베이스에 저장됩니다. GenAI Stack은 이러한 목적으로 weaviate와 chromadb와 같은 데이터베이스를 지원합니다.

프롬프트 엔진

프롬프트 엔진은 사용자 쿼리와 필요한 프롬프트 유형을 기반으로 프롬프트 템플릿을 생성하는 역할을 담당합니다. 생성된 프롬프트 템플릿들은 검색기(retriever)에 전달되며, 검색기는 이를 사용하여 소스 데이터베이스에서 관련 데이터를 검색합니다. 프롬프트 엔진은 또한 사용자 쿼리에 대한 검증을 수행하여, 이것이 검색기에 안전하게 전송될 수 있는지 확인합니다.

검색(Retrieval)

검색 컴포넌트는 다양한 검색 관련 작업을 관리하는 책임이 있습니다. 주요 목적은 필요한 정보나 자원을 검색하는 것으로, 예를 들어 vectordb 컴포넌트에서 관련 문서를 쿼리하고 검색하고, 이에 대한 후처리 작업을 수행하며, 프롬프트 엔진 컴포넌트에서 프롬프트 템플릿을 검색하고 이를 예상된 형식과 일치하도록 포매팅하는 것입니다. 또한 채팅 기록을 검색하고, 마지막으로 llm을 쿼리하고 메모리에 쿼리와 응답을 저장합니다.

다음은 검색기(Retriever)에게 일반적으로 관련된 역할들의 세부 사항입니다.

  1. 컨텍스트 획득: 검색기는 벡터 데이터베이스에서 데이터를 쿼리하고 검색하여 소스 데이터를 가져오는 역할을 합니다. 이 단계는 기본적으로 쿼리에 기반하여 관련 문서를 반환합니다.
  2. 후처리: vectordb에서 관련 문서를 검색한 후에, 검색기는 그것에 대해 후처리 작업을 수행합니다. 이에는 파싱이 포함되며, 또한 검색된 데이터를 정리, 포맷팅 또는 변환하여 추가로 사용하기에 적합하게 만드는 작업도 포함될 수 있습니다.
  3. 프롬프트 템플릿 획득: 프롬프트 템플릿은 미리 정의되거나 사용자가 정의할 수 있는 구조로, 사용자와의 대화나 상호 작용을 안내합니다. 검색기는 프롬프트 엔진 컴포넌트에서 이러한 템플릿을 획득합니다.
  4. 프롬프트 템플릿 포맷팅: 프롬프트 템플릿이 획득되면, 검색기는 이를 포맷팅하여 예상된 형식에 맞도록 만드는 역할을 합니다.
  5. 채팅 기록 획득: 채팅 기록에는 대화 내에서 이전의 상호작용과 교환된 메시지의 기록이 포함됩니다. 검색기는 프롬프트 템플릿에 대한 이전 채팅 기록을 획득합니다.
  6. 언어 모델 (LLM) 쿼리: 응답을 생성하기 위해, 검색기는 언어 모델 (LLM)과 상호작용합니다. 검색자는 LLM에 프롬프트 템플릿을 전송하며, 이는 검색된 컨텍스트를 기반으로 질문을 하거나 응답을 요청하거나 정보를 찾는 작업을 포함할 수 있습니다.
  7. 채팅 대화 저장: 최근의 채팅 대화는 대화 내에서 연속성과 맥락을 유지하기 위해 메모리에 저장됩니다.

검색기(Retriever) 컴포넌트 없이:

  • 사용자 쿼리 처리: 리트리버 컴포넌트가 없어도 스택 컴포넌트들은 각자의 역할을 수행합니다. 프롬프트 엔진은 프롬프트 템플릿의 구조를 정의하며, 메모리 컴포넌트는 채팅 기록을 저장하고, vectordb 컴포넌트는 컨텍스트와 벡터 임베딩을 처리하며, 모델 컴포넌트는 사용자 쿼리에 답변을 생성합니다.
  • 리소스 통합: 리트리버 없이 이러한 리소스의 통합은 더 수동적으로 이루어집니다. 다른 스택 컴포넌트들이 모델 컴포넌트에 대한 입력을 모으고 구조화하기 위해 함께 작업해야 할 수 있습니다. 예를 들어, 프롬프트 엔진, vectordb, 그리고 메모리 컴포넌트는 필요한 컨텍스트와 템플릿을 조립하기 위해 협력해야 할 수 있습니다.
  • 언어 모델과의 상호작용: 모델 컴포넌트는 프롬프트 엔진으로부터 구조화된 입력이나 템플릿을 직접 받아 응답을 생성할 것입니다.
  • 대화 메모리 업데이트: 이 시나리오에서는 각 컴포넌트가 대화 기록 업데이트를 관리하는 책임을 집니다. 예를 들어, 메모리 컴포넌트는 컨텍스트를 유지하기 위해 채팅 기록을 저장하고 검색하는데 더 적극적으로 행동해야 할 수 있습니다.

요약하자면, 리트리버 컴포넌트는 언어 모델과의 상호작용을 위해 다양한 스택 컴포넌트에서 리소스를 수집하고 통합하는 프로세스를 간소화하는 오케스트레이터 역할을 합니다. 리트리버 없이는 스택 컴포넌트들이 같은 결과를 얻기 위해 더 밀접하게 협력해야 하며, 이는 수동적인 정보 조정과 통합을 더 필요로 할 수 있습니다.

LLM 캐시

LLM 캐시 컴포넌트는 언어 모델(LLM)의 캐시를 관리하는 책임이 있습니다. 이 컴포넌트는 캐시를 저장하고 검색하는 역할을 하며, 선호하는 벡터 데이터베이스(weaviate 또는 chromadb)에 캐시를 저장하는 데 사용할 수 있습니다. 이 컴포넌트는 선택사항이며 스택의 성능을 향상시키는 데 사용할 수 있습니다. 이는 LLM에 대한 쿼리 수를 줄이고 비용 효율적입니다.

캐시 설정: LLM 캐시 컴포넌트는 언어 모델(LLM)의 캐시를 설정하는 책임이 있습니다. 이는 쿼리와 응답을 캐시에 저장하고 메타데이터와 함께 저장할 수 있습니다.

캐시 가져오기: LLM 캐시 컴포넌트는 언어 모델(LLM)의 캐시를 가져오는 책임이 있습니다. 이는 쿼리와 메타데이터를 기반으로 하이브리드 검색을 수행하여 캐시를 검색합니다. 반환된 캐시에는 쿼리에 대한 예상 응답이 포함됩니다.

스택은 LLM 캐시 컴포넌트 없이 사용할 수 있습니다. 이 경우, 스택은 LLM과 직접 상호 작용하여 응답을 생성할 것입니다.

메모리

메모리는 채팅 시스템 내에서 채팅 대화를 저장하고 관리하는 중요한 구성 요소입니다. 주요 기능은 사용자와 대규모 언어 모델(llms) 간의 과거 상호 작용 기록을 유지하는 것입니다. 이 저장된 정보는 여러 목적에 사용되며, 그 중에는 llm의 맥락상 관련된 응답 제공 능력을 향상시키고, 사용자 선호도를 추적하며, 원활하고 일관된 대화를 촉진하는 것이 포함됩니다. 사용자 입력과 시스템 응답을 저장함으로써 사용자 경험을 향상시키고 채팅 환경 내에서 개인화된 상호 작용을 가능하게 하는 소중한 자원을 만들어냅니다.

메모리 컴포넌트를 함께 사용할 때:

  • 컨텍스트와 연속성: 메모리 컴포넌트가 스택에 통합되면 시스템은 대화 내에서 컨텍스트와 연속성을 유지할 수 있습니다. 이 컴포넌트는 이전의 채팅 대화 기록을 저장하여 챗봇이나 애플리케이션이 대화에서 이전에 논의된 내용을 기억할 수 있게 합니다. 이는 관련성 있고 일관된 응답을 제공하는데 중요합니다.
  • 향상된 사용자 경험: 메모리 컴포넌트의 존재로 인해 챗봇은 더 개인화되고 사용자 친화적인 경험을 제공할 수 있습니다. 챗봇은 이전 메시지를 참조할 수 있어 대화가 더 자연스럽고 매력적으로 느껴지게 만듭니다.
  • 효율적인 후속 쿼리 처리: 사용자가 후속 질문을 하거나 대화의 이전 부분을 참조할 때, 메모리 컴포넌트는 관련 컨텍스트와 정보를 검색하는 데 도움을 주어 이러한 쿼리에 정확하게 답변하기 쉽게 만듭니다.
  • 개선된 채팅 기록: 메모리 컴포넌트에 의해 유지되는 채팅 기록은 사용자 상호 작용을 분석하고, 성능을 모니터링하며, 시간이 지남에 따라 챗봇의 응답을 미세 조정하는데 있어 가치 있는 자원이 됩니다.

메모리 컴포넌트 없이:

  • 제한된 컨텍스트 유지: 메모리 컴포넌트가 없으면 시스템은 메시지 간에 컨텍스트를 유지할 수 없습니다. 시스템은 각 사용자 입력을 고립된 쿼리로 처리할 수 있으며, 이로 인해 덜 일관성 있고 컨텍스트 인식이 떨어지는 응답이 발생할 수 있습니다.
  • 감소된 개인화: 과거의 상호 작용을 기억할 수 없기 때문에 챗봇은 일반적인 응답을 제공하고 사용자의 이전 입력을 기반으로 대화를 개인화하는 기회를 놓칠 수 있습니다.
  • 후속 질문 처리의 어려움: 후속 질문을 처리하거나 대화의 이전 부분을 참조하는 것이 어려울 수 있습니다. 시스템은 과거 메시지에 대한 기억이 없어 대화에서 혼란이 발생할 가능성이 있습니다.
  • 비효율적인 사용자 경험: 사용자는 후속 메시지에서 정보나 컨텍스트를 반복해야 할 수 있으며, 이는 사용자에게 불만을 주고 덜 효율적인 사용자 경험을 초래할 수 있습니다.

요약하자면, 메모리 컴포넌트는 스택 기반 아키텍처의 기능을 향상시키는 중요한 역할을 합니다. 이를 통해 시스템은 컨텍스트를 유지하고 개인화된 응답을 제공하며 후속 쿼리를 효율적으로 처리할 수 있습니다. 메모리 컴포넌트 없이 시스템은 일관되고 컨텍스트 인식이 있는 대화 경험을 제공하는 능력이 크게 감소하며, 이는 전반적인 사용자 만족도와 챗봇의 효과성에 영향을 미칠 수 있습니다. 따라서 메모리 컴포넌트를 포함시키는 것은 높은 품질의 대화 상호 작용을 제공하려는 시스템에 대한 주요 설계 고려 사항입니다.

LLMs(대규모 언어 모델):

대규모 언어 모델은 사용자의 쿼리에 기반하여 응답이나 통찰을 생성하기 위해 벡터 임베딩을 활용합니다. 우리는 ChatGPT와 gpt4all을 사전에 구성했지만, 사용자는 자신만의 커스텀 모델을 구성할 수 있습니다. gpt4all 및 기타 오픈 소스 LLMs와 함께, 이것은 개발자에게 전체 스택과 모델을 자신의 서버에 호스팅할 수 있도록 제공하며, 그들에게 필요한 개인 정보 보호와 보안을 제공합니다.

몇 가지 간단한 단계로 LLM 모델

실행 모델은 어떤 LLM을 실행할지 결정하는 컴포넌트입니다. 이 컴포넌트는 주로 HTTP 서버 아래에서 LLM 모델을 실행하고 API 엔드포인트를 통해 접근하기 위한 것입니다. 모델은 모델을 로드하고 검색 컨텍스트와 사용자 프롬프트를 적절하게 분석하고 모델에게 추론을 위해 제공하기 위한 필요한 전처리 및 후처리 함수를 로드하기 위한 것입니다. 응답 클래스도 모델의 요구 사항에 따라 사용자 정의할 수 있습니다. GenAI Stack은 Raw Response(문자열 또는 바이트)나 JsonResponse와 같은 것들을 지원합니다. 기본값은 JsonResponse입니다.


결론적으로, GenAI Stack은 다양한 애플리케이션에 대해 큰 언어 모델의 기능을 활용하기 위한 구조적인 접근법을 제공하는 종합적인 프레임워크입니다. 잘 정의된 구성 요소들은 원활한 통합 프로세스를 보장하며, 개발자가 고급 LLMs로 구동되는 애플리케이션을 빌드하기 더 쉽게 만듭니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다