Nathaniel

2. Langchain → Chain 생성? 본문

AI

2. Langchain → Chain 생성?

Nathaniel1 2025. 2. 26. 01:42
LCEL(LangChain Expression Language)이란 무엇인가

 

프롬프트 템플릿을 만들어서 체인을 구성한다, 템플릿 안에는 입력 변수(사용자의 질문)가 사용된다.

qeustion, 변수 등 다양한 것들을 프롬프트 템플릿으로 생성할 것이다.

프롬프트 템플릿은 사용자의 질문을 정해진 내용에 맞도록 리스트화하는 것.

 

아래의 예시를 코드로 작성하여 템플릿으로 만든다고 생각하면 된다.

template = "{County}는 어느 나라의 도시인가요?"

# from_template 메소드를 이용하여 PromptTemplate 객체 생성
prompt_template = PromptTemplate.from_template(template)
prompt_template


# prompt 생성
prompt = prompt_template.format(county="서울")
prompt

출력값 : '서울은 어느 나라의 도시인가요?'

 

위 프롬프트를 템플릿으로 생성해서 LLM Chain과 연결하는 것이 LCEL( LangChain Expression Language)이다

 

그림 이해도

 

프롬프트 출력 값 → LLM으로 전달 된다.

위에서 작성된 프롬프트 템플릿의 출력값 '서울은 어느 나라의 도시인가요?'가 LLM에 전달이 되도록 하는 것.

하나의 파이프라인을 조립하는 것이자, Langchain에서 Chain이라는 표현을 쓴다(체인으로 엮는다)

 

Chain = Prompt | LLM | OutputParser 이러한 과정들로 차례들을 엮어서 하나의 파이프라인으로 묶어주는 결과물을 Chain이라고 한다!!

이때 Unix 파이프 연산자와 유사한 ' | '이 기호를 써서 Prompt와 LLM을 묶어줄 것이다.

 

1. prompt = PromptTemplate.from_template("{topic} 에 대해 쉽게 설명해주세요.")

 

아래는 Prompt 템플릿 된 값을 Chain 변수와 Model 변수 값인 GPT-4o-mini와 '|' 파이프로 엮어준다는 코드이다

# prompt 를 PromptTemplate 객체로 생성합니다.
prompt = PromptTemplate.from_template("{topic} 에 대해 쉽게 설명해주세요.")

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)

chain = prompt | model

 

chain을 출력해 보면 Prompt와 Model이 엮어진 아래의 출력값이 나오게 된다.

Prompt는 당연 유저의 답변이 될 것

chain

출력 값 : 
PromptTemplate(input_variables=['topic'], input_types={}, partial_variables={}, template='{topic} 에 대해 쉽게 설명해주세요.')
| ChatOpenAI(client=<openai.resources.chat.completions.completions.Completions object at 0x000001AFA68FF750>, async_client=<openai.resources.chat.completions.completions.AsyncCompletions object at 0x000001AFA6903690>, root_client=<openai.OpenAI object at 0x000001AFA68F3B50>, root_async_client=<openai.AsyncOpenAI object at 0x000001AFA68FF910>, model_name='gpt-4o-mini', temperature=0.1, model_kwargs={}, openai_api_key=SecretStr('**********'))

 

※ 즉 prompt 입력으로 들어와서 그 결과 값을 LLM에 전달한다고 기억하면 된다! 

 

2. input = {"topic": "인공지능 모델의 학습 원리"}

 

이제 chain을 Invoke() 호출을 해줄 것인데,

딕셔너리 형태로 입력값을 전달한다(키:값) Invoke() 함수 호출 시, 입력 값 전달

# input 딕셔너리에 주제를 '인공지능 모델의 학습 원리'으로 설정합니다.
input = {"topic": "인공지능 모델의 학습 원리"}


# prompt 객체와 model 객체를 파이프(|) 연산자로 연결하고 invoke 메서드를 사용하여 input을 전달합니다.
# 이를 통해 AI 모델이 생성한 메시지를 반환합니다.
chain.invoke(input)

 

풀어보자면

1. prompt = PromptTemplate.from_template("{topic} 에 대해 쉽게 설명해주세요.")

2. input = {"topic": "인공지능 모델의 학습 원리"}

 

1번 prompt 변수에 넣었던 "{topic}에 대해 설명해주세요"를 2번 input 변수에 동일하게 {topic}으로 가져와서

{Key : value} 형태로 chain.invoke(input)   "출력해 줘"라고 이해하면 된다

더 쉽게 말하면 파이프로 엮은 {topic} prompt 변수를 input = {"topic": "value"} 동일하게 불러와서 input에 넣어준다.

topic 이름은 동일하게 맞춰야 된다. topic / topic (O), topic / topic2 (X)
↓ 예시 ↓
1. prompt = {topic}    템플릿 | 모델 파이프 
2. input = {topic}        → 입력 {key:value}
3. chain.invoke(input) → 입력 값을 GPT model로 전달

 

변수 명은 여러 개가 들어가도 된다.

# {topic}, {how} 변수 두 개 지정 시

prompt = PromptTemplate.from_template("{topic} 에 대해 {how} 설명해주세요.")
model = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)chain = prompt | model


# input 딕셔너리에 주제를 '인공지능 모델의 학습 원리', '간단하게'로 설정
input = {"topic": "인공지능 모델의 학습 원리", "how":"간단하게"}

 

변수 명 두 개 출력 사진

변수명 두 개 출력

템플릿 안에 정한 프롬프트에 따라 결과 값은 달라진다. 명확한 목적을 가지고 템플릿 프롬프트를 작성해야 한다!!

"변수를 어떤 목적으로 몇 개를 구성하겠다."라는 템플릿을 계획 있게 작성!

 

Chain 생성의 마지막 OutputParser 단계

chain = prompt | model | output_parser

 

기존에 prompt | model로 Chain 했을 때 chain.invoke(input)을 하면  AIMessage라는 content 값인 AI 모델의 출력 답변이 나온다. ↓ 예시는 아래 확인 ↓

chain = prompt ❘ model

하지만 Prompt | model | OutputParser 형태로 Chain을 하면 아래와 같이 깔끔하게 답변을 얻을 수 있다.

chain = prompt ❘ model ❘ output_parser

이렇게 3개의 변수들을 묶었을 때의 마지막 단계인 부분을 확인할 수 있다!!

상황에 따라 받고 싶은 문자 형태를 chain으로 묶어서 출력 받으면 좋을 것 같다.

 

출처 테디노트 실습 코드 : https://github.com/teddylee777/langchain-kr

 

GitHub - teddylee777/langchain-kr: LangChain 공식 Document, Cookbook, 그 밖의 실용 예제를 바탕으로 작성한 한

LangChain 공식 Document, Cookbook, 그 밖의 실용 예제를 바탕으로 작성한 한국어 튜토리얼입니다. 본 튜토리얼을 통해 LangChain을 더 쉽고 효과적으로 사용하는 방법을 배울 수 있습니다. - teddylee777/langch

github.com