가수면

Vector Db, Embedding 본문

Python/LLM

Vector Db, Embedding

니비앙 2024. 7. 7. 23:59

langchain 로더 - https://github.com/langchain-ai/langchain/tree/master/libs/langchain/langchain/document_loaders

 

langchain/libs/langchain/langchain/document_loaders at master · langchain-ai/langchain

🦜🔗 Build context-aware reasoning applications. Contribute to langchain-ai/langchain development by creating an account on GitHub.

github.com

Text Splitter - llm의 경우 한번에 보낼 수 있는 토큰 제한이 있어 큰 텍스트를 청크로 나누는 역할을 해줌

text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size=100,
    chunk_overlap=20,	# 의미가 불분명하게 잘리지 않도록 청크 간 오버랩 설정
    length_function=len,
    is_separator_regex=False,
)

 

 

import os

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore

if __name__ == '__main__':
    print("Ingesting...")
    loader = TextLoader("mediumblog1.txt") # text말고도 다른 형식 많음. 모두 .load() 방식을 사용
    document = loader.load()

    print("splitting...")
    text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) # text splitter 생성
    texts = text_splitter.split_documents(document) # 데이터 청크로 쪼개기
    print(f"created {len(texts)} chunks")

    embeddings = OpenAIEmbeddings(openai_api_key=os.environ.get("OPENAI_API_KEY")) # 임베딩 모델 생성

    print("ingesting...")
    PineconeVectorStore.from_documents(texts, embeddings, index_name=os.environ['INDEX_NAME'])
    # 인수 = 대상, 사용할 임베딩 모델 정보를 가진 임베딩 객체, 저장할 index(Pinecone 저장소) 이름
    print("finish")

 

 

import os

from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_pinecone import PineconeVectorStore

from langchain import hub
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.retrieval import create_retrieval_chain


if __name__ == "__main__":
    print(" Retrieving...")

    embeddings = OpenAIEmbeddings()
    llm = ChatOpenAI()

    query = "what is Pinecone in machine learning?"
    chain = PromptTemplate.from_template(template=query) | llm
    # result = chain.invoke(input={})
    # print(result.content)

    vectorstore = PineconeVectorStore(
        index_name=os.environ["INDEX_NAME"], embedding=embeddings
    )

    retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
    combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
    retrival_chain = create_retrieval_chain(
        retriever=vectorstore.as_retriever(), combine_docs_chain=combine_docs_chain
    )

    result = retrival_chain.invoke(input={"input": query})

    print(result)

create_stuff_documents_chain

검색으로 가져온 벡터를 llm에 사용할 프롬프트에 채우는 역할을 함

create_retrieval_chain

벡터 db에서 검색해서 프롬프트를 만드는 총괄 프로세스를 담당.

검색을 담당할 백터 스토어와 입력 문서로 채워진 프롬프트를 인자로 받음

 

프로세스 흐름

 

  • 질문 쿼리 입력:
    • 사용자가 질문을 입력. 이 질문은 벡터 스토어에서 관련 문서를 검색하는 데 사용된다.
  • 벡터 검색:
    • 입력된 질문에 대한 임베딩 작업
    • 변환된 질문 벡터를 retriever가 받아 유사도 검색으로 벡터 데이터베이스에서 관련된 벡터(문서)를 검색
  • 프롬프트 생성 및 LLM 호출:
    • combine_docs_chain에 의해 분리된 청크를 결합해 프롬프트로 생성
    • 결과적으로 질문 + 답변으로 참조할 정보(db에 저장된 검색 결과 벡터)들을 하나의 프롬프트로 생성한다.
    • 생성된 프롬프트를 LLM으로 전송
  • LLM 응답:
    • LLM은 프롬프트를 받아 질문에 대한 응답을 생성 (llm이 기존 알고 있는 지식 + 프롬프트로 받은 정보를 취합해 답변 생성)
    • 응답을 사용자에게 반환

 

'Python > LLM' 카테고리의 다른 글

프롬프트 엔지니어링  (0) 2024.07.22
토큰 한도 처리 전략  (4) 2024.07.22
Agent 구현  (0) 2024.07.17
[기본] LangChain  (0) 2024.06.30
Comments