1. 들어가며
RAG 시스템을 사용하며 그 구조에 대해 알고는 있었습니다. 심지어 이 시스템의 성능을 높이려면 어떤 요소를 추가하며 고도화해야하는지도 구상했습니다. 다만 제가 직접 밑단에서부터 구축해본 경험은 없더라구요. 만들어진 시스템을 통해 데이터를 구축하고, API를 사용해 검색과 생성 결과를 얻어본 적은 있지만 파이썬을 사용해 좀 더 기본적인 바탕을 익혀보고자 강의를 수강하였습니다.
https://www.inflearn.com/course/%EC%9E%85%EB%AC%B8%EC%9E%90%EB%A5%BC%EC%9C%84%ED%95%9C-%EB%9E%AD%EC%B2%B4%EC%9D%B8-%EA%B8%B0%EC%B4%88/dashboard
[지금 무료]입문자를 위한 LangChain 기초 강의 | 판다스 스튜디오 - 인프런
판다스 스튜디오 | 파이썬을 활용하여 랭체인(LangChain)의 기본 개념과 사용법을 학습합니다. 구글 코랩(colab) 환경에서 실습 위주로 진행하고, 실습자료는 깃헙(Github)을 통해서 제공합니다., 입문
www.inflearn.com
본 강의는 인프런에서 무료로 제공하는 온라인 강의로 총 5개 챕터로 구성되어있습니다. 총 강의시간도 1시간으로 길지 않아 가볍게 수강하기에 좋았습니다. 물론 스스로 내용을 흡수하고 자기 것으로 만들기 위해서는 그것보다 많은 시간을 투자해야 합니다. 실습 위주의 강의로 파이썬을 어느 정도 할 줄 알아야 순조롭게 진행할 수 있겠습니다. 랭체인을 빠르게 익히는 것을 목표로 하고 있다면 매우 추천합니다.

2. 강의 내용
챕터별 주요 내용은 아래와 같습니다.
2.1. 1강. 체인(Chain)에 대한 이해: 기본 LLM 체인(Prompt+LLM)과 멀티 체인
위키독스 자료 기준 Part 1. LangChain 기초 의 1-2. LLM 체인 내용을 다룹니다. 사용자의 입력과 입력 외의 요청사항을 받아서 LLM을 통해 적절한 답변을 생성하는 체인 구조에 대해 설명합니다. 가장 기초적인 작동 방식부터, 체인이 여러 개 연결되는 멀티 체인까지 예제와 함께 익힐 수 있습니다.
이 챕터를 수강하며 LLM에게 여러 일을 한번에 시키면 안된다는 주의사항이 떠올랐습니다. 같은 질문을 해도 매번 답변이 조금씩 달라지는데, 여러 요청을 한번에 무리하게 시키면 답변도 달라지고 출력 구조도 꼬일 수 있다는 문제가 생긴다는 거죠. 답변을 무리하게 시키는 바람에 output parser가 잘 작동하지 않아 종종 이상한 결과를 본 경험이 생각났습니다. 사람도 멀티테스킹이 불가능하듯, 가급적 체인에게는 하나의 일만 하도록 시키며 멀티 체인을 구성하는 편이 좋겠습니다. (사람이 하기 어려우니 기계를 시키는 건데, 기계도 하기 어려워 한다는 아이러니.. 기계가 사람의 뇌를 닮도록 학습되어 그러한가 봅니다.)
<python />
prompt1 = ChatPromptTemplate.from_template("translates {korean_word} to English.")
prompt2 = ChatPromptTemplate.from_template(
"explain {english_word} using oxford dictionary to me in Korean."
)
llm = ChatOpenAI(model="gpt-4o-mini")
chain1 = prompt1 | llm | StrOutputParser()
chain2 = (
{"english_word": chain1}
| prompt2
| llm
| StrOutputParser()
)
chain2.invoke({"korean_word":"미래"})
2.2. 2강. 프롬프트 만들기: Prompt Template 이해 및 적용
위키독스 자료 기준 Part 1. LangChain 기초의 1-3. 프롬프트 내용, 프롬프트의 정의와 구성요소에 대해 다룹니다. 프롬프트 템플릿은 다른 LLM에서도 재활용하기 위한 어떤 표준화된 프롬프트 형식을 일컫습니다. PromptTemplate과 ChatPromptTemplate 클래스를 사용하여 어떻게 템플릿을 구성할 수 있는지를 예제와 함께 설명합니다. 특히 ChatPromptTemplate는 역할(system, user 등)과 내용을 구분하여 보다 디테일하게 프롬프트를 구성할 수 있게 합니다.
<python />
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate
chat_prompt = ChatPromptTemplate.from_messages(
[
SystemMessagePromptTemplate.from_template("이 시스템은 천문학 질문에 답변할 수 있습니다."),
HumanMessagePromptTemplate.from_template("{user_input}"),
]
)
messages = chat_prompt.format_messages(user_input="태양계에서 가장 큰 행성은 무엇인가요?")
2.3. 3강. LLM 모델 구조: LLM 클래스와 ChatModel 모델 클래스 구분
위키독스 자료 기준 Part 1. LangChain 기초의 1-4-1. LangChain 모델 유형을 다룹니다. LLM은 단일 요청에 대한 출력을 생성할 때, Chat Model은 챗봇처럼 사용자와의 연속적인 대화가 필요할 때에 더 적합하다고 합니다. 동일한 질문에도 LLM 모델 채팅 모델은 답변하는 스타일도 다르더라고요. 생성형 AI가 필요한 상황과 역할에 맞게 적절한 클래스를 선택하여 적용할 필요가 있겠습니다.
<python />
# 1. LLM
from langchain_openai import OpenAI
llm = OpenAI()
llm.invoke("한국의 대표적인 관광지 3군데를 추천해주세요.")
"""
1. 경복궁 (서울) - 대한민국의 대표적인 궁궐로, 조선 왕조의 건립 및 건축 양식을 보여주는 곳입니다. 아름다운 정원과 건물들이 많이 보존되어 있어서 한국의 역사와 문화를 체험할 수 있습니다.
2. 제주도 (제주특별자치도) - 한국에서 가장 인기 있는 관광지로, 아름다운 자연경관과 독특한 문화, 맛집들이 많이 있는 곳입니다. 해변, 산, 화산, 동굴 등 다양한 자연 명소와 함께 제주 특유의 문화인 풍류와 제주 오일장 등을 즐길 수 있습니다.
3. 부산 남포동 (부산) - 부산
"""
<python />
# 2. Chat Model
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
chat = ChatOpenAI()
chat_prompt = ChatPromptTemplate.from_messages([
("system", "이 시스템은 여행 전문가입니다."),
("user", "{user_input}"),
])
chain = chat_prompt | chat
chain.invoke({"user_input": "안녕하세요? 한국의 대표적인 관광지 3군데를 추천해주세요."})
"""
AIMessage(content='안녕하세요! 한국의 대표적인 관광지 3군데를 추천해드리겠습니다.\n\n1. 경복궁 (Gyeongbokgung Palace) - 서울의 중심에 위치한 경복궁은 조선 왕조의 궁궐로서 가장 크고 아름다운 궁궁 중 하나입니다. 경복궁에서는 한국 전통 건축물을 감상하고 궁중문화를 체험할 수 있습니다.\n\n2. 부산 해운대해수욕장 (Haeundae Beach) - 부산의 대표적인 해변으로 유명한 해운대해수욕장은 아름다운 모래사장과 시원한 바다를 즐길 수 있는 장소입니다. 해수욕뿐만 아니라 주변의 맛집과 관광명소도 풍부합니다.\n\n3. 경주 (Gyeongju) - 경주는 한국의 역사와 문화가 깃들어 있는 도시로서 세계문화유산에 등재된 고구려 유적지와 신라 왕궁, 불교 사찰 등이 있습니다. 경주는 한국의 역사적인 유산을 체험할 수 있는 멋진 관광지입니다.\n\n이렇게 한국의 대표적인 관광지 3군데를 추천해드렸습니다. 혹시 더 궁금한 사항이 있으시면 언제든지 물어보세요!')
"""
2.4. 4강. LLM 모델 튜닝: 모델 파라미터 설정
위키독스 자료 기준 Part 1. LangChain 기초의 1-4-2. LangChain의 LLM 모델 파라미터 설정을 다룹니다. 일반적으로 사용되는 파라미터에 대해 알아보는 챕터입니다. 창의적이며 다양한 답변을 얻기 위해서 Temperature, Top P 와 같은 파라미터의 값을 크게 설정하고, 결과가 어떻게 달라지는 지를 직접 확인해보면 좋을 것 같습니다. 최초 모델 인스턴스 생성 단계에서, 모델을 호출하는 단계에서 각각 파라미터를 전달하는 방법들에 대해서도 설명합니다. 또한 모델을 이미 정의한 후에도 bind 메소드를 사용하여 파라미터를 변경할 수도 있다고 합니다. 여러 파라미터를 이용해 테스트를 할 때 유용하게 적용할 수 있을 것 같습니다.
2.5. 5강. RAG 기법 이해: 웹 문서에 대한 QA 챗봇 만들기
위키독스 자료 기준 Part 2. RAG 기법에 대해서 다룹니다. RAG의 정의부터 웹페이지 데이터를 로드하고 청킹한 후 벡터 DB에 저장, 검색하고 생성하는 과정까지를 다룹니다. RAG에서는 답변의 일관성을 위해서 Temperature 파라미터를 낮춘다는 노하우도 설명합니다. 웹페이지 말고 pdf를 비롯한 파일들을 읽거나 Chroma 외에 다른 벡터 DB를 사용하는 방법에 대해서도 확장해서 알고 싶다면, 이 과정을 한번 거친 후에 따로 서치하며 코드를 적용해봐야 합니다. 요즘엔 또 지피티나 여타 생성형 AI가 잘해주니 그쪽에 물어봐도 좋겠네요..!
3. 마치며
이번 인프런 무료 강의를 통해 파이썬에서 랭체인을 사용하며 검색 및 생성 시스템을 구축하는 방법을 익혔습니다. 이 강의를 저처럼 파이썬으로 직접 랭체인과 RAG를 적용해보고 싶은 분들에게 추천하며, 쉬운 예제코드로 빠르게 이해하는 데에 충분히 도움이 될 것이라 생각합니다. 파이썬은 기본적으로 할 줄 알아야 하지만, 전반적으로 입문자가 듣기에 적절한 수준이었다고 생각합니다.
강사님은 매우 전문성 있는 분이신 것 같고 무엇보다 강의 자료들이 위키독스와 깃허브에 올라와 있어 온라인으로 익히기에 아주 적절했습니다. 다만 본 강의에서 배운 내용들은 실제 실무에 바로 적용하기에는 조금 아쉬울 수 있을 것 같습니다. 클래스나 메소드에서 제공하는 파라미터 설명이나 디폴트 값은 알 수 없어서 더 자세하게 알고 싶다면 직접 찾아봐야 하지만, 그만큼 빠르게 적용할 수 있는 기본 예제 코드를 제공하는 점은 좋았습니다.
- 실습자료 (깃허브): https://github.com/tsdata/langchain-study
- 참고 교재 (위키독스): https://wikidocs.net/book/14473
'繩鋸木斷水滴石穿 > AI | 머신러닝' 카테고리의 다른 글
[IR] Rerank: 검색 결과를 재정렬하여 RAG 성능 높이기 (1) | 2024.07.14 |
---|---|
[NLP] 텍스트 전처리: 파이썬에서 띄어쓰기, 문장 분리 라이브러리 사용하기 (2) | 2023.11.26 |
[NLP] 감성 분석과 ABSA(Aspect-Based Sentiment Analysis) 개념 (1) | 2023.10.09 |
[Tips] 범주형 변수의 카테고리 개수를 줄이는 방법들 (2) | 2023.09.10 |
[sklearn] LabelEncoder와 OrdinalEncoder 비교 (0) | 2023.08.27 |