본문 바로가기

IT, Computer

Retrieval Augmented Generation(RAG) 복습 (5) Pinecone

반응형

썸네일


목차


    서론

    이전에는 chroma를 활용해서 진행을 했다. 이번에는 Pinecone을 어떻게 활용하는지에 대해 포스팅을 하려고한다. Pincone의 장점은 무엇이며, Chroma랑 비교되는 부분을 알아보고, 이후에 코드를 통해 어떤식으로 구현하는 지 알아보겠다.


    Chroma , Pinecone 차이

    가장 큰 차이는 Chroma는 in-memory 방식을 사용한다는 것이고 Pinecone은 cloud를 이용한다는 것이다. cloud를 사용함으로써 llm 서버를 이전할 때 용이하다고 볼 수 있다. 즉, pinecone을 사용함으로써 database를 클라우드에다가 만드는 것이다. 그러므로 우리가 해야될건 기존 코드에서 database 부분을 수정하는 것이다.


    Chroma를 사용할때는 아래 코드와 같이 database를 선언했을 것이다. 주석과 같이 전자는 처음에 만들때고 후자는 이미 있는걸 끌어와서 쓸 때다. pinecone을 활용해서 db를 클라우드에 구축하려면 아래에 있는 database 부분을 변경해주면 된다.

    
    # 1. 처음 database를 만드는 경우
    database = Chroma(documents = documents_list, embedding = embeddings, collection_name = '이름') 
    
    # 2. 기존에 database가 있는 경우
    database = Chroma (embedding = embeddigs, collection_name = '이름', persist_directory = './chroma')

     

    https://python.langchain.com/v0.2/docs/integrations/vectorstores/pinecone/ 여기에 들어가서 필요한 패키지들을 설치를 한 뒤, 아래 코드를 작성하자. 해당 코드는 위에 링크에서 복붙할 수 있다.

    import getpass
    import os
    import time
    
    from pinecone import Pinecone
    
    if not os.getenv("PINECONE_API_KEY"):
        os.environ["PINECONE_API_KEY"] = getpass.getpass("Enter your Pinecone API key: ")
    
    pinecone_api_key = os.environ.get("PINECONE_API_KEY")
    
    pc = Pinecone(api_key=pinecone_api_key)

    이걸 돌리면 api key를 넣으라는 문구가 vscode상단에 뜨는데 발급받은 api key를 입력하면 된다. api key는 https://app.pinecone.io/ 여기로 들어가서 회원가입을 한 다음 아래 사진에 있는 API keys를 누르면 발급하는 키가 뜬다. 그거 누르면 됨. .env에 넣어도 돌아간다.  

    메뉴 리스트

    이후, 위 사진에서 두번째 행에 있는 database를 클릭한다. 그후 create index를 클릭하고, 본인이 원하는 인덱스 이름을 넣으면 된다. 그 아래 Configuration이 있는데 Dimensions은 임베딩 모델의 벡터 크기다. 내가 무슨 임베딩 모델을 쓰냐에 따라서 dimension이 달라진다. setup-by-model을 클릭하여 내가 쓰는 임베딩 모델을 클릭한다. Metric은 뭐가 정답인건 없지만 consine이 국룰로 통하고 있다. 그리하자. cosine 유사도 검색을 한다는 뜻이다. 나머지는 냅두고, 맨 아래에 있는 create index를 누르면 index가 만들어진다. 이제 셋팅이 됐으니 다시 vscode로 넘어온다. 아까 제일 처음에 database를 삭제했던 그 자리에 코드를 넣을 차례다.

     

    from langchain_pinecone import PineconeVectorStore
    
    index = '내가 설정한 index'
    database = PineconeVectorStore.from_documents(document_list,embedding=embedding, index=index)
    # 참고로, documnet_list, embedding은 앞에서 선언했다고 가정.

    끝으로

    위에 코드가 무사히 돌려진 다음 pinecone index 페이지에 들어가면 database에 저장된 걸 볼 수 있다. 이후 아래는 기존 코드와 동일하게 진행하면 된다. 이번 포스팅은 여기까지로하고, 다음 포스팅에서는 dictionary를 활용해서 RAG의 효율을 개선하는 과정을 알아보도록 하겠다. 다음 포스팅을 보려면 여기로.