위키피디아 문서 로더를 활용하여 역사적으로 유명한 인물에 대한 질문에 답변하는 기능을 구현해보겠습니다. 이 기능은 사용자가 인물의 이름과 질문을 입력하면, 해당 인물의 위키피디아 정보를 가져와 추가적인 컨텍스트로 사용하여 질문에 대한 정확한 답변을 제공합니다.
.env
파일에서 불러오기먼저 필요한 패키지를 설치하고 임포트합니다.
!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
파일에서 환경 변수를 로드하기 위한 라이브러리.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")
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
: 로드할 문서의 최대 개수OpenAI의 채팅 모델을 초기화합니다.
# 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
위의 모든 단계를 포함한 전체 함수 코드는 다음과 같습니다.
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
answer_question_about("Claude Shannon", "그는 언제 태어났나요?")
출력:
클로드 섀넌은 1916년 4월 30일에 태어났습니다.
load_max_docs
의 값을 변경하여 더 많은 컨텍스트를 가져올 수 있습니다.WikipediaLoader
의 language
매개변수를 사용합니다.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", "그는 언제 태어났나요?")
.env
파일에 OpenAI API 키 저장
프로젝트 디렉토리에 .env
파일을 생성하고 다음과 같이 OpenAI API 키를 저장합니다:
OPENAI_API_KEY=your_openai_api_key_here
코드 실행
위의 코드를 실행하면 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
의 값을 변경하여 위키피디아에서 가져오는 문서의 양을 조절할 수 있습니다.
이 코드를 통해 위키피디아의 정보를 활용하여 특정 인물에 대한 질문에 정확하게 답변할 수 있습니다.