Nathaniel

3. Langchain LCEL, Parallel 본문

AI

3. Langchain LCEL, Parallel

Nathaniel1 2025. 3. 2. 15:31

지난번 LCEL문법을 사용하여 Langchain의 chain을 진행했다.

유닉스 파이프를 인용한 " | " 문자를 사용해 chain을 만들었는데 그 구조는 아래와 같다.

chain = prompt | llm | Outputparser

Langchain 이해도

 

 

stream = 실시간 출력으로 응답 받고

invoke = 출력되는 답변을 완성될 때까지 기다렸다가 한번에 받기

위 두 가지를 진행했었다.

 

Batch, max_concurrency

 

이번엔 batch(단위 실행) 여러 개의 딕셔너리를 포함하는 리스트를 인자로 받아서 딕셔너리에 있는

topic의 키 값을 사용한 일괄처리 수행방법이다.

 

answer = chain.batch([{"topic:": "ChatGPT"}, {"topic":"instagram"}]) 이런 방식이다.

그리고 변수로 선언한 answer의 인덱스 값들을 하나씩 불러와 실행하는 방법도 된다.

ex) answer[0], answer[1] 이런식으로말이다.

 

또한 max_concurrency 키를 통해 동시에 처리할 수 있는 최대 작업수를 설정한다.

아래와 같이, batch에 리스트 형식 내 Key:Value를 받고, config라는 변수에 "max_concurrency:3"로 답변출력을 받으면 

5개의 topic에 대한 이야기를 3개의 답변으로 출력해준다

chain.batch(
    [
        {"topic": "ChatGPT"},
        {"topic": "Instagram"},
        {"topic": "멀티모달"},
        {"topic": "프로그래밍"},
        {"topic": "머신러닝"},
    ],
    config={"max_concurrency": 3},
)
['ChatGPT는 자연어 처리 기술을 이용하여 대화 상대와 상호작용하는 인공지능 챗봇 서비스이다. 사용자는 ChatGPT를 통해 일상 대화, 질문 응답, 정보 제공 등의 다양한 상황에서 대화할 수 있다. ChatGPT는 일상적인 상황뿐만 아니라 전문적인 지식이 필요한 상황에서도 효과적으로 대응할 수 있는 특징을 가지고 있다.',
 '인스타그램은 사진과 동영상을 공유하고 다른 사람들과 소통할 수 있는 소셜 미디어 플랫폼이다. 사용자들은 팔로워들과 이야기를 공유하며 인스타그램 스토리, 피드 포스트, 라이브 방송 등 다양한 기능을 활용할 수 있다. 또한 해시태그를 통해 관심사나 주제에 맞는 게시물을 검색하고 찾아볼 수 있다.',
 '멀티모달은 여러 가지 형태의 통신 수단을 결합하여 정보를 전달하는 방법이다. 예를 들어 음성, 화상, 텍스트 등의 다양한 방식으로 소통할 수 있다. 멀티모달을 통해 더 효율적으로 의사소통하고 정보를 전달할 수 있어서 업무나 일상 생활에서 유용하게 활용된다.',
 '프로그래밍은 컴퓨터에게 일련의 명령을 내리는 작업이다. 이를 통해 원하는 기능을 수행하거나 원하는 결과를 얻을 수 있다. 프로그래밍은 문제 해결 능력을 기르고 창의적인 사고를 발전시킬 수 있는 유용한 기술이다.',
 '머신러닝은 컴퓨터 시스템이 데이터를 분석하여 패턴을 학습하고 예측하는 기술이다. 이러한 학습 과정을 통해 컴퓨터는 스스로 문제를 해결하고 최적의 결정을 내릴 수 있다. 머신러닝은 다양한 분야에서 활용되며 인공지능의 발전에 큰 역할을 한다.']

 

비동기 async

 

async stream : 비동기 스트림, async invoke : 비동기 호출

비동기는 여러개의 작업을 할 수 있게 하는 메서드라고 생각하면 된다(일괄처리)

GPT가 사용자가 특정 시간에 10명이서 답변 출력을 요청했을 때 10개의 답변을 GPT가 수행해야 하는데 이것을 비동기라고 생각하면된다.

 

비동기 호출은 invoke와 stream 앞 글자에 a를 붙인다 → ainvoke, astream

async for token in chain.astream({"topic": "YouTube"}):
    # 메시지 내용을 출력합니다. 줄바꿈 없이 바로 출력하고 버퍼를 비웁니다.
    print(token, end="", flush=True)
    
# 비동기 체인 객체의 'ainvoke' 메서드를 호출하여 'NVDA' 토픽을 처리합니다.
my_process = chain.ainvoke({"topic": "NVDA"})

 

 

비동기 async 사용하는 방법은  my_process에 ainvoke를 호출하고,  await my_process를 하면 출력이된다.

# 비동기 체인 객체의 'ainvoke' 메서드를 호출하여 'NVDA' 토픽을 처리합니다.
my_process = chain.ainvoke({"topic": "NVDA"})

# 비동기로 처리되는 프로세스가 완료될 때까지 기다립니다.
await my_process

 

async batch : 비동기 배치

 

이제 위에서 했던 batch도 마찬가지로 abatch를 사용해서 코드를 짤 수 있다.

# 주어진 토픽에 대해 비동기적으로 일괄 처리를 수행합니다.
my_abatch_process = chain.abatch(
    [{"topic": "YouTube"}, {"topic": "Instagram"}, {"topic": "Facebook"}]
)

# 비동기로 처리되는 일괄 처리 프로세스가 완료될 때까지 기다립니다.
await my_abatch_process

 

Parallel 병렬성

 

Runnable이란 무엇인가? 뜬금없지만 Runnable은 Langchain에서 Chain을 구성하는 prompt, llm, outputparser를 각 각 한개씩을 Runnable이라고 부르며 실행가능한 요소라고 칭한다.

+ invoke를 호출할 수 있다면, Runnable이다.

 

아래의 코드에서 보면 Chain1, Chain2가 있는데, 이 두 개의 Runnable을 병렬적으로 실행가능하게 하는 것이 RunnableParallel이다.

병렬 실행 체인 생성 combined = RunnableParallel(capital=chain1, area=chain2)

from langchain_core.runnables import RunnableParallel

# {country} 의 수도를 물어보는 체인을 생성합니다.
chain1 = (
    PromptTemplate.from_template("{country} 의 수도는 어디야?")
    | model
    | StrOutputParser()
)

# {country} 의 면적을 물어보는 체인을 생성합니다.
chain2 = (
    PromptTemplate.from_template("{country} 의 면적은 얼마야?")
    | model
    | StrOutputParser()
)

# 위의 2개 체인을 동시에 생성하는 병렬 실행 체인을 생성합니다.
combined = RunnableParallel(capital=chain1, area=chain2)

 

chain1로 두 개 토픽 배치 처리

# 배치 처리를 수행합니다.
chain1.batch([{"country": "대한민국"}, {"country": "미국"}])

출력 : ['대한민국의 수도는 서울이다.', '미국의 수도는 워싱턴 D.C.입니다.']

 

chain2로 두 개 토픽 배치 처리

# 배치 처리를 수행합니다.
chain2.batch([{"country": "대한민국"}, {"country": "미국"}])

출력 : ['대한민국의 총 면적은 약 100,210km² 입니다.', '미국의 면적은 약 9,833,520km² 입니다.']

 

chain1, chain2를 combined로 합쳐 병렬처리하는 방식

 

# 주어진 데이터를 배치로 처리합니다.
combined.batch([{"country": "대한민국"}, {"country": "미국"}])

출력 : 
[{'capital': '대한민국의 수도는 서울이다.', 'area': '대한민국의 면적은 약 100,363.438km² 입니다.'},
 {'capital': '미국의 수도는 워싱턴 D.C.입니다.', 'area': '미국의 면적은 약 9,833,520㎢ (3,796,742제곱마일) 로 세계에서 세 번째로 큰 국가입니다.'}]

 

이렇게 병렬과 배치 처리를 통해서 답변을 한번에 밀어서 받는 것도 가능하다.

 

다음은 Runnable을 활용한 것들에 대해서 글을 작성해보려한다.