[AI] 5. RetrievalQA Chain 을 사용해 보자

늘 공부하는 괴짜·2025년 3월 25일
0

AI : Langchain (RAG)

목록 보기
5/38

말 그대로 Retrieval 한뒤 Question/Answer 하겠다... 라는 것이다. (?)

있는 그대로 말하자면 그렇고, 선언된 llm과, Retriever, Prompt 를 묶어서 뭔가 해주겠다는 의미같다.

------ 문서를 읽고 쪼개는 과정은 생략한다. -------

1. Embbeding 선언

from dotenv import load_dotenv
from langchain_community.embeddings import OllamaEmbeddings

load_dotenv()

embeddings = OllamaEmbeddings(
    model="llama3.2:1b"
)

2. Vector database 선언

from langchain_chroma import Chroma

chroma_database = Chroma.from_documents(
    documents=document_list,
    embedding=embeddings,
    persist_directory="./chroma_db",
    collection_name="chroma_nintendo"
)

3. llm 선언

from langchain_community.chat_models import ChatOllama

# pull 받은 모델 사용
llm = ChatOllama(
    model="llama3.2:1b"
)  

1 부터 3 까지는 사실 이전과 동일하다.

new-1. langchainhub 설치

# 랭체인 허브 설치.
%pip install -U langchain langchainhub --quiet

new-2. langchainhub 에서 프롬프트 불러오기

from langchain import hub

# 프롬프트를 제공한다.
prompt = hub.pull("rlm/rag-prompt")

new-3. RetrievalQA 로 llm, retriever, prompt 를 인수로 넘긴다.

from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(
    llm, # llama3.2:1b
    retriever=chroma_database.as_retriever(), # 다양하게 사용됨. 이걸로 데이터를 가져옴.
    chain_type_kwargs={"prompt": prompt}
)

new-4. 체이닝된 qa_chain 에 질문을 던진다.

ai_message = qa_chain({"query": "닌텐도가 만든 게임은?"})

역시 모델이 구려서 그런가... 답변도 시원찮다.

Finally

지난번에 워드 문서로 가지고 놀때...
질의(query) 와 retrieved_docs (유사검색 결과), 모델(llm), 질문 프롬프트(retrieved_docs와 query 설정)를 조금 조잡하게 설정했던 기억이 있다. RetrievalQA 는 이런 부분을 어느 정도는 해소해 주는 느낌이다. 중간에 llm이나 retriever, query 가 변경이 될 경우 qa_chain 쪽 소스만 변경하면 되니 좀더 간결하게 코딩이 가능해질 것이다.

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글