본문 바로가기
딥러닝

[딥러닝] 언어 모델 활용 (1) LangChain _ 20241106

by 황오독 2024. 11. 6.

** 들어가기 전

더보기

LangChain대규모언어모델(LLMs)을 사용하여 여러 가지 일을 자동으로 할 수 있게 도와주는 도구

언어모델(ex.ChatGPT)을 통해 연결해서 한 번에 할 수 있도록 체인을 만듬.

 

무엇을 할 수 있나?

- 여러 단계를 거쳐서 문서 요약하기 작업 (문서 분석 모델, 주요 내용 추출 모델, 요약 모델로 순차적 처리)

- 번역 후 질문에 답하기 (번역 모델, 번역된 텍스트에 대해 질문/답 하는 모델)

- 검색 후 관련 정보 찾아주기 (검색 모델, 내용 분석 모델, 답변 모델)

- FAQ 자동 응답, 상품 추천 등

1. 개발환경 준비

 1) 라이브러리 설치

① 구글 드라이브에 새 폴더 생성
: langchain
② Colab에서 구글 드라이브 연결 ③ requirements.txt 파일 경로 확인

 

2) OpenAI API Key 설정

④ api_key.txt 파일 생성(개별키) ⑤ 코드에서 api_key 로딩 및 설정
def load_api_key(filepath):
    with open(filepath, 'r') as file:
        return file.readline().strip()

path = '/content/drive/MyDrive/langchain/'

# API 키 로드 및 환경변수 설정
openai.api_key = load_api_key(path + 'api_key.txt')
os.environ['OPENAI_API_KEY'] = openai.api_key

 

2. LangChain

- 대규모 언어모델(LLMs)을 활용하여 체인을 구성함.

- 해당 체인을 통해, 복잡한 작업을 자동화하고 쉽게 수행할 수 있도록 돕는 라이브러리

- 즉 언어모델을 연결해서 손쉽게 원하는 작업을 구현하게 해주는 최신기술

- 단점은 버그가 많고 버전업이 잦다.

출처 : https://blog.stackademic.com/what-is-langchain-and-how-to-use-it-c9a656b80cea

 

(1) 모델 사용

- LangChain에서 hugging Face 모델 연결을 지원하지만, OpenAI 모델을 연결해서 사용

 1) LLM : gpt-3.5-turbo

from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model = "gpt-3.5-turbo")

 

 2) Langchain에서 사용하는 세가지 유형의 Message

  - SystemMessage: 시스템 역할 부여

  - HumanMessage: 질문

  - AIMessage: 답변

sys_role = '당신은 애국심을 가지고 있는 건전한 대한민국 국민입니다.' # SystemMessage
question = '독도는 어느 나라 땅이야?' # HumanMessage
result = chat([HumanMessage(content=question), SystemMessage(content=sys_role)])
print(result.content) # AIMessage

 

 3) Message를 구분하는 이유

대화 구조화 각 메시지 유형에 따라 대화의 특정 부분을 정의하고, 시스템과 사용자가 어떻게 상호작용할지를 명확히 함.
역할 분리 메시지 유형을 구분함으로써, 대화 흐름을 관리하고 특정 메시지가 언제, 어떻게 사용되는지를 쉽게 이해할 수 있음.
대화 관리 대화를 더 잘 이해하고 관리하는 데 도움을 줌.

 

(2) 입력 구조화

 1) PromptTemplate : 파이썬 입력과 프롬프트 결합 지원 모듈

from langchain import PromptTemplate

prompt = PromptTemplate(template = '{nation}의 인구수는?', # {nation} : 입력받을 변수
						input_variables = ['nation']) # ['nation'] : 입력변수를 리스트로 선언

# 사용 (질문 프롬프트, HumanMessage)
print(prompt.format(nation='한국')
print(prompt.format(nation='중국')

# 언어모델과 결합
result = chat([HumanMessage(content=prompt.format(nation='한국'))])
print(result.content) # (AIMessage)

 

(2) 출력 구조화

 1) OutputParser : 출력 형태를 지정하는 방법

  - CommaSeparatedListOutputParser : 콤마로 구분된 리스트 형태

# output_parser는 쉼표로 구분된 리스트 형식으로 응답을 파싱하는 파서
output_parser = CommaSeperatedListOutputParser()

# 예시 질문
result = chat([HumanMessage(content='트랜스포머 기반 언어모델 3개 알려줘.'), 
               HumanMessage(content=output_parser.get_format_instructions())])

# 원시 응답 출력 (모델이 그대로 반환한 텍스트)
print(result)  # "BERT, GPT, T5"

# 응답을 쉼표로 구분된 리스트로 파싱
output = output_parser.parse(result.content)

# 파싱된 결과 출력 (리스트 형태로 변환된 결과)
print(output)  # ['BERT', 'GPT', 'T5']

 

* 굳이 리스트로 파싱하는 이유?

더보기

"BERT, GPT, T5"라는 응답을 그대로 사용할 때는 문자열에서 특정 항목을 분리하거나 분석하기가 어렵지만

리스트로 변환되면, 각 항목을 쉽게 개별적으로 다룰 수 있음.

for model in output:
    print(f"모델: {model}")
output = [model.upper() for model in output] print(output) # ['BERT', 'GPT', 'T5']

 

2) 스트리밍 방식 출력 : 생성되는 실시간으로 답변

 - streaming = True : 모델 응답을 스트리밍 방식으로 받아오겠다는 의미

 - callbacks=[StreamingStdOutCallbackHandler()] : 스트리밍 중에 생성된 응답을 실시간으로 콘솔 출력

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chat2 = ChatOpenAI(model='gpt-3.5-turbo',
				   streaming=True, callbacks=[StreamingStdOutCallbackHandler()]) # 스트리밍 설정
                   
sys_role = '당신은 세계 최고의 요리사입니다.'
question = '한국식 후라이드치킨 만드는 방법 알려주세요.'

result = chat2([HumanMessage(content=question), SystemMessage(content=sys_role)])