** 들어가기 전
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)을 활용하여 체인을 구성함.
- 해당 체인을 통해, 복잡한 작업을 자동화하고 쉽게 수행할 수 있도록 돕는 라이브러리
- 즉 언어모델을 연결해서 손쉽게 원하는 작업을 구현하게 해주는 최신기술
- 단점은 버그가 많고 버전업이 잦다.
(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)])
'딥러닝' 카테고리의 다른 글
[딥러닝] Object Detection _ 20241107 (6) | 2024.11.07 |
---|---|
[딥러닝] 언어 모델 활용 (2) RAG _ 20241106 (10) | 2024.11.06 |
[딥러닝] 언어모델 이해 (3) Tokenizing & Embedding _ 20241105 (10) | 2024.11.05 |
[딥러닝] 언어모델 이해 (2) Transformer _ 20241105 (17) | 2024.11.05 |
[딥러닝] 언어모델 이해 (1) ChatGPT API로 연결하기 _ 20241105 (8) | 2024.11.05 |