본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

Local Qdrant RAG 폐쇄망 RAG

by 3604 2026. 4. 14.
728x90

출처: https://github.com/XinBow99/Local-Qdrant-RAG?tab=readme-ov-file

Local-Qdrant-RAG

Local-Qdrant-RAG is a framework designed to leverage the powerful combination of Qdrant for vector search and RAG (Retrieval-Augmented Generation) for enhanced query understanding and response generation. It uses the Qdrant service for storing and retrieving vector embeddings and the RAG model to augment query responses with information retrieved from Qdrant.

Getting Started

This guide will help you set up Local-Qdrant-RAG on your local machine for development and testing purposes.

Prerequisites

Before you begin, ensure you have the following installed:

  • Python 3.8 or higher
  • Docker and Docker Compose (for running Qdrant locally)
  • Ollama (for running LLM locally)
  • Qdrant (Vector Database)

Installation

  1. Clone the Repository
  2. $git clone <https://github.com/your-repo/local-qdrant-rag.git>

$cd local-qdrant-rag

  1. Install Dependencies

Install all necessary Python packages.

# $pip install -r requirements.txt

ㅁ 가상 환경(venv) 활용하기 (RAG 프로젝트 추천)
로컬 AI RAG 시스템을 구축 중이시라면, 시스템 전체에 패키지를 깔기보다 가상 환경을 만들어 그 안에서 pip를 쓰는 것이 관리에 훨씬 유리합니다.
  1. venv 모듈 설치:
sudo apt install python3-venv
  1. 가상 환경 생성 및 활성화:
python3 -m venv venv
source venv/bin/activate
    1. 결과: 활성화된 상태((venv) 표시가 뜸)에서는 pip 명령어만 입력해도 내부적으로 잘 작동합니다.
ㅁ 필요한 라이브러리 설치
 # sentence-transformers와 qdrant-client 등 코드 실행에 필요한 패키지를 설치해야 합니다.
 pip install qdrant-client sentence-transformers langchain-community
 pip install llama-index
 pip install llama-index llama-index-embeddings-huggingface llama-index-vector-stores-qdrant
 pip install llama-index llama-index-llms-ollama llama-index-embeddings-huggingface llama-index-vector-stores-qdrant

 

Set Up Qdrant

Follow the instructions in the Qdrant website

docker pull qdrant/qdrant

#코드의 q_client_url="http://localhost:6333/" 부분을 보면 로컬에서 Qdrant 서버가 돌아가고 있어야 합니다. Docker를 사용하는 # 것이 가장 간편합니다.
# 터미널에서 아래 명령어 실행

docker run -p 6333:6333 -p 6334:6334 \ -v $(pwd)/qdrant_storage:/qdrant/storage:z \ qdrant/qdrant
 
 
Set Up Ollama

Follow the instructions in the Ollama website

$curl -fsSL https://ollama.com/install.sh | sh

$ curl https://ollama.ai/install.sh 
$ chmod 755 install.sh
>> Downloading ollama...
>>> Installing ollama to /usr/local/bin...
[sudo] userid
암호
>>> Adding ollama user to render group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
>>> NVIDIA GPU installed.

$ ollama serve  #설치 후 자동 실행되지만 나중에는 이렇게 실행하면 된다.
Error: listen tcp 127.0.0.1:11434: bind: address already in use
$ ollama run llama3.1:8b   #
exaone3.5:7.8b

$ollama run <path-to-model>

Usage

  1. Ingest Data into Qdrant

Before using the RAG model, you need to ingest your dataset into Qdrant. The DataIngestor class in qdrant_data_helper.py can help with this task.

------------------------------------------------------------------------------------------

from utils import qdrant_data_helper 

ingestor = qdrant_data_helper.DataIngestor(

    q_client_url="http://localhost:6333/",

    q_api_key="test", # you can change this to your own qdrant api key if you have set it, otherwise, using None

    data_path="./data/",

    collection_name="dcard_collection",

    embedder_name="sentence-transformers/all-mpnet-base-v2"

    ) 

index = ingestor.ingest() 

print("Index created successfully!")

------------------------------------------------------------------------------------------

Folder structure for data_path:

data/

├── doc1.txt

├── doc2.txt

├── doc3.txt

└── ...

  1. Using the RAG Model

To use the RAG model for query responses, instantiate the RAG class and use the get_response method.

"""

Thie is inference code for the RAG and Qdrant with Ollama

"""

 

from utils.qdrant_data_helper import RAG, Query

 

def main():

    host = "localhost"

    rag = RAG(

        q_client_url=f"http://{host}:6333/",

        q_api_key="test", # you can change this to your own qdrant api key if you have set it, otherwise, using None

        ollama_model="gemma:7b",

        ollama_base_url=f"http://{host}:11434",

        )

   

    search_index = rag.qdrant_index(

                    collection_name="dcard_collection",

                    chunk_size=1024

                    )

 

    query = Query(

            query="高科大是什時候合的?",

            top_k=5

    )

 

    result = rag.get_response(

                    index= search_index,

                    query= query,

                    append_query="",

                    response_mode="tree_summarize"

                )

 

    print("Result: ", result.search_result)

    print("Score: ", result.source)

 

if __name__ == "__main__":

    main()

Follow the llamaindex library to set response_mode. llamaindex

References

To-Do

  •  Add support for other vector databases
  •  Optimize Metadata Filtering

 

 

 

 

"Command 'pip' not found, did you mean:" 해결 방법

pip 명령어를 찾을 수 없다는 메시지는 현재 사용 중인 Ubuntu(WSL2) 환경에 파이썬 패키지 관리자인 pip가 설치되어 있지 않거나, 경로(PATH)가 설정되지 않았을 때 발생합니다.

가장 빠르고 확실한 해결 방법들을 단계별로 정리해 드립니다.


1. Ubuntu 패키지 관리자로 설치 (가장 권장)

WSL2 환경에서는 시스템 자체에 pip를 설치하는 것이 가장 간편합니다. 터미널에 다음 명령어를 순서대로 입력하세요.

Bash

# 패키지 리스트 업데이트

sudo apt update

 

# 파이썬 3 pip 설치

sudo apt install python3-pip

  • 설치 중간에 Do you want to continue? [Y/n] 메시지가 나오면 Enter 또는 y를 입력합니다.

2. 설치 후 확인

설치가 완료되었다면 정상적으로 인식되는지 버전을 확인합니다.

Bash

pip3 --version

만약 pip3는 되는데 pip라는 명령어만 안 되는 경우라면, 아래 명령어로 별칭(alias)을 설정하거나 pip3를 그대로 사용하시면 됩니다.


3. 가상 환경(venv) 활용하기 (RAG 프로젝트 추천)

로컬 AI RAG 시스템을 구축 중이시라면, 시스템 전체에 패키지를 깔기보다 가상 환경을 만들어 그 안에서 pip를 쓰는 것이 관리에 훨씬 유리합니다.

  1. venv 모듈 설치:

Bash

sudo apt install python3-venv

  1. 가상 환경 생성 및 활성화:

Bash

python3 -m venv venv

source venv/bin/activate

  1. 결과: 활성화된 상태((venv) 표시가 뜸)에서는 pip 명령어만 입력해도 내부적으로 잘 작동합니다.

💡 : 'Permission Denied' 오류가 난다면?

간혹 pip install 시 권한 문제가 발생할 수 있습니다. 이때 sudo pip를 사용하는 것은 보안상 권장되지 않으므로, 가급적 위의 3(가상 환경) 방식을 사용하시거나 아래처럼 사용자 전용으로 설치하세요.

  • pip install --user <패키지명>

지금 진행 중인 local-qdrant-rag 프로젝트 폴더 안에서 가상 환경을 만들고 계신가요? 환경 구성 중에 다른 라이브러리(: pymilvusqdrant-client) 설치가 필요한 단계라면 바로 말씀해 주세요!

"root@DESKTOP-FTGPEGB:/opt/Local-Qdrant-RAG# pip install -r requirements.txt

error: externally-managed-environment" 해결 방법은?

현재 사용 중인 Ubuntu 환경(WSL2)이 시스템 파이썬 환경을 보호하기 위해 패키지 설치를 제한하고 있는 상태입니다. 최신 리눅스 배포판에서 흔히 발생하는 안전장치입니다.

이 문제를 해결하고 Local-Qdrant-RAG 프로젝트를 정상적으로 실행할 수 있는 가장 깔끔한 방법 3가지를 정리해 드립니다.


방법 1: 파이썬 가상 환경(venv) 사용 (가장 추천)

시스템 환경을 건드리지 않고 프로젝트 전용 독립 공간을 만드는 방식입니다. RAG 시스템처럼 라이브러리 의존성이 복잡한 경우 이 방법이 필수입니다.

  1. 가상 환경 생성 도구 설치 (설치되어 있지 않은 경우):

Bash

apt update && apt install python3-venv

  1. 프로젝트 폴더 내에 가상 환경 생성:

Bash

python3 -m venv venv

  1. 가상 환경 활성화:

Bash

source venv/bin/activate

  1. 패키지 다시 설치:

Bash

pip install -r requirements.txt


방법 2: --break-system-packages 옵션 사용 (빠른 해결)

가상 환경을 만들기 번거롭고 즉시 설치하고 싶을 때 사용합니다. 다만 시스템 파이썬 패키지와 충돌이 발생할 위험이 있어 권장되지는 않습니다.

Bash

pip install -r requirements.txt --break-system-packages


방법 3: pipx 활용하기

만약 특정 라이브러리가 아니라 '도구(Tool)'로서의 프로그램을 설치하려는 목적이라면 pipx가 대안이 될 수 있습니다. (하지만 RAG 개발 목적이라면 방법 1이 훨씬 낫습니다.)

Bash

apt install pipx

pipx ensurepath

pipx install -r requirements.txt


보안 및 관리 팁

현재 root 계정으로 작업을 진행 중이신데, 실제 개발 환경에서는 가급적 일반 사용자 계정에서 가상 환경을 사용하시는 것이 권장됩니다.

  • Qdrant 연동 관련: requirements.txt 설치가 끝나면 보통 qdrant-client가 포함되어 있을 겁니다. 혹시 Qdrant 서버를 Docker로 띄우실 계획인가요, 아니면 로컬 바이너리로 실행하실 계획인가요? 그 단계에서 설정 파일(config.yaml ) 수정이 필요할 수 있으니 도움이 필요하시면 말씀해 주세요.

 

 

참고

 

"(venv) root@DESKTOP-FTGPEGB:/Local-Qdrant-RAG# python3 qdrant_data_helper.py Traceback (most recent call last): File "/Local-Qdrant-RAG/qdrant_data_helper.py", line 1, in <module> from utils import qdrant_data_helper File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 5, in <module> from .text_transformations import get_transform_pipeline File "/Local-Qdrant-RAG/utils/text_transformations.py", line 2, in <module> from llama_index.core import Document ModuleNotFoundError: No module named 'llama_index'" 해결 방법?

Edit

Copy

Share

이 오류는 llama_index 모듈이 설치되지 않았기 때문에 발생합니다. 다음 단계로 해결할 수 있습니다:

해결 방법

1. llama-index 설치

bash

Copy

pip install llama-index

또는 핵심 기능만 필요하다면:

bash

Copy

pip install llama-index-core

2. 가상환경 확인

가상환경(venv)이 활성화된 상태에서 설치했는지 확인하세요:

bash

Copy

# 가상환경 활성화 (이미 활성화된 것으로 보입니다)

source venv/bin/activate  # Linux/Mac

# 또는

venv\Scripts\activate  # Windows

 

# 설치 확인

pip list | grep llama

3. requirements.txt 확인

프로젝트에 requirements.txt 파일이 있다면:

bash

Copy

pip install -r requirements.txt

4. 설치 후 확인

bash

Copy

python -c "from llama_index.core import Document; print('OK')"


추가로 llama-index 관련 다른 패키지도 필요할 수 있습니다 (: llama-index-embeddings-huggingface, llama-index-vector-stores-qdrant ). 전체 의존성을 한 번에 설치하려면:

bash

Copy

pip install llama-index llama-index-embeddings-huggingface llama-index-vector-stores-qdrant

"ModuleNotFoundError: No module named 'llama_index.llms.ollama'" 해결 방법?

Edit

Copy

Share

이 오류는 llama-index Ollama 통합 패키지가 설치되지 않았기 때문에 발생합니다.

해결 방법

1. llama-index-llms-ollama 설치

bash

Copy

pip install llama-index-llms-ollama

2. 전체 관련 패키지 한 번에 설치

Qdrant RAG 프로젝트를 위해 일반적으로 필요한 패키지들:

bash

Copy

pip install llama-index llama-index-llms-ollama llama-index-embeddings-huggingface llama-index-vector-stores-qdrant

3. 설치 확인

bash

Copy

python -c "from llama_index.llms.ollama import Ollama; print('OK')"


llama-index 주요 통합 패키지 정리

Table

기능 설치 명령어
핵심 기능 pip install llama-index-core
Ollama LLM pip install llama-index-llms-ollama
OpenAI pip install llama-index-llms-openai
HuggingFace 임베딩 pip install llama-index-embeddings-huggingface
Qdrant 벡터 스토어 pip install llama-index-vector-stores-qdrant
전체 (추천) pip install llama-index (대부분 포함)

llama-index를 이미 설치했는데도 오류가 발생하면, 버전 문제일 수 있으니 업그레이드도 시도해보세요:

bash

Copy

pip install --upgrade llama-index llama-index-llms-ollama

"MPNetModel LOAD REPORT from: sentence-transformers/all-mpnet-base-v2 Key | Status | | ------------------------+------------+--+- embeddings.position_ids | UNEXPECTED | | Notes: - UNEXPECTED: can be ignored when loading from different task/architecture; not ok if you expect identical arch. /Local-Qdrant-RAG/utils/qdrant_data_helper.py:46: UserWarning: Api key is used with an insecure connection. self.client = qdrant_client.QdrantClient(url=q_client_url, api_key=q_api_key) if q_api_key else qdrant_client.QdrantClient(url=q_client_url) Traceback (most recent call last):" 해결 방법?

Edit

Copy

Share

이 메시지들은 경고(Warning)이며, 실제 오류는 마지막 Traceback 이후에 나옵니다. 하지만 각각의 의미와 해결 방법을 설명드립니다:

1. MPNetModel UNEXPECTED Warning (무시 가능)

plain

Copy

embeddings.position_ids | UNEXPECTED

원인: sentence-transformers 모델을 로드할 때 발생하는 일반적인 경고입니다. 모델 아키텍처 차이로 인한 것이며 무시해도 됩니다.

해결 (선택사항):

Python

Copy

# transformers 라이브러리 경고 숨기기

import warnings

warnings.filterwarnings("ignore", message=".*UNEXPECTED.*")


2. Api key insecure connection Warning (중요)

plain

Copy

UserWarning: Api key is used with an insecure connection.

원인: HTTP 연결(비보안) API 키를 사용하고 있습니다.

해결 방법

방법 A: HTTPS 사용 (권장)

Python

Copy

# URL https:// 로 변경

q_client_url = "https://your-qdrant-server:6333"

방법 B: 로컬 개발 환경 (경고 무시)

Python

Copy

import warnings

# 경고 숨기기 (로컬 개발 시에만)

warnings.filterwarnings("ignore", category=UserWarning)

방법 C: API 키 없이 로컬 연결

Python

Copy

# 로컬 Qdrant API 키 필요 없음

self.client = qdrant_client.QdrantClient(url="http://localhost:6333")

# 또는

self.client = qdrant_client.QdrantClient(path="/path/to/local/storage")  # 로컬 파일 모드


3. 실제 오류 확인

마지막 Traceback 이후의 완전한 에러 메시지를 보여주시면 정확한 해결 방법을 알려드릴 수 있습니다.

bash

Copy

# 전체 에러 메시지 복사해서 공유해주세요


요약: utils/qdrant_data_helper.py 수정 예시

Python

Copy

import warnings

warnings.filterwarnings("ignore")  # 또는 특정 경고만 필터링

 

import qdrant_client

from llama_index.vector_stores.qdrant import QdrantVectorStore

 

class QdrantDataHelper:

    def __init__(self, q_client_url, q_api_key=None):

        # 로컬 개발: API 키 없이

        if not q_api_key:

            self.client = qdrant_client.QdrantClient(url=q_client_url)

        # 원격 서버: HTTPS 권장

        elif q_client_url.startswith("https"):

            self.client = qdrant_client.QdrantClient(

                url=q_client_url,

                api_key=q_api_key

            )

        # HTTP + API (경고 발생)

        else:

            self.client = qdrant_client.QdrantClient(

                url=q_client_url,

                api_key=q_api_key

            )

실제 Traceback 이후의 에러 내용을 공유해주시면 더 정확히 도와드릴 수 있습니다!

"MPNetModel LOAD REPORT from: sentence-transformers/all-mpnet-base-v2 Key | Status | | ------------------------+------------+--+- embeddings.position_ids | UNEXPECTED | | Notes: - UNEXPECTED: can be ignored when loading from different task/architecture; not ok if you expect identical arch. /Local-Qdrant-RAG/utils/qdrant_data_helper.py:46: UserWarning: Api key is used with an insecure connection. self.client = qdrant_client.QdrantClient(url=q_client_url, api_key=q_api_key) if q_api_key else qdrant_client.QdrantClient(url=q_client_url) Traceback (most recent call last): File "/Local-Qdrant-RAG/qdrant_data_helper.py", line 19, in index = ingestor.ingest() ^^^^^^^^^^^^^^^^^ File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 80, in ingest service_context = self.create_service_context() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 73, in create_service_context return ServiceContext.from_defaults(llm=None, embed_model=self.embedder, chunk_size=self.chunk_size) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/venv/lib/python3.12/site-packages/llama_index/core/service_context.py", line 33, in from_defaults raise ValueError( ValueError: ServiceContext is deprecated. Use llama_index.settings.Settings instead, or pass in modules to local functions/methods/interfaces. See the docs for updated usage/migration: https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context_migration/ "

Edit

Copy

Share

이 오류는 ServiceContextdeprecated(폐기)되었기 때문에 발생합니다. LlamaIndex의 새로운 API 방식으로 변경해야 합니다.

해결 방법: ServiceContext → Settings 마이그레이션

수정 전 (기존 코드 - 오류 발생)

Python

Copy

# utils/qdrant_data_helper.py line 73

return ServiceContext.from_defaults(

    llm=None,

    embed_model=self.embedder,

    chunk_size=self.chunk_size

)

수정 후 (새로운 방식)

방법 1: Settings 사용 (권장)

Python

Copy

# 파일 상단 import 변경

from llama_index.core.settings import Settings

from llama_index.core.node_parser import SentenceSplitter

 

# create_service_context 메서드 수정

def create_service_context(self):

    # Settings에 글로벌 설정 적용

    Settings.embed_model = self.embedder

    Settings.llm = None  # 또는 사용하는 LLM

    Settings.node_parser = SentenceSplitter(chunk_size=self.chunk_size)

   

    return Settings  # 또는 None 반환 (Settings는 전역)

방법 2: 로컬 파라미터 전달 (더 현대적인 방식)

Python

Copy

# ingest 메서드에서 직접 파라미터 전달

from llama_index.core.node_parser import SentenceSplitter

 

def ingest(self):

    # ServiceContext 없이 직접 파라미터 전달

    documents = self.load_documents()

   

    # 노드 파서 직접 생성

    node_parser = SentenceSplitter(chunk_size=self.chunk_size)

    nodes = node_parser.get_nodes_from_documents(documents)

   

    # VectorStoreIndex 생성 시 embed_model 직접 전달

    from llama_index.core import VectorStoreIndex

   

    index = VectorStoreIndex(

        nodes=nodes,

        embed_model=self.embedder,

        # llm=None  # 필요시

    )

   

    return index


완전한 수정 예시: utils/qdrant_data_helper.py

Python

Copy

# 상단 import 수정

from llama_index.core import VectorStoreIndex, Document

from llama_index.core.settings import Settings  # 새로운 방식

from llama_index.core.node_parser import SentenceSplitter

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# ServiceContext import 제거

 

class QdrantDataHelper:

    def __init__(self, ...):

        # ... 기존 초기화 코드 ...

        self.embedder = HuggingFaceEmbedding(

            model_name="sentence-transformers/all-mpnet-base-v2"

        )

   

    def create_service_context(self):

        """Settings로 글로벌 설정"""

        Settings.embed_model = self.embedder

        Settings.llm = None  # 임베딩만 할 경우

        Settings.node_parser = SentenceSplitter(

            chunk_size=self.chunk_size,

            chunk_overlap=20  # 필요시 추가

        )

        return Settings

   

    def ingest(self):

        """문서 인제스트"""

        documents = self.load_documents()

       

        # 방법 A: Settings 사용

        self.create_service_context()

        index = VectorStoreIndex.from_documents(documents)

       

        # 방법 B: 직접 파라미터 전달 (권장)

        # index = VectorStoreIndex.from_documents(

        #     documents,

        #     embed_model=self.embedder,

        #     node_parser=SentenceSplitter(chunk_size=self.chunk_size)

        # )

       

        return index


빠른 체크리스트

Table

항목 작업
Import 제거 from llama_index.core import ServiceContext 삭제
Import 추가 from llama_index.core.settings import Settings
Import 추가 from llama_index.core.node_parser import SentenceSplitter
메서드 수정 ServiceContext.from_defaults(...) → Settings 설정
파라미터 전달 chunk_size SentenceSplitter로 전달

참고 문서

수정 후에도 오류가 발생하면 ingest 메서드의 전체 코드를 공유해주세요!

"Traceback (most recent call last): File "/Local-Qdrant-RAG/qdrant_data_helper.py", line 1, in <module> from utils import qdrant_data_helper File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 30 def __init__(self, ...): ^^^" 해결 방법

Edit

Copy

Share

이 오류는 Python 문법 오류입니다. ...는 실제 코드에서 사용할 수 없는 placeholder(자리표시자)입니다.

문제 원인

Python

Copy

def __init__(self, ...):  # 잘못된 문법

Python에서는 ... (Ellipsis)를 함수 파라미터로 직접 사용할 수 없습니다.


해결 방법: 실제 파라미터로 변경

수정 전 (오류)

Python

Copy

def __init__(self, ...):

수정 후 (올바른 문법)

예시 1: QdrantDataHelper 클래스

Python

Copy

def __init__(self, q_client_url, q_api_key=None, chunk_size=512):

    self.q_client_url = q_client_url

    self.q_api_key = q_api_key

    self.chunk_size = chunk_size

    # ... 나머지 초기화 코드

예시 2: 실제 사용 중인 파라미터로 맞춰서

Python

Copy

def __init__(self, documents_path, q_client_url, q_api_key=None, chunk_size=512, collection_name="default"):

    self.documents_path = documents_path

    self.q_client_url = q_client_url

    self.q_api_key = q_api_key

    self.chunk_size = chunk_size

    self.collection_name = collection_name

   

    # Qdrant 클라이언트 초기화

    import qdrant_client

    if q_api_key:

        self.client = qdrant_client.QdrantClient(url=q_client_url, api_key=q_api_key)

    else:

        self.client = qdrant_client.QdrantClient(url=q_client_url)

   

    # 임베딩 모델 초기화

    from llama_index.embeddings.huggingface import HuggingFaceEmbedding

    self.embedder = HuggingFaceEmbedding(model_name="sentence-transformers/all-mpnet-base-v2")


완전한 수정된 파일 예시

Python

Copy

# utils/qdrant_data_helper.py

 

import warnings

warnings.filterwarnings("ignore")

 

from llama_index.core import VectorStoreIndex, Document

from llama_index.core.settings import Settings

from llama_index.core.node_parser import SentenceSplitter

from llama_index.embeddings.huggingface import HuggingFaceEmbedding

from llama_index.core import StorageContext

from llama_index.vector_stores.qdrant import QdrantVectorStore

import qdrant_client

import os

 

 

class QdrantDataHelper:

    # 실제 파라미터로 수정

    def __init__(self, documents_path, q_client_url, q_api_key=None,

                 chunk_size=512, collection_name="documents"):

        self.documents_path = documents_path

        self.q_client_url = q_client_url

        self.q_api_key = q_api_key

        self.chunk_size = chunk_size

        self.collection_name = collection_name

       

        # Qdrant 클라이언트

        if q_api_key:

            self.client = qdrant_client.QdrantClient(

                url=q_client_url,

                api_key=q_api_key

            )

        else:

            self.client = qdrant_client.QdrantClient(url=q_client_url)

       

        # 임베딩 모델

        self.embedder = HuggingFaceEmbedding(

            model_name="sentence-transformers/all-mpnet-base-v2"

        )

       

        # Vector Store

        self.vector_store = QdrantVectorStore(

            client=self.client,

            collection_name=collection_name

        )

   

    def load_documents(self):

        """문서 로드"""

        from llama_index.core import SimpleDirectoryReader

        return SimpleDirectoryReader(self.documents_path).load_data()

   

    def ingest(self):

        """문서 인제스트"""

        # Settings 설정

        Settings.embed_model = self.embedder

        Settings.node_parser = SentenceSplitter(

            chunk_size=self.chunk_size,

            chunk_overlap=20

        )

       

        # 문서 로드 및 인덱싱

        documents = self.load_documents()

       

        storage_context = StorageContext.from_defaults(

            vector_store=self.vector_store

        )

       

        index = VectorStoreIndex.from_documents(

            documents,

            storage_context=storage_context

        )

       

        return index


메인 파일 (qdrant_data_helper.py) 수정

Python

Copy

# qdrant_data_helper.py (루트 파일)

 

from utils.qdrant_data_helper import QdrantDataHelper

 

# 실제 값으로 인스턴스 생성

ingestor = QdrantDataHelper(

    documents_path="./data",           # 문서 경로

    q_client_url="http://localhost:6333",  # Qdrant URL

    q_api_key=None,                    # API (로컬은 None)

    chunk_size=512,                    # 청크 크기

    collection_name="my_collection"    # 컬렉션 이름

)

 

index = ingestor.ingest()

print("Ingestion complete!")


핵심 정리

Table

잘못된 코드 올바른 코드
def __init__(self, ...): def __init__(self, param1, param2, ...):
... placeholder 실제 파라미터 이름과 기본값 지정

... (Ellipsis) Python에서 주로 다음 경우에 사용됩니다:

  • 타입 힌트: Callable[..., int]
  • pass 대체: def func(): ...
  • NumPy 등에서 슬라이싱: arr[..., 0]

함수 파라미터 자리표시자로는 사용할 수 없습니다!

"Notes: - UNEXPECTED: can be ignored when loading from different task/architecture; not ok if you expect identical arch. Traceback (most recent call last): File "/Local-Qdrant-RAG/qdrant_data_helper.py", line 21, in index = ingestor.ingest() ^^^^^^^^^^^^^^^^^ File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 146, in ingest service_context = self.create_service_context() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Local-Qdrant-RAG/utils/qdrant_data_helper.py", line 139, in create_service_context return ServiceContext.from_defaults(llm=None, embed_model=self.embedder, chunk_size=self.chunk_size) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/root/venv/lib/python3.12/site-packages/llama_index/core/service_context.py", line 33, in from_defaults raise ValueError( ValueError: ServiceContext is deprecated. Use llama_index.settings.Settings instead, or pass in modules to local functions/methods/interfaces. See the docs for updated usage/migration: https://docs.llamaindex.ai/en/stable/module_guides/supporting_modules/service_context_migration/ " 해결 방법?

Edit

Copy

Share

이 오류는 ServiceContextdeprecated(폐기)되었기 때문에 발생합니다. 이전에 설명드린 대로 Settings로 변경해야 합니다.

해결 방법

1. import 문 변경

Python

Copy

# utils/qdrant_data_helper.py 상단

 

# 제거

from llama_index.core import ServiceContext

 

# 추가

from llama_index.core.settings import Settings

from llama_index.core.node_parser import SentenceSplitter

2. create_service_context 메서드 수정

Python

Copy

# utils/qdrant_data_helper.py line 139

 

# 기존 코드 (오류)

def create_service_context(self):

    return ServiceContext.from_defaults(

        llm=None,

        embed_model=self.embedder,

        chunk_size=self.chunk_size

    )

 

# 수정된 코드

def create_service_context(self):

    # Settings에 글로벌 설정 적용

    Settings.embed_model = self.embedder

    Settings.llm = None  # 임베딩만 수행하는 경우

    Settings.node_parser = SentenceSplitter(

        chunk_size=self.chunk_size,

        chunk_overlap=20  # 필요시 추가

    )

    return Settings

3. ingest 메서드 수정 (선택사항 - 더 나은 방식)

Python

Copy

# utils/qdrant_data_helper.py line 146

 

# 기존

def ingest(self):

    service_context = self.create_service_context()

    # ... 나머지 코드

 

# 수정 - Settings는 전역이므로 반환값 불필요

def ingest(self):

    # Settings 적용

    self.create_service_context()

   

    # 문서 로드

    documents = self.load_documents()

   

    # 인덱스 생성 (Settings 자동 적용)

    from llama_index.core import VectorStoreIndex

    index = VectorStoreIndex.from_documents(documents)

   

    return index


완전한 수정된 create_service_context

Python

Copy

def create_service_context(self):

    """

    ServiceContext 대신 Settings 사용 (LlamaIndex v0.10+)

    """

    from llama_index.core.settings import Settings

    from llama_index.core.node_parser import SentenceSplitter

   

    # 글로벌 Settings 설정

    Settings.embed_model = self.embedder

    Settings.llm = None  # 임베딩 전용

   

    # chunk_size node_parser에 설정

    Settings.node_parser = SentenceSplitter(

        chunk_size=self.chunk_size,

        chunk_overlap=getattr(self, 'chunk_overlap', 20)

    )

   

    # transformaciones도 필요시 설정

    if hasattr(self, 'transformations'):

        Settings.transformations = self.transformations

   

    return Settings


가장 간단한 해결 (빠른 수정)

ServiceContext 부분만 주석 처리하고 Settings로 대체:

Python

Copy

# line 139 주변

def create_service_context(self):

    # ServiceContext 제거, Settings로 대체

    from llama_index.core.settings import Settings

    from llama_index.core.node_parser import SentenceSplitter

   

    Settings.embed_model = self.embedder

    Settings.llm = None

    Settings.node_parser = SentenceSplitter(chunk_size=self.chunk_size)

   

    return Settings


참고: Settings vs ServiceContext 차이점

Table

항목 ServiceContext () Settings ()
사용 방식 인스턴스 생성 후 전달 전역 객체 직접 수정
반환 객체 반환 전역 객체 (싱글톤)
유연성 지역적 설정 전역 설정 (override 가능)

수정 후에도 오류가 지속되면 ingest 메서드의 전체 코드를 공유해주세요

 

728x90