작성
·
15
0
안녕하세요.
좋은 강의 항상 감사드립니다.
한 가지 문의드리고 싶습니다.
섹션 6의 28강에서 RAG 실행 부분을 실습하던 중,
제 로컬 환경에서는 코드가 에러 없이 정상적으로 실행되었지만.chroma/esl_topics 폴더가 생성되지 않는 현상이 발생했습니다.
코드 상으로는 os.makedirs(PERSIST_DIR, exist_ok=True) 구문이 있으므로
폴더가 자동으로 생성될 것으로 예상했는데, 실제로는 생성되지 않는 것 같습니다.
혹시 해당 폴더가 생성되는 정확한 경로를 알려주실 수 있을까요?
또는 Windows 환경에서는 위 코드로 폴더가 생성되지 않는 경우가 있는지도 궁금합니다.
확인 부탁드립니다.
감사합니다.

import os
from typing import Type, Optional
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from env import OPENAI_API_KEY
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
PDF_FILENAME = os.path.join("knowledge", "29ESLConversationTopic.pdf")
PERSIST_DIR = os.path.join(".chroma", "esl_topics")
def qa(question):
os.makedirs(PERSIST_DIR, exist_ok=True)
embeddings = OpenAIEmbeddings()
try:
has_index = bool(os.listdir(PERSIST_DIR))
except FileNotFoundError:
has_index = False
if has_index:
vectordb = Chroma(persist_directory=PERSIST_DIR, embedding_function=embeddings)
else:
loader = PyPDFLoader(PDF_FILENAME)
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_documents(docs)
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory=PERSIST_DIR)
retriever = vectordb.as_retriever(search_kwargs={"k": 3})
llm = ChatOpenAI(model="gpt-4o-mini",temperature=0.3)
return RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever).run(question)
class RAGToolInput(BaseModel):
question: str = Field(description="질문")
class RAGTool(BaseTool):
name: str = "ESL_Chroma_RAG"
description: str = "Retrieves from '29 ESL Conversation Topics' PDF via ChromaDB and answers questions."
args_schema: Type[BaseModel] = RAGToolInput
def _run(self, question: str):
try:
return qa(question)
except Exception as e:
return str(e)
rag_tool = RAGTool()
답변 1
0
안녕하세요
PERSIST_DIR = os.path.join(".chroma", "esl_topics") 는 현재 작업 디렉토리(cwd) 기준인데 터미널/IDE/노트북에 따라 cwd가 프로젝트 루트가 아닐 수도 있습니다. (물론 강의처럼 루트 경로에서 실행하면 이슈가 없을 것 같긴 한데.. 정확한 원인은 파악이 어렵네요..)
아래 코드로 변경해주시고, 안되신다면 print된 부분을 공유해주시면 더 도움을 드리겠습니다.
아래 코드는 참고로 실행 중인 스크립트 파일 기준(프로젝트 내부 고정 경로)으로 찍는 방법입니다.
from pathlib import Path
...
BASE_DIR = Path(__file__).resolve().parent
PDF_FILENAME = BASE_DIR / "knowledge" / "29ESLConversationTopic.pdf"
PERSIST_DIR = BASE_DIR / ".chroma" / "esl_topics"
...
PERSIST_DIR.mkdir(parents=True, exist_ok=True)
print("CWD :", Path.cwd())
print("__file__ base:", BASE_DIR)
print("PERSIST_DIR :", PERSIST_DIR.resolve())
print("Exists? :", PERSIST_DIR.exists())