해결된 질문
작성
·
569
0
안녕하세요, 수업을 잘 듣고 사용하고 있는 기업 연구원입니다.
llm모델과 retrevial모델이 다른 경우 벡터값이 다를텐데, 어떻게 작동하는지 모르겠어서 질문드립니다.
자세한 내용은 아래와 같습니다.
Retrevial모델로는 mpnet을 사용합니다.
model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {"device": "cuda:0"}
embeddings = HuggingFaceEmbeddings(model_name=model_name,
model_kwargs=model_kwargs
)
이러한 임베딩 모델을 선언한 뒤에, chroma로 vectordb를 만들었다고 가정하고,
llm틀은 llama2를 사용하여 쿼리 파이프라인을 만들었습니다.
retriever = vectordb.as_retriever()
query_pipeline = transformers.pipeline(
"text-generation",
model=model, # 모델id: 'meta-llama/Llama-2-7b-chat-hf'로 함 (생략됨)
tokenizer=tokenizer,
torch_dtype=torch.float16,
device_map= device,
)
llm = HuggingFacePipeline(pipeline=query_pipeline)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True
)
이런식으로 해서 사용을 해도 사용이 잘 되는 것을 확인했습니다만 이해가 안됩니다.
제가 '쿼리'를 보내면, llama2 모델이 벡터화를 할 것이고,
벡터db에서 찾을때는 "sentence-transformers/all-mpnet-base-v2"이 모델로 벡터화 된 데이터를 찾을 것인데 이 두 벡터 값이 다를 것 같은데 왜 작동이 되는 건가요?
제 생각으로는 두개의 다른 모델이라면 같은 문장이어도 다른 벡터값을 가질텐데, 어떻게 이게 두개의 언어모델이 다른데 작동하는건지 궁금합니다.
답변 기다리겠습니다. 감사합니다:) 좋은 교육 받을 수 있어서 기쁩니다.
답변 1
1
안녕하세요~. 반갑습니다.
먼저 교육이 도움이 되셨다니 기쁘네요^^.
RetrievalQA 클래스를 사용하시게 되면 다음의 과정을 거쳐서 최종 답변을 만들어내게됩니다.
Retriever를 통해서 VectorDB에서 가장 유사한 Context 문장을 찾음
1에서 찾은 Context 문장을 포함한 Prompt를 구성해서 LLM에게 전달할 최종 Prompt 완성
최종 완성된 Prompt를 이용해서 LLM이 해당 Prompt에 대한 답변 생성
말씀해주신 상황은 위 과정에서 1번 과정에서 sentence-transformers/all-mpnet-base-v2 모델이 query에 기반해서 가장 유사한 context 문장을 찾고, 해당 context 문장을 토대로 최종 prompt 를 구성한뒤 해당 prompt에 기반해서 3번 과정에서 llama2이 답변을 해주게됩니다.
따라서 1번과 3번 과정은 독립적으로 이루어지기 때문에 2개의 다른 모델을 사용해도 문제가 없습니다.
정확히 system prompt로 아래와 같은 문장을 사용하고 (1번과정에서 {context} 부분에 replace 될 문장을 찾는 것입니다.)
system_template = """Use the following pieces of context to answer the user's question.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
----------------
{context}"""
human prompt로 아래와 같은 문장이 사용됩니다.
"{question}"
LangChain GitHub에서 아래 코드 부분들을 참조하세요.
좋은 하루되세요.
감사합니다.
해당 부분 큰 도움 되었는데, 답글을 안남겼군요.. 이제서야 댓글 답니다. 감사합니다.