isPowerfulBlog
[LLM] LangChain 🦜🔗 본문
소프트웨어융합최신기술 수업에서 LangChain을 접하게 되어 접한 김에 정리를 해놔야겠다.
알아놓으면 너무너무 유용할 것 같은 랭체인.
실습 정도에는 돈 별로 안 들어서 해볼만 하다.
LangChain
LLM을 사용하여 애플리케이션을 만드는 것을 단순화해주는 프레임워크.
각기 다른 태스크를 가진 LLM을 Chain처럼 연결지어 하나의 복잡한 태스크를 수행할 수 있도록 할 수 있고, 이 과정을 간편하게 할 수 있는 아주 강력한 도구이다.🔥🔥 복잡한 태스크를 여러개의 작은 태스크로 쪼개어 하는 방식을 LLM에서도 쉽고 간편하게 적용할 수 있다는 점이 굉장히 매력적인 것 같다.
Environment setup
Install
$ pip install langchain openai
langchain
을 설치하여 바로 사용이 가능하고, OpenAI의 모델을 사용할거기 때문에 openai
도 설치해준다.
OpenAI API KEY 발급
LLM을 제공하는 대표적인 플랫폼인 OpenAI를 이용할 예정이기 때문에, 일단 해당 플랫폼에 회원가입한다.
그리고 account > api-keys에 들어가 API KEY를 생성해준다.
자고로 API KEY는 생성되었을때 어디다가 복붙해서 저장해두어야한다 다시 볼 수 없음! ❌
import os
os.environ["OPENAI_API_KEY"] = KEY
환경변수는 이렇게 설정해주면 된다.
OpenAI 모델을 가져다 쓸 때, 과금이 발생한다.
따라서 OpenAI 플랫폼에 들어가 필요한 만큼 금액 충전을 미리 해놓는다.
나는 실습하는거라 5달러만 충전했다.
연결 확인
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
llm = OpenAI()
chat_model = ChatOpenAI()
llm.predict("hi!")
>>> "Hi"
chat_model.predict("hi!")
>>> "Hi"
해당 스크립트를 실행시켜 response가 오는지 확인한다.
How to Use
LangChain에서는 다양한 인터페이스와 모듈들을 제공한다.
그 중 간단히 LLM 또는 ChatModel을 가져와 사용하는 방법에 대해서 익힌다.
1. LLMs
2. Chat Models
LLMs vs Chat Models
랭체인에서 제공하는 LLM과 Chat Model에는 어떠한 차이점이 있을까?
- LLM : 텍스트 문자열을 입력으로 사용하고 텍스트 문자열을 반환하는 모델
- Chat Model : 언어 모델의 지원을 받지만 채팅 메시지 목록을 입력으로 사용하고 채팅 메시지를 반환하는 모델
나는 Chat Model은 LLM에서 추가로 이전 메세지의 Memory에 영향을 받는 다는 차이점이 있다고 이해했다. (맞나?🤔)
1. LLMs
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-ada-001")
llm("What day comes after Friday?")
>>>> ' \n\nSaturday '
OpenAI로부터 모델을 로드하여 바로 LLM에 문자열을 입력하고, 문자열을 반환받을 수 있다.
매우 간단!
2. Chat Models
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
Chat Model 또한 마찬가지로 먼저 근간이 되는 ChatModel을 로드해준다.
from langchain.schema.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="You're a helpful assistant"),
HumanMessage(content="What is the purpose of model regularization?"),
]
chat.invoke(messages)
>>>> AIMessage(content="The purpose of model regularization is to prevent overfitting in machine learning models. Overfitting occurs when a model becomes too complex and starts to fit the noise in the training data, leading to poor generalization on unseen data. Regularization techniques introduce additional constraints or penalties to the model's objective function, discouraging it from becoming overly complex and promoting simpler and more generalizable models. Regularization helps to strike a balance between fitting the training data well and avoiding overfitting, leading to better performance on new, unseen data.")
이렇게 SystmemMessagem, HumanMessage를 채팅 리스트(messages)에 넣고 이를 위에서 가져온 Chat Model의 입력으로 넣어주어 AI 답변을 반환받을 수 있다.
Schema
message
LLM의 가장 기본이 되는 인터페이스, 위의 예시코드처럼 사용
1. SystemMessage : LLM 에게 할 일을 알려주는 컨텍스트
2. HumanMessage : 사용자가 입력한 메세지
3. AIMessage : AI 가 응답한 메세지
docs
텍스트와 메타 정보를 포함한 객체, 아래와 같이 사용
from langchain.schema import Document
Document(page_content="This is my document. It is full of text that I've gathered from other places
metadata={
'my_document_id' : 234234,
'my_document_source' : "The LangChain Papers",
'my_document_create_time' : 1680013019
})
Memory
기본적으로 , LLM 은 사용자가 보낸 정보를 기억하지 않기 때문에 채팅모델 구현을 위해 이를 기억할 수 있도록 memory 기능을 지원
from langchain.memory import ChatMessageHistory
history = ChatMessageHistory()
history.add_user_message("hi!")
history.add_ai_message("whats up?")
history.messages
>>>> [HumanMessage(content='hi!', additional_kwargs={}),
AIMessage(content='whats up?', additional_kwargs={})]
user메세지와 ai메세지를 직접 추가할 수 있다.
Prompt Template
동적인 입력이 주었을 때 그에 맞게 프롬프트를 생성할 수 있도록 하는 템플릿
from langchain.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template(
"Tell me a {adjective} joke about {content}."
)
prompt_template.format(adjective="funny", content="chickens")
python 의 f-string 형식과 유사하다.
Chains
작은 태스크들을 Chain으로 엮어 하나의 복잡한 태스크를 해결할 수 있는 모델을 만들 수 있다.
다양한 chains가 있지만 여기 예시에서는 SimpleSequentialChain을 사용했다.
사용자가 스포츠 종목을 입력하면 , 그 스포츠 종목의 유명한 팀과 그 팀의 유명한 선수를 소개하는 예제이다.
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import SimpleSequentialChain
llm = OpenAI(temperature=1)
# 입력받은 스포츠에서 가장 유명한 팀을 소개
template = """Your job is to come up with the most famous team in the sports that the users suggest
% USER SPORTS
{user_sports}
YOUR RESPONSE:
"""
prompt_template = PromptTemplate(input_variables=["user_sports"], template=template)
# 이를 하나의 chain으로 생성
sports_chain = LLMChain(llm=llm, prompt=prompt_template)
# 해당 팀 내 유명한 선수 소개
template = """Given a team, come up with one player of the team.
% TEAM
{user_team}
YOUR RESPONSE:
"""
prompt_template = PromptTemplate(input_variables=["user_team"], template=template)
# 이를 하나의 chain으로 생성
team_chain = LLMChain(llm=llm, prompt=prompt_template)
각각의 태스크를 수행하는 llm을 만들고, chain으로 결합해준다.
# 두 chain을 결합
overall_chain = SimpleSequentialChain(chains=[sports_chain, team_chain], verbose=True)
user_message = input("user >> ")
overall_chain.run(user_message)
user >> soccer
간단히 완성!
Langchain은 앞으로 정말 유용하게 사용할 것 같다.
공식문서를 보면 더 다양한 기능들이 나와있다. docs 보고 추가로 공부해봐야지.
References
국민대학교 23-2학기 소프트웨어융합최신기술_Langchain_실습 과제
LangChain Document
'AI' 카테고리의 다른 글
[LangChain] LLM으로 문서 요약하기 (summarization) (0) | 2024.04.23 |
---|---|
[LangChain] Text Splitter로 긴 문서를 작은 Chunk로 쪼개기 (0) | 2024.04.19 |
[프로젝트] Anti-aginGAN for CAT based StyleGAN2 (0) | 2023.02.20 |
[Anaconda] 아나콘다 기본 명령어 (0) | 2023.01.24 |
[Numpy] npz: 파일 구조 확인하기 (1) | 2023.01.16 |