LangChain과 언어 모델을 활용한 채팅 모델 심층 가이드

GoGoComputer·2024년 10월 2일
0

LangChain Basics

목록 보기
5/40

주제: 언어 모델과 LangChain을 활용한 채팅 모델의 이해

우리는 현재 언어 모델과 LangChain에 대해 대화 모델을 통해 계속해서 이야기하고 있습니다. 이번 강의에서는 특히 채팅 모델과 그 구성 요소, 그리고 이를 어떻게 활용할 수 있는지에 대해 깊이 있게 다뤄보겠습니다.

1. 채팅 모델이란 무엇인가요?

채팅 모델은 일련의 메시지로 구성되어 있습니다. 마치 친구와 휴대폰으로 주고받는 채팅 대화처럼 말이죠. 그러나 이 경우 대화의 한쪽이 인공지능(AI)이라는 점이 다릅니다. 즉, 사용자는 인간이고, 상대방은 AI입니다. 이를 통해 인간과 AI 간의 상호작용이 가능해집니다.

2. LangChain의 스키마 객체

LangChain은 큰 언어 모델을 기반으로 하며, 이를 효과적으로 활용하기 위해 세 가지의 스키마 객체를 만듭니다:

  • 시스템 메시지: 이 메시지는 AI 시스템의 전반적인 분위기나 성격을 설정합니다. 예를 들어, AI가 친절한 교육자인지, 무례한 십대인지, 또는 특정 지식을 알고 있어야 하는지 등을 지정할 수 있습니다.
  • 인간 메시지: 사용자가 AI에게 보내는 메시지입니다. 질문, 요청, 또는 단순한 대화 등이 될 수 있습니다.
  • 인공지능 메시지: AI가 인간의 메시지에 응답하는 내용입니다.

3. 시스템 메시지의 역할과 중요성

시스템 메시지는 AI의 성격과 응답 방식을 결정하는 데 매우 중요합니다. 예를 들어, OpenAI의 Playground에서 시스템 메시지를 "친절한 교육자"로 설정하고 사용자가 "명왕성에 관한 사실을 말해줘"라고 요청하면, AI는 친절하고 상세하게 명왕성에 대한 정보를 제공합니다.

하지만 시스템 메시지를 "무례하고 졸린 십대인데 파티만 원함"으로 변경하면 어떻게 될까요? 같은 요청에 대해서도 AI의 응답이 완전히 달라집니다. 명왕성에 대한 정보를 주면서도 파티에 가고 싶다는 투정 섞인 반응을 보일 수 있습니다. 이는 시스템 메시지가 AI의 응답에 얼마나 큰 영향을 미치는지를 보여줍니다.

4. 채팅 모델에 추가 매개변수 전달하기

이번 강의에서는 큰 언어 모델을 채팅 모델에 통합하고, 추가 매개변수나 인자를 전달하는 방법을 알아봅니다. 이전 강의에서는 다루지 않았던 내용이지만, 같은 방식으로 접근할 수 있습니다.

  • 온도(Temperature): 응답의 무작위성을 조절합니다. 값을 높이면 응답이 다양해지고, 낮추면 일정한 패턴의 응답을 얻을 수 있습니다.
  • 빈도 페널티(Frequency Penalty)존재 페널티(Presence Penalty): 동일하거나 유사한 단어나 구문의 반복 사용을 줄이는 데 사용됩니다.
  • 최대 토큰(Max Tokens): 응답의 최대 길이를 설정합니다.

5. 캐싱 기능의 활용

캐싱 기능을 사용하면 이전에 처리한 요청과 그에 대한 응답을 메모리에 저장할 수 있습니다. 이를 통해 동일한 요청에 대해 다시 응답을 생성할 때 시간을 절약하고, API 호출 비용을 줄일 수 있습니다.

예를 들어, 여러 사용자가 "명왕성에 대해 알려줘"라고 요청한다면, 최초의 응답을 캐시에 저장해 두었다가 이후 동일한 요청에 대해 저장된 응답을 반환할 수 있습니다.

6. 코드 예제 살펴보기

이제 실제 코드를 통해 위 개념들을 이해해 보겠습니다.

6.1. ChatOpenAI 객체 생성

from langchain.chat_models import ChatOpenAI

chat = ChatOpenAI(api_key="YOUR_API_KEY")
  • ChatOpenAI를 임포트하고 chat 객체를 생성합니다.
  • API 키는 환경 변수로 설정되어 있다면 별도로 지정하지 않아도 됩니다.

6.2. 메시지 전달

채팅 객체에 메시지를 전달할 때는 세 가지 스키마 객체를 사용합니다:

  • 시스템 메시지: AI의 성격을 정의합니다.
  • 인간 메시지: 사용자의 입력입니다.
  • 인공지능 메시지: AI의 응답입니다.

예를 들어:

from langchain.schema import SystemMessage, HumanMessage

messages = [
    SystemMessage(content="당신은 친절한 교육자입니다."),
    HumanMessage(content="명왕성에 대해 알려주세요.")
]

result = chat(messages)
print(result.content)
  • 여기서 AI는 친절한 교육자로서 명왕성에 대한 정보를 제공합니다.

6.3. 시스템 메시지의 영향 확인

시스템 메시지를 변경해 봅시다:

messages = [
    SystemMessage(content="당신은 무례하고 졸린 십대인데 파티만 원합니다."),
    HumanMessage(content="명왕성에 대해 알려주세요.")
]

result = chat(messages)
print(result.content)
  • 이제 AI의 응답은 달라집니다. 무례한 십대로서의 성격이 반영되어, 명왕성에 대한 정보 제공을 거부하거나 투정 섞인 답변을 할 수 있습니다.

7. 추가 매개변수 전달하기

추가 매개변수를 통해 AI의 응답을 더욱 세밀하게 제어할 수 있습니다:

result = chat.generate(
    messages,
    temperature=0.7,
    max_tokens=150,
    presence_penalty=0.6,
    frequency_penalty=0
)
  • 온도(temperature): 응답의 다양성을 조절합니다.
  • 최대 토큰(max_tokens): 응답의 길이를 제한합니다.
  • 존재 페널티(presence_penalty): 새로운 주제를 도입하도록 유도합니다.
  • 빈도 페널티(frequency_penalty): 반복을 줄입니다.

8. 캐싱을 통한 효율성 향상

동일한 요청에 대해 반복적으로 응답을 생성하는 경우, 캐싱을 통해 효율성을 높일 수 있습니다:

from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
  • 이렇게 설정하면 동일한 프롬프트에 대한 응답을 메모리에 저장하고, 이후 동일한 요청 시 저장된 응답을 반환합니다.
  • 이는 API 호출 횟수를 줄여 비용을 절감하고, 응답 속도를 향상시킵니다.

9. 실용적인 응용

이러한 개념들을 활용하면 더 복잡하고 유용한 애플리케이션을 개발할 수 있습니다. 예를 들어:

  • 고객 서비스 챗봇: 시스템 메시지를 사용하여 브랜드의 톤과 가이드라인에 맞는 챗봇을 만들 수 있습니다.
  • 교육용 도구: 친절한 교육자로서 AI가 학생들의 질문에 답변하도록 설정할 수 있습니다.
  • 맞춤형 정보 제공: 사용자 프로필이나 선호도에 따라 AI의 응답을 개인화할 수 있습니다.

10. 다음 단계: 프롬프트 템플릿

이번 강의에서는 채팅 모델과 그 구성 요소, 그리고 추가 매개변수와 캐싱을 통한 응답 제어 방법에 대해 알아보았습니다. 다음 강의에서는 프롬프트 템플릿에 대해 자세히 알아볼 예정입니다. 이를 통해 더 효율적이고 강력한 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)

코드 설명:

  1. 필요한 패키지 설치 및 임포트:

    • openai, langchain, python-dotenv 패키지를 설치합니다.
      pip install openai langchain python-dotenv
    • 필요한 모듈을 임포트합니다.
    • dotenv를 사용하여 .env 파일에서 환경 변수를 로드합니다.
  2. .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 키를 가져옵니다.
    • API 키가 로드되지 않았을 경우 에러를 발생시킵니다.
  3. ChatOpenAI 인스턴스 생성:

    • ChatOpenAI 객체를 생성하면서 openai_api_key 매개변수로 API 키를 전달합니다.
    • 기본 온도는 0으로 설정하여 동일한 입력에 대해 동일한 출력을 받도록 합니다.
  4. 메시지 생성 및 모델 호출:

    • SystemMessageHumanMessage를 생성하여 시스템의 성격과 사용자의 요청을 설정합니다.
    • 메시지를 리스트에 담아 모델에 전달하고 응답을 받습니다.
    • 첫 번째 응답은 기본적인 유능한 비서의 답변입니다.
  5. 시스템 메시지 수정:

    • 시스템 메시지를 무례하고 졸린 십대로 변경하여 AI의 성격을 바꿉니다.
    • 변경된 메시지로 모델을 다시 호출하여 응답을 확인합니다.
  6. 추가 매개변수 설정:

    • temperature, presence_penalty, max_tokens 등의 추가 매개변수를 설정하여 생성되는 텍스트의 무작위성과 길이를 조절합니다.
    • 설정된 매개변수로 새로운 ChatOpenAI 객체를 생성하고 모델을 호출합니다.
  7. 캐시 사용:

    • InMemoryCache를 사용하여 동일한 요청에 대한 응답을 캐시에 저장합니다.
    • 첫 번째 요청은 캐시에 저장되고, 두 번째 요청부터는 캐시에서 응답을 가져와 API 호출 비용과 시간을 절약합니다.

주의 사항:

  • .env 파일은 코드와 동일한 디렉토리에 위치해야 합니다.
  • .env 파일에는 민감한 정보(API 키 등)가 포함되므로 절대로 버전 관리 시스템(예: Git)에 포함되지 않도록 .gitignore 파일에 추가해야 합니다.
    .env
  • openai_api_keyChatOpenAI 객체 생성 시 매개변수로 전달합니다.
  • temperature 값을 높이면 생성되는 텍스트의 무작위성이 증가하지만, 너무 높으면 일관성 없는 응답이 나올 수 있습니다.
  • max_tokens는 생성되는 응답의 최대 토큰 수를 제한합니다.
  • 캐시는 동일한 입력에 대한 응답을 저장하므로, 입력이 변경되면 캐시가 적용되지 않습니다.

실행 결과 예시:

응답 1:
명왕성은 태양계의 왜소행성으로, 1930년에 발견되었습니다. 태양으로부터 평균 약 59억 km 떨어져 있으며, 주로 얼음과 암석으로 이루어져 있습니다.


응답 2:
명왕성? 몰라도 돼. 파티나 갈 거야.


응답 3:
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.


응답 4 (캐시에 저장됨):
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.


응답 5 (캐시에서 가져옴):
명왕성은... 아, 모르겠고 그냥 파티나 가고 싶어.

이 코드를 실행하면 LangChain과 OpenAI의 채팅 모델을 사용하여 시스템 메시지, 사용자 메시지, 추가 매개변수, 캐시 등을 활용하는 방법을 이해할 수 있습니다. 또한 .env 파일을 사용하여 API 키를 안전하게 관리하는 방법도 배울 수 있습니다.

profile
IT를 좋아합니다.

0개의 댓글