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.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)
쿼리엔진 생성
쿼리 실행하기
인덱스 저장
저장된 인덱스 불러오기
# 저장된 인덱스 불러오기
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를 사용하지 않고 다른 모델을 사용하는 방법
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)