가수면
Vector Db, Embedding 본문
langchain 로더 - https://github.com/langchain-ai/langchain/tree/master/libs/langchain/langchain/document_loaders
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