LangChain과 OpenAI로 문서 기반 질문 답변 시스템 구축하기

GoGoComputer·2024년 11월 7일
0

LangChain Basics

목록 보기
29/40
post-thumbnail

LangChain을 사용하여 특정 문서에 대한 질문에 답변하는 방법을 알아보겠습니다. 이 과정에서 OpenAI의 임베딩과 언어 모델을 활용하고, Chroma를 벡터 스토어로 사용하여 효율적인 검색을 구현할 것입니다. 마지막에는 작동 가능한 전체 실습 코드를 제공하겠습니다. 참고로, OPENAI_API_KEY.env 파일에 저장하여 불러올 것입니다.

목차

  1. 필요한 라이브러리 설치
  2. 환경 설정 및 API 키 로드
  3. 임베딩 함수 설정
  4. 벡터 스토어 연결
  5. 언어 모델 설정
  6. 질문에 답변하는 체인 설정
  7. 질문 정의 및 문서 검색
  8. 체인 실행 및 답변 출력
  9. 출처와 함께 답변 얻기
  10. 전체 코드

1. 필요한 라이브러리 설치

먼저, 필요한 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요:

pip install langchain openai chromadb python-dotenv
  • langchain: LLM을 효율적으로 활용하기 위한 라이브러리입니다.
  • openai: OpenAI의 API를 사용하기 위한 라이브러리입니다.
  • chromadb: Chroma 벡터 스토어를 사용하기 위한 라이브러리입니다.
  • python-dotenv: .env 파일에서 환경 변수를 로드하기 위한 라이브러리입니다.

2. 환경 설정 및 API 키 로드

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')

3. 임베딩 함수 설정

OpenAI의 임베딩 기능을 사용하여 텍스트를 벡터로 변환합니다.

from langchain.embeddings.openai import OpenAIEmbeddings

embedding_function = OpenAIEmbeddings()

4. 벡터 스토어 연결

Chroma를 사용하여 벡터 스토어에 연결합니다. 여기서는 이미 구축된 벡터 스토어를 불러옵니다.

from langchain.vectorstores import Chroma

db_connection = Chroma(
    persist_directory='../01-Data-Connections/US_Constitution/',
    embedding_function=embedding_function
)

주의사항:

  • persist_directory는 벡터 스토어가 저장된 디렉토리의 경로입니다. 이 경로는 여러분의 환경에 맞게 수정해야 합니다.
  • 벡터 스토어를 처음 설정하는 경우, 해당 디렉토리에 벡터화된 문서가 있어야 합니다. 그렇지 않다면, 텍스트 데이터를 임베딩하여 벡터 스토어를 생성해야 합니다.

5. 언어 모델 설정

OpenAI의 채팅 모델을 사용하여 자연스러운 답변을 생성합니다.

from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=0)
  • temperature=0은 답변의 일관성을 높여줍니다.

6. 질문에 답변하는 체인 설정

질문에 답변하기 위한 체인을 설정합니다.

from langchain.chains.question_answering import load_qa_chain

chain = load_qa_chain(llm, chain_type='stuff')
  • chain_type='stuff'는 간단한 체인 유형을 지정합니다.

7. 질문 정의 및 문서 검색

사용자가 질문을 입력하고, 벡터 스토어에서 관련 문서를 검색합니다.

question = "What is the 15th amendment?"

docs = db_connection.similarity_search(question)
  • similarity_search 함수는 질문과 유사한 내용을 가진 문서를 반환합니다.

8. 체인 실행 및 답변 출력

체인을 실행하여 답변을 얻고 출력합니다.

answer = chain.run(input_documents=docs, question=question)
print("Answer:")
print(answer)

9. 출처와 함께 답변 얻기

답변과 함께 해당 정보의 출처를 알고 싶다면, 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)
  • 이 체인은 답변과 함께 문서의 출처를 제공합니다.

10. 전체 코드

아래는 위의 모든 단계를 합친 전체 코드입니다.

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를 활용하여 문서 기반의 질문에 답변하는 시스템을 구축할 수 있습니다. 전체 코드를 실행하면 질문에 대한 답변과, 필요에 따라 출처 정보를 얻을 수 있습니다.

profile
IT를 좋아합니다.

0개의 댓글