본문 바로가기
AI

랭체인(LangChain)의 컴포넌트(Components) : Model I/O

by Dev_Mook 2025. 2. 5.
728x90

이번 포스팅에서도 랭체인의 컴포넌트에 대해 알아볼거에요.
랭체인의 컴포넌트에는 Model I/ORetrievalCompositionMemoryCallbacks 등이 있어요.
 
모든 컴포넌트를 한 번에 공부하기는 쉽지 않기 때문에!
이번에는 Model I/O에 대해서 학습해볼게요.

 

 

# Model I/O

 
모든 언어 모델 애플리케이션의 핵심 요소는 모델이에요.
랭체인(LangChain)은 모든 언어 모델을 활용할 수 있도록
빌딩 블록(Building Blocks)이라는 인터페이스를 제공하는데요!
Model I/O빌딩 블록(Building Block) 중 하나랍니다.
 

Model I/O

 
Model I/O모델과 상호작용을 하기 위해 입출력과 LLM API 호출을 담당해요.

사용자의 입력(Prompt)을 전달받아 API를 통해 모델(Model)에 전달하고 결과를 반환받아요.
그리고 결과를 보정(Output Parsers)하여 다시 사용자에게 전달합니다!

이 작업을 수행하는 프롬프트(Prompt), 모델(Model), 출력 파서(Output Parsers)
Model I/O의 구성 요소라고 해요.
 

Model I/O의 구성 요소

 
이제 Model I/O의 구성 요소인 Model(Chat Models, LLMs)출력 파서(Output Parsers),
그리고 프롬프트(PromptTemplates)에 대해 살펴볼까요?
 
 

# Chat Models

 
ChatModels랭체인의 핵심 컴포넌트 중 하나에요.
하나의 ChatModel하나의 거대 모델을 의미하며,
사용자가 채팅 메시지를 입력하면 ChatModel이 채팅 메시지를 출력해주죠!
 
랭체인은 OpenAI, Cohere, Hugging Face 등 다양한 모델 공급자(공급업체)와 상호작용할 수
있도록 표준 인터페이스를 제공해줘요.
그리고 랭체인을 통해 동기화, 비동기, 일괄 처리, 스트리밍 모드로 모델을 사용할 수 있고,
캐싱 등의 다른 기능도 제공해준다고 해요.
 
Chat Models는 바로 다음에 설명할 LLMs의 지원을 받아요.
하지만 사용자와 거대 언어 모델 사이에서 대화를 나눌 수 있도록 설정 값이 조정되어 있어요.
그리고 모델 공급자(공급업체) API를 통해 입력을 전달하고 결과를 반환받죠!
 
여기서 중요한 점!
순수하게 텍스트만 사용하는 모델과 달리 ChatModels는 채팅 메시지 목록을 입력으로 전달한다는 점이에요!
다음에 설명할 LLMs뿐만 아니라 여러 모델에 단순한 문자열을 입력으로 전달하는 것과 차이가 있죠.
 

랭체인의 ChatModels 동작

 
ChatModels를 활용하여 구현된 서비스에는 대표적으로 GPT-4Claude-2가 있답니다!
 
 

# LLMs : Models

 
Large Language Models(LLMs)랭체인의 핵심 컴포넌트 중 하나에요!
 
랭체인 자체는 거대 언어 모델(LLM)을 제공하지 않아요.
대신 공급자(공급업체)가 제공하는 표준 인터페이스를 통해
다양한 거대 언어 모델(LLM)과 상호작용을 하죠.
 
어떻게 다양한 거대 언어 모델(LLMs)과 상호작용을 할 수 있을까요?
 
바로 랭체인의 LLM Class 덕분이랍니다!
LLM ClassLLM 공급자(공급업체)들에 대한 표준 인터페이스를 제공하도록 설계되어있거든요.
그렇기 때문에 다양한 거대 언어 모델(LLM)과 상호작용을 할 수 있는거에요.
 
랭체인의 LLMs(Large Language Models)"순수하게 텍스트만 사용하는 모델"을 참조해요.
그렇기 때문에 이 모델이 제공하는 API는 문자열 프롬프트를 통해 입력을 받고
문자열을 생성해서 결과로 출력해줘요.
 

랭체인의 LLMs 동작

 
OpenAI의 GPT-3가 바로 LLM으로 구현된 모델이라고 해요!
 
한가지 명심할 점!
모든 모델이 동일하게 동작하는 것은 아니에요.
각 모델은 자신에게 적절한 입출력 방식을 활용하는데요.
예를 들어 Anthropic의 모델은 XML 데이터를 기반으로 작동하는 반면,
OpenAI는 JSON 데이터를 기반으로 동작하죠!
 
나중에 모델(Model)을 구현하고 싶다면 이 점을 꼭 명심하고 설계해보세요!
 
 

# Prompt Templates

 
대부분의 LLM 애플리케이션사용자가 입력한 질문거대 언어 모델(LLM)에게 바로 전달하지 않아요.
예를 들어 ChatGPT에게 "랭체인이 뭐야?"라고 질문한다면?
GPT 모델에게 곧바로 "랭체인이 뭐야?"라는 값을 전달하지 않는다는 의미에요.

 

사용자의 입력을 LLM에게 바로 전달하지 않음


그럼 어떻게 전달될까요?
 
일반적으로 사용자가 입력한 값은 PromptTemplate에게 전달되요.
그럼 PromptTemplate은 이미 등록된 프롬프트와 사용자의 입력을 조합하여

LLM에게 전달하기 위한 새로운 입력 값을 만들어줘요.
 
왜 PromptTemplate을 이용하는걸까요?
예시 소스코드를 보면서 그 이유를 알아볼게요.
 

from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template("{product}을(를) 만드는 회사의 이름을 추천해줘.")
prompt.format(product="컬러풀한 양말")

# 결과 : 컬러풀한 양말을(를) 만드는 회사의 이름을 추천해줘.

 
혹시 눈치채셨나요?
 
PromptTemplate을 이용하기 전에는 "컴퓨터를 만드는 회사의 이름을 추천해줘.",
"양말을 만드는 회사의 이름을 추천해줘.", "자전거를 만드는 회사의 이름을 추천해줘."와 같이
매번 비슷한 포맷의 질문을 사람들이 입력해야 됐어요.
 
하지만 PromptTemplate이 불필요한 반복을 효과적으로 줄여줬죠.
당연히 사용자가 질문하기 위해 들이는 노력도 줄어들었어요!

프롬프트를 이렇게 활용할 수 있는 이유는 바로 "변수"!
예제 소스코드에 있는 "{product}"가 변수에요.
사용자가 product에 대한 값만 입력하면 PromptTemplate이 "{product}" 부분을 사용자가 입력한 값으로 대체해주죠!
이 내용을 랭체인의 공식 문서에서는 [변수를 "부분적으로" 포맷할 수 있다]고 작성되어 있어요.

변수를 여러 개 등록할 수도 있을까요?
물론 가능합니다!
그리고 단순히 입력된 메시지를 보내는 것뿐만 아니라 메시지를 입출력하는게 누구인지 역할도 전달할 수 있어요.
아래 ChatPromptTemplate을 활용한 예제를 통해 살펴볼게요.

from langchain_core.prompts.chat import ChatPromptTemplate

template = "You are a helpful assistant that translates {input_language} to {output_language}."
human_template = "{text}"

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    ("human", human_template),
])

chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")

 

# 결과
[
    SystemMessage(content="You are a helpful assistant that translates English to French.", additional_kwargs={}),
    HumanMessage(content="I love programming.")
]


거대 언어 모델(LLM)과 대화를 하기위해 ChatPromptTemplate을 사용했네요.
이제 코드를 분석해볼까요?

"system"은 LLM 애플리케이션 시스템을 의미해요.
이 곳에는 주로 LLM 애플리케이션이 어떤 역할을 수행하면 되는지 사전 지시문을 작성한답니다.
"human"은 생성형 AI에게 질문하는 사용자를 의미해요.
즉, 사용자가 입력한 값이라는 것을 LLM에게 알려주죠.

그리고 마지막 줄에 작성된 소스코드를 보면 각 변수가 어떤 값으로 대체되어야 하는지 작성되어 있죠!
이렇게 여러 변수를 사용해서 거대 언어 모델(LLM)과 쉽게 대화할 수 있답니다. 

 

 

# Output Parsers

 
Output Parsers(출력 파서)는 언어 모델에서 생성한 값을 다운스트림, 즉 결과물로 사용할 수 있도록
형식을 변환해주는 역할을 담당해요.
예를 들어 다음과 같죠!
 
    1. LLM의 텍스트를 구조화된 정보, 예를 들어 JSON 형식의 데이터로 변환해줘요.
    2. ChatModel이 생성한 ChatMessage문자열로 변환해줘요.
    3. 메시지뿐만 아니라 OpenAI 함수 호출 등에서 반환된 정보문자열로 변환해줘요.
 
이처럼 Output Parsers(출력 파서)는 모델(Model)이 생성한 결과물사용자가 보기 쉬운 형식으로
변환을 해주는 중요한 역할을 담당한답니다!
 
 

# 마무리

 
랭체인의 핵심 컴포넌트 중 하나인 Model I/O에 대해 알아봤어요.
랭체인 공식 문서(Documents)를 보면서 학습을 해봤는데
Model I/O가 무엇이며 어떻게 구성되어 있는지 이해했나요?
 
아직은 세세하게 이해하지 못해도 돼요!
Model I/O가 무엇인지, 각 구성 요소가 어떤 역할을 하는지
전체적인 모습만이라도 이해하였다면 그 것으로 이번 포스팅은 성공했다고 생각하거든요.
 
물론 각 구성 요소에 대해 깊게 공부하면 랭체인을 알아가는데 큰 도움이 될거에요.
하지만 시간은 한정적이죠...
 
그렇기 때문에 Model I/O에 대해서는 이정도만 학습하고!
랭체인의 다른 컴포넌트들에 대해서도 알아봐야겠죠?
* 시간이 허락한다면 Model I/O의 구성 요소에 대해 깊게 공부해볼게요.
 
글을 읽으면서 잘못된 점이 있으면 언제든 지적해주세요.
더욱 더 공부를 하고 수정을 해나갈게요.

  

# 참고

 

 

How-to guides | 🦜️🔗 LangChain

Here you’ll find answers to “How do I….?” types of questions.

python.langchain.com

 

 

How-to guides | 🦜️🔗 LangChain

Here you’ll find answers to “How do I….?” types of questions.

python.langchain.com

 

728x90