
읽기 시간 : ~ 10 분
Pulsejet github Repo를 사용한 아트 데코 래그 챗봇 빌딩 : https://github.com/jet-engine/art-deco-chatbot
이 블로그 포스트는 다음 링크에서 읽을 수 있습니다.
대형 언어 모델 (LLM)은 상당히 발전하여 광범위한 질문에 답할 수있는 능력을 향상 시켰습니다. 그러나 그들은 여전히 특정 또는 최근 정보와 관련하여 도전에 직면하여 종종 부정확성이나 "환각"을 초래합니다. 이러한 문제를 해결하기 위해 검색 증강 생성 (RAG) 접근법은 문서 검색 단계를 응답 생성 프로세스에 통합합니다. 이 접근법은 문서의 코퍼스를 사용하고 효율적인 검색을 위해 벡터 데이터베이스를 사용하여 세 가지 주요 단계를 통해 LLM 응답의 정확성과 신뢰성을 향상시킵니다.
벡터 데이터베이스는 빠른 유사성 검색과 효율적인 데이터 관리를 용이하게하여 RAG를 LLM 기능을 향상시키기위한 강력한 솔루션입니다.
1920 년대에서 1940 년대까지의 아르 데코 시대는 건축에서 눈부신 유산을 남겼습니다. Meta의 LLAMA3.1과 같은 모델의 기능에도 불구하고, 특히 Art Deco와 관련된 미묘한 또는 상세한 쿼리에 대해서는 응답이 신뢰할 수 없습니다. Art Deco Chatbot의 목표는 Rag를 사용하여 Art Deco Architecture에 대한 응답 품질을 향상시켜 품질과 시간 효율성 모두에서 전통적인 LLM에 의해 생성 된 것과 비교하는 것입니다.
Art Deco Chatbot을 설계함으로써 복잡한 걸레 시스템을 구축 할 수있는 방법을 보여줍니다. Art Deco Chatbot Github 저장소에서 전체 코드에 액세스 할 수 있습니다. 코드를 검토 하고이 readme를 읽으면 다음을 배울 것입니다.
Ollama는 로컬 기계에서 LLM 모델을 쉽게 실행하는 것을 용이하게하는 프로그램입니다.
ollama pull llama3.1 (헝겊에 사용될 LLM)ollama pull nomic-embed-text (헝겊에 사용될 임베딩 모델) 이 프로젝트에서는 RAG를 수행 할 수있는 방법을 보여주기 위해 코드를 작성하는 것을 목표로 할뿐만 아니라 RAG의 결과를 다른 LLM과 비교하고 벤치마킹하는 것을 목표로합니다. 이러한 LLM 중 일부는 GPT-4o 와 같은 로컬로 실행할 수없고, 다른 LLM은 컴퓨팅이 무겁고 클라우드 서비스에서 실행됩니다 ( Llama3.1:70b 와 예 : GROQ에서).
Litellm은 서로 다른 LLM을 쿼리하기위한 통합 인터페이스를 제공하여 코드를 깨끗하고 읽을 수있게합니다. Litellm Python 라이브러리를 확인하는 것이 권장되지만이 프로젝트에는 필요하지 않습니다.
OpenAI 및 Groq에서 API 키를 가져와 프로젝트에서 사용하십시오. 이 서비스를 사용하는 것에 대해 청구 될 수 있습니다. 글을 쓰는 시점에 Groq API 무료로 사용할 수 있지만 OpenAI API 무료가 아닙니다.
PulseJet은 고성능 벡터 데이터베이스로, 문서 임베드의 효율적인 저장 및 검색을 가능하게합니다. PulseJet 설정 :
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet 로 Docker 컨테이너 만들기 참고 : PulseJet이 requirements.txt 파일에 이미 포함되어 있으므로 첫 번째 단계를 건너 뛸 수 있습니다.
PulseJet Docker 이미지 실행 및 벡터 데이터베이스 작업에 PulseJet Python 라이브러리 사용에 대한 자세한 내용은 PulseJet 문서를 확인하십시오.
실행하여 필요한 모든 종속성을 설치하십시오.
pip install -r requirements.txt
이 프로젝트는
Python 3.11있는conda환경을 사용하여 개발되었습니다.
다른 환경에서 프로젝트를 테스트하지 않았으므로 최적의 성능과 호환성을 위해이 구성을 고수하는 것이 좋습니다.
Art Deco Chatbot은 config.template.yaml 및 secrets.yaml 의 구성을 위해 두 개의 YAML 파일을 사용합니다. 각 섹션의 자세한 분석은 다음과 같습니다.
API 키로 secrets.yaml 파일을 만듭니다.
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "다음은 각 섹션에 대한 자세한 설명입니다.
true 로 설정하면 시스템이 지정된 파일에서 임베딩을로드합니다. false 경우 새 임베딩을 생성 하여이 파일에 저장합니다. 프로젝트를 실행하기 전에 이러한 구성 파일을 특정 설정으로 업데이트하십시오. RAG 매개 변수를 조정하면 RAG 시스템의 성능과 정확도에 크게 영향을 줄 수 있습니다. 특정 사용 사례 및 문서 세트에 대한 최적의 구성을 찾으려면 다른 값을 가진 실험이 필요할 수 있습니다.
wiki-bot.py 와 함께 스크레이퍼 실행이 단계는 wikipedia의 모든 긁힌 기사의 컨텐츠 파일이 https://huggingface.co/datasets/jetengine/art_deco_usa_ds에서 제공되므로 선택 사항입니다 .
이 데이터 세트를 다운로드하고 모든 텍스트 파일을 rag_files 디렉토리에 복사 할 수 있습니다. 다음 섹션에서 설명 될 미리 계산 된 임베딩을 사용하려는 경우 실제로이 데이터 세트를 다운로드 할 필요는 없습니다.
스크래핑 과정을 반복 할 필요가 없습니다. 데이터 스크래핑 프로세스에 관심이 없다면이 섹션의 나머지 읽기를 건너 뛸 수 있습니다.
우리의 초기 단계는 Art-Deco Architecture에 대한 지식을 수집하는 것입니다. 우리는 Art-Deco 운동에서 눈에 띄는 것을 감안할 때 미국 구조에 중점을 둡니다. wiki-bot.py 스크립트는 관련 Wikipedia 기사 모음을 자동화하여 액세스 할 수 있도록 구조화 된 디렉토리로 구성합니다.
다음을 사용하여 봇을 실행하십시오.
python wiki-bot.py
빈 rag_files 디렉토리로 wiki-bot.py를 실행하면 rag_files 아래에있는 text 라는 서브 폴더에 스크랩 된 Wikipedia 기사의 내용을 저장합니다. 봇은 또한 기사 URL, 참조 등과 같은 다양한 유형의 데이터를 구성하기 위해 다양한 하위 폴더를 생성합니다. 현재 초점은 Wikipedia 기사의 내용에만 해당하기 때문에 text 하위 폴더에서 HG 데이터 세트로 내용을 전송하고 다른 모든 서브 폴더 만 제거했습니다.
따라서, 스크랩 된 문서가 이미 껴안는 얼굴에서 스크랩 된 문서를 직접 실행하려면 텍스트 하위 폴더에서 rag_files 디렉토리로 모든 파일을 복사 한 다음 rag_files 내의 모든 하위 폴더를 삭제하거나 config.yaml 에서 rag_files_path rag_files/text 로 변경해야합니다.
indexing.py 사용하여 문서를 색인화합니다실행하여 문서를 색인화합니다.
python indexing.py
이 스크립트는 문서를 처리하고 임베딩을 생성하며 PulseJet에 저장합니다. 임베딩을 생성하기 위해 시간을 잃고 싶지 않다면 https://huggingface.co/jetengine/rag_art_deco_embeddings에서 사전 계산 된 임베드를 다운로드하고 use_precalculated_embeddings: true 설정하십시오.
우리의 설정에서 임베딩의 설정 생성에서 완료하는 데 약 15 분이 걸리고 벡터를 펄스 제트에 삽입하는 데 약 4 초가 걸립니다.
스크립트는 다음에 대한 타이밍 정보를 출력합니다.
chat.py 와의 추론 실행구성이 올바른지 확인한 다음 실행하십시오.
python chat.py
이 스크립트는 다른 LLM 및 RAG 시스템을 쿼리하여 출력을 통해 HTML, JSON 및 CSV 형식을 비교할 수 있습니다.
PulseJet 은이 프로젝트에서 효율적인 벡터 저장 및 검색을 위해 사용됩니다. 다음은 PulseJet이 Art Deco Chatbot 프로젝트에 어떻게 통합되는지에 대한 자세한 개요입니다.
펄스 제트 클라이언트 초기화 :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) 이것은 PulseJet 클라이언트를 만듭니다. 프로젝트에서는 원격 펄스 제트 인스턴스를 사용하고 있으므로 location "원격"으로 설정됩니다. 이것은 Docker 컨테이너에서 실행되는 Pulsejet 서버에 연결됩니다.
컬렉션 만들기 :
client . create_collection ( collection_name , vector_config ) 이것은 PulseJet에 새로운 컬렉션을 만들어 문서 임베딩을 저장합니다. vector_config 매개 변수는 벡터 크기 및 인덱스 유형 (예 : 효율적인 유사성 검색을위한 HNSW)과 같은 벡터 스토리지의 구성을 지정합니다.
벡터 삽입 : 프로젝트에서 벡터 삽입에 다음 패턴을 사용합니다.
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )이것은 처음에는 혼란스러워 보일지 모르지만 다음은 다음과 같습니다.
collection[0] 실제로 PulseJet 클라이언트 인스턴스입니다.collection[1] 은 우리가 삽입하는 컬렉션의 이름입니다.embed 우리가 삽입하는 벡터입니다.meta 벡터와 관련된 추가 메타 데이터입니다.이것은 호출과 동일합니다.
client . insert_single ( collection_name , vector , meta )대량 삽입의 경우 다음을 사용합니다.
client . insert_multi ( collection_name , embeds )이것은 한 번에 여러 개의 임베딩을 삽입하여 큰 데이터 세트에 더 효율적입니다.
벡터 검색 :
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None ) 이는 지정된 PulseJet 컬렉션에서 유사성 검색을 수행하여 주어진 쿼리 벡터에 대해 가장 관련성이 높은 문서를 찾습니다. limit 매개 변수는 반환 할 최대 결과 수를 지정합니다.
프로젝트에서 client['db'] PulseJet 클라이언트의 데이터베이스 메소드에 액세스하는 데 사용됩니다. 클라이언트를 직접 사용하는 것과 같습니다.
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )연결 닫기 :
client . close ()더 이상 필요하지 않은 경우 PulseJet 데이터베이스에 대한 연결이 닫힙니다.
PulsejetRagClient 클래스는 pulsejet_rag_client.py 에 정의되어 있으며 Rag 시스템의 맥락에서 PulseJet과 상호 작용하기위한 높은 수준의 인터페이스를 제공합니다. 주요 구성 요소의 분석은 다음과 같습니다.
초기화 :
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])클라이언트는 구성 매개 변수로 초기화되어 PulseJet 클라이언트를 설정하고 관련 구성 값을 저장합니다.
컬렉션 만들기 :
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " ) 이 메소드는 지정된 매개 변수로 PulseJet에서 새 컬렉션을 만듭니다. get_vector_size 함수를 사용하여 임베딩에 적합한 벡터 크기를 결정합니다.
벡터 삽입 :
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )이 방법은 관련 메타 데이터와 함께 단일 및 다중 벡터를 Pulsejet Collection에 삽입하는 것을 처리합니다.
벡터 검색 :
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []이 메소드는 PulseJet 컬렉션에서 유사성 검색을 수행하여 주어진 쿼리 벡터에 대해 가장 관련성이 높은 문서를 찾습니다.
연결 닫기 :
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )이 메소드는 더 이상 필요하지 않은 경우 PulseJet 데이터베이스에 대한 연결을 닫습니다.
PulsejetRagClient 는 프로젝트 전체에서 PulseJet과 상호 작용하는 데 사용됩니다. 일반적으로 인스턴스화되고 사용되는 방법은 다음과 같습니다.
창조 :
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )인덱싱 문서 :
indexing.py 에서는 클라이언트를 사용하여 컬렉션을 생성하고 벡터를 삽입합니다.
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) rag.py 에서는 클라이언트를 사용하여 헝겊 과정에서 유사한 벡터를 검색합니다.
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )작업이 완료되면 연결을 닫습니다.
rag_client . close ()이 구현은 RAG 시스템의 모든 PulseJet 작업에 대해 깨끗하고 캡슐화 된 인터페이스를 제공합니다.
LLama3.1 사용한 RAG 작업은 쿼리 길이가 증가하여 단순한 질문에 응답하는 것보다 시간이 오래 걸립니다.Art Deco Chatbot은 LLM이 Rag와 더 잘 활용 될 수있는 방법을 보여줍니다. 우리의 프로젝트는 데이터 스크래핑에서 문서화에서 내장 생성 및 벡터 데이터베이스의 통합에 이르기까지 모든 단계를 다루는 RAG 구현에 대한 포괄적 인 탐색을 제공합니다.
Rag 시스템의 문서 기반이 커짐에 따라 삽입 및 검색 작업의 성능이 점점 비판적입니다. PulseJet 벡터 데이터베이스를 본격적인 RAG 시스템에 통합하는 방법을 배웁니다. 특히 대규모 문서베이스에서 RAG 응용 프로그램을 처리 할 때 기능으로부터 큰 이점을 얻을 수 있습니다.
우리의 헝겊 반응이 더 정확했을 수 있습니다. 우리는 아트 데코 챗봇의 성능을 향상시키기 위해 몇 가지 실험적 접근법을 고려하고 있습니다.
우리는 다음과 같은 이니셔티브를 통해이 프로젝트를 확장 할 계획입니다.
Art Deco Chatbot을 실험하고 매개 변수를 수정하여 자신의 관심 분야에 적응하는 것이 좋습니다.
저자 : Güvenç Usanmaz