AI 모델 및 플랫폼
LlamaIndex: LLM 애플리케이션에 맞춤 데이터를 쉽게 추가합니다
대규모 언어 모델(Large Language Models, LLM)인 OpenAI의 GPT 시리즈는 다양한 공개 데이터에 대해 훈련되어 텍스트 생성, 요약, 질문 답변, 계획 등에서卓越한 능력을 보여주었습니다. 그러나 이러한 모델을 개인적이거나 사적인 데이터와 통합하는 문제가 빈번하게 제기됩니다.
기업과 개인은 다양한 소스와 형식의 데이터를 보유하고 있으며, 이러한 데이터를 LLM과 통합하기 위해 여러 방법이 제안되고 실험되고 있습니다.
Fine-tuning은 이러한 접근 방식 중 하나로, 모델의 가중치를 특정 데이터셋의 지식으로 조정하는 것을 포함합니다. 그러나 이 과정은 데이터 준비와 최적화에 상당한 노력이 필요하며, 또한 기계 학습 전문 지식이 필요합니다. 또한 대규모 데이터셋을 다루는 경우에는 비용이 상당할 수 있습니다.
인 컨텍스트 학습(In-context learning)은 대안으로 등장하여, 입력과 프롬프트를 조작하여 LLM이 정확한 출력을 생성할 수 있도록 합니다. 이 접근 방식은 모델의 재훈련을 필요로 하지 않으며, 사적인 데이터를 통합하는 더 효율적이고 접근하기 쉬운 방법을 제공합니다.
그러나 이 접근 방식은 사용자의 프롬프트 엔지니어링 기술에 의존하며, 기술적인 데이터나 특정 도메인에 대한 전문 지식이 필요할 수 있습니다. 또한 프롬프트의 길이가 제한되어 있으며, 복잡한 작업의 경우 모델의 성능이 저하될 수 있습니다. 또한 데이터의 보안과 개인 정보 보호 문제도 있습니다.
이러한 기술을 탐색하는 동안, LlamaIndex와 같은 도구가 주목을 받고 있습니다.
LlamaIndex는 Jerry Liu에 의해 시작되었으며, GPT-3를 실험하는 동안 개인 데이터를 처리하는 모델의 한계를 발견했습니다. 이 관찰은 LlamaIndex 프로젝트의 시작을 의미했습니다.
이 프로젝트는 투자자들의 관심을 끌어 850만 달러의 시드 펀딩을 확보했습니다.
LlamaIndex는 사용자가 자신의 데이터를 LLM과 통합할 수 있도록 해주어, 지식 생성과 추론을 개인화된 통찰력으로 향상시킵니다. 사용자는 자신의 데이터를 제공하여, 지식 생성과 추론을 개인화된 통찰력으로 향상시킬 수 있습니다.
고수준 개념 및 통찰력
1. 검색 증강 생성(Retrieval Augmented Generation, RAG):
RAG는 LLM을 맞춤 데이터와 결합하여 모델의 능력을 향상시키는 두 단계의 과정입니다. 이 과정은 다음과 같이 구성됩니다.
- 인덱싱 단계: 지식 기반을 생성하기 위한 준비 단계입니다.
- 쿼리 단계: 지식 기반에서 관련된 컨텍스트를 찾아서 LLM이 쿼리에 답변할 수 있도록 합니다.
LlamaIndex와 함께 인덱싱하기:
- 데이터 커넥터: 데이터 커넥터는 데이터를 다양한 소스와 형식에서 가져와서 LlamaIndex에서 사용할 수 있도록 합니다. 데이터 커넥터는 LlamaHub에서 찾을 수 있으며, 데이터 로더는 쉽게 통합할 수 있도록 설계되었습니다.
- 문서/노드: 문서는 다양한 데이터 타입을 포함할 수 있는 가방과 같은 객체입니다. 노드는 문서의 일부분으로, 메타데이터와 다른 노드와의 관계를 포함하여 데이터를 효율적으로 검색할 수 있도록 합니다.
- 데이터 인덱스: 데이터를 가져온 후, LlamaIndex는 데이터를 검색할 수 있는 형식으로 인덱싱합니다. 뒤에서, 원시 문서를 중간 표현으로 변환하고, 벡터 임베딩을 계산하며, 메타데이터를 추론합니다. 인덱스 중에서 VectorStoreIndex가 가장 많이 사용됩니다.
LlamaIndex의 인덱스 유형: 데이터를 조직화하는 핵심
LlamaIndex는 다양한 인덱스 유형을 제공하며, 각 유형은 다른 요구 사항과 사용 사례에 적합합니다. 이러한 인덱스의 핵심은 노드입니다.
1. 리스트 인덱스:
- 메커니즘: 리스트 인덱스는 노드를 순차적으로 배열합니다. 입력 데이터를 노드로 나누고, 노드를 선형적으로 배열하여 순차적으로 또는 키워드 또는 임베딩으로 검색할 수 있도록 합니다.
- 장점: 이 인덱스 유형은 순차적 검색에 적합합니다. LlamaIndex는 LLM의 토큰 제한을 초과하는 경우에도 입력 데이터를 모두 사용하여 텍스트를 쿼리하고 답변을 개선합니다.
2. 벡터 스토어 인덱스:
- 메커니즘: 노드를 벡터 임베딩으로 변환하고, 로컬 또는 벡터 데이터베이스에 저장합니다. 쿼리할 때, 가장 유사한 노드를 찾아서 응답 생성기에 전달합니다.
- 장점: 텍스트 비교를 위한 벡터 검색이 필요한 경우에 사용할 수 있습니다.
3. 트리 인덱스:
- 메커니즘: 입력 데이터를 트리 구조로 변환하여, 노드를 요약하고, GPT를 사용하여 부모 노드를 생성합니다. 쿼리할 때, 트리 인덱스는 루트 노드에서 리프 노드로 이동하거나 선택된 리프 노드에서 직접 응답을 생성할 수 있습니다.
- 장점: 트리 인덱스를 사용하면 긴 텍스트를 효율적으로 검색하고, 다양한 텍스트 세그먼트에서 정보를 추출할 수 있습니다.
4. 키워드 인덱스:
- 메커니즘: 키워드와 노드를 매핑하여, 쿼리할 때 키워드를 추출하고 매핑된 노드를 사용할 수 있도록 합니다.
- 장점: 사용자 쿼리가 명확한 경우에 사용할 수 있습니다. 예를 들어, 의료 문서에서 COVID-19와 관련된 문서만 찾을 수 있습니다.
LlamaIndex 설치
LlamaIndex를 설치하는 것은 간단한 과정입니다. Pip 또는 소스에서 직접 설치할 수 있습니다.
1. Pip에서 설치:
- 다음 명령을 실행합니다:
pip install llama-index
- 참고: 설치 중에 LlamaIndex는 NLTK와 HuggingFace와 같은 패키지에 대한 로컬 파일을 다운로드하고 저장할 수 있습니다. 이러한 파일을 위한 디렉토리를 지정하려면 “LLAMA_INDEX_CACHE_DIR” 환경 변수를 사용합니다.
2. 소스에서 설치:
- 먼저 GitHub에서 LlamaIndex 저장소를 클론합니다:
git clone https://github.com/jerryjliu/llama_index.git
- 클론한 후, 프로젝트 디렉토리로 이동합니다.
- Poetry를 사용하여 패키지 종속성을 관리합니다.
- 가상 환경을 생성합니다:
poetry shell - 코어 패키지 요구 사항을 설치합니다:
poetry install
환경 설정
1. OpenAI 설정:
- 기본적으로, LlamaIndex는 OpenAI의 gpt-3.5-turbo를 텍스트 생성에 사용하고, text-embedding-ada-002를 검색과 임베딩에 사용합니다.
- 이 설정을 사용하려면 OPENAI_API_KEY가 필요합니다. OpenAI 웹사이트에서 등록하여 새 API 토큰을 생성할 수 있습니다.
- 사용자는 프로젝트 요구 사항에 따라 기본 LLM을 사용자 지정할 수 있습니다. LLM 제공업체에 따라 추가 환경 키와 토큰이 필요할 수 있습니다.
2. 로컬 환경 설정:
- OpenAI를 사용하지 않으려면, LlamaIndex는 자동으로 로컬 모델로 전환합니다. LlamaCPP와 llama2-chat-13B를 텍스트 생성에 사용하고, BAAI/bge-small-en을 검색과 임베딩에 사용합니다.
- LlamaCPP를 사용하려면 제공된 설치 가이드를 따르세요. llama-cpp-python 패키지를 설치하여 GPU 지원을 포함하도록 합니다. 이 설정은 CPU와 GPU에서 약 11.5GB의 메모리를 사용합니다.
- 로컬 임베딩을 사용하려면 pip install sentence-transformers를 실행합니다. 이 로컬 설정은 약 500MB의 메모리를 사용합니다.
이러한 설정으로, 사용자는 프로젝트 요구 사항과 자원에 따라 OpenAI 또는 로컬 모델을 사용할 수 있습니다.
사용 사례: LlamaIndex와 OpenAI를 사용한 웹페이지 쿼리
다음은 Python 스크립트를 사용하여 웹페이지에서 특정 정보를 쿼리하는 예입니다.
!pip install llama-index html2text
<p>import os
from llama_index import VectorStoreIndex, SimpleWebPageReader</p>
<p># OpenAI 키를 입력하세요:
os.environ["OPENAI_API_KEY"] = ""</p>
<p># URL을 입력하세요:
url = "http://www.paulgraham.com/fr.html"</p>
<p># URL을 문서로 로드합니다:
documents = SimpleWebPageReader(html_to_text=True).load_data([url])</p>
<p># 벡터 스토어를 생성합니다:
index = VectorStoreIndex.from_documents(documents)</p>
<p># 쿼리 엔진을 생성합니다:
query_engine = index.as_query_engine()</p>
<p># 질문을 합니다:
response = query_engine.query("Paul이 자금을 조달하기 위한 3가지 최선의 조언은 무엇입니까?")
print(response)
Paul이 자금을 조달하기 위한 3가지 최선의 조언은 다음과 같습니다. 1. 초기에 낮은 숫자에서 시작합니다. 이는 유연성을 제공하고, 장기적으로 더 많은 자금을 조달할 수 있는 기회를 증가시킵니다. 2. 가능하다면 이익을 낼 수 있도록 합니다. 추가 자금 없이 이익을 낼 수 있는 계획을 갖는 것은 시작업에 대한 투자자들의 매력을 증가시킵니다. 3. 평가를 최적화하지 마십시오. 평가가 중요하지만, 자금 조달에서 가장 중요한 요소는 아닙니다. 필요한 자금을 얻고, 좋은 투자자를 찾는 것에 집중하세요.
이 스크립트를 사용하면, 웹페이지에서 특정 정보를 쿼리하는 강력한 도구를 만들 수 있습니다. 이는 LlamaIndex와 OpenAI를 사용하여 웹 데이터를 쿼리할 수 있는 것의 일부입니다.
LlamaIndex vs Langchain: 목표에 따라 선택
LlamaIndex와 Langchain을 선택하는 것은 프로젝트의 목표에 따라 다릅니다. 지능형 검색 도구를 개발하려면 LlamaIndex가 적합합니다. Langchain은 ChatGPT와 같은 시스템을 생성하고, 플러그인 기능을 제공하며, 여러 도구를 조합하여 전체적인 솔루션을 제공합니다. 예를 들어, Langchain을 사용하여 Python 코드를 실행하고 Google 검색을 동시에 수행할 수 있는 에이전트를 생성할 수 있습니다. 간단히 말하면, LlamaIndex는 데이터 처리에 뛰어나고, Langchain은 여러 도구를 조합하여 전체적인 솔루션을 제공합니다.

LlamaIndex Logo Artwork created using Midjourney


















