📢 Goal: 이전 대화 내용을 저장하여 연결된 대화를 할 수 있는 챗봇 구현
RunnableWithMessageHistoryimport library
# 라이브러리 불러오기
# RunnableWithMessageHistory: 대화 기록과 연동되는 체인을 실행할 수 있게 해주는 도구
from langchain_core.runnables.history import RunnableWithMessageHistory
# MessagesPlaceholder: 프롬프트 내에서 대화기록이 들어갈 자리를 표시
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# BaseChatMessageHistory: 대화 기록 관리 도구
from langchain_core.chat_history import BaseChatMessageHistory
# ChatMessageHistory: BaseChatMessageHistory 구체적인 구현체 -> 실제 대화메시지를 저장하고 관리하는 기능 수행
from langchain_community.chat_message_histories import ChatMessageHistory
# StrOutputParser: 체인의 출력 결과를 문자열 형식으로 파싱하는 도구
from langchain_core.output_parsers import StrOutputParser
모델 생성
# 1. 모델 생성
llm_model = ChatOpenAI(model='gpt-4o-mini', temperature=0)
메시지 리스트 생성
# 2. 메세지 리스트 생성 -> ChatPromptTemplate
message = [('system','당신은 신뢰 가능한 대화형 AI 조수입니다.'),
MessagesPlaceholder(variable_name='history'), # <- 여기에 추가
('human','{input}')]
메시지 기반 템플릿 객체 생성
# 3. 메시지 기반 템플릿 객체 생성
prompt = ChatPromptTemplate.from_messages(message)
체인 구성
# 4. 체인 구성
output_parser = StrOutputParser()
chain = prompt | llm_model | output_parser
세션 기록 저장을 위한 딕셔너리
# 5. 세션 기록 저장을 위한 딕셔너리 {key : value} = {session_id(user_id) : chat_conent}
store = {}
세션 관리하는 함수 정의
# 6. 세션 관리하는 함수 정의
def get_session_history(session_id : str):
if session_id not in store: # session 저장된 적 없으면 새로 저장
store[session_id] = ChatMessageHistory()
# session 저장된 적 있으면 기록 불러오기
return store[session_id]
체인과 세션 관리 함수, 사용자의 입력값, 히스토리 연결
# 7. 체인과 세션 관리 함수, 사용자의 입력값, 히스토리 연결
with_message_history = RunnableWithMessageHistory(
chain, # 체인
get_session_history, # 대화 기록 함수
input_messages_key='input', # 사용자의 입력 값 mapping
history_messages_key='history' # 메세지 리스트 MessagesPlaceholder 에서 사용한 변수명과 mapping
)
무한루프를 통한 채팅 진행
# 8. 무한 루프를 통한 채팅 진행
while True:
q = input('입력: ')
# 채팅 종료 조건 추가
if q == 'end':
print('채팅 종료')
break
# 모델 응답
res = with_message_history.invoke(
{'input':q},
config = {'configurable': {'session_id': 'x-test1234'}} # session_id 전달하여 대화기록 불러오기
)
print(res)
print()
입력: 안녕? 나는 최영화야. 인공지능 강사를 하고 있어.
안녕하세요, 최영화님! 인공지능 강사로 활동하고 계시다니 멋지네요. 어떤 주제를 주로 가르치시나요? 또는 인공지능에 대해 궁금한 점이 있으신가요?
입력: 재미있는 수업을 하고 싶어. LLM 관련된 수업을 어떻게 재미있게 할 수 있을가?
LLM(대규모 언어 모델) 관련 수업을 재미있게 진행하기 위한 몇 가지 아이디어를 제안해 드릴게요:
1. **실시간 데모**: LLM을 사용하여 실시간으로 질문에 답하거나 텍스트를 생성하는 데모를 보여주세요. 학생들이 직접 질문을 던지게 하여 모델의 반응을 확인하는 것도 흥미로울 것입니다.
2. **게임화**: LLM을 활용한 퀴즈나 게임을 만들어 보세요. 예를 들어, 학생들이 LLM이 생성한 문장을 보고 그 문장이 진짜인지 가짜인지 맞추는 게임을 할 수 있습니다.
3. **창의적 글쓰기**: 학생들에게 LLM을 사용하여 짧은 이야기를 생성하게 하거나, 주어진 주제에 대해 LLM과 협력하여 글을 작성하게 해보세요. 그 후, 각자의 결과물을 공유하고 토론하는 시간을 가질 수 있습니다.
4. **비교 분석**: LLM과 다른 AI 모델(예: 규칙 기반 시스템) 간의 차이점을 비교하는 활동을 진행해 보세요. 학생들이 직접 두 모델을 사용해 보고 결과를 비교하게 하면 흥미로운 논의가 이루어질 수 있습니다.
5. **윤리적 토론**: LLM의 사용에 따른 윤리적 문제에 대해 토론하는 시간을 가져보세요. 학생들이 다양한 관점을 제시하고, 실제 사례를 통해 논의할 수 있도록 유도하면 좋습니다.
6. **프로젝트 기반 학습**: 학생들이 팀을 이루어 LLM을 활용한 프로젝트를 진행하게 해보세요. 예를 들어, 특정 주제에 대한 FAQ를 생성하거나, 챗봇을 만드는 프로젝트를 통해 실습할 수 있습니다.
이런 방법들을 통해 학생들이 LLM에 대해 더 깊이 이해하고, 동시에 재미있게 배울 수 있는 환경을 조성할 수 있을 것입니다. 도움이 필요하시면 언제든지 말씀해 주세요!
입력: 1반
"1반"이라는 말씀은 수업의 반을 의미하시는 건가요? 아니면 특정한 주제나 활동에 대한 질문이신가요? 좀 더 구체적으로 말씀해 주시면 더 도움이 될 수 있을 것 같습니다!
입력: 아, 오타야. 1번
아, 이해했습니다! 1번, 즉 **실시간 데모**에 대해 좀 더 구체적으로 설명해 드릴게요.
### 실시간 데모를 활용한 수업 진행 방법
1. **사전 준비**:
- LLM을 사용할 수 있는 플랫폼(예: OpenAI의 ChatGPT, Hugging Face의 Transformers 등)을 미리 설정해 두세요.
- 학생들이 사용할 수 있는 질문 목록을 준비하거나, 주제를 정해 두면 좋습니다.
2. **수업 시작**:
- LLM의 기본 개념과 작동 원리를 간단히 설명합니다. 예를 들어, LLM이 어떻게 학습하고, 어떤 데이터를 기반으로 작동하는지에 대해 이야기할 수 있습니다.
3. **실시간 질문 세션**:
- 학생들에게 LLM에 질문을 던지게 하세요. 학생들이 직접 질문을 하도록 유도하면 참여도가 높아집니다.
- 예를 들어, "LLM이란 무엇인가요?" 또는 "인공지능의 미래에 대해 어떻게 생각하나요?"와 같은 질문을 던질 수 있습니다.
4. **결과 분석**:
- LLM이 생성한 답변을 함께 읽고, 그 내용에 대해 토론합니다. 학생들이 답변의 정확성, 창의성, 그리고 한계에 대해 의견을 나누게 하세요.
- "이 답변이 왜 유용한가?" 또는 "어떤 부분이 더 개선될 수 있을까?"와 같은 질문을 통해 깊이 있는 논의를 유도할 수 있습니다.
5. **학생 참여 유도**:
- 학생들이 LLM을 사용해 직접 텍스트를 생성해 보도록 합니다. 예를 들어, "주어진 주제로 짧은 이야기를 만들어 보세요."라고 요청할 수 있습니다.
- 생성된 텍스트를 공유하고, 서로의 결과물에 대해 피드백을 주고받는 시간을 가질 수 있습니다.
6. **마무리**:
- 수업을 마치기 전에 LLM의 활용 가능성과 한계에 대해 다시 한 번 정리하고, 학생들이 느낀 점이나 배운 점을 공유하도록 합니다.
이런 방식으로 실시간 데모를 활용하면 학생들이 LLM에 대해 더 흥미를 느끼고, 적극적으로 참여할 수 있는 수업을 만들 수 있습니다. 추가적인 질문이나 도움이 필요하시면 언제든지 말씀해 주세요!
입력: 내 이름이 뭐라고 했지?
당신의 이름은 최영화님입니다! 다른 질문이나 도움이 필요하시면 언제든지 말씀해 주세요.
입력: end
채팅 종료# 메시지 리스트 생성
message2 = [('system','당신은 신뢰 가능한 대화형 AI 조수입니다.'),
MessagesPlaceholder(variable_name='history'),
('human','{input}')]
# 프롬프트 템플릿 생성
prompt2 = ChatPromptTemplate.from_messages(message2)
# 체인 구성
chain2 = prompt2 | llm_model | output_parser
# 기억 삽입
session_id = 'x-test1234'
init_history = ChatMessageHistory()
init_history.add_user_message('안녕? 나는 최영화야') # user = human
init_history.add_ai_message('네~ 안녕하세요')
init_history.add_user_message('내가 좋아하는 음식은 마라탕이야.')
init_history.add_ai_message('네 기억하겠습니다.')
store[session_id] = init_history
# 체인과 세션관리함수를 연결
with_message_history2 = RunnableWithMessageHistory(
chain2,
get_session_history,
input_messages_key='input',
history_messages_key='history'
)
# 무한루프를 통한 채팅 진행
while True:
q = input('입력: ')
if q == 'end':
print('채팅 종료.')
break
res = with_message_history2.invoke(
{'input': q},
config = {'configurable': {'session_id': 'x-test1234'}}
)
print(res)
입력: 내가 좋아하는 음식은 뭐야?
당신이 좋아하는 음식은 마라탕입니다!
입력: 너 기억력 좋구나. 내 이름은 뭐야?
당신의 이름은 최영화입니다!
입력: end
채팅 종료.