인프런 커뮤니티 질문&답변

Yeop Lee님의 프로필 이미지
Yeop Lee

작성한 질문수

모두를 위한 대규모 언어 모델 LLM(Large Language Model) Part 2 - 랭체인(LangChain)으로 나만의 ChatGPT 만들기

llm모델과 vectordb를 생성하는 retrevial모델이 다른경우, 어떻게 작동하는지 궁금합니다.

해결된 질문

작성

·

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

AISchool님의 프로필 이미지
AISchool
지식공유자

안녕하세요~. 반갑습니다.

먼저 교육이 도움이 되셨다니 기쁘네요^^.

 

RetrievalQA 클래스를 사용하시게 되면 다음의 과정을 거쳐서 최종 답변을 만들어내게됩니다.

  1. Retriever를 통해서 VectorDB에서 가장 유사한 Context 문장을 찾음

  2. 1에서 찾은 Context 문장을 포함한 Prompt를 구성해서 LLM에게 전달할 최종 Prompt 완성

  3. 최종 완성된 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에서 아래 코드 부분들을 참조하세요.

https://github.com/langchain-ai/langchain/blob/d136925c49868bc24513d7a249b2d085b9c5d06a/libs/langchain/langchain/chains/retrieval_qa/base.py#L222

https://github.com/langchain-ai/langchain/blob/d136925c49868bc24513d7a249b2d085b9c5d06a/libs/langchain/langchain/chains/retrieval_qa/base.py#L82

https://github.com/langchain-ai/langchain/blob/d136925c49868bc24513d7a249b2d085b9c5d06a/libs/langchain/langchain/chains/question_answering/stuff_prompt.py#L20

 

좋은 하루되세요.

감사합니다.

Yeop Lee님의 프로필 이미지
Yeop Lee
질문자

해당 부분 큰 도움 되었는데, 답글을 안남겼군요.. 이제서야 댓글 답니다. 감사합니다.

Yeop Lee님의 프로필 이미지
Yeop Lee

작성한 질문수

질문하기