콘텐츠로 이동

RAG 라마인덱스 기초

API 키 성성시 Limit에서 아래와 같이 설정할 것

  • gpt-4o-mini
  • gpt-3.5-turbo
  • dall-e-3

gpt-3.5-turbo는 RAG 라마인덱스 실습에서 내부적으로 사용되기 때문에 꼭 설정해 주어야 함
gpt-3.5-turbo를 허용하지 않으면 라마인덱스 실행시 오류가 발생함

실행 준비

!pip install llama-index
!pip install llama-index-core
!pip install llama-index-llms-openai
!pip install llama-index-llms-replicate
!pip install llama-index-embeddings-huggingface

API Key 설정

import os

os.environ["OPENAI_API_KEY"] = "???"

데이터 생성

import os

# 텍스트 데이터를 저장할 디렉토리 준비
os.makedirs('data', exist_ok=True)

# 예제 텍스트 파일 생성
with open('data/sample.txt', 'w') as f:
    f.write("""
    LlamaIndex는 정보 검색 및 응답 생성의 강력한 도구입니다.
    다양한 데이터 소스를 활용해 GPT 모델을 효율적으로 사용할 수 있도록 돕습니다.
    이 예제에서는 간단한 텍스트 파일을 기반으로 검색 인덱스를 생성하고 질의하는 방법을 보여줍니다.
    """)

문서 및 인덱스 생성 (gpt-3.5-turbo를 사용하도록 되어 있어서 오류가 발생할 수 있음)

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

#문서 생성
documents = SimpleDirectoryReader("data").load_data()


# 사용자가 모델을 선택할 수 있도록 변수 설정
model_name = "gpt-4o-mini"

# LLM 정의
client = OpenAI(model=model_name)

#인덱스 생성 (기본 값으로 gpt-turbo-3.5를 사용하도록 되어 있어서 오류가 발생할 수 있음. 아래쪽에 보완 제시)
#index = VectorStoreIndex.from_documents(documents)
index = VectorStoreIndex.from_documents(documents, llm=client)

최근 변경 방식으로 수정한 코드

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data").load_data()


import os
os.environ["OPENAI_API_KEY"] = "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"
os.environ["OPENAI_PROJECT"] = "proj_gXjHWOE9nRRP6zbyHJ0NfdTj"  # 모델 권한을 켜 둔 그 프로젝트 ID

client = OpenAI()
index = VectorStoreIndex.from_documents(documents, llm=client)

사용 가능한 모델 체크

import os
os.environ["OPENAI_API_KEY"] = "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"
os.environ["OPENAI_PROJECT"] = "proj_gXjHWOE9nRRP6zbyHJ0NfdTj"  # 모델 권한을 켜 둔 그 프로젝트 ID

from openai import OpenAI
client = OpenAI()  # 위 환경변수(키/프로젝트)를 사용
available = [m.id for m in client.models.list().data]
print("text-embedding-3-small in project?:", "text-embedding-3-small" in available)

임베딩 모델 수정하기

import os
os.environ["OPENAI_API_KEY"] = "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"
os.environ["OPENAI_PROJECT"] = "proj_gXjHWOE9nRRP6zbyHJ0NfdTj"  # 모델 권한을 켜 둔 그 프로젝트 ID


from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.openai import OpenAIEmbedding

# 최신 OpenAI 임베딩 모델 지정
embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# 문서 생성
documents = SimpleDirectoryReader("data").load_data()

# 인덱스 생성 (임베딩 모델 주입)
index = VectorStoreIndex.from_documents(documents, embed_model=embed_model)

쿼리엔진 생성

query_engine = index.as_query_engine()

쿼리 실행하기

response = query_engine.query("LlamaIndex는 무엇인가요?")

# 결과 출력
print("질의 결과:", response)

인덱스 저장

index.storage_context.persist()

저장된 인덱스 불러오기

# 저장된 인덱스 불러오기
from llama_index.core import StorageContext, load_index_from_storage

# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir="./storage")

# load index (gpt-turbo-3.5 기본 사용)
#index = load_index_from_storage(storage_context)

# 변경된 방식. llm 모델은 인덱스와는 관련이 없고 이후 query엔진에 영향을 줌.
client = OpenAI()
index = load_index_from_storage(storage_context, llm=client)

로드된 인덱스 테스트

query_engine = index.as_query_engine()
response = query_engine.query("LlamaIndex는 무엇인가요?")

# 결과 출력
print("질의 결과:", response)

gpt-3.5-turbo를 사용하지 않고 다른 모델을 사용하는 방법

pip install llama-index openai
from llama_index.llms import OpenAI
from llama_index import VectorStoreIndex, SimpleDirectoryReader

# OpenAI API 키 설정
import os
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"


# 문서 불러오기
documents = SimpleDirectoryReader("data").load_data()

# 인덱스 생성 (기본으로 gpt-turbo-3.5 사용)
#index = VectorStoreIndex.from_documents(documents, llm=llm)

# 인덱스 생성시 다른 모델을 사용하도록 지정
#llm = OpenAI(model="gpt-4o-mini")  # 또는 "gpt-4o", "gpt-3.5-turbo-16k" 등
client = OpenAI()
index = VectorStoreIndex.from_documents(documents, llm=client)

# 쿼리 엔진 생성
query_engine = index.as_query_engine()

# 질문 실행
response = query_engine.query("이 문서에서 핵심 내용을 요약해줘.")
print(response)

Chat vs Completion 설정 (Completion은 단일 질문 답변 방식으로서 예전 방식임)

llm = OpenAI(model="text-davinci-003", is_chat_model=False)