어떻게 LLM 또는 ChatGPT를 이용하여 데이터 기반의 지능형 QA 챗봇을 구축하는가?

How to Build an Intelligent QA Chatbot on your data with LLM or ChatGPT

How to deploy a LLM chatbot

LLM(대규모 언어 모델)에 의해 강화된 지능형 챗봇의 세계를 소개합니다. 이 글에서는 조직의 질문 응답 챗봇에 LLM을 원활하게 통합하는 방법에 대해 깊이 다루겠습니다. 고수준의 시스템 디자인 요소와 코드 구현의 세세한 부분까지 깊숙이 소개합니다.

여러분의 Postgres 데이터베이스를 위한 뛰어난 오픈 소스 확장 프로그램인 ‘pgvector‘를 강조하고 싶습니다. 이 확장 프로그램은 임베딩의 효율적인 저장 및 검색을 가능하게 하여 벡터 유사성 검색을 용이하게 합니다.

또한, GPT 3.5/4를 사용하여 데이터 파일을 분석하고 질문을 제기하는 편리한 플러그 앤 플레이 솔루션을 찾고 있다면, ‘ quivr‘를 강력히 추천합니다. Quivr는 GenerativeAI의 힘을 활용하여 비구조화된 정보를 저장하고 검색하는 두 번째 뇌 역할을 합니다. AI 능력으로 터보충전된 Obsidian이라고 생각하시면 됩니다.

지능형 챗봇과 LLM 통합의 잠재력은 엄청나지만, 조직들은 이 과정에서 종종 여러 어려움에 부딪힙니다. 지능형 챗봇을 구축하고 LLM을 자체 조직 지식과 통합하는 것은 다양한 요소에 주의를 기울이며 신중하게 고려해야 합니다. 이러한 노력에서 조직들이 직면하는 일반적인 문제점 몇 가지를 살펴보겠습니다.

  1. 주요 장애물 중 하나는 훈련 데이터의 가용성 및 품질입니다. LLM은 훈련을 위해 대량의 고품질 데이터를 필요로 하지만, 조직들은 그들의 특정 도메인 또는 산업을 대표하는 충분하고 관련성 있는 데이터를 모으는 데 어려움을 겪을 수 있습니다. 또한, 훈련 데이터의 정확성과 다양성을 보장하는 것은 챗봇의 편향된 또는 왜곡된 응답을 방지하기 위해 중요합니다.
  2. 또 다른 도전 과제는 LLM을 조직의 기존 지식 기반과 통합하는 데 있습니다. 많은 조직들은 독점 데이터와 도메인 특화 정보를 보유하고 있습니다. 이 지식을 LLM과 효과적으로 통합하는 것은 복잡할 수 있으며, 데이터의 정밀한 매핑, 전처리, 및 구조화가 필요합니다. 조직들은 챗봇에 민감한 정보를 통합할 때 데이터 프라이버시와 보안 문제도 고려해야 합니다.
  3. 더욱이, 챗봇이 문맥에 맞는 응답을 이해하고 생성하는 능력을 보장하는 것은 중요한 장애물입니다. LLM은 강력하긴 하지만, 문맥의 모호성 해소와 미묘한 질의의 이해에 어려움을 겪을 수 있습니다. 조직은 챗봇의 이해력 및 응답 생성 능력을 향상시키기 위해 강력한 자연어 처리 기술과 미세 조정 전략에 투자해야 합니다.
  4. 확장성 역시 다른 도전과제입니다. 조직이 성장함에 따라 챗봇은 최적의 성능을 유지하면서 늘어나는 질의량을 처리해야 합니다. 챗봇의 확장성을 보장하기 위해서는 응답 지연, 동시 요청 처리, 효율적인 자원 할당과 같은 문제를 해결해야 합니다.
  5. 마지막으로, 사용자 경험은 챗봇의 성공에 있어 중요한 역할을 합니다. 조직은 직관적이고 사용자 친화적인 인터페이스를 설계하고, 기존 통신 채널과의 원활한 통합을 제공하며, 효과적인 오류 처리 및 대체 메커니즘을 구현해야 합니다. 자동화와 인간 개입 사이의 균형을 이루는 것은 만족스러운 사용자 경험을 창출하기 위해 중요합니다.

이러한 도전과제를 극복하는 것은 기술 전문지식, 도메인 지식, 그리고 다양한 기능, 팀들의 반복적인 개발 과정의 조합을 필요로 합니다.

이 글에서는 여러분에게 다음 내용들을 안내해 드리겠습니다:

  1. 조직의 독점적 지식을 사전 처리하여 (거의) 모든 LLM에 입력할 수 있게 하는 방법
  2. 관련 콘텐츠를 빠르게 검색하기 위해 조직의 지식 기반을 트리 구조로 구축하여 전체 말뭉치 대신 제한된 텍스트를 LLM에 전달하는 방법
  3. 오픈 소스 대규모 언어 모델에서 질의응답 챗봇 구축하기
  4. 챗봇에 메모리 부여하기
  5. 확장 가능한 환경에 배포하는 방법
  6. 모범 사례

데이터 모으기

조직의 모든 지식 기반을 한 곳에 모아봅니다. 이미 Confluence Wiki(Confluence는 조직에게 귀중한 정보의 보물 저장고 역할을 하는 인기 있는 위키 플랫폼)나 SharePoint, Wiki.js, Zoho Wiki 등 한 곳에 모여 있다면 관련 페이지를 파악하고 필터링된 콘텐츠의 목록을 생성하는 것이 좋습니다.

데이터셋을 준비하는 것은 어떤 기계 학습 모델에서도 가장 중요한 단계입니다. 이 단계는 실제로 전체 모델 개발 생명 주기(MDLC)에서 상당한 시간을 차지합니다. 왜냐하면 전체 프로젝트는 데이터셋의 품질, 관련성, 그리고 사전 처리에 의존하기 때문입니다.

이 예제에서는 Jira 문서를 기반으로 챗봇을 구축하겠습니다.

Jira Cloud resources page에는 다양한 주제에 관한 문서가 있습니다. 저는 ‘Search for issues in Jira’.라는 주제를 선택하기로 했습니다.

이 주제 아래에는 부모 주제와 관련된 다양한 하위 주제들이 있습니다.

Beautiful Soup (웹 스크레이핑 라이브러리)을 사용하거나 각 페이지에 직접 접속하여 전체 웹페이지를 복사하고 워드 문서에 붙여 넣을 수 있습니다.

원하는 결과는 모든 지식 기반 기사가 하나의 폴더 내의 .txt 파일에 들어있어야 합니다.

임베딩 생성하기

간단한 용어로 임베딩은 단어, 문장 또는 문서의 의미와 문맥을 포착하는 숫자적 표현입니다. 그것들은 텍스트의 본질을 나타내는 간결한 코드나 요약과 같습니다.

왜 임베딩이 필요한가요? 여기서는 입력된 질문과 유사한 내용(또는 관련 문서)을 찾기 위해 임베딩을 사용하며, 전체 말뭉치를 모든 질문에 전송하는 대신 관련 문서만 LLM의 문맥으로 전달합니다.

임베딩의 다른 여러 사용 사례도 있지만, 여기서는 가장 가까운 이웃 검색만을 위해 사용됩니다.

따라서 우리의 모든 말뭉치를 임베딩으로 변환하려면  SentenceTransformers라는 Transformer 라이브러리를 사용할 수 있습니다.

SentenceTransformers는 문장, 텍스트 및 이미지 임베딩을 위한 Python 프레임워크입니다. 초기 작업은 “Sentence-BERT: Siamese BERT-Networks를 사용한 문장 임베딩”이라는 논문에서 설명되어 있습니다.

이 프레임워크를 사용하여 100개 이상의 언어에 대한 문장/텍스트 임베딩을 계산할 수 있습니다. 이 임베딩은 코사인 유사도와 같은 것으로 비교하여 유사한 의미를 가진 문장을 찾을 수 있습니다. 이는 의미론적 텍스트 유사도(STS), 의미론적 검색 또는 순화 마이닝에 유용할 수 있습니다.

  1. Semantic Textual Similarity (STS; 의미론적 텍스트 유사성)
    • STS는 두 문장이나 문구 간의 의미적 유사성을 측정하는 작업입니다.
    • 예를 들어, “강아지는 동물입니다”와 “강아지는 생물체입니다”라는 문장은 다르게 표현되었지만 유사한 의미를 지닙니다. STS는 이러한 유사성을 숫자 값으로 표현할 수 있습니다.
    • 이 작업은 기계 학습, 특히 딥 러닝 방법에 의존하는 경우가 많습니다.
  2. Semantic Search (의미적 검색)
    • 의미적 검색은 검색어와 도큐먼트 또는 데이터셋의 내용 간의 의미적 관계를 파악하여 관련성이 높은 결과를 반환하는 검색 방법입니다.
    • 전통적인 키워드 기반 검색과 달리, 의미적 검색은 단순한 문자 일치보다는 문맥과 의미를 고려합니다.
    • 예를 들어, “태양의 에너지”라는 검색어로 “태양광 발전”에 관한 내용을 찾을 수 있습니다.
  3. Paraphrase Mining (패러프레이즈 마이닝)
    • 패러프레이즈 마이닝은 큰 텍스트 데이터셋에서 의미적으로 유사한 문장 또는 문구를 찾아내는 작업입니다.
    • 예를 들어, “우주에서 가장 가까운 별은 무엇입니까?”와 “가장 가까운 천체는 어떤 별입니까?”와 같은 문장은 다르게 표현되었지만 같은 의미를 지닙니다. 패러프레이즈 마이닝을 사용하면 이러한 유사성을 갖는 문장들을 찾아낼 수 있습니다.

이 프레임워크는 PyTorch와 Transformers를 기반으로 하며 다양한 작업에 튜닝된 사전 학습된 모델의 큰 컬렉션을 제공합니다. 또한, 자신의 모델을 세밀하게 튜닝하는 것도 쉽습니다.

조직의 지식 기반은 매일 바뀌지 않을 것이므로, 임베딩에서 ANN 모델(다음 단계에서 설명)을 제안하고 S3와 같은 저 지연 스토리지에서 빠르게 검색할 수 있도록 저장하는 것이 좋습니다.

import os
from sentence_transformers import SentenceTransformer


# all-MiniLM-L6-v2 is the fastest mode in the
# size bracket. You can also use other models
# for better quality or choose smaller models
# for performance. 
# https://www.sbert.net/docs/pretrained_models.html#model-overview

model = SentenceTransformer('all-MiniLM-L6-v2')

# Load corpus
data_dir = "./data"
os.listdir(data_dir)

corpus = []

for filename in os.listdir(data_dir):
    print(f"Loading file {filename}")
    
    with open(f"{data_dir}/{filename}") as f:
        doc = f.readlines()
        corpus.append(doc)
        
assert len(corpus) == len(os.listdir(data_dir))

# Build Embeddings
embeddings = model.encode(corpus)
assert embeddings.shape[0] == len(corpus)

주의


이 라이브러리의 이름에서 알 수 있듯이, 이것은 문장 변환기입니다. 그리고 우리는 이것을 사용하여 전체 문서를 변환했습니다.

이는 최대 길이 이후의 모든 단어들을 잘라내기 때문입니다. 그리고 우리는 문서의 핵심을 처음의 단어들이 잘 설명한다고 가정합니다.

그러나 실제 제품화 환경에서는 더 나은 품질을 달성하기 위해 주제를 더 세밀하게 세분화해야 합니다.

  1. 라이브러리의 성격: Sentence Transformers는 문장을 인코딩하기 위해 설계되었습니다. 더 큰 텍스트에 이를 사용하는 것은 문제가 될 수 있습니다.
  2. 축소 문제: 텍스트가 최대 길이(일반적으로 기본 변환 모델, 예: BERT의 512 토큰에 의해 결정됨)를 초과하면 라이브러리는 초과분을 잘라내게 되어 중요한 정보를 잃을 수 있습니다.
  3. 초기 단어 가정: 경고에 따르면 문서의 시작 부분이 그 문서의 주요 아이디어나 본질을 잘 나타낸다는 가정을 하고 있다고 합니다. 그러나 특히 긴 문서의 경우 이것이 항상 사실일 수는 없습니다.
  4. 생산 환경 조언: 생산 환경에서는 임베딩의 품질을 유지하고 중요한 정보를 놓치지 않도록 문서를 보다 효과적으로 세분화(예: 단락이나 섹션 별로)하는 것이 좋습니다.

긴 텍스트에 Sentence Transformers를 사용할 계획이라면 주의해야 하며, 텍스트를 세분화하거나 더 긴 시퀀스에 특별히 설계된 모델을 사용하는 전략을 탐구해야 합니다.

ANN 모델 구축

간단한 용어로 설명하자면 근사 최근접 이웃 (ANN,Approximate Nearest Neighbour) 모델은 대규모 데이터셋에서 주어진 항목과 유사하거나 가까운 항목을 찾을 때, 모든 항목을 철저히 검색하는 것 없이 도와주는 기술입니다.

예를 들어, 동물의 사진과 같은 대량의 항목 모음을 가지고 있다고 가정해보세요. 이 컬렉션에서 주어진 개의 사진과 가장 유사한 사진을 찾고 싶다고 상상해보세요. 모든 사진을 하나씩 찾아보는 대신, ANN 모델은 검색 범위를 빠르게 좁히고 효율적으로 유사한 사진을 찾게 해줍니다.

마찬가지로, 조직은 챗봇에 질문할 수 있는 수십만 개의 주제 하위 집합을 가질 수 있습니다. 따라서 모든 가능한 문서에서 가장 관련 있는 상위 k 자료를 찾으려고 시도하는 대신, ANN 모델은 빠르게 거의 유사한 문서 몇 개를 출력할 것입니다.

ANN 모델은 항목들이 그들의 유사성에 기반하여 조직되는 공간 또는 표현을 생성함으로써 작동합니다. 이 공간은 데이터를 더 구조화된 형태로 변환하는 수학적 알고리즘을 사용하여 구축됩니다. 항목들은 그들의 특징이나 특성을 기반으로 이 공간의 특정 위치에 매핑됩니다.

주어진 항목에 가장 가까운 이웃(가장 유사한 항목)을 찾고 싶을 때, ANN 모델은 데이터셋의 모든 항목과 비교할 필요가 없습니다. 대신, 공간을 통해 내비게이션하는 데 똑똑한 기술을 사용하여 유사성에서 가깝게 될 가능성이 있는 더 작은 후보 하위 집합을 식별합니다. 이로 인해 검색 과정이 크게 가속됩니다.

ANN 모델의 핵심 아이디어는 효율성을 위해 정확성의 조금을 희생한다는 것입니다. 그들은 정확한 가장 가까운 이웃에 아주 가까운 근사 해답을 제공하지만, 훨씬 빠른 검색 시간으로 결과를 도출합니다. 따라서 무차별한 KNN(K Nearest Neighbour) 검색의 recall이 1이라면, 사용하는 ANN 모델에 따라 그 리콜은 1보다 작을 것입니다. 이런 근사치는 우리가 큰 데이터셋을 처리하고 실시간 또는 거의 실시간으로 유사성 검색을 수행할 수 있게 합니다.

ANN 모델, 즉 근사 최근접 이웃(Approximate Nearest Neighbour) 모델은 대규모 데이터셋에서 주어진 항목과 유사한 항목을 빠르게 찾는 데 사용되는 알고리즘입니다. 전체 데이터셋을 모두 탐색하지 않고도 유사한 항목을 찾을 수 있기 때문에 검색 시간을 크게 단축시킬 수 있습니다.

ANN 모델의 핵심 원리는 다음과 같습니다:

  1. 공간 구축: 항목들은 그들의 특징 또는 특성에 기반하여 특정 공간 내에서 조직됩니다. 이 공간은 항목들 간의 유사성을 반영하여 구축됩니다.
  2. 빠른 탐색: 주어진 항목과 가장 유사한 항목을 찾을 때, ANN 모델은 데이터셋의 모든 항목과 비교하는 대신, 특정 공간 내에서 똑똑한 기술을 사용하여 유사한 항목의 후보군을 빠르게 식별합니다.
  3. 정확성 vs 효율성: ANN은 완벽한 정확성을 목표로 하지 않습니다. 대신, 훨씬 빠른 검색 시간을 제공하면서도 근접한 결과를 제공하는 것을 목표로 합니다. 따라서 완벽한 최근접 이웃 결과와 약간 다를 수 있지만, 검색 시간은 크게 줄어듭니다.

실제 응용 분야에서는 이미지 검색, 추천 시스템, 자연어 처리 등에서 ANN 모델이 활용됩니다. 이러한 모델은 대규모 데이터셋에서 실시간 또는 거의 실시간으로 유사성 검색을 수행해야 하는 상황에서 특히 유용합니다.

How it will be used

  • How FAISS will be used

FAISS는 Facebook Research에서 개발한 밀집 벡터를 위한 유사성 검색 라이브러리로, 이를 활용하여 견고한 검색 인덱스를 구축합니다. 사용자가 챗봇에 질문을 제시하면, 백엔드에서 특정 프로세스를 따릅니다. 먼저, Sentence Transformer를 사용하여 질문을 임베딩으로 인코딩합니다. 그 다음, 이 임베딩을 검색 인덱스에 공급하여 가장 가깝게 일치하는 임베딩을 검색합니다. 이 가장 가까운 일치 임베딩은 그에 해당하는 코퍼스 문서와 연결됩니다. 마지막으로, 이 문서를 사용자의 질문과 함께 대형 언어 모델(Large Language Model, LLM)이 처리할 수 있도록 문맥 정보로 포함시킵니다.

FAISS는 밀집 벡터의 효율적인 유사성 검색 및 클러스터링을 위한 라이브러리입니다. RAM에 들어갈 수 없을 만큼 큰 것까지 모든 크기의 벡터 집합에서 검색하는 알고리즘을 포함하고 있습니다. 또한 평가와 파라미터 튜닝을 위한 지원 코드도 포함되어 있습니다. FAISS는 C++로 작성되었으며 Python/numpy를 위한 완전한 래퍼(wrapper)를 갖추고 있습니다. 가장 유용한 알고리즘 중 일부는 GPU에서 구현되어 있습니다.

Build a FAISS Index

try:
    import faiss
except:
    !pip install faiss-cpu -q
    import faiss
    
    
# Build the index
d = embeddings.shape[1]        # Dimension
index = faiss.IndexFlatL2(d)

# Add vectors to the index
index.add(embeddings)
print(index.ntotal)

# Sanity Check
# "model" is our Sentence Transformer model
xq = model.encode(["I am not able to find my issue, where is it gone?"])
k = 1
D, I = index.search(xq, k)

print(corpus[0])
  1. Faiss 라이브러리 임포트:
   import faiss
  1. 인덱스 생성:
   d = <dimension of your embeddings> # 예: Sentence Transformer로 인코딩된 임베딩의 차원
   index = faiss.IndexFlatL2(d)
  1. 임베딩을 인덱스에 추가:
   xb = <your embeddings matrix> # 이것은 당신의 문서나 데이터의 임베딩들입니다.
   index.add(xb)
  1. 정상 작동 여부 검증:
   xq = <encoded question using Sentence Transformer>
   k = <number of nearest neighbors you want to retrieve> # 보통 1~5 사이의 값을 사용합니다.
   D, I = index.search(xq, k)

여기서, D는 검색된 결과들과의 거리를 나타내는 행렬이고, I는 해당 결과들의 인덱스를 나타내는 행렬입니다.

  1. 결과 확인:
   print("Retrieved document:", corpus[I[0][0]])

corpus[I[0][0]]는 검색된 문서나 데이터 중에서 가장 유사한 항목을 반환합니다.

이 프로세스를 통해 주어진 질문에 대한 가장 관련 있는 문서나 데이터를 빠르게 찾을 수 있습니다.

You can also pose other questions like “Can I save my search results?”:

ANN (Approximate Nearest Neighbors)를 사용하는 주요 이유

  1. 응답 시간 최소화: 대규모 데이터셋에서 유사한 항목을 찾기 위해 전체 데이터셋을 모두 탐색하는 것은 매우 비효율적입니다. ANN는 이러한 검색을 빠르게 수행하여 챗봇과 같은 실시간 서비스에서 필요한 빠른 응답 시간을 제공합니다.
  2. 자원 최적화: ANN를 사용하면 계산 및 메모리 자원을 효율적으로 사용할 수 있습니다. 이는 특히 대규모 데이터셋을 처리하는 데 매우 중요합니다.
  3. 효율적인 근사: ANN는 완벽한 결과를 제공하는 것이 아니라 ‘근사적’인 결과를 제공합니다. 하지만 이 근사치는 대부분의 실용적인 사용 사례에서 충분합니다.

또한, 다양한 오픈 소스 ANN 라이브러리가 있습니다:

  • Scann: Google Research에서 개발한 ANN 라이브러리로, 높은 효율성을 제공합니다.Scann by google research
  • Annoy: Spotify에서 개발하였으며, 디스크에 저장된 대규모 데이터셋에서의 빠른 검색을 위해 설계되었습니다. Annoy by Spotify

여러 ANN 라이브러리의 성능과 특성을 비교하려면 ANN-Benchmarks 웹사이트를 참조하면 좋습니다. 이를 통해 특정 문제나 요구 사항에 가장 적합한 라이브러리를 선택할 수 있습니다.

Build QA model

There are two main types of Large Language Models currently in the market:

  1. Base LLM : Base LLM은 대량의 텍스트 데이터로 훈련된 언어 모델입니다. 이는 다양한 언어 작업을 수행할 수 있으며, 특정 지시사항 없이도 질문에 대한 답변을 생성할 수 있습니다.
  2. Instruction Tuned LLM : Instruction Tuned LLM은 특정 지시사항에 따라 세밀하게 조정된 언어 모델입니다. 이 모델은 특정 작업, 예를 들면 질의응답,에 더 효과적으로 대응하기 위해 훈련되었습니다. 사용자의 지시를 더 정확하게 이해하고 그에 맞는 응답을 생성합니다.

Base LLM

Base LLM은 텍스트 훈련 데이터를 기반으로 다음 단어를 반복적으로 예측합니다. 그래서 만약 다음과 같은 시작 문장을 주면,

“옛날 옛날에 유니콘이 한 마리 있었어요”
이 모델은 한 번에 하나의 단어를 반복적으로 예측함으로써, 마법의 숲에서 모든 유니콘 친구들과 함께 사는 유니콘에 대한 이야기를 완성할 수 있습니다.

이제 여기에는 단점이 있습니다. 만약

프랑스의 수도는 무엇인가요?
라는 프롬프트를 준다면, 인터넷에는 프랑스에 관한 퀴즈 문제 목록이 있을 수 있습니다. 그래서 이에 대한 완성이

응답:
프랑스의 가장 큰 도시는 무엇인가요, 프랑스의 인구는 얼마나 되나요?
등으로 나올 수 있습니다. 그러나 실제로 원하는 것은 이 모든 질문을 나열하는 것이 아니라 프랑스의 수도가 무엇인지 알려주길 바랄 것입니다.

Instruction Tuned LLM

Instruction Tuned LLM은 대신 지시사항을 따르려고 시도하며, 아마도 다음과 같이 말할 것입니다.

응답: 프랑스의 수도는 파리입니다.

Base LLM에서 Instruction Tuned LLM으로 어떻게 변환하나요? 이것이 ChatGPT와 같은 Instruction Tuned LLM을 훈련시키는 과정입니다. 먼저 많은 데이터, 수천억 단어 또는 그 이상의 데이터로 Base LLM을 훈련시킵니다. 이 과정은 큰 슈퍼컴퓨터 시스템에서 몇 개월 동안 진행될 수 있습니다. Base LLM을 훈련시킨 후에는 출력이 입력 지시사항을 따르는 더 작은 예제 집합으로 모델을 세밀하게 훈련시킵니다.

Base LLM에서 Instruct LLM으로의 전환은 조직이 필요한 데이터, 전문 지식 및 자원을 보유하고 있지 않다면 의미가 없을 수 있습니다. 그러나 오픈 소스 Instruct LLM 또는 ChatGPT를 사용하여 귀하의 질의응답 봇을 만들 수 있습니다.

오픈 소스 LLM 중, GPT4All은 GPU나 인터넷이 없어도 귀하의 기계(또는 클라우드)에서 작동하는 무료로 사용 가능하며, 개인 정보를 존중하는 챗봇입니다.

본질적으로, GPT4All은 소비자용 CPU에서 로컬로 실행되는 강력하고 맞춤형의 큰 언어 모델을 훈련하고 배포하기 위한 생태계입니다. 그들의 웹사이트에서 제공하는 GPT4All 도구는 모든 운영체제에서 다운로드하여 개발 또는 플레이(아마도 생산용으로도)에 사용할 수 있습니다.

그들의 목표는 — 개인 또는 기업이 자유롭게 사용, 배포 및 구축할 수 있는 최고의 지시어 기반 어시스턴트 스타일 언어 모델이 되는 것입니다.

GPT4All 모델은 3GB에서 8GB 크기의 파일로, GPT4All 오픈 소스 생태계 소프트웨어에 다운로드하여 연결할 수 있습니다. Nomic AI는 이 소프트웨어 생태계의 품질과 보안을 강화하면서 개인 또는 기업이 자체 온-엣지 대규모 언어 모델을 쉽게 훈련하고 배포할 수 있도록 노력을 주도하고 있습니다.

GPT4All 도구를 기계에 설치한 후, 이렇게 보일 것입니다:

For our chatbot we will use pip gpt4all library.

try:
    import gpt4all
except:
    !pip install gpt4all==0.3.6 -q
    import gpt4all
    

# You can also use other models
gptj = gpt4all.GPT4All("ggml-gpt4all-j-v1.3-groovy")

messages = [
    {
        "role": "user", 
        "content": (
            "Take the context from context xml tags and answer the question "
            f" between question xml tags. <context>{text}<context>"
            "<question>I can't find my recent issue?<question>"
        )
    }
]
response = gptj.chat_completion(messages)

print(response["choices"][0]["message"]["content"])

이 코드는 GPT4All 라이브러리를 사용하여 챗봇 응답을 생성합니다.

  1. 먼저, gpt4all을 가져오려고 시도합니다. 만약 라이브러리가 설치되어 있지 않으면, 해당 라이브러리를 pip를 사용하여 설치합니다.
  2. 그 후, GPT4All 클래스의 인스턴스를 생성하고, 이를 통해 특정 모델인 ggml-gpt4all-j-v1.3-groovy를 로드합니다.
  3. messages라는 리스트에 사용자의 메시지를 정의합니다. 이 메시지는 XML 태그를 사용하여 컨텍스트와 질문을 구분합니다.
  4. gptj.chat_completion(messages)를 사용하여 모델에 질문을 제출하고 응답을 받습니다.
  5. 마지막으로, 응답의 내용을 출력합니다.

이 코드는 주어진 컨텍스트와 질문을 기반으로 ggml-gpt4all-j-v1.3-groovy 모델을 사용하여 응답을 생성하는 방법을 보여줍니다.

Input:

Output:

제품 환경의 QA에서는 QA 봇이 사용자의 이전 메시지를 유지하는 것이 바람직합니다. 따라서 후속 질문을 처리할 때 이전 상호 작용에서의 전체 메시지 체인을 포함합니다.

이전 질문의 지식이 필요한 새로운 질문을 해봅시다:

Response:

때로는 모델이 응답의 끝 부분에 관련 없는 질문을 포함할 수 있습니다. 이러한 행동이 특이하게 보일 수 있지만, 그렇게 드문 것은 아닙니다. 모델에 의해 생성된 언어는 다양할 수 있지만 기본적인 의미는 동일합니다.

그러니 여기 있습니다 — 문맥을 이해하는 QA 봇.

프롬프트 기술을 향상시키기 위해, Isa Fulford와 Andrew Ng의 ‘개발자를 위한 ChatGPT 프롬프트 엔지니어링(ChatGPT Prompt Engineering for Developers)’이라는 짧은 코스를 듣는 것을 추천합니다. 그들은 또한 ChatGPT 프로그래밍에 관한 다른 무료 짧은 코스를 제공하는데, 이에는 응용 프로그램 개발 및 langchain 사용이 포함됩니다. 이런 소중한 자원을 꼭 탐험해 보세요.

다른 옵션들

business problem에 따라 다른 오픈 소스 LLM들도 시도해 볼 수 있습니다.

Falcon 7B Instruct (7B는 70억 파라미터를 의미하며, 원래의 Falcon은 400억 파라미터인 Falcon 40B Instruct를 가지고 있고 100GB의 RAM이 필요합니다) 역시 유망한 결과를 보여줍니다.

다음 코드는 transformers 라이브러리에서 Falcon 7B를 어떻게 사용하는지 보여줍니다:

!!pip install transformers torch einops -U accelerate -q

from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch


model = "tiiuae/falcon-7b-instruct"

tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)

def query(q:str) -> None:
    template = (
        "You are an artificial intelligence assistant. "
        "The assistant gives helpful, detailed, and "
        f"polite answers to the user's questions. {question} "
    ) # Checkout above course for a better prompt
    query = template + q
    sequences = pipeline(
        q
        max_length=200,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        eos_token_id=tokenizer.eos_token_id,
    )
    
    
sequences = pipeline(
   """Based on the following document answer the question between xml tags."""
   f"""<document>{document}<document>\n""" # document is the relevant context from ANN
   f"""<question>How do I find my issue?<question>""",
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    max_new_tokens=2000,
    eos_token_id=tokenizer.eos_token_id,
)

for seq in sequences:
    print(f"Result: {seq['generated_text']}")

And the output of this LLM:

Falcon 7B Response

응답은 나쁘지 않다고 말하겠습니다, 전혀 나쁘지 않습니다.

Open Assistant도 시도해 볼 수 있으며, 이는 HuggingChat의 기본 모델이기도 합니다.

충분한 RAM이 있다면, Vicuna (13B 버전과 7B 버전 둘 다 있음)도 시도해 볼 만 합니다.

다음 웹사이트에서 거의 모든 오픈 소스 LLM과 대화를 즐길 수 있습니다 — https://chat.lmsys.org/

답글 남기기

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