LangChain을 사용하여 특정 문서에 대한 질문에 답변하는 방법을 알아보겠습니다. 이 과정에서 OpenAI의 임베딩과 언어 모델을 활용하고, Chroma를 벡터 스토어로 사용하여 효율적인 검색을 구현할 것입니다. 마지막에는 작동 가능한 전체 실습 코드를 제공하겠습니다. 참고로, OPENAI_API_KEY
는 .env
파일에 저장하여 불러올 것입니다.
먼저, 필요한 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요:
pip install langchain openai chromadb python-dotenv
langchain
: LLM을 효율적으로 활용하기 위한 라이브러리입니다.openai
: OpenAI의 API를 사용하기 위한 라이브러리입니다.chromadb
: Chroma 벡터 스토어를 사용하기 위한 라이브러리입니다.python-dotenv
: .env
파일에서 환경 변수를 로드하기 위한 라이브러리입니다.OPENAI_API_KEY
를 .env
파일에 저장하고 코드에서 불러옵니다.
.env
파일 생성 및 API 키 저장프로젝트 디렉토리에 .env
파일을 생성하고 다음과 같이 작성합니다:
OPENAI_API_KEY=your_openai_api_key_here
your_openai_api_key_here
부분을 실제 OpenAI API 키로 대체하세요.
import os
from dotenv import load_dotenv
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
OpenAI의 임베딩 기능을 사용하여 텍스트를 벡터로 변환합니다.
from langchain.embeddings.openai import OpenAIEmbeddings
embedding_function = OpenAIEmbeddings()
Chroma를 사용하여 벡터 스토어에 연결합니다. 여기서는 이미 구축된 벡터 스토어를 불러옵니다.
from langchain.vectorstores import Chroma
db_connection = Chroma(
persist_directory='../01-Data-Connections/US_Constitution/',
embedding_function=embedding_function
)
주의사항:
persist_directory
는 벡터 스토어가 저장된 디렉토리의 경로입니다. 이 경로는 여러분의 환경에 맞게 수정해야 합니다.OpenAI의 채팅 모델을 사용하여 자연스러운 답변을 생성합니다.
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0)
temperature=0
은 답변의 일관성을 높여줍니다.질문에 답변하기 위한 체인을 설정합니다.
from langchain.chains.question_answering import load_qa_chain
chain = load_qa_chain(llm, chain_type='stuff')
chain_type='stuff'
는 간단한 체인 유형을 지정합니다.사용자가 질문을 입력하고, 벡터 스토어에서 관련 문서를 검색합니다.
question = "What is the 15th amendment?"
docs = db_connection.similarity_search(question)
similarity_search
함수는 질문과 유사한 내용을 가진 문서를 반환합니다.체인을 실행하여 답변을 얻고 출력합니다.
answer = chain.run(input_documents=docs, question=question)
print("Answer:")
print(answer)
답변과 함께 해당 정보의 출처를 알고 싶다면, load_qa_with_sources_chain
을 사용합니다.
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
chain_with_sources = load_qa_with_sources_chain(llm, chain_type='stuff')
query = "What is the 14th amendment?"
docs = db_connection.similarity_search(query)
answer_with_sources = chain_with_sources.run(input_documents=docs, question=query)
print("\nAnswer with Sources:")
print(answer_with_sources)
아래는 위의 모든 단계를 합친 전체 코드입니다.
import os
from dotenv import load_dotenv
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains.qa_with_sources import load_qa_with_sources_chain
from langchain.chains.question_answering import load_qa_chain
from langchain.chat_models import ChatOpenAI
# OpenAI API 키 로드하기
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
# 임베딩 함수 설정하기
embedding_function = OpenAIEmbeddings()
# 벡터 스토어 연결하기
db_connection = Chroma(
persist_directory='../01-Data-Connections/US_Constitution/',
embedding_function=embedding_function
)
# 언어 모델 설정하기
llm = ChatOpenAI(temperature=0)
# 질문에 답변하는 체인 설정하기
chain = load_qa_chain(llm, chain_type='stuff')
# 질문 정의 및 문서 검색
question = "What is the 15th amendment?"
docs = db_connection.similarity_search(question)
# 체인 실행 및 답변 출력
answer = chain.run(input_documents=docs, question=question)
print("Answer:")
print(answer)
# 출처와 함께 답변 얻기
chain_with_sources = load_qa_with_sources_chain(llm, chain_type='stuff')
query = "What is the 14th amendment?"
docs = db_connection.similarity_search(query)
answer_with_sources = chain_with_sources.run(input_documents=docs, question=query)
print("\nAnswer with Sources:")
print(answer_with_sources)
Chroma 벡터 스토어 구축하기: 만약 벡터 스토어가 아직 없다면, 텍스트 데이터를 임베딩하여 벡터 스토어를 생성해야 합니다. 예를 들어, 미국 헌법 텍스트를 임베딩하여 저장할 수 있습니다.
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
# 텍스트 로드 및 분할
loader = TextLoader('US_Constitution.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
# 벡터 스토어 생성 및 저장
db_connection = Chroma.from_documents(
docs,
embedding_function,
persist_directory='../01-Data-Connections/US_Constitution/'
)
db_connection.persist()
경로 수정: 코드 내의 경로(persist_directory
등)는 여러분의 환경에 맞게 수정해야 합니다.
에러 처리: 실제 구현 시 에러가 발생할 수 있으므로 적절한 예외 처리를 추가하는 것이 좋습니다.
이렇게 하면 LangChain과 OpenAI를 활용하여 문서 기반의 질문에 답변하는 시스템을 구축할 수 있습니다. 전체 코드를 실행하면 질문에 대한 답변과, 필요에 따라 출처 정보를 얻을 수 있습니다.