본문 바로가기

카테고리 없음

엣지에서 AI 활용하기: 올라마, 큐드런트, 라즈베리 파이로 RAG 시스템 구축하기

반응형

 

이 글은 마치 π와 e가 만나 오일러의 공식을 탄생시킨 것처럼, Raspberry Pi, Ollama, 그리고 Qdrant라는 세 가지 요소를 절묘하게 결합하여 흥미로운 RAG 시스템을 구축하는 방법을 소개하고 있습니다. fb @LlamaIndex KR

 

1. 구조적 우수성:

 

이 시스템의 구조는 마치 완벽한 정육면체처럼 안정적입니다. Raspberry Pi라는 경제적인 하드웨어 위에 Ollama(언어 모델용)와 Qdrant(벡터 데이터베이스용)라는 소프트웨어 도구들이 균형 있게 자리 잡고 있죠. 이는 마치 삼각함수의 삼각형처럼 각 요소가 서로를 보완하며 작동합니다.

 

2. 경제성과 효율성:

 

이 접근 방식의 비용 효율성은 소수점 아래로 무한히 뻗어가는 π처럼 끝이 없어 보입니다. Raspberry Pi를 사용함으로써 비용은 최소화하면서도, 엣지 컴퓨팅의 장점을 극대화했습니다. 이는 마치 최적화 문제에서 최소값을 찾아내는 것과 같은 묘미가 있습니다. 3. 구현의 명확성:

 

글에서 제시된 구현 단계는 수학적 증명처럼 명확하고 논리적입니다. 특히 LlamaIndex 라이브러리를 사용한 RAG 파이프라인 구축 과정은 복잡한 미적분 문제를 단계별로 풀어나가는 것처럼 체계적으로 설명되어 있습니다. 4. 한계점 인식:

 

저자는 이 시스템의 성능 한계를 인정하면서도, 마치 테일러 급수로 함수를 근사하듯이 의미론적 캐싱이나 모델 양자화 같은 최적화 기법을 제안하고 있습니다. 이는 문제를 정직하게 바라보고 해결책을 모색하는 수학자의 자세와 닮아있습니다.

5. 미래 발전 가능성:

 

이 접근법은 AI 기술을 더욱 접근 가능하게 만드는 데 기여합니다. 마치 복소수가 실수의 세계를 확장했듯이, 이러한 DIY 방식의 RAG 시스템은 AI 응용 프로그램의 영역을 넓힐 수 있는 잠재력을 가지고 있습니다.

 

결론적으로, 이 글은 '저비용 고효율'이라는 수학의 최적화 원리를 AI 시스템 구축에 적용한 훌륭한 예시입니다. 물론 클라우드 기반 솔루션에 비해 성능과 확장성에서 한계가 있겠지만, 이는 마치 뉴턴의 물리학이 아인슈타인의 상대성 이론으로 확장된 것처럼, 더 큰 발전을 위한 징검다리가 될 수 있을 것입니다.

 

저자의 이러한 시도는 AI의 민주화에 기여하는 의미 있는 한 걸음으로, 앞으로 이 분야에서 더 많은 '수학적 아름다움'을 발견할 수 있기를 기대해 봅니다! 

 

원문 링크 

 

엣지에서 AI 활용하기: 올라마, 큐드런트, 라즈베리 파이로 RAG 시스템 구축하기 

 

작고 비용 효율적인 라즈베리 파이를 활용해 검색 증강 세대(RAG) 시스템을 위한 임베딩 모델, 벡터 데이터베이스 및 언어 모델(LLM)을 호스팅하면 경제성, 휴대성 및 에너지 효율성이 독특하게 조화를 이룹니다. 이 접근 방식은 실험과 학습을 위한 저비용 플랫폼을 제공하여 고급 AI 기능에 대한 액세스를 대중화할 뿐만 아니라 데이터를 로컬에서 처리하여 지연 시간과 대역폭 사용량을 줄이는 엣지 컴퓨팅 솔루션을 구현할 수 있습니다. 오프라인 기능, 높은 커스터마이징 기능, 지원 커뮤니티의 이점이 추가된 RAG 시스템용 Ollama, Qdrant 및 Raspberry Pi를 활용하면 교육 도구부터 실시간 현지화된 AI 서비스에 이르기까지 광범위한 애플리케이션에 실용적이고 혁신적인 솔루션을 제공할 수 있습니다. 

 

 

아키텍처

 

이 다이어그램은 라즈베리 파이 5, 언어 모델(LLM)을 위한 Ollama, 임베딩 모델, 벡터 데이터베이스(VDB) 관리를 위한 Qdrant를 사용하는 검색 증강 세대(RAG) 시스템의 아키텍처를 보여줍니다. 라즈베리 파이 5는 임베딩 모델과 언어 모델을 모두 호스팅하는 컴팩트하고 비용 효율적인 컴퓨팅 장치를 제공하는 중앙 하드웨어 구성 요소 역할을 합니다. 올라마는 LLM을 관리하여 라즈베리 파이가 자연어 데이터를 생성하고 처리하는 정교한 언어 모델을 실행할 수 있도록 합니다. Qdrant는 LLM에서 생성된 임베딩을 저장 및 관리하고 벡터 데이터의 효율적인 검색과 검색을 보장하는 벡터 데이터베이스 역할을 하며, 이는 RAG 시스템에 매우 중요한 요소입니다. 이 설정은 저렴하고 휴대성이 뛰어난 라즈베리파이의 특성을 활용하여 다재다능하고 강력한 AI 솔루션을 만들어냅니다.

 

워크플로

 

전체 프로세스는 데이터 수집 및 임베딩 생성으로 시작됩니다. 라즈베리 파이에서 호스팅되는 LLM은 입력 데이터를 처리하여 임베딩을 생성하고, 임베딩은 Qdrant에 저장됩니다. 쿼리가 발생하면 RAG 시스템은 이러한 임베딩을 사용하여 벡터 데이터베이스에서 가장 관련성이 높은 데이터를 검색합니다. 그런 다음 검색된 데이터는 LLM에서 처리되어 일관성 있고 맥락에 맞는 응답을 생성합니다. 이 응답이 RAG 프로세스의 최종 결과물입니다. Qdrant의 데이터 스토리지, LLM의 데이터 처리, Raspberry Pi의 하드웨어 기능 간의 원활한 상호 작용을 통해 효율적이고 효과적인 데이터 검색 및 응답 생성이 가능합니다.

 

장점

 

비용 효율적: 라즈베리 파이 5를 활용하면 비용과 공간 요구 사항이 줄어들어 다양한 애플리케이션에 이 기술을 적용할 수 있습니다.

 

휴대성: 크기가 작아 다양한 장소로 쉽게 이동하고 배포할 수 있어 데모, 교육 목적 또는 현지화된 애플리케이션에 이상적입니다.

 

에너지 효율성: 라즈베리파이 5는 표준 서버보다 훨씬 적은 전력을 소비하므로 지속적인 애플리케이션이나 실험을 실행할 수 있는 친환경적인 대안이 될 수 있습니다.

 

엣지 컴퓨팅: 라즈베리파이에서 RAG 시스템을 실행하면 데이터 처리 및 분석이 데이터 소스와 더 가까운 곳에서 이루어지므로 지연 시간과 대역폭 사용량을 줄일 수 있는 엣지 컴퓨팅이 가능합니다.

 

개인정보 보호: Raspberry Pi에서 로컬로 데이터를 처리하면 민감한 정보가 인터넷을 통해 전송되지 않도록 하여 데이터 유출 및 무단 액세스의 위험을 줄임으로써 개인정보 보호가 강화됩니다.

 

구현

 

라즈베리파이 이미저를 사용하여 라즈베리파이 OS를 설치하는 것은 몇 단계만 거치면 완료할 수 있는 간단한 과정입니다. 다음은 설치에 도움이 되는 자세한 가이드입니다.

 

1. 라즈베리파이 이미저 다운로드 및 설치

 

먼저 컴퓨터에 라즈베리파이 이미저 소프트웨어를 다운로드해야 합니다. 라즈베리파이 이미저는 공식 라즈베리파이 웹사이트에서 찾을 수 있습니다.

 

라즈베리 파이 이미저 다운로드 페이지로 이동합니다.

 

사용 중인 운영 체제(Windows, macOS 또는 Ubuntu)에 적합한 버전을 다운로드합니다.

 

특정 OS의 설치 지침에 따라 소프트웨어를 설치합니다.

 

2. microSD 카드 준비하기

 

최소 8GB 이상의 저장 용량이 있는 microSD 카드가 필요합니다. 필요한 경우 적절한 어댑터를 사용하여 microSD 카드를 컴퓨터에 삽입합니다.

 

3. 라즈베리파이 이미저 실행

 

설치가 완료되면 컴퓨터에서 라즈베리 파이 이미저를 엽니다.

 

4. 운영 체제 선택하기

 

라즈베리파이 이미저에서 "OS 선택" 버튼을 클릭합니다.

 

운영체제 목록이 나타납니다. 목록에서 "Raspberry Pi OS(32비트)"를 선택합니다. 특정 요구사항이 있는 경우 다른 버전을 선택할 수도 있습니다(예: 최소한의 설치를 위한 Raspberry Pi OS Lite).

 

5. 스토리지 선택

 

다음으로 "스토리지 선택" 버튼을 클릭합니다.

 

이전에 삽입한 microSD 카드를 선택합니다. 이미저가 기존 데이터를 덮어쓰게 되므로 올바른 드라이브를 선택하도록 주의하세요.

 

6. 6. microSD 카드에 OS 쓰기

 

OS와 저장소를 선택한 후 "쓰기" 버튼을 클릭합니다.

 

이미저가 OS를 microSD 카드에 쓸 것인지 확인하라는 메시지를 표시합니다. 이를 확인한 후 이미저가 라즈베리 파이 OS를 다운로드하고 설치하도록 허용합니다. 이 과정은 몇 분 정도 걸릴 수 있습니다.

 

7. Raspberry Pi에 microSD 카드를 삽입합니다.

 

라즈베리파이 이미저가 microSD 카드에 OS 쓰기를 완료하면 컴퓨터에서 카드를 제거합니다.

 

microSD 카드를 라즈베리파이에 삽입합니다.

 

8. 라즈베리 파이 전원 켜기

 

라즈베리파이를 전원에 연결합니다. 모니터, 키보드, 마우스와 같은 주변 장치도 연결해야 합니다.

 

라즈베리파이의 전원을 켭니다. 라즈베리 파이 OS 설정 화면으로 부팅됩니다. 

 

9. 초기 설정

 

화면의 안내에 따라 라즈베리 파이 OS의 초기 설정을 완료합니다.

 

국가, 언어, 시간대를 설정하라는 메시지가 표시됩니다.

 

Raspberry Pi 모델이 지원하는 경우 Wi-Fi 연결을 설정할 수도 있습니다.

 

10. 설정 완료

 

초기 설정이 완료되면 라즈베리파이 OS 데스크톱으로 이동합니다.

 

여기에서 다양한 프로젝트와 작업에 라즈베리 파이를 사용할 수 있습니다.

 

이제 라즈베리파이5에 올라마와 큐드랜트를 설치할 준비가 되었습니다.

 

 

도커 올라마, 큐드란트 설치:

 

공식 도커 페이지에서 데비안 설치에 대한 도커를 따르세요.

 

Qdrant-퀵스타트 가이드에 따라 Linux에 Qdrant를 설치합니다.

 

Ollama 공식 페이지의 Ollama 설치 지침을 따릅니다.

 

모든 설치가 완료되고 성공하여 구성 요소가 실행되면 아래에 표시될 것입니다. 

 

라즈베리 파이에서 임베드 및 언어 모델을 보여주는 올라마

 

 

라즈베리 파이에서 실행되는 큐드론.

 

 

The Code Test

 

from llama_index.core import (
    SimpleDirectoryReader,
    VectorStoreIndex,
    StorageContext,
    Settings,
    get_response_synthesizer)
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.schema import TextNode, MetadataMode
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.core.retrievers import VectorIndexRetriever
import qdrant_client
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# load the local data directory and chunk the data for further processing
docs = SimpleDirectoryReader(input_dir="data", required_exts=[".pdf"]).load_data(show_progress=True)
text_parser = SentenceSplitter(chunk_size=512, chunk_overlap=100)

# Create a local Qdrant vector store
logger.info("initializing the vector store related objects")
client = qdrant_client.QdrantClient(url="http://192.168.1.103:6333/")
vector_store = QdrantVectorStore(client=client, collection_name="research_papers")

# local vector embeddings model
logger.info("initializing the OllamaEmbedding")
embed_model = OllamaEmbedding(model_name='nomic-embed-text:latest', base_url='https://192.168.1.103:11434')

logger.info("initializing the global settings")
Settings.embed_model = embed_model
Settings.llm = Ollama(model="gemma:2b", base_url='https://192.168.1.103:11434', request_timeout=600)
Settings.transformations = [text_parser]

text_chunks = []
doc_ids = []
nodes = []

logger.info("enumerating docs")
for doc_idx, doc in enumerate(docs):
    curr_text_chunks = text_parser.split_text(doc.text)
    text_chunks.extend(curr_text_chunks)
    doc_ids.extend([doc_idx] * len(curr_text_chunks))

logger.info("enumerating text_chunks")
for idx, text_chunk in enumerate(text_chunks):
    node = TextNode(text=text_chunk)
    src_doc = docs[doc_ids[idx]]
    node.metadata = src_doc.metadata
    nodes.append(node)

logger.info("enumerating nodes")
for node in nodes:
    node_embedding = embed_model.get_text_embedding(
        node.get_content(metadata_mode=MetadataMode.ALL)
    )
    node.embedding = node_embedding

logger.info("initializing the storage context")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
logger.info("indexing the nodes in VectorStoreIndex")
index = VectorStoreIndex(
    nodes=nodes,
    storage_context=storage_context,
    transformations=Settings.transformations,
)

logger.info("initializing the VectorIndexRetriever with top_k as 5")
vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
response_synthesizer = get_response_synthesizer()
logger.info("creating the RetrieverQueryEngine instance")
vector_query_engine = RetrieverQueryEngine(
    retriever=vector_retriever,
    response_synthesizer=response_synthesizer,
)

logger.info("retrieving the response to the query")

# Start a loop to continually get input from the user
while True:
    # Get a query from the user
    user_query = input("Enter your query [type 'bye' to 'exit']: ")

    # Check if the user wants to terminate the loop
    if user_query.lower() == "bye" or user_query.lower() == "exit":
        break

    response = vector_query_engine.query(str_or_query_bundle=user_query)
    print(response)
    client.close()

 

 

라즈베리파이에서 RAG 실행하기.

 

라즈베리 파이에서 포인트 및 메타데이터로 수집된 큐드론 컬렉션.

 

향후 범위

 

추론 속도가 약간 느린 경우 시맨틱 캐시, 벡터 양자화 기술 및 언어 모델 양자화와 같은 기술을 사용하여 성능을 부팅할 수 있습니다.

 

결론

 

결론적으로, 라즈베리 파이 5를 사용하여 언어 모델링을 위한 Ollama와 벡터 데이터베이스 관리를 위한 Qdrant를 갖춘 검색 증강 세대(RAG) 시스템을 호스팅하는 것은 매우 효율적이고 비용 효율적인 솔루션입니다. Linux에 Docker, Qdrant, Ollama를 설치하면 원활한 통합과 강력한 성능을 보장합니다. 이러한 접근 방식은 고급 AI 기술에 대한 액세스를 대중화할 뿐만 아니라 휴대성, 에너지 효율성 및 개인정보 보호를 강화하여 다양한 혁신 애플리케이션에 이상적인 선택이 될 수 있습니다. 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^