지난 포스트에서 LCEL을 활용해 Chain을 구성하는 방법과 이를 실행하는 방법을 알아보았습니다.
LCEL은 LangChain의 다양한 컴포넌트들을 연결하여 하나의 실행 가능한 객체로 만들기 위한 구현 방식입니다. 이렇게 구현하면 쉽게 Chain을 만들고, 하나의 표준화된 문법으로 실행시킬 수 있습니다.
이번 포스트에서는 LCEL로 완성된 Chain으로 사용할 수 있는 다양한 기능에 대해 살펴보겠습니다.
LCEL 인터페이스를 이해하기 위해서는 먼저 Runnable 프로토콜에 대한 이해가 필요합니다.
LCEL로 연결되는 각 컴포넌트들은 모두 Ruuable 프로토콜에 따라 구현되었습니다.
Runnable이란 LangChain에서 정의한 일종의 구현 방식입니다. Runnable 프로토콜에 따라 구현된 컴포넌트들은,
| 연산자로 이어붙였을 때 앞선 컴포넌트의 결과물이 다음 컴포넌트의 입력으로 전달되는 하나의 객체로 연결하고,구현 되었다고 이해할 수 있겠습니다.
이미 LangChain의 대부분 컴포넌트들은 Runnable 프로토콜에 따라 구현되어있습니다.
이렇게 구현하면 다음과 같은 장점을 가질 수 있습니다.
1. 사용자 정의 chain을 쉽게 구현할 수 있다.
2. 표준 인터페이스에 따라 호출할 수 있다.
여기에서 언급한 표준 인터페이스는 다음을 포함합니다.
stream : 응답의 청크를 스트리밍invoke : 입력에 대해 체인을 호출 (답변이 모두 생성되면 반환)batch : 입력 목록에 대해 한번에 체인 호출astream : 비동기적으로 응답 청크를 스트리밍ainvoke : 비동기적으로 입력에 대해 체인 호출abatch : 비동기적으로 입력 목록에 대해 한번에 체인 호출astraem_log : 최종 응답 뿐 아니라 발생하는 중간 단계를 스트리밍이제, 각 표준 인터페이스 기능들을 하나씩 살펴보며 어떻게 통일된 방식으로 호출하는 지 정리해보겠습니다.
먼저 체인을 구성해두고, 그 체인을 다양한 방식으로 호출해보겠습니다.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = PromptTemplate.from_template("{topic}에 대해 자세하게 설명해줘.")
model = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)
chain = prompt | model | StrOutputParser()
streamfor chunk in chain.stream({'topic' : '인공지능 모델의 학습 방법'}):
print(chunk, end="", flush=True)
invokeprint(chain.invoke({'topic' : '인공지능 모델의 학습 방법'}))
batch.batch() 메서드는 여러 개의 딕셔너리를 포함하는 리스트를 인자로 받아서, 각 딕셔너리로 완성되는 각 프롬프트에 대해 일괄 처리를 수행합니다.
chain.batch([{"topic" : "인공지능"}, {"topic" : "안드로이드"}])
실행 결과도 살펴보면
['인공지능(Artificial Intelligence, AI)은 컴퓨터 시스템이 인간의 지능을 모방하여 학습, 추론, 문제 해결, 이해, 언어 처리 등의 작업을 수행할 수 있도록 하는 기술입니다. AI는 여러 분야에서 활용되며, 그 범위는 매우 넓습니다. 다음은 인공지능의 주요 개념과 기술에 대한 설명입니다.\n\n### 1. 인공지능의 종류\n- **약한 인공지능(Weak AI)**: 특정 작업을 수행하도록 설계된 AI로, 예를 들어 음성 인식, 이미지 인식, 추천 시스템 등이 이에 해당합니다. 현재 대부분의 AI 시스템이 이 범주에 속합니다.\n- **강한 인공지능(Strong AI)**: 인간과 같은 수준의 지능을 갖춘 AI로, 스스로 학습하고 이해하며 다양한 작업을 수행할 수 있는 능력을 지닙니다. 현재는 이론적인 개념에 가까우며, 실제로 구현된 사례는 없습니다.\n\n### 2. 머신러닝(Machine Learning)\n머신러닝은 AI의 한 분야로, 데이터에서 패턴을 학습하여 예측이나 결정을 내리는 알고리즘을 개발하는 것입니다. 머신러닝은 크게 세 가지 유형으로 나눌 수 있습니다:\n- **지도 학습(Supervised Learning)**: 입력 데이터와 그에 대한 정답(레이블)을 제공하여 모델을 학습시키는 방법입니다. 예를 들어, 스팸 이메일 분류기 등이 있습니다.\n- **비지도 학습(Unsupervised Learning)**: 레이블이 없는 데이터에서 패턴이나 구조를 찾아내는 방법입니다. 클러스터링이나 차원 축소 기법이 여기에 해당합니다.\n- **강화 학습(Reinforcement Learning)**: 에이전트가 환경과 상호작용하며 보상을 최대화하는 방향으로 학습하는 방법입니다. 게임 AI나 로봇 제어에 많이 사용됩니다.\n\n### 3. 딥러닝(Deep Learning)\n딥러닝은 머신러닝의 한 분야로, 인공신경망(Artificial Neural Networks)을 기반으로 한 기술입니다. 여러 층의 신경망을 통해 복잡한 데이터의 특징을 자동으로 추출하고 학습할 수 있습니다. 이미지 인식, 자연어 처리, 음성 인식 등 다양한 분야에서 뛰어난 성능을 보여주고 있습니다.\n\n### 4. 자연어 처리(Natural Language Processing, NLP)\n자연어 처리는 컴퓨터가 인간의 언어를 이해하고 생성할 수 있도록 하는 기술입니다. 텍스트 분석, 기계 번역, 감정 분석, 챗봇 등이 NLP의 응용 분야입니다.\n\n### 5. 컴퓨터 비전(Computer Vision)\n컴퓨터 비전은 이미지나 비디오에서 정보를 추출하고 이해하는 기술입니다. 객체 인식, 얼굴 인식, 자율주행차의 환경 인식 등이 포함됩니다.\n\n### 6. AI의 응용 분야\n- **의료**: 진단 보조, 개인 맞춤형 치료, 의료 영상 분석 등.\n- **금융**: 신용 평가, 사기 탐지, 알고리즘 트레이딩 등.\n- **자동차**: 자율주행차, 운전 보조 시스템 등.\n- **소매**: 고객 행동 분석, 재고 관리, 추천 시스템 등.\n- **제조업**: 품질 검사, 예측 유지보수, 로봇 자동화 등.\n\n### 7. 윤리적 고려사항\nAI의 발전과 함께 윤리적 문제도 대두되고 있습니다. 데이터 프라이버시, 편향된 알고리즘, 일자리 대체, 책임 소재 등의 이슈가 논의되고 있습니다. AI 기술이 사회에 미치는 영향을 고려하여 윤리적이고 책임감 있는 개발과 사용이 필요합니다.\n\n인공지능은 앞으로도 계속 발전할 것으로 예상되며, 우리의 삶에 많은 변화를 가져올 것입니다.',
'안드로이드(Android)는 구글이 개발한 모바일 운영 체제(OS)로, 주로 스마트폰과 태블릿에서 사용됩니다. 안드로이드는 리눅스 커널을 기반으로 하며, 오픈 소스 소프트웨어로 제공되어 다양한 제조업체들이 이를 기반으로 한 기기를 제작할 수 있습니다. 다음은 안드로이드에 대한 자세한 설명입니다.\n\n### 1. 역사\n- **출시**: 안드로이드는 2008년 9월 23일 첫 번째 상용 버전인 안드로이드 1.0이 출시되었습니다.\n- **구글 인수**: 2005년 구글이 안드로이드 Inc.를 인수하면서 안드로이드의 발전이 시작되었습니다.\n\n### 2. 구조\n안드로이드는 여러 계층으로 구성되어 있습니다:\n- **리눅스 커널**: 하드웨어와 소프트웨어 간의 인터페이스 역할을 하며, 메모리 관리, 프로세스 관리, 보안 등을 담당합니다.\n- **안드로이드 런타임(ART)**: 앱을 실행하는 환경으로, 이전에는 Dalvik이라는 가상 머신을 사용했습니다. ART는 성능을 개선하고, 앱의 실행 속도를 높입니다.\n- **프레임워크**: 개발자가 앱을 만들기 위해 사용하는 API와 라이브러리로 구성되어 있습니다. UI 구성 요소, 데이터베이스, 위치 서비스 등을 포함합니다.\n- **애플리케이션**: 사용자에게 제공되는 다양한 앱들이 이 계층에 위치합니다. 구글 플레이 스토어를 통해 다운로드할 수 있습니다.\n\n### 3. 특징\n- **오픈 소스**: 안드로이드는 오픈 소스 프로젝트로, 누구나 소스 코드를 수정하고 배포할 수 있습니다. 이를 통해 다양한 제조업체들이 자신만의 커스터마이즈된 버전을 만들 수 있습니다.\n- **다양한 기기 지원**: 스마트폰, 태블릿, 스마트워치, TV, 자동차 등 다양한 디바이스에서 사용됩니다.\n- **구글 서비스 통합**: 구글의 다양한 서비스(구글 맵, 구글 드라이브, 유튜브 등)와의 통합이 잘 되어 있습니다.\n\n### 4. 버전\n안드로이드는 정기적으로 업데이트되며, 각 버전은 특정한 이름과 번호를 가지고 있습니다. 예를 들어, 안드로이드 10, 11, 12 등과 같은 버전이 있으며, 이전에는 디저트 이름(컵케이크, 도넛 등)으로도 알려졌습니다.\n\n### 5. 개발\n안드로이드 앱 개발은 주로 자바(Java)와 코틀린(Kotlin) 언어를 사용하여 이루어집니다. 안드로이드 스튜디오(Android Studio)는 공식 IDE로, 개발자들이 앱을 만들고 테스트하는 데 필요한 도구를 제공합니다.\n\n### 6. 보안\n안드로이드는 다양한 보안 기능을 제공하며, 정기적인 보안 업데이트를 통해 취약점을 수정합니다. 그러나 오픈 소스 특성상, 사용자나 제조업체가 커스터마이즈한 버전에서는 보안 문제가 발생할 수 있습니다.\n\n### 7. 시장 점유율\n안드로이드는 전 세계 모바일 운영 체제 시장에서 가장 높은 점유율을 차지하고 있으며, 다양한 제조업체들이 안드로이드 기반의 기기를 출시하고 있습니다.\n\n안드로이드는 그 유연성과 확장성 덕분에 모바일 생태계에서 중요한 역할을 하고 있으며, 앞으로도 계속 발전할 것으로 예상됩니다.']
실행 결과도 list로 반환되는 것을 알 수 있습니다.
단순히 일괄 처리만 요청하는 것이 아니라, 한번에 처리할 최대 작업 수를 지정할 수 도 있는데요, 다음과 같이 코드를 작성합니다.
chain.batch(
[
{"topic" : "인공지능"},
{"topic" : "안드로이드"},
{"topic" : "휴머노이드"},
{"topic" : "인공태양"},
{"topic" : "인공눈물"},
],
config={"max_concurrency" : 3} # 동시에 처리할 수 있는 최대 작업 수 지정
)
astream (비동기 스트림)앞서 stream 메서드로 호출한 응답을 스트리밍할 때 for 문을 사용했습니다. 다만, 비동기 방식으로 호출한 astream을 사용하면 async for 문을 사용해야합니다.
async for token in chain.astream({'topic' : '인공지능 모델의 학습 방법'}):
print(token, end="", flush=True)
이렇게 실행하면 for문도 비동기적으로 실행하기 때문에 전체적으로 비동기적 스트리밍이 가능합니다.
ainvoke (비동기 호출)response = await chain.ainvoke({"topic" : "NVDA"})
이렇게 비동기 방식으로 호출하는 ainvoke()의 응답 결과를 받아보기 위해서는 await 문과 함께 사용해야 합니다. 비동기 방식으로 실행되는 결과를 대기했다가 받아내야하기 때문입니다.
abatch (비동기 일괄 처리)response = await chain.abatch(
[{"topic" : "인공지능"}, {"topic" : "안드로이드"}]
)
abatch()의 경우도 마찬가지로 응답 결과를 받아보기 위해서는 await 문과 함께 사용해야 합니다.
이렇게 LCEL 인터페이스의 다양한 기능에 대해 살펴보았습니다.
LCEL로 생성할 Chain도 Runnable 한 객체이기 때문에, 이를 실행하는 다양한 방법을 알고 익숙해져야만 더 복잡한 Chain도 구성할 수 있을 것입니다.
출처