LangChain를 활용한 간단한 챗봇 만들어보기¶

라이브러리 설치¶

pip install -Uq langchain_core langchain_openai langchain
In [1]:
!pip install -Uq langchain_core langchain_openai langchain
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 409.3/409.3 kB 5.5 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.4/50.4 kB 1.2 MB/s eta 0:00:00
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 28.6 MB/s eta 0:00:00

API_Key 인증¶

In [2]:
import os
from openai import OpenAI

def init_api():
    with open("chatgpt.env") as env:
       for line in env:
           key, value = line.strip().split("=")
           os.environ[key] = value

init_api()

# client = OpenAI(api_key  = os.environ.get("API_KEY"))
os.environ["OPENAI_API_KEY"] = os.environ.get("API_KEY")
In [3]:
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
In [4]:
# 프롬프트 템플릿 생성
# 템플릿은 system과 human으로 구성되어 있음.
prompt_template = ChatPromptTemplate.from_messages([
    ("system", "안녕하세요. 친구처럼 대화하고 이모티콘을 사용해 주세요 😊"),
    ("human", "{input_text}")
])

# LangChain 체인 생성
# RunnablePassthrough()를 쓰지 않으면 human의 변수명은 user_input으로 고정 사용해야 함.
# RunnablePassthrough()를 쓸 경우,  human의 사용자 입력 변수의 이름을 "input_text"로 지정 가능.
# | prompt_template : 생성한 것을 prompt_template 체인에 연결
# | ChatOpenAI()    : OpenAI의 채팅 모델을 체인에 연결
# | StrOutputParser()  : AI의 응답을 문자열로 파싱 - 모델의 출력을 사람이 읽을 수 있는 문자열로 변환
chain = {"input_text": RunnablePassthrough()} | prompt_template | ChatOpenAI() | StrOutputParser()


# 대화 루프 시작
while True:
    message = input("YOU :(quit : 종료)  ")
    if message.lower() == "quit":
        break

    print(" AI : ", end="", flush=True)

    for response in chain.stream(message):
        print(response, end="", flush=True)
    print()
 AI : 안녕! 어떻게 지내? 😊✨
 AI : 안녕하세요! 어떻게 지내셨어요? 😊✨
 AI : 안녕하세요! 저는 대화를 나누고 질문에 답변하며 정보를 제공할 수 있어요. 무엇이든 물어보세요! 💬✨

실습 및 도전 과제¶

  • [실습 1] Prompt 메시지를 변경해 보자.여행용 챗봇 만들어보기
  • [실습 2] Prompt 메시지로 할루시네이션을 없애는 프롬프트를 작성해 보자.
  • [도전 1] 이전의 대화를 기능을 추가하는 것을 만들어보자.

Prompt 엔지니어링¶

In [5]:
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

# 할루시네이션 방지 시스템 메시지
prompt_template = ChatPromptTemplate.from_messages([
    ("system",
     "안녕하세요. 대화할 때 정확하고 신뢰할 수 있는 정보만 제공해 주세요. "
     "잘 모르는 내용은 추측하지 말고 '모르겠습니다'라고 답변해 주세요. 😊"),
    ("human", "{input_text}")
])

# LangChain 체인 생성
chain = {"input_text": RunnablePassthrough()} | prompt_template | ChatOpenAI() | StrOutputParser()

# 대화 루프 시작
while True:
    message = input("YOU :(quit : 종료)  ")
    if message.lower() == "quit":
        break

    print(" AI : ", end="", flush=True)

    for response in chain.stream(message):
        print(response, end="", flush=True)
    print()
 AI : 안녕하세요! 무엇을 도와드릴까요? 😊
 AI : 안녕, 나는 챗봇이야. 대화나 정보 제공에 도움을 줄 수 있어. 함께 어떤 이야기를 나눌까? 😊
 AI : 안녕하세요! 챗봇은 다양한 영역에서 도움을 줄 수 있습니다. 주로 FAQ 답변, 예약 서비스, 제품 정보 제공, 일정 확인, 날씨 정보 제공, 번역, 음악 추천, 간단한 질문에 대한 답변 등 다양한 기능을 수행할 수 있습니다. 하지만 몇몇 복잡하고 전문적인 주제에 대해서는 정확한 정보를 제공하기 어려울 수 있습니다.
 AI : 별 말씀을요. 궁금한 것이 있으시면 언제든지 물어보세요. 😊
In [ ]: