TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 Gen AI>

[Gen AI] 랭체인을 활용한 챗봇 업그레이드 - 3

by 기록자_Recordian 2024. 12. 13.
728x90
반응형
이전 내용
 

[Gen AI] 랭체인을 활용한 챗봇 업그레이드 - 2

이전 내용 [Gen AI] 랭체인을 활용한 챗봇 업그레이드 - 1이전 내용 [Gen AI] 그라디오로 제작한 챗봇 허깅 페이스에 업로드하기이전 내용 [Gen AI] 그라디오로 챗봇 제작하기 - 3 (소설봇)이전 내용 [

puppy-foot-it.tistory.com


모델 I/O

 

5. 체인(Chain)

체인은 랭체인의 핵심 기능 중 하나이다.

LLM을 사용하여 서비스를 개발할 때 LLM의 자체 기능만을 사용해 개발할 수도 있지만, 다른 기능을 제공하는 모듈 등을 LLM에 연결해 서비스하는 경우가 많다. 랭체인은 이러한 모듈을 체인으로 연결할 수 있는 인터페이스를 제공하여 모듈을 호출할 수 있도록 해준다.

 

[LLM 체인 구조]

User Input Text ▶ Prompt Template ▶ LLM

유저가 텍스트를 입력하면 프롬프트 템플릿을 사용하여 프롬프트로 변환한 후 체인을 사용하여 프롬프트와 LLM을 연결하여 출력값을 얻는다.

 

import langchain
import openai
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

llm = OpenAI(temperature=0.8)
prompt = PromptTemplate(input_variables=["product"], template="{product}를 생성하는 회사 이름을 만들어주세요.")

chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
print(chain.run("남성의류"))

▶ temperature (창의성) 수치를 높이면 값이 달라진다. (참고로 0.4로 설정했을 때는 '남자옷놀이' 라는 이름을 받았다.)

 

만약 template 부분에서 회사 이름을 5개 만들어 달라고 하면 어떻게 될까?

prompt = PromptTemplate(input_variables=["product"], template="{product}를 생성하는 회사 이름을 5개 만들어주세요.")

▶ 남성의류 회사를 5개 생성해준다.

 

체인은 단일로 구성할 수 있으며 연속되게 구성할 수도 있다.

import langchain
import openai
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import SimpleSequentialChain, LLMChain

llm = OpenAI(temperature=.7)
template = """당신은 패션잡지회사 기자입니다. 제목과 같은 기사를 작성해 주세요.
제목: {title}
"""
prompt_template=PromptTemplate(input_variables=["title"],
                               template=template)
article_chain = LLMChain(llm=llm, prompt=prompt_template)

llm = OpenAI(temperature=.7)
template = """잡지 기사를 짧게 줄여 주세요.
잡지 기사:
{article}
"""
prompt_template=PromptTemplate(input_variables=["article"],
                               template=template)
review_chain=LLMChain(llm=llm, prompt=prompt_template)

overall_chain = SimpleSequentialChain(chains=[article_chain, review_chain], verbose=True)

review=overall_chain.run("겨울철 남자 패션 스타일링")

 

위의 예제는 두 개의 체인을 순차적으로 생성하여 사용하는 예제이다.

  • 한 단계의 출력이 다음 단계의 입력으로 사용할 수 있도록 해주는 SimpleSequentialChain을 import 하였다.
  • article_chain 은 제목을 입력받아 기사를 작성하는 기능을 가지고 있는 체인이며,
  • review_chain은 article_chain에서 출력된 결과를 article 변수에 입력받아 프롬프트로 "잡지 기사를 짧게 줄여 주세요 잡지 기사: {article}" 라는 프롬프트를 생성하고 llm에 체인으로 연결한다.
  • 두 개의 체인을 연결한 overall_chain을 생성하고 SimpleSequentialChain의 chains 매개변수에 리스트를 연속으로 실행한 체인을 입력하였다.
  • article_chain으로 기사를 작성하고 그 결과를 review_chain의 입력값으로 전달했다.

6. 메모리(Memory)

챗GPT와 같은 LLM을 사용할 때 기존의 대화 내용을 기억해서 연속된 대답을 하는 것을 볼 수 있는데, Openai API를 사용하여 챗GPT를 사용할 때는 기존의 대화를 기억하지 못하고 호출할 때마다 새로운 대화처럼 답변하게 된다.

기존의 대화를 기억하기 위해 Memory는 랭체인에서 기존의 대화를 저장하는 기능을 제공하며, 메모리의 종류는 다음과 같다.

  • ConversationBufferMemory: 대화 내용을 그대로 저장
  • ConversationBufferWindowMemory: 지정한 개수만큼의 대화만 기억
  • ConversationTokenBufferMemory: 대화를 기억할 때 토큰의 수로 기억
  • ConversationSummaryBufferMemory: 이전의 대화 내용을 LLM을 이용해 요약해서 기억

그 외에도 아래 링크에 들어가면 다양한 메모리 종류를 알 수 있다.

https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.memory

 

◆ ConversationBufferMemory

이는 가장 일반적인 대화를 저장하는 메모리이다.

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

llm = OpenAI(temperature=0)

memory = ConversationBufferMemory()

conversation = ConversationChain(
    llm=llm,
    memory=memory
)

conversation.invoke(input="안녕, 난 DUDE의 주인이야.")

 

다음 셀에서 대화를 이어나간다.

conversation.invoke(input="내가 무슨 일을 한다고 했지?")
conversation.invoke(input="내가 어디 주인이라고 했지?")

▶ history에 필자와 AI의 대화가 계속 나오는 것을 확인할 수 있다. (근데 좀 멍청하다..)

 

또는 하단의 명령어로 지금까지의 대화를 볼 수 있다.

print(memory.buffer)

 

메모리에 직접 데이터를 입력할 수도 있다.

memory = ConversationBufferMemory()
memory.save_context({"input": "안녕, 나는 DUDE라는 옷가게를 운영하고 있어."},
                    {"output": "DUDE 주인님 반갑습니다."})
print(memory.buffer)

 

ConversationBufferWindowMemory

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferWindowMemory

llm = OpenAI(temperature=0)

memory = ConversationBufferWindowMemory(k=1)
memory.save_context({"input": "안녕, 나는 DUDE라는 옷가게를 운영하고 있어."},
                    {"output": "DUDE 주인님 반갑습니다."})
memory.save_context({"input": "나는 2023년도에 결혼을 했어."},
                    {"output": "늦었지만 결혼을 축하 드려요."})

memory.load_memory_variables({})

▶ ConversationBufferWindowMemory(k=1)로 메모리를 설정하여 마지막 1개의 대화만을 기억하도록 했기 때문에, 마지막 대화만 기억되었다.

 

첫 번째 대화 내용을 기억 못하는지 물어본다.

conversation = ConversationChain(
    llm=llm,
    memory=memory
)

conversation.invoke(input="내 옷가게 이름이 뭐라고 했지?")

 

ConversationTokenBufferMemory

ConversationTokenBufferMemory를 사용하기 위해서는 tiktoken 라이브러리를 설치해줘야 한다.

pip install tiktoken
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationTokenBufferMemory

llm = OpenAI(temperature=0)

memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=60)

memory.save_context({"input": "안녕, 나는 DUDE라는 옷가게를 운영하고 있어."},
                    {"output": "DUDE 주인님 반갑습니다."})
memory.save_context({"input": "나는 2023년도에 결혼을 했어."},
                    {"output": "늦었지만 결혼을 축하 드려요."})
memory.save_context({"input": "나는 대한민국에 살고 있어."},
                    {"output": "좋은 나라에 살고 계시는 군요."})

memory.load_memory_variables({})

▶ max_token_limit 을 60으로 설정하여 토큰을 60개 미만으로 기억하도록 하였다. 이를 실행하면 토큰수에 맞춰 마지막 대화를 기준으로 60개 미만의 대화만 기억된다.

 

 

ConversationSummaryBufferMemory

전대화를 요약해 기억하기 위해 최근 대화는 최대 토큰 범위 내에서 유지한다.

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryBufferMemory

llm = OpenAI(temperature=0)

sale_info="DUDE에서 크리스마스 맞이 이벤트를 진행 중입니다. \
기모가 들어간 따뜻한 바지를 10% 할인 판매합니다. \
두툼하면서 가벼운 패딩 조끼를 1+1 으로 판매합니다. \
멋도 살리면서 보온도 잡은 코트를 20% 할인 판매합니다. \
그 외 다양한 제품을 이벤트로 판매하고 있으니 들어와서 확인해 주세요."

memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)
memory.save_context({"input": "DUDE"}, {"output": "반갑습니다."})
memory.save_context({"input": "궁금한 게 있어"}, {"output": "무엇을 알려 드릴까요?"})
memory.save_context({"input": "이벤트 제품 정보를 알려줘"}, {"output": f"{sale_info}"})
memory.load_memory_variables({})

print(memory.buffer)

영어로 출력된 내용은 다음과 같다.

인간이 AI에게 인사하며 이벤트에 대한 호기심을 표현합니다. AI는 한국어로 응답하여 정보를 제공합니다. 인간은 이벤트 상품에 대한 정보를 요청합니다. AI는 현재 듀드가 따뜻한 바지 할인, 패딩 조끼 1+1 할인, 스타일리시하고 따뜻한 코트 20% 할인 등 크리스마스 이벤트를 진행 중이라고 설명합니다. AI는 인간이 더 많은 상품을 확인할 수 있도록 이벤트를 안내합니다.

다음 내용

 

[Gen AI] 그라디오 챗봇 업그레이드

그라디오로 제작한 챗봇 시리즈 [Gen AI] 그라디오로 챗봇 제작하기 - 1 (상담봇)이전 내용 [Gen AI] 그라디오(Gradio)이전 내용 [Gen AI] OpenAI API 사용해보기 (로컬, 주피터노트북)이전 내용 [Gen AI] OpenA

puppy-foot-it.tistory.com


[출처]

Hey, 파이썬! 생성형 AI 활용 앱 만들어줘

 

728x90
반응형