강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

Tora King님의 프로필 이미지
Tora King

작성한 질문수

한 번에 끝내는 AI 에이전트 개발 올인원 (w. CrewAI, LangGraph, Google ADK)

검색증강생성기술(RAG) 구현: 인덱싱, 리트리버 w. langchain

섹션6장 .chroma/esl_topics폴더에 관하여

작성

·

15

0

안녕하세요.
좋은 강의 항상 감사드립니다.

한 가지 문의드리고 싶습니다.
섹션 6의 28강에서 RAG 실행 부분을 실습하던 중,
제 로컬 환경에서는 코드가 에러 없이 정상적으로 실행되었지만
.chroma/esl_topics 폴더가 생성되지 않는 현상이 발생했습니다.

코드 상으로는 os.makedirs(PERSIST_DIR, exist_ok=True) 구문이 있으므로
폴더가 자동으로 생성될 것으로 예상했는데, 실제로는 생성되지 않는 것 같습니다.

혹시 해당 폴더가 생성되는 정확한 경로를 알려주실 수 있을까요?
또는 Windows 환경에서는 위 코드로 폴더가 생성되지 않는 경우가 있는지도 궁금합니다.

확인 부탁드립니다.
감사합니다.

image.png

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())

 

Tora King님의 프로필 이미지
Tora King

작성한 질문수

질문하기