
저는 해당 DB에서 자료를 찾아분석을합니다. + GPT API를 사용하여 적절한 답변을 만듭니다

gpt-4o mini 저렴하고 성능도 괜찮다고 들었어요 이걸 사용하면될 것 같아요
그럼 실제로 한번 사용하는 연습을 해볼께요







MiniProject3/
├── api/ # 📌 백엔드(API) - Python 기반 REST API
├── data/ # 📌 데이터 저장소 (레시피 데이터 포함)
│ └── recipes/ # └ 레시피 관련 데이터 폴더
├── frontend/ # 📌 프론트엔드 (사용자 UI)
│ └── chatbot-ui/ # └ 챗봇 UI 관련 코드
├── scripts/ # 📌 유틸리티 & 자동화 스크립트
└── vector_db/ # 📌 벡터 데이터베이스 (FAISS 기반)
└── faiss_index/ # └ FAISS 인덱스 저장 폴더
📌 유틸리티 & 자동화 스크립트란?
유틸리티(Utility) & 자동화 스크립트는 프로젝트에서 반복적이거나 번거로운 작업을 자동으로 실행하는 코드입니다.
유틸리티(Utility): 프로젝트에서 자주 사용되는 공용 함수, 도구








✅ 목표:
1️⃣ 다양성을 최적화 (MaxMarginalRelevanceExampleSelector)
2️⃣ 대화 내용을 기억 (단기 & 장기 기억)
3️⃣ 스트리밍 방식으로 응답
4️⃣ 벡터 데이터베이스에서 데이터를 검색하여 포함
🔹 LlamaIndex(구 GPT Index) 와 RAG 는 GPT 모델이 외부 데이터에 접근하여 보다 정확한 응답을 생성할 수 있도록 하는 기술입니다.
🔹 RAG는 검색된 정보를 활용해 답변을 생성하는 개념(방법론)이고, LlamaIndex는 이를 구현하는 프레임워크(도구)입니다.
✅ LangChain은 RAG를 쉽게 구현할 수 있도록 돕는 프레임워크
✅ 벡터 DB 연동, 임베딩, LLM 호출, 체인 로직 등을 쉽게 연결



## 모듈등록
import os
import faiss
import langchain
import openai
from langchain_openai import OpenAI
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core import Document
from llama_index.core import GPTVectorStoreIndex
# 라마인덱스, faiss 연동
from llama_index.core import StorageContext, GPTVectorStoreIndex
from llama_index.vector_stores.faiss import FaissVectorStore
## api 키등록
# os - 파일경로 조작 , __file__ 현재 실행중인 Python 파일의 전체경로를 나타냄
env_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), ".env")
print(env_path)
def get_api_key(env_file):
if os.path.exists(env_file):
with open(env_file, "r", encoding="utf-8") as file: # UTF-8 인코딩 추가
for line in file:
line = line.strip()
# print(f"{line}") // 제대로 읽었는지 확인
if line.startswith("OPENAI_API_KEY="):
key_value = line.split("=", 1)[1].strip().strip("'").strip('"') # 작은따옴표 & 큰따옴표 제거
return key_value
print("API KEY를 찾을 수 없음") # 키를 찾지 못한 경우
return None
# API 키 가져오기
API_KEY = get_api_key(env_path)
os.environ["OPENAI_API_KEY"] = API_KEY
# 1. 데이터 로드
documents = SimpleDirectoryReader(input_dir="C:/Users/r2com/Documents/MiniProject3/data/recipes").load_data()
print(f"📂 {len(documents)}개의 문서를 로드했습니다.")
# 2. FAISS 벡터 DB 초기화
embedding_dim = 1536 # OpenAI Embeddings 차원 수
faiss_index = faiss.IndexFlatL2(embedding_dim)
# 3. LLamaIndex에서 FAISS와 연동하여 벡터 DB 생성
vector_store = FaissVectorStore(faiss_index=faiss_index) # FAISS를 벡터 저장소로 사용
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 4. LLamaIndex를 이용하여 문서를 벡터화하고 FAISS에 저장
index = GPTVectorStoreIndex.from_documents(
documents,
storage_context=storage_context
)
print("✅ FAISS 벡터 DB 저장 완료!")
# 5. FAISS 인덱스 저장
faiss.write_index(faiss_index, "C:/Users/r2com/Documents/MiniProject3/vector_db/recipes_faiss.index")
print("✅ FAISS 인덱스 파일 저장 완료!")
# 6. 쿼리 엔진 생성
query_engine = index.as_query_engine()
# 7. 사용자 질의 수행
query = "비밀의 방에 있는 물건은?"
response = query_engine.query(query)
print(f"🔍 질문: {query}")
print(f"🤖 응답: {response}")
처음에 사용할 데이터를 로드해온다음에
FAISS 벡터 DB를 사용하기위해 초기화해놓고
FAISS는 기본적으로 LlamaIndex와 직접 연동되지 않으므로, 변환이 필요함
로드한 문서를 OpenAI 임베딩을 사용해 벡터화하고, FAISS에 저장
해당 인덱스를저장한다음 저장하는이유는 또 사용하기위해서일태고
이제 벡터 DB에서 검색할 수 있도록 쿼리 엔진을 생성
수행
## 모듈등록
import os
import faiss
import langchain
import openai
from langchain_openai import OpenAI
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core import Document
from llama_index.core import GPTVectorStoreIndex
# 라마인덱스, faiss 연동
from llama_index.core import StorageContext, GPTVectorStoreIndex
from llama_index.vector_stores.faiss import FaissVectorStore
from llama_index.llms.openai import OpenAI
## api 키등록
# os - 파일경로 조작 , __file__ 현재 실행중인 Python 파일의 전체경로를 나타냄
env_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), ".env")
print(env_path)
def get_api_key(env_file):
if os.path.exists(env_file):
with open(env_file, "r", encoding="utf-8") as file: # UTF-8 인코딩 추가
for line in file:
line = line.strip()
# print(f"{line}") // 제대로 읽었는지 확인
if line.startswith("OPENAI_API_KEY="):
key_value = line.split("=", 1)[1].strip().strip("'").strip('"') # 작은따옴표 & 큰따옴표 제거
return key_value
print("API KEY를 찾을 수 없음") # 키를 찾지 못한 경우
return None
# API 키 가져오기
API_KEY = get_api_key(env_path)
os.environ["OPENAI_API_KEY"] = API_KEY
# 1. 데이터 로드
documents = SimpleDirectoryReader(input_dir="C:/Users/r2com/Documents/MiniProject3/data/recipes").load_data()
print(f"📂 {len(documents)}개의 문서를 로드했습니다.")
# 2. FAISS 벡터 DB 초기화
embedding_dim = 1536 # OpenAI Embeddings 차원 수
faiss_index = faiss.IndexFlatL2(embedding_dim)
# 3. LLamaIndex에서 FAISS와 연동하여 벡터 DB 생성
vector_store = FaissVectorStore(faiss_index=faiss_index) # FAISS를 벡터 저장소로 사용
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# 4. LLamaIndex를 이용하여 문서를 벡터화하고 FAISS에 저장
index = GPTVectorStoreIndex.from_documents(
documents,
storage_context=storage_context
)
print("✅ FAISS 벡터 DB 저장 완료!")
# 5. FAISS 인덱스 저장
save_dir = "C:/Users/r2com/Documents/MiniProject3/vector_db"
os.makedirs(save_dir, exist_ok=True)
faiss.write_index(faiss_index, os.path.join(save_dir, "recipes_faiss.index"))
print("✅ FAISS 인덱스 파일 저장 완료!")
# 6. GPT 모델 설정
llm = OpenAI(model="gpt-4o-mini")
# 7. LlamaIndex에서 OpenAI LLM을 사용하여 질의 응답 처리
query_engine = index.as_query_engine(llm=llm)
# 8. 사용자 질문 실행
query = "비밀의 방에 있는 물건은?"
response = query_engine.query(query)
print(f"🔍 질문: {query}")
print(f"🤖 GPT 응답: {response}")
즉, FAISS를 사용하면 GPT가 모든 문서를 직접 분석할 필요 없이, 관련 문서만 바탕으로 더 빠르고 정확한 응답을 제공할 수 있음!
