Model

(1) 개념

  • Prompt를 입력받아 실제로 응답을 생성하는 구성요소입니다.
  • LCEL에서 Model은 Prompt 다음 단계에서 실행되며, 입력된 지시문을 바탕으로 추론을 수행합니다.
  • 사용하는 모델의 종류에 따라 응답 품질, 속도, 비용, 출력 형식 등이 달라질 수 있습니다.
  • 즉, Model은 Prompt를 해석하고, 그에 맞는 결과를 생성하는 역할을 합니다.
1
2
3
4
5
Model 이 담당하는 역할
- Prompt 해석
- 추론 수행
- 답변 생성
- 형식에 맞는 응답 반환

(2) 예시

  • 다양한 모델을 사용할 수 있으며, 아래 예시에서는 ChatOpenAI 모델을 사용했습니다.
  • 아래 코드에서는 OpenAI의 gpt-4o-mini 를 LCEL에서 사용할 수 있도록 준비했습니다.
  • API로 요청하는 Model 의 경우, 사용자 인증을 위한 API KEY가 필요한 경우가 보통입니다.
1
2
3
4
5
6
from langchain_openai import ChatOpenAI
import os

# model 준비
os.environ["OPENAI_API_KEY"] = "MyAPIKey..."
model = ChatOpenAI(model="gpt-4o-mini")
  • 이후 Prompt와 연결하면, 해당 모델이 실제로 응답을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os

# model 준비
os.environ["OPENAI_API_KEY"] = "MyAPIKey..."
model = ChatOpenAI(model="gpt-4o-mini")

# prompt template 준비
prompt = PromptTemplate.from_template(
    "{topic}에 대해 초보자도 이해할 수 있도록 3문장으로 설명하세요."
)

# chain 생성
chain = prompt | model

# input 을 받아 추론
result = chain.invoke({"topic": "LangChain의 LCEL"})

print(result)
1
2
3
4
5
6
# 출력
content='LCEL은 LangChain Expression Language의 약자로, LangChain에서 체인을 간결하게 구성하기 위한 표현 방식입니다.
이를 사용하면 프롬프트, 모델, 출력 파서를 파이프(|)로 연결하여 하나의 실행 흐름으로 만들 수 있습니다.
덕분에 복잡한 체인도 직관적이고 재사용 가능하게 작성할 수 있습니다.'
additional_kwargs=...
response_metadata=...

(3) 종류

1) Chat Model

  • 대화 형식의 입력을 받아 응답을 생성하는 모델입니다.
  • 일반적인 챗봇, 질의응답, 역할 기반 대화 등에 주로 사용됩니다.
  • LangChain에서는 ChatOpenAI 또는 ChatGoogleGenerativeAI 등을 지원합니다.
1
2
3
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini")

2) Text Generation Model

  • 일반 텍스트를 입력받아 이어지는 텍스트를 생성하는 모델입니다.
  • 문장 생성, 요약, 설명, 초안 작성 같은 작업에 활용 가능합니다.
  • 최근 LangChain에서는 Chat Model 중심으로 많이 사용되지만, 개념적으로는 텍스트 생성 모델도 포함됩니다.

3) Embedding Model

  • 문장을 직접 답변으로 생성하는 것이 아니라, 텍스트를 벡터로 변화하는 모델입니다.
  • 의미 기반 검색, 문서 유사도 비교, RAG의 검색 단계 등에서 사용됩니다.
  • 응답 생성용 모델과는 역할이 다릅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from langchain_openai import OpenAIEmbeddings
import os

# API Key 설정
os.environ["OPENAI_API_KEY"] = "My API Key ..."

# Embedding Model 준비  
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 문장을 벡터로 변환  
result = embeddings.embed_query("Langchain의 LCEL은 무엇인가요?")

# 답변 출력
print(type(result)) # 답변의 자료형
print(len(result))  # 답변의 전체 길이(차원)
print(result[:5])   # 앞 5개 값만 출력
1
2
3
<class 'list'>
1536
[0.01116180419921875, -0.01123046875, 0.0118255615234375, -0.0196533203125, 0.030548095703125]
  • 여러 문서를 임베딩할 때에는 embed_documents() 를 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain_openai import OpenAIEmbeddings
import os

# API Key 설정
os.environ["OPENAI_API_KEY"] = "My API Key ..."

# Embedding Model 준비
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

documents = [
    "LangChain은 LLM 애플리케이션 개발을 돕는 프레임워크입니다.",
    "LCEL은 LangChain Expression Language의 약자입니다.",
    "벡터 데이터베이스는 임베딩된 문서를 저장하고 검색하는 데 사용됩니다."
]

# 여러 문서를 벡터로 변환
result = embeddings.embed_documents(documents)

print(len(result))        # 문서 개수
print(len(result[0]))     # 각 문서 벡터 차원 수
print(result[0][:5])      # 첫 번째 문서 벡터 일부
1
2
3
4
# 출력 예시
3
1536
[0.0211, -0.0342, 0.0554, 0.0188, -0.0723]

(4) Chat Model의 출력

  • Chat Model의 결과는 단순 문자열이 아니라 AIMessage 객체 형태입니다.
  • 따라서 chain.invoke() 결과를 그대로 출력하면 응답 본문 외 메타데이터도 보이게 됩니다.
  • 응답 텍스트만 사용하고 싶다면 .content 필드만 사용하거나, 다음 포스팅에서 살펴볼 OutputParser 를 연결해 문자열로 변환할 수 있습니다.
1
2
result = chain.invoke({"topic": "LangChain의 LCEL"})
print(result.content)
1
2
3
4
# 출력
LCEL은 LangChain Expression Language의 약자로, LangChain에서 체인을 간결하게 구성하기 위한 표현 방식입니다.
이를 사용하면 프롬프트, 모델, 출력 파서를 파이프(|)로 연결하여 하나의 실행 흐름으로 만들 수 있습니다.
덕분에 복잡한 체인도 직관적이고 재사용 가능하게 작성할 수 있습니다.

(5) Model 을 사용하는 이유

  • Prompt 만으로는 결과가 생성되지 않음. 추론을 하는 Model이 필요
  • 어떤 Model을 선택하느냐에 따라 성능과 비용이 달라짐
  • LCEL에서는 Prompt, Model, Parser를 연결해 하나의 실행 흐름을 구현

Comments