질의응답(QA, Question Answering) 시스템은 자연어 질문에 대해 문서나 지식 베이스에서 답변을 추출하거나 생성하는 NLP 시스템이다.
QA 시스템 유형
추출형 QA (BERT)
python
from transformers import pipeline
qa_pipeline = pipeline(
"question-answering",
model="monologg/koelectra-base-finetuned-korquad",
device=0,
)
context = """
삼성전자는 대한민국의 다국적 전자기업이다. 1969년 이병철이 창립했으며
본사는 경기도 수원시에 위치한다. 반도체, 스마트폰, 가전제품을 주력으로 한다.
"""
questions = [
"삼성전자는 언제 창립되었나요?",
"삼성전자 본사는 어디에 있나요?",
]
for q in questions:
result = qa_pipeline(question=q, context=context)
print(f"Q: {q}")
print(f"A: {result['answer']} (신뢰도: {result['score']:.3f})")
RAG 시스템 구현
python
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서 청킹
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(documents)
# 벡터 저장소 생성
vectorstore = Chroma.from_documents(
docs,
embedding=OpenAIEmbeddings(),
persist_directory="./chroma_db",
)
# RAG 체인
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o-mini", temperature=0),
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
)
result = qa_chain("삼성전자의 주력 제품은 무엇인가요?")
print(f"답변: {result['result']}")
for doc in result['source_documents']:
print(f"출처: {doc.metadata['source']}")