주제: 언어 모델과 LangChain을 활용한 채팅 모델의 이해
우리는 현재 언어 모델과 LangChain에 대해 대화 모델을 통해 계속해서 이야기하고 있습니다. 이번 강의에서는 특히 채팅 모델과 그 구성 요소, 그리고 이를 어떻게 활용할 수 있는지에 대해 깊이 있게 다뤄보겠습니다.
채팅 모델은 일련의 메시지로 구성되어 있습니다. 마치 친구와 휴대폰으로 주고받는 채팅 대화처럼 말이죠. 그러나 이 경우 대화의 한쪽이 인공지능(AI)이라는 점이 다릅니다. 즉, 사용자는 인간이고, 상대방은 AI입니다. 이를 통해 인간과 AI 간의 상호작용이 가능해집니다.
LangChain은 큰 언어 모델을 기반으로 하며, 이를 효과적으로 활용하기 위해 세 가지의 스키마 객체를 만듭니다:
시스템 메시지는 AI의 성격과 응답 방식을 결정하는 데 매우 중요합니다. 예를 들어, OpenAI의 Playground에서 시스템 메시지를 "친절한 교육자"로 설정하고 사용자가 "명왕성에 관한 사실을 말해줘"라고 요청하면, AI는 친절하고 상세하게 명왕성에 대한 정보를 제공합니다.
하지만 시스템 메시지를 "무례하고 졸린 십대인데 파티만 원함"으로 변경하면 어떻게 될까요? 같은 요청에 대해서도 AI의 응답이 완전히 달라집니다. 명왕성에 대한 정보를 주면서도 파티에 가고 싶다는 투정 섞인 반응을 보일 수 있습니다. 이는 시스템 메시지가 AI의 응답에 얼마나 큰 영향을 미치는지를 보여줍니다.
이번 강의에서는 큰 언어 모델을 채팅 모델에 통합하고, 추가 매개변수나 인자를 전달하는 방법을 알아봅니다. 이전 강의에서는 다루지 않았던 내용이지만, 같은 방식으로 접근할 수 있습니다.
캐싱 기능을 사용하면 이전에 처리한 요청과 그에 대한 응답을 메모리에 저장할 수 있습니다. 이를 통해 동일한 요청에 대해 다시 응답을 생성할 때 시간을 절약하고, API 호출 비용을 줄일 수 있습니다.
예를 들어, 여러 사용자가 "명왕성에 대해 알려줘"라고 요청한다면, 최초의 응답을 캐시에 저장해 두었다가 이후 동일한 요청에 대해 저장된 응답을 반환할 수 있습니다.
이제 실제 코드를 통해 위 개념들을 이해해 보겠습니다.
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(api_key="YOUR_API_KEY")
ChatOpenAI
를 임포트하고 chat
객체를 생성합니다.채팅 객체에 메시지를 전달할 때는 세 가지 스키마 객체를 사용합니다:
예를 들어:
from langchain.schema import SystemMessage, HumanMessage
messages = [
SystemMessage(content="당신은 친절한 교육자입니다."),
HumanMessage(content="명왕성에 대해 알려주세요.")
]
result = chat(messages)
print(result.content)
시스템 메시지를 변경해 봅시다:
messages = [
SystemMessage(content="당신은 무례하고 졸린 십대인데 파티만 원합니다."),
HumanMessage(content="명왕성에 대해 알려주세요.")
]
result = chat(messages)
print(result.content)
추가 매개변수를 통해 AI의 응답을 더욱 세밀하게 제어할 수 있습니다:
result = chat.generate(
messages,
temperature=0.7,
max_tokens=150,
presence_penalty=0.6,
frequency_penalty=0
)
동일한 요청에 대해 반복적으로 응답을 생성하는 경우, 캐싱을 통해 효율성을 높일 수 있습니다:
from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
이러한 개념들을 활용하면 더 복잡하고 유용한 애플리케이션을 개발할 수 있습니다. 예를 들어:
이번 강의에서는 채팅 모델과 그 구성 요소, 그리고 추가 매개변수와 캐싱을 통한 응답 제어 방법에 대해 알아보았습니다. 다음 강의에서는 프롬프트 템플릿에 대해 자세히 알아볼 예정입니다. 이를 통해 더 효율적이고 강력한 AI 응용 프로그램을 개발할 수 있습니다.
마무리하며
이상으로 주어진 내용을 쉽게 풀어서 자세히 설명해 드렸습니다. AI 언어 모델과 LangChain을 활용하면 다양한 방식으로 AI와 상호작용할 수 있으며, 이를 통해 효율성과 생산성을 높일 수 있습니다. 궁금한 점이 있으면 언제든지 질문해 주세요!
다음은 .env
파일에 API 키를 저장하고 이를 사용하여 LangChain과 OpenAI의 채팅 모델을 활용하는 예제 코드입니다.
# 필요한 패키지 설치
# !pip install openai langchain python-dotenv
# 모듈 임포트
from langchain.chat_models import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage
from langchain.cache import InMemoryCache
import langchain
import os
from dotenv import load_dotenv
# .env 파일에서 API 키 로드
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
# API 키가 제대로 로드되었는지 확인
if openai_api_key is None:
raise ValueError("OPENAI_API_KEY가 .env 파일에 설정되지 않았습니다.")
# ChatOpenAI 인스턴스 생성 (API 키와 기본 온도 설정)
chat = ChatOpenAI(
temperature=0,
openai_api_key=openai_api_key
)
# 시스템 메시지와 사용자 메시지 생성
system_message = SystemMessage(content="당신은 유능한 비서입니다.")
human_message = HumanMessage(content="명왕성에 대해 말해줘.")
# 메시지 리스트 생성
messages = [system_message, human_message]
# 모델에 메시지 전달 및 응답 받기
response = chat(messages)
# AI의 응답 출력
print("응답 1:")
print(response.content)
print("\n")
# 시스템 메시지 수정 (AI의 성격 변화)
system_message = SystemMessage(content="당신은 무례하고 졸린 십대인데 파티만 원합니다.")
messages = [system_message, human_message]
# 변경된 시스템 메시지로 모델 재호출
response = chat(messages)
# 새로운 AI의 응답 출력
print("응답 2:")
print(response.content)
print("\n")
# 추가 매개변수 설정 (온도, 존재 페널티, 최대 토큰 수)
chat = ChatOpenAI(
temperature=0.9,
presence_penalty=0.6,
max_tokens=40,
openai_api_key=openai_api_key
)
# 동일한 메시지로 모델 호출
response = chat(messages)
# 응답 출력
print("응답 3:")
print(response.content)
print("\n")
# LangChain 캐시 설정 (인메모리 캐시 사용)
langchain.llm_cache = InMemoryCache()
# 첫 번째 요청 (캐시에 저장됨)
response = chat(messages)
print("응답 4 (캐시에 저장됨):")
print(response.content)
print("\n")
# 두 번째 요청 (캐시에서 가져옴, 더 빠름)
response = chat(messages)
print("응답 5 (캐시에서 가져옴):")
print(response.content)
코드 설명:
필요한 패키지 설치 및 임포트:
openai
, langchain
, python-dotenv
패키지를 설치합니다.pip install openai langchain python-dotenv
dotenv
를 사용하여 .env
파일에서 환경 변수를 로드합니다..env 파일에서 API 키 로드:
.env
파일에 OPENAI_API_KEY
를 저장합니다.OPENAI_API_KEY=your-openai-api-key
여기서 your-openai-api-key
를 실제 OpenAI API 키로 교체해야 합니다.load_dotenv()
함수를 사용하여 .env
파일의 내용을 환경 변수로 로드합니다.os.getenv("OPENAI_API_KEY")
를 사용하여 API 키를 가져옵니다.ChatOpenAI 인스턴스 생성:
ChatOpenAI
객체를 생성하면서 openai_api_key
매개변수로 API 키를 전달합니다.메시지 생성 및 모델 호출:
SystemMessage
와 HumanMessage
를 생성하여 시스템의 성격과 사용자의 요청을 설정합니다.시스템 메시지 수정:
추가 매개변수 설정:
temperature
, presence_penalty
, max_tokens
등의 추가 매개변수를 설정하여 생성되는 텍스트의 무작위성과 길이를 조절합니다.ChatOpenAI
객체를 생성하고 모델을 호출합니다.캐시 사용:
InMemoryCache
를 사용하여 동일한 요청에 대한 응답을 캐시에 저장합니다.주의 사항:
.env
파일은 코드와 동일한 디렉토리에 위치해야 합니다..env
파일에는 민감한 정보(API 키 등)가 포함되므로 절대로 버전 관리 시스템(예: Git)에 포함되지 않도록 .gitignore
파일에 추가해야 합니다..env
openai_api_key
를 ChatOpenAI
객체 생성 시 매개변수로 전달합니다.temperature
값을 높이면 생성되는 텍스트의 무작위성이 증가하지만, 너무 높으면 일관성 없는 응답이 나올 수 있습니다.max_tokens
는 생성되는 응답의 최대 토큰 수를 제한합니다.실행 결과 예시:
응답 1:
명왕성은 태양계의 왜소행성으로, 1930년에 발견되었습니다. 태양으로부터 평균 약 59억 km 떨어져 있으며, 주로 얼음과 암석으로 이루어져 있습니다.
응답 2:
명왕성? 몰라도 돼. 파티나 갈 거야.
응답 3:
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.
응답 4 (캐시에 저장됨):
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.
응답 5 (캐시에서 가져옴):
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.
이 코드를 실행하면 LangChain과 OpenAI의 채팅 모델을 사용하여 시스템 메시지, 사용자 메시지, 추가 매개변수, 캐시 등을 활용하는 방법을 이해할 수 있습니다. 또한 .env
파일을 사용하여 API 키를 안전하게 관리하는 방법도 배울 수 있습니다.