이전까지는 문서를 로드하여 쪼갠 후 임베딩한 데이터를 chroma 라는 것을 이용하여 저장 하였는데 이번에는 이 벡터 데이터를 pinecone 이라는 클라우드에 넣어 보겠다.
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(
model="llama3.2:1b"
)
가입 직후의 모습은 아래와 같다.
HTTP response body: {"code":3,"message":"Vector dimension 2048 does not match the dimension of the index 3072","details":[]}
*Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings... *
index 가 만들어졌다.
# 분실하면 다시 만들어야 함.
PINECONE_API_KEY=pcsk_78oqUZ_7KP2dGutbe7tNw............
from dotenv import load_dotenv
load_dotenv()
%pip install --upgrade --quiet langchain-pinecone
langchain-community langchain pinecone-notebooksß
import os
from langchain_pinecone import PineconeVectorStore
from pinecone import Pinecone
import time
pinecone_api_key = os.environ.get("PINECONE_API_KEY")
pc = Pinecone(api_key=pinecone_api_key)
# pinecone index 에 저장
# dimension 을 어거지로 2048로 맞춘 것...
pinecone_database = PineconeVectorStore.from_documents(
documents=document_list, # 기존과 동일
embedding=embeddings, # 기존과 동일
pinecone_api_key=pinecone_api_key,
index_name="index"
)
index 를 저장하면 이런 모습이다.
index 상세 내역을 보면 원본 파일명과 쪼갠 텍스트의 일부를 볼 수 있다.
from langchain_community.chat_models import ChatOllama
# pull 받은 모델 사용
llm = ChatOllama(
model="llama3.2:1b"
)
from langchain import hub
# 프롬프트를 제공한다.
prompt = hub.pull("rlm/rag-prompt")
retriever 가 chroma_database 에서 pinecone_database 로 변경된다. 나머지는 동일하다.
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm, # llama3.2:1b
retriever=pinecone_database.as_retriever(), # 다양하게 사용됨. 이걸로 데이터를 가져옴.
chain_type_kwargs={"prompt": prompt}
)
ai_message = qa_chain({"query": "닌텐도가 만든 게임은?"})
ai_message
질문 할때마다 계속 다른 결과물을 준다. 나도 좋은 모델 사용해보고 싶구먼...
이번에는 chroma 대신 pinecone 을 사용하는 것 뿐이었지만 로컬 vector 데이터를 관리하기가 용이하지 않기에 클라우드 저장소의 이점을 충분히 살릴 수 있을 것 같다. 여러 index 를 미리 만들어놓고 테스트 하기에도 편할듯 하다.