위키피디아 문서 로더를 활용한 역사적 인물 질문 답변 시스템 구현

GoGoComputer·2024년 10월 30일
0

LangChain Basics

목록 보기
14/40
post-thumbnail

위키피디아 문서 로더를 활용하여 역사적으로 유명한 인물에 대한 질문에 답변하는 기능을 구현해보겠습니다. 이 기능은 사용자가 인물의 이름과 질문을 입력하면, 해당 인물의 위키피디아 정보를 가져와 추가적인 컨텍스트로 사용하여 질문에 대한 정확한 답변을 제공합니다.

목표

  • 위키피디아 문서 로더를 사용하여 인물의 정보를 가져오기
  • OpenAI의 채팅 모델을 활용하여 질문에 답변하기
  • 추가적인 컨텍스트를 제공하여 정확도를 높이기
  • 작동 가능한 전체 코드를 제공하여 실습 가능하도록 하기
  • API 키는 .env 파일에서 불러오기

단계별 설명

1. 필요한 라이브러리 설치 및 임포트

먼저 필요한 패키지를 설치하고 임포트합니다.

!pip install wikipedia langchain openai python-dotenv
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import WikipediaLoader
from dotenv import load_dotenv
import os
  • wikipedia: 위키피디아 API를 사용하기 위한 라이브러리
  • langchain: 언어 모델과의 상호 작용을 위한 라이브러리
  • openai: OpenAI API를 사용하기 위한 라이브러리
  • python-dotenv: .env 파일에서 환경 변수를 로드하기 위한 라이브러리

2. .env 파일에서 API 키 로드

.env 파일에 다음과 같이 OpenAI API 키를 저장합니다.

OPENAI_API_KEY=your_openai_api_key_here

Python 코드에서 dotenv를 사용하여 이 키를 로드합니다.

load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")

3. 위키피디아에서 인물 정보 로드

WikipediaLoader를 사용하여 인물의 위키피디아 문서를 로드합니다.

def answer_question_about(person_name, question):
    # 위키피디아 문서 로드
    loader = WikipediaLoader(query=person_name, load_max_docs=1)
    documents = loader.load()
    context_text = documents[0].page_content
  • query: 검색할 인물의 이름
  • load_max_docs: 로드할 문서의 최대 개수

4. OpenAI 채팅 모델 설정

OpenAI의 채팅 모델을 초기화합니다.

    # OpenAI 채팅 모델 초기화
    model = ChatOpenAI(openai_api_key=openai_api_key)

5. 프롬프트 템플릿 생성

사용자의 질문과 위키피디아에서 가져온 컨텍스트를 포함하는 프롬프트를 생성합니다.

    # 프롬프트 템플릿 생성
    human_template = "질문에 답변해주세요:\n{question}\n\n추가 정보:\n{context}"
    human_prompt = HumanMessagePromptTemplate.from_template(human_template)

6. 채팅 프롬프트 생성 및 모델 호출

프롬프트를 모델에 전달하고 답변을 받습니다.

    # 채팅 프롬프트 생성
    chat_prompt = ChatPromptTemplate.from_messages([human_prompt])

    # 메시지 포맷팅
    messages = chat_prompt.format_prompt(question=question, context=context_text).to_messages()

    # 모델 호출 및 응답 받기
    response = model(messages)

    # 답변 추출
    answer = response.content
    print(answer)
    return answer

7. 전체 함수 코드

위의 모든 단계를 포함한 전체 함수 코드는 다음과 같습니다.

def answer_question_about(person_name, question):
    '''
    위키피디아 문서 로더를 사용하여 인물에 대한 질문에 답변합니다. 추가적인 컨텍스트를 삽입하여 정확한 답변을 제공합니다.
    '''

    # 위키피디아 문서 로드
    loader = WikipediaLoader(query=person_name, load_max_docs=1)
    documents = loader.load()
    context_text = documents[0].page_content

    # OpenAI API 키 로드
    load_dotenv()
    openai_api_key = os.getenv("OPENAI_API_KEY")

    # OpenAI 채팅 모델 초기화
    model = ChatOpenAI(openai_api_key=openai_api_key)

    # 프롬프트 템플릿 생성
    human_template = "질문에 답변해주세요:\n{question}\n\n추가 정보:\n{context}"
    human_prompt = HumanMessagePromptTemplate.from_template(human_template)

    # 채팅 프롬프트 생성
    chat_prompt = ChatPromptTemplate.from_messages([human_prompt])

    # 메시지 포맷팅
    messages = chat_prompt.format_prompt(question=question, context=context_text).to_messages()

    # 모델 호출 및 응답 받기
    response = model(messages)

    # 답변 추출
    answer = response.content
    print(answer)
    return answer

8. 함수 실행 예시

answer_question_about("Claude Shannon", "그는 언제 태어났나요?")

출력:

클로드 섀넌은 1916년 4월 30일에 태어났습니다.

추가 정보

  • 에러 처리: 실제 환경에서 실행할 때 발생할 수 있는 예외 상황에 대비하여 에러 처리를 추가하면 좋습니다.
  • 컨텍스트 조절: load_max_docs의 값을 변경하여 더 많은 컨텍스트를 가져올 수 있습니다.
  • 언어 설정: 위키피디아에서 다른 언어로 정보를 가져오려면 WikipediaLoaderlanguage 매개변수를 사용합니다.
  • 모델 파라미터 조절: ChatOpenAI에서 temperature, max_tokens 등의 파라미터를 조절하여 응답의 다양성과 길이를 조절할 수 있습니다.

결론

이렇게 하면 사용자가 입력한 인물의 이름과 질문을 기반으로, 위키피디아에서 해당 인물의 정보를 가져와 추가적인 컨텍스트로 활용하여 OpenAI의 채팅 모델을 통해 정확한 답변을 제공할 수 있습니다.

이 기능은 문서 로더와 언어 모델을 결합하여 지식 기반의 질문 답변 시스템을 구현하는 좋은 예시입니다.


사용 가능한 전체 코드를 제공해드리겠습니다. 이 코드는 .env 파일에서 OPENAI_API_KEY를 로드하여 OpenAI의 채팅 모델을 사용합니다.

# 필요한 라이브러리 설치
# !pip install wikipedia langchain openai python-dotenv

# 필요한 라이브러리 임포트
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import WikipediaLoader
from dotenv import load_dotenv
import os

def answer_question_about(person_name, question):
    '''
    위키피디아 문서 로더를 사용하여 인물에 대한 질문에 답변합니다. 추가적인 컨텍스트를 삽입하여 정확한 답변을 제공합니다.
    '''
    # OpenAI API 키 로드
    load_dotenv()
    openai_api_key = os.getenv("OPENAI_API_KEY")
    
    # 위키피디아 문서 로드
    loader = WikipediaLoader(query=person_name, load_max_docs=1)
    documents = loader.load()
    context_text = documents[0].page_content

    # OpenAI 채팅 모델 초기화
    model = ChatOpenAI(openai_api_key=openai_api_key)

    # 프롬프트 템플릿 생성
    human_template = "질문에 답변해주세요:\n{question}\n\n추가 정보:\n{context}"
    human_prompt = HumanMessagePromptTemplate.from_template(human_template)

    # 채팅 프롬프트 생성
    chat_prompt = ChatPromptTemplate.from_messages([human_prompt])

    # 메시지 포맷팅
    messages = chat_prompt.format_prompt(question=question, context=context_text).to_messages()

    # 모델 호출 및 응답 받기
    response = model(messages)

    # 답변 추출
    answer = response.content
    print(answer)
    return answer

# 함수 사용 예시
answer_question_about("Claude Shannon", "그는 언제 태어났나요?")

사용 방법

  1. .env 파일에 OpenAI API 키 저장

    프로젝트 디렉토리에 .env 파일을 생성하고 다음과 같이 OpenAI API 키를 저장합니다:

    OPENAI_API_KEY=your_openai_api_key_here
  2. 코드 실행

    위의 코드를 실행하면 answer_question_about 함수가 클로드 섀넌의 생년월일에 대한 답변을 출력합니다.

    예시 출력:

    클로드 섀넌은 1916년 4월 30일에 태어났습니다.

주요 기능 설명

  • 라이브러리 임포트 및 설치

    필요한 라이브러리를 설치하고 임포트합니다. python-dotenv.env 파일에서 환경 변수를 로드하는 데 사용됩니다.

  • OpenAI API 키 로드

    load_dotenv() 함수를 사용하여 .env 파일에 저장된 OPENAI_API_KEY를 로드합니다.

  • 위키피디아 문서 로드

    WikipediaLoader를 사용하여 지정된 인물의 위키피디아 문서를 로드하고, 첫 번째 문서의 내용을 context_text로 저장합니다.

  • 프롬프트 생성 및 모델 호출

    사용자 질문과 추가 컨텍스트를 포함한 프롬프트를 생성하고, OpenAI의 채팅 모델을 통해 답변을 받습니다.

  • 답변 출력

    최종적으로 모델의 응답을 출력하고 반환합니다.

주의 사항

  • API 키 보호

    API 키는 절대로 코드에 직접 입력하지 말고 .env 파일이나 환경 변수를 사용하여 로드하세요.

  • 패키지 버전 호환성

    패키지 설치 시 버전 호환성에 유의하세요. 필요에 따라 특정 버전을 설치해야 할 수 있습니다.

  • 요금 발생 주의

    OpenAI의 API를 사용하면 요금이 발생할 수 있으므로 사용량을 모니터링하세요.

추가 정보

  • 다른 인물과 질문으로 테스트

    다양한 인물의 이름과 질문을 입력하여 함수를 테스트해보세요.

    answer_question_about("Albert Einstein", "상대성 이론이 무엇인가요?")
  • 에러 처리 추가

    실제 사용 시 네트워크 오류나 API 호출 실패 등에 대비하여 에러 처리를 추가하면 더욱 견고한 코드를 만들 수 있습니다.

  • 추가 컨텍스트 조절

    load_max_docs의 값을 변경하여 위키피디아에서 가져오는 문서의 양을 조절할 수 있습니다.


이 코드를 통해 위키피디아의 정보를 활용하여 특정 인물에 대한 질문에 정확하게 답변할 수 있습니다.

profile
IT를 좋아합니다.

0개의 댓글