[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인

안녕하세요 K-DEVCON(k-devcon.com) 입니다.
 
6월 22일(토) 에는 K-DEVCON LA 챕터에서 <데브콘 LA : 유월엔 랭체인> 이라는 주제로 온라인 세미나가 진행되었습니다. 지난 5월 행사에 이어 AI와 관련된 주제로 행사가 진행되었습니다.
 
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인
 
이번 세미나는 줌으로 진행되었습니다.
Langchain에 대한 이야기를 정말 많이 들어봤었는데 이번 세미나를 통해서 Langchain이 무엇이고, 어떤 역할을 하는지 코드와 함께 살펴볼 수 있었습니다.
 
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인 - 이미지 2
 
이번 세미나를 통해 재밌게 보았던 부분들을 정리해보았습니다.
 
Langchain 이란
LangChain은 대규모 언어 모델(LLM)을 기반으로 애플리케이션을 구축하기 위한 오픈 소스 프레임워크입니다.
LangChain의 도구와 API를 통해 LLM 기반 애플리케이션을 구축하는 과정을 간소화할 수 있습니다.
 
Langchain에 대한 설명은 인터넷에서 쉽게 찾아볼 수 있습니다.
dev container
https://code.visualstudio.com/docs/devcontainers/containers
devcontainer를 사용하면 도커를 이용하여 로컬개발환경을 구축할 수 있습니다.
이를 통해 깔끔한 환경 구성이 가능하게 됩니다.


Token calculator
https://platform.openai.com/tokenizer
토큰은 AI 모델이 작동하는 기본 구성 요소입니다. 모델은 입력된 단어를 토큰으로 변환합니다. 출력시 토큰을 다시 단어로 변환합니다.
중요한 것은 토큰 = 돈이라는 것입니다. 
위 링크는 openai 의 토큰 계산기 입니다. 영어에서 하나의 토큰은 대략 단어의 75%에 해당한다고 합니다.
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인 - 이미지 3

 Chat model vs LLMs
https://python.langchain.com/v0.1/docs/modules/model_io/concepts/
 
LangChain에서는 두가지 모델을 제공합니다. Chat model과 LLMs 인데요.
LLMs는 순수 텍스트 완성 모델이고 Chat model은 채팅에 좀 더 특화되어 있습니다.

 
Chat model 은 메시지 주고 받습니다. 그리고 모든 메시지에는 역할과 콘텐츠 속성이 있습니다.
역할은 누가 말하는지를 설명하고 콘텐츠는 메시지의 내용을 의미합니다.
 
역할
역할은 크게 HumanMessage, AIMessage, SystemMessage 가 있습니다. 각각에 대해 간단하게 설명하면 다음과 같습니다.
 
- system message : 시스템에 대한 메세지 (모델이 어떻게 동작할지에 대해 정의)
 - human message : 사용자가 입력한 메세지
 - ai message : ai가 출력한 메세지 (assistant, openai term)
 
Temperature
langchain을 통해 OpenAI 의 모델을 초기화 할 때 temperature 라는 속성 값을 넣을 수 있는데요
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인 - 이미지 4

https://platform.openai.com/docs/api-reference/chat/create#chat-create-temperature 
 
이 속성 값은 무작위성에 영향을 미치는데 값이 클수록 출력이 더 무작위로 나오고 값이 작을수록 값이 비슷하게 나온다고 합니다.
관련해서 Seed 라는 속성 값에 대한 언급도 있었습니다.
 
Langchain express language(LCEL)
https://python.langchain.com/v0.1/docs/expression_language/
 
Langchain express language(LCEL, 랭체인 표현 언어)는 체인을 쉽게 구성하는 선언적 방법입니다.
LCEL을 사용하면 기본 구성 요소로 복잡한 체인을 쉽게 구축할 수 있으며 스트리밍, 병렬 처리, 로깅과 같은 기본 기능을 지원합니다.
 
LCEL을 사용하여 다양한 구성 요소를 단일 체인으로 통합할 수 있습니다. `|` (pipe) 를 이용해서 체인으로 결합할 수 있으며. 예시는 다음과 같습니다.
 
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
output_parser = StrOutputParser()

chain = prompt | model | output_parser

chain.invoke({"topic": "ice cream"})
 
Output Parser 라는 것 외에는 Function Calling 으로 처리할 수 있는 방법도 있다고 합니다.
 
Prompt engineering
지난 5월 행사에서는 CoT (Chain of Thought) 라는 기법에 대해서 소개해주셨는데 이번에는 아래의 세가지 방법에 대해서 소개해주셨습니다.
 
- Zero Shot : 모델에게 예제를 제공하지 않음
- One Shot : 모델에게 예제를 한번만 제공
 - Few Shot : 모델에게 예제를 몇 번 제공 (6개 미만으로 주는게 좋다고 함.)
 
Langchain smith
https://smith.langchain.com/
개인적으로 재밌게 본 플랫폼인데요. 내 어플리케이션이 chain 을 따라 어떻게 동작하는지 각 단계별로 볼 수 있었습니다. LLM을 로깅, 모니터링 해주는 플랫폼 이였습니다.
 
Langchain hub
langchain hub에서는 내가 만든, 혹은 다른 사람들이 만든 프롬프트를 공유할 수 있었습니다.
 
검색증강생성 (RAG, Retrieval Augmented Generation)
이번 세미나를 통해서 개인적으로 더 가까워질 수 있었던 개념입니다.
기존부터 RAG에 대한 이야기는 많이 들었는데 대략적인 이해만 하고 있었다가 이번 기회를 통해서 이해를 할 수 있었습니다.
 
RAG 는 크게 두 단계로 나누어 집니다.
1. 전처리
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인 - 이미지 5

https://python.langchain.com/v0.1/docs/use_cases/question_answering/ 
2. 서비스
[Review] 2024-06-22(토) K-DEVCON LA : 유월엔 랭체인 - 이미지 6

https://python.langchain.com/v0.1/docs/use_cases/question_answering/ 
 
이 과정에서 임베딩 이라는 것이 진행되는데, 실제적으로 경험을 해본적이 없다보니 실제로는 어떻게 진행되는지 궁금했었습니다.
 
그러던 와중에 이번 세미나를 통해서 아래와 같은 예시를 보여주셨고, 덕분에 RAG 과정에 대해 잘 이해할 수 있었습니다.
 
from langchain_openai import OpenAIEmbeddings
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import CharacterTextSplitter

from langchain.storage import LocalFileStore
from langchain_community.document_loaders import UnstructuredMarkdownLoader

splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator="\n",
    chunk_size=600,
    chunk_overlap=100,
)
loader = UnstructuredMarkdownLoader("files/kubernetes_hardening_guidance.md")

docs = loader.load_and_split(text_splitter=splitter)
 
from langchain.vectorstores import FAISS

embeddings = OpenAIEmbeddings()

# 임베딩을 해서 디비에 넣는다.
vectorstore = FAISS.from_documents(docs, embeddings)

results = vectorstore.similarity_search("누구에게 이 가이드를 추천하는가?")

# 유사도 검사를 통해 관련된 문장을 찾아온다. 이것을 프롬프트에 담아 llm에 보낸다.
 

 내용 정리는 여기 까지 입니다 : )
 
다음에도 더욱 알찬 모임으로 찾아뵙겠습니다. ^^ 기업 콜라보레이션 언제나 환영합니다. 많은 문의, 연락 부탁드립니다.
 
 
 
K-DEVCON은 IT 전문가 커뮤니티 그룹으로 다양한 IT 기술을 연구하며 회원간의 소통을 공유하는 모임 입니다. 현재 IT업계에 종사하고 있거나, 종사할 예정이거나, IT를 공부하는 학생 그리고 IT에 관심이 있다면 누구나 함께할 수 있습니다.
 
기술 세미나, 스터디, 토론 등 다양한 활동을 하고 있으며, 주요 소통 및 이벤트 공유는 오픈챗 및 홈페이지 등을 통해서 공유하고 있습니다.
소프트웨어 엔지니어, 데이터 엔지니어, 머신러닝 엔지니어, 시스템 엔지니어, 시큐리티 엔지니어, 데브옵스, SRE, PM, Educator, UI/UX, 스타트업, 대학생 등 다양한 구성원이 활동 중입니다.
 
homepage : https://k-devcon.com
contact : info@k-devcon.com
 
2024년 1월 2일(화) K-DEVCON 서울 챕터를 오픈했습니다! 앞으로 K-DEVCON 서울 챕터가 마련한 오픈챗과 각종 활동은 전공자/비전공자, 재직자, 취준생, 학생 관계없이 자유롭게 참여 가능하며, 최신 IT 인프라가 오가는 서울에서 다양한 활동으로 많은 IT 관계자분들과 소통할 수 있기를 희망합니다.